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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt27
-rw-r--r--SConstruct2
-rw-r--r--build_files/buildbot/config/user-config-i686.py4
-rw-r--r--build_files/buildbot/config/user-config-x86_64.py4
-rw-r--r--build_files/cmake/Modules/FindOpenCOLLADA.cmake27
-rw-r--r--build_files/cmake/Modules/FindPCRE.cmake69
-rw-r--r--build_files/cmake/Modules/FindXML2.cmake68
-rw-r--r--build_files/cmake/macros.cmake12
-rw-r--r--build_files/scons/config/darwin-config.py2
-rw-r--r--build_files/scons/config/linuxcross-config.py1
-rw-r--r--build_files/scons/config/win32-mingw-config.py2
-rw-r--r--build_files/scons/config/win64-vc-config.py2
-rw-r--r--doc/python_api/examples/bge.texture.1.py2
-rw-r--r--doc/python_api/examples/bpy.types.Operator.py2
-rw-r--r--doc/python_api/rst/bge.types.rst2
-rw-r--r--doc/python_api/rst/bgl.rst90
-rw-r--r--doc/python_api/rst/gpu.rst531
-rw-r--r--doc/python_api/rst/info_best_practice.rst65
-rw-r--r--doc/python_api/rst/info_gotcha.rst63
-rw-r--r--doc/python_api/rst/info_quickstart.rst48
-rw-r--r--doc/python_api/rst/info_tips_and_tricks.rst235
-rw-r--r--doc/python_api/sphinx_doc_gen.py3
-rw-r--r--extern/CMakeLists.txt4
-rw-r--r--extern/SConscript3
-rw-r--r--extern/recastnavigation/CMakeLists.txt66
-rw-r--r--extern/recastnavigation/Detour/Include/DetourCommon.h167
-rw-r--r--extern/recastnavigation/Detour/Include/DetourNode.h149
-rw-r--r--extern/recastnavigation/Detour/Include/DetourStatNavMesh.h234
-rw-r--r--extern/recastnavigation/Detour/Include/DetourStatNavMeshBuilder.h33
-rw-r--r--extern/recastnavigation/Detour/Include/DetourTileNavMesh.h315
-rw-r--r--extern/recastnavigation/Detour/Include/DetourTileNavMeshBuilder.h29
-rw-r--r--extern/recastnavigation/Detour/Source/DetourCommon.cpp244
-rw-r--r--extern/recastnavigation/Detour/Source/DetourNode.cpp140
-rw-r--r--extern/recastnavigation/Detour/Source/DetourStatNavMesh.cpp876
-rw-r--r--extern/recastnavigation/Detour/Source/DetourStatNavMeshBuilder.cpp346
-rw-r--r--extern/recastnavigation/Detour/Source/DetourTileNavMesh.cpp1428
-rw-r--r--extern/recastnavigation/Detour/Source/DetourTileNavMeshBuilder.cpp213
-rw-r--r--extern/recastnavigation/License.txt18
-rw-r--r--extern/recastnavigation/Readme.txt120
-rw-r--r--extern/recastnavigation/Recast/Include/Recast.h501
-rw-r--r--extern/recastnavigation/Recast/Include/RecastLog.h80
-rw-r--r--extern/recastnavigation/Recast/Include/RecastTimer.h31
-rw-r--r--extern/recastnavigation/Recast/Source/Recast.cpp272
-rw-r--r--extern/recastnavigation/Recast/Source/RecastContour.cpp732
-rw-r--r--extern/recastnavigation/Recast/Source/RecastFilter.cpp249
-rw-r--r--extern/recastnavigation/Recast/Source/RecastLog.cpp77
-rw-r--r--extern/recastnavigation/Recast/Source/RecastMesh.cpp1218
-rw-r--r--extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp1010
-rw-r--r--extern/recastnavigation/Recast/Source/RecastRasterization.cpp308
-rw-r--r--extern/recastnavigation/Recast/Source/RecastRegion.cpp1081
-rw-r--r--extern/recastnavigation/Recast/Source/RecastTimer.cpp58
-rw-r--r--extern/recastnavigation/SConscript11
-rwxr-xr-xintern/audaspace/intern/AUD_JOSResampleReader.cpp11
-rwxr-xr-xintern/audaspace/intern/AUD_SequencerHandle.cpp4
-rwxr-xr-xintern/audaspace/intern/AUD_SequencerHandle.h3
-rw-r--r--intern/audaspace/intern/AUD_SequencerReader.cpp4
-rw-r--r--intern/elbeem/CMakeLists.txt17
-rw-r--r--intern/ghost/intern/GHOST_NDOFManager.cpp4
-rw-r--r--intern/guardedalloc/MEM_sys_types.h7
-rw-r--r--intern/iksolver/intern/IK_QSegment.cpp2
-rw-r--r--intern/opennl/CMakeLists.txt7
-rw-r--r--intern/opennl/superlu/superlu_sys_types.h2
-rw-r--r--intern/smoke/CMakeLists.txt2
-rw-r--r--intern/smoke/SConscript2
-rw-r--r--intern/smoke/intern/FFT_NOISE.h2
-rw-r--r--intern/smoke/intern/WTURBULENCE.cpp2
-rw-r--r--release/datafiles/blenderbuttonsbin215334 -> 214916 bytes
-rw-r--r--release/scripts/modules/bpy_types.py26
-rw-r--r--release/scripts/startup/bl_operators/animsys_update.py1
-rw-r--r--release/scripts/startup/bl_operators/nla.py9
-rw-r--r--release/scripts/startup/bl_ui/properties_data_armature.py10
-rw-r--r--release/scripts/startup/bl_ui/properties_data_modifier.py159
-rw-r--r--release/scripts/startup/bl_ui/properties_data_speaker.py2
-rw-r--r--release/scripts/startup/bl_ui/properties_game.py112
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_fluid.py2
-rw-r--r--release/scripts/startup/bl_ui/space_userpref.py13
-rw-r--r--release/scripts/startup/bl_ui/space_view3d_toolbar.py7
-rw-r--r--source/blender/blenfont/intern/blf_font.c119
-rw-r--r--source/blender/blenfont/intern/blf_glyph.c11
-rw-r--r--source/blender/blenfont/intern/blf_internal.h2
-rw-r--r--source/blender/blenfont/intern/blf_internal_types.h6
-rw-r--r--source/blender/blenfont/intern/blf_lang.c4
-rw-r--r--source/blender/blenfont/intern/blf_util.c2
-rw-r--r--source/blender/blenkernel/BKE_blender.h2
-rw-r--r--source/blender/blenkernel/BKE_colortools.h8
-rw-r--r--source/blender/blenkernel/BKE_curve.h13
-rw-r--r--source/blender/blenkernel/BKE_global.h2
-rw-r--r--source/blender/blenkernel/BKE_material.h2
-rw-r--r--source/blender/blenkernel/BKE_navmesh_conversion.h64
-rw-r--r--source/blender/blenkernel/BKE_node.h344
-rw-r--r--source/blender/blenkernel/BKE_object.h2
-rw-r--r--source/blender/blenkernel/BKE_paint.h1
-rw-r--r--source/blender/blenkernel/BKE_sequencer.h2
-rw-r--r--source/blender/blenkernel/BKE_sound.h9
-rw-r--r--source/blender/blenkernel/CMakeLists.txt11
-rw-r--r--source/blender/blenkernel/SConscript11
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c164
-rw-r--r--source/blender/blenkernel/intern/blender.c11
-rw-r--r--source/blender/blenkernel/intern/boids.c8
-rw-r--r--source/blender/blenkernel/intern/brush.c8
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c7
-rw-r--r--source/blender/blenkernel/intern/collision.c28
-rw-r--r--source/blender/blenkernel/intern/colortools.c14
-rw-r--r--source/blender/blenkernel/intern/curve.c48
-rw-r--r--source/blender/blenkernel/intern/customdata.c40
-rw-r--r--source/blender/blenkernel/intern/displist.c4
-rw-r--r--source/blender/blenkernel/intern/effect.c24
-rw-r--r--source/blender/blenkernel/intern/material.c11
-rw-r--r--source/blender/blenkernel/intern/mesh_validate.c4
-rw-r--r--source/blender/blenkernel/intern/navmesh_conversion.cpp478
-rw-r--r--source/blender/blenkernel/intern/nla.c3
-rw-r--r--source/blender/blenkernel/intern/node.c3321
-rw-r--r--source/blender/blenkernel/intern/object.c71
-rw-r--r--source/blender/blenkernel/intern/particle.c4
-rw-r--r--source/blender/blenkernel/intern/sca.c16
-rw-r--r--source/blender/blenkernel/intern/scene.c17
-rw-r--r--source/blender/blenkernel/intern/sequencer.c5
-rw-r--r--source/blender/blenkernel/intern/shrinkwrap.c16
-rw-r--r--source/blender/blenkernel/intern/sketch.c10
-rw-r--r--source/blender/blenkernel/intern/sound.c48
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c6
-rw-r--r--source/blender/blenkernel/intern/texture.c4
-rw-r--r--source/blender/blenlib/BLI_math_inline.h5
-rw-r--r--source/blender/blenlib/BLI_math_matrix.h5
-rw-r--r--source/blender/blenlib/BLI_math_vector.h7
-rw-r--r--source/blender/blenlib/BLI_string.h9
-rw-r--r--source/blender/blenlib/BLI_utildefines.h6
-rw-r--r--source/blender/blenlib/CMakeLists.txt1
-rw-r--r--source/blender/blenlib/intern/BLI_kdopbvh.c21
-rw-r--r--source/blender/blenlib/intern/graph.c4
-rw-r--r--source/blender/blenlib/intern/math_matrix.c32
-rw-r--r--source/blender/blenlib/intern/math_vector.c8
-rw-r--r--source/blender/blenlib/intern/math_vector_inline.c22
-rw-r--r--source/blender/blenlib/intern/noise.c16
-rw-r--r--source/blender/blenlib/intern/string.c120
-rw-r--r--source/blender/blenlib/intern/string_utf8.c183
-rw-r--r--source/blender/blenloader/BLO_sys_types.h11
-rw-r--r--source/blender/blenloader/CMakeLists.txt1
-rw-r--r--source/blender/blenloader/SConscript2
-rw-r--r--source/blender/blenloader/intern/readfile.c359
-rw-r--r--source/blender/blenloader/intern/writefile.c68
-rw-r--r--[-rwxr-xr-x]source/blender/collada/AnimationExporter.cpp1700
-rw-r--r--source/blender/collada/AnimationImporter.cpp405
-rw-r--r--source/blender/collada/AnimationImporter.h14
-rw-r--r--source/blender/collada/ArmatureExporter.cpp8
-rw-r--r--source/blender/collada/ArmatureExporter.h33
-rw-r--r--source/blender/collada/ArmatureImporter.cpp11
-rw-r--r--source/blender/collada/ArmatureImporter.h4
-rw-r--r--source/blender/collada/CMakeLists.txt6
-rw-r--r--source/blender/collada/CameraExporter.cpp6
-rw-r--r--source/blender/collada/CameraExporter.h8
-rw-r--r--source/blender/collada/DocumentExporter.cpp206
-rw-r--r--source/blender/collada/DocumentExporter.h7
-rw-r--r--source/blender/collada/DocumentImporter.cpp22
-rw-r--r--source/blender/collada/EffectExporter.cpp15
-rw-r--r--source/blender/collada/EffectExporter.h10
-rw-r--r--source/blender/collada/ErrorHandler.cpp89
-rw-r--r--source/blender/collada/ErrorHandler.h58
-rw-r--r--source/blender/collada/ExportSettings.cpp29
-rw-r--r--source/blender/collada/ExportSettings.h39
-rw-r--r--source/blender/collada/ExtraTags.cpp12
-rw-r--r--source/blender/collada/GeometryExporter.cpp6
-rw-r--r--source/blender/collada/GeometryExporter.h8
-rw-r--r--source/blender/collada/ImageExporter.cpp8
-rw-r--r--source/blender/collada/ImageExporter.h10
-rw-r--r--source/blender/collada/LightExporter.cpp6
-rw-r--r--source/blender/collada/LightExporter.h7
-rw-r--r--source/blender/collada/MaterialExporter.cpp6
-rw-r--r--source/blender/collada/MaterialExporter.h6
-rw-r--r--source/blender/collada/MeshImporter.cpp10
-rw-r--r--source/blender/collada/SceneExporter.cpp161
-rw-r--r--source/blender/collada/SceneExporter.h109
-rw-r--r--source/blender/collada/SkinInfo.cpp6
-rw-r--r--source/blender/collada/TransformReader.cpp1
-rw-r--r--source/blender/collada/TransformWriter.cpp2
-rw-r--r--source/blender/collada/collada.cpp13
-rw-r--r--source/blender/editors/animation/anim_channels_defines.c6
-rw-r--r--source/blender/editors/animation/anim_filter.c47
-rw-r--r--source/blender/editors/animation/anim_ops.c4
-rw-r--r--source/blender/editors/animation/keyframing.c91
-rw-r--r--source/blender/editors/armature/editarmature.c12
-rw-r--r--source/blender/editors/armature/editarmature_sketch.c16
-rw-r--r--source/blender/editors/armature/meshlaplacian.c14
-rw-r--r--source/blender/editors/armature/poseSlide.c5
-rw-r--r--source/blender/editors/armature/poselib.c5
-rw-r--r--source/blender/editors/armature/poseobject.c75
-rw-r--r--source/blender/editors/curve/curve_ops.c2
-rw-r--r--source/blender/editors/curve/editcurve.c127
-rw-r--r--source/blender/editors/datafiles/blenderbuttons.c13449
-rw-r--r--source/blender/editors/gpencil/CMakeLists.txt1
-rw-r--r--source/blender/editors/gpencil/drawgpencil.c2
-rw-r--r--source/blender/editors/gpencil/gpencil_edit.c4
-rw-r--r--source/blender/editors/gpencil/gpencil_intern.h7
-rw-r--r--source/blender/editors/gpencil/gpencil_ops.c3
-rw-r--r--source/blender/editors/gpencil/gpencil_paint.c263
-rw-r--r--source/blender/editors/gpencil/gpencil_undo.c168
-rw-r--r--source/blender/editors/include/ED_armature.h1
-rw-r--r--source/blender/editors/include/ED_curve.h2
-rw-r--r--source/blender/editors/include/ED_gpencil.h4
-rw-r--r--source/blender/editors/include/ED_node.h5
-rw-r--r--source/blender/editors/include/ED_object.h4
-rw-r--r--source/blender/editors/include/ED_sculpt.h1
-rw-r--r--source/blender/editors/include/ED_sequencer.h4
-rw-r--r--source/blender/editors/include/UI_icons.h2
-rw-r--r--source/blender/editors/include/UI_interface.h19
-rw-r--r--source/blender/editors/include/UI_resources.h3
-rw-r--r--source/blender/editors/interface/interface_draw.c54
-rw-r--r--source/blender/editors/interface/interface_layout.c46
-rw-r--r--source/blender/editors/interface/interface_panel.c4
-rw-r--r--source/blender/editors/interface/interface_templates.c42
-rw-r--r--source/blender/editors/interface/interface_widgets.c380
-rw-r--r--source/blender/editors/interface/resources.c17
-rw-r--r--source/blender/editors/mesh/editmesh.c8
-rw-r--r--source/blender/editors/mesh/editmesh_add.c20
-rw-r--r--source/blender/editors/mesh/editmesh_lib.c22
-rw-r--r--source/blender/editors/mesh/editmesh_mods.c14
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c20
-rw-r--r--source/blender/editors/object/CMakeLists.txt14
-rw-r--r--source/blender/editors/object/SConscript6
-rw-r--r--source/blender/editors/object/object_add.c2
-rw-r--r--source/blender/editors/object/object_constraint.c8
-rw-r--r--source/blender/editors/object/object_edit.c2
-rw-r--r--source/blender/editors/object/object_hook.c4
-rw-r--r--source/blender/editors/object/object_intern.h5
-rw-r--r--source/blender/editors/object/object_modifier.c7
-rw-r--r--source/blender/editors/object/object_navmesh.cpp628
-rw-r--r--source/blender/editors/object/object_ops.c7
-rw-r--r--source/blender/editors/object/object_relations.c2
-rw-r--r--source/blender/editors/object/object_select.c34
-rw-r--r--source/blender/editors/render/render_shading.c27
-rw-r--r--source/blender/editors/screen/area.c8
-rw-r--r--source/blender/editors/screen/screen_context.c6
-rw-r--r--source/blender/editors/screen/screen_ops.c24
-rw-r--r--source/blender/editors/sculpt_paint/paint_image.c5
-rw-r--r--source/blender/editors/sculpt_paint/paint_stroke.c4
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c49
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_intern.h2
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_undo.c4
-rw-r--r--source/blender/editors/sound/sound_ops.c21
-rw-r--r--source/blender/editors/space_file/file_draw.c4
-rw-r--r--source/blender/editors/space_file/filelist.c4
-rw-r--r--source/blender/editors/space_graph/graph_ops.c4
-rw-r--r--source/blender/editors/space_info/info_stats.c4
-rw-r--r--source/blender/editors/space_logic/logic_ops.c6
-rw-r--r--source/blender/editors/space_logic/logic_window.c80
-rw-r--r--source/blender/editors/space_nla/nla_draw.c4
-rw-r--r--source/blender/editors/space_nla/nla_select.c2
-rw-r--r--source/blender/editors/space_node/drawnode.c751
-rw-r--r--source/blender/editors/space_node/node_buttons.c4
-rw-r--r--source/blender/editors/space_node/node_draw.c691
-rw-r--r--source/blender/editors/space_node/node_edit.c693
-rw-r--r--source/blender/editors/space_node/node_header.c195
-rw-r--r--source/blender/editors/space_node/node_intern.h15
-rw-r--r--source/blender/editors/space_node/node_ops.c3
-rw-r--r--source/blender/editors/space_node/node_select.c24
-rw-r--r--source/blender/editors/space_node/node_state.c34
-rw-r--r--source/blender/editors/space_node/space_node.c22
-rw-r--r--source/blender/editors/space_outliner/outliner_draw.c52
-rw-r--r--source/blender/editors/space_outliner/outliner_edit.c72
-rw-r--r--source/blender/editors/space_outliner/outliner_intern.h30
-rw-r--r--source/blender/editors/space_outliner/outliner_select.c2
-rw-r--r--source/blender/editors/space_outliner/outliner_tools.c61
-rw-r--r--source/blender/editors/space_outliner/outliner_tree.c44
-rw-r--r--source/blender/editors/space_sequencer/sequencer_draw.c26
-rw-r--r--source/blender/editors/space_sequencer/sequencer_edit.c2
-rw-r--r--source/blender/editors/space_sequencer/space_sequencer.c138
-rw-r--r--source/blender/editors/space_text/space_text.c5
-rw-r--r--source/blender/editors/space_text/text_draw.c21
-rw-r--r--source/blender/editors/space_text/text_intern.h1
-rw-r--r--source/blender/editors/space_view3d/drawarmature.c154
-rw-r--r--source/blender/editors/space_view3d/drawobject.c113
-rw-r--r--source/blender/editors/space_view3d/drawvolume.c46
-rw-r--r--source/blender/editors/space_view3d/view3d_buttons.c4
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c337
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c46
-rw-r--r--source/blender/editors/space_view3d/view3d_snap.c6
-rw-r--r--source/blender/editors/transform/transform.c79
-rw-r--r--source/blender/editors/transform/transform_constraints.c40
-rw-r--r--source/blender/editors/transform/transform_conversions.c168
-rw-r--r--source/blender/editors/transform/transform_generics.c54
-rw-r--r--source/blender/editors/transform/transform_manipulator.c12
-rw-r--r--source/blender/editors/transform/transform_orientations.c23
-rw-r--r--source/blender/editors/transform/transform_snap.c88
-rw-r--r--source/blender/editors/util/SConscript2
-rw-r--r--source/blender/editors/util/undo.c6
-rw-r--r--source/blender/gpu/GPU_extensions.h2
-rw-r--r--source/blender/gpu/GPU_material.h74
-rw-r--r--source/blender/gpu/SConscript2
-rw-r--r--source/blender/gpu/intern/gpu_codegen.c143
-rw-r--r--source/blender/gpu/intern/gpu_codegen.h103
-rw-r--r--source/blender/gpu/intern/gpu_extensions.c7
-rw-r--r--source/blender/gpu/intern/gpu_material.c210
-rw-r--r--source/blender/gpu/intern/gpu_shader_material.glsl24
-rw-r--r--source/blender/gpu/intern/gpu_shader_material.glsl.c1818
-rw-r--r--source/blender/imbuf/intern/cineon/cineonlib.c5
-rw-r--r--source/blender/imbuf/intern/cineon/logImageCore.h4
-rw-r--r--source/blender/makesdna/DNA_actuator_types.h25
-rw-r--r--source/blender/makesdna/DNA_customdata_types.h4
-rw-r--r--source/blender/makesdna/DNA_meshdata_types.h4
-rw-r--r--source/blender/makesdna/DNA_modifier_types.h178
-rw-r--r--source/blender/makesdna/DNA_node_types.h171
-rw-r--r--source/blender/makesdna/DNA_object_types.h5
-rw-r--r--source/blender/makesdna/DNA_outliner_types.h2
-rw-r--r--source/blender/makesdna/DNA_scene_types.h51
-rw-r--r--source/blender/makesdna/DNA_sequence_types.h2
-rw-r--r--source/blender/makesdna/DNA_space_types.h1
-rw-r--r--source/blender/makesdna/DNA_userdef_types.h6
-rw-r--r--source/blender/makesrna/RNA_access.h21
-rw-r--r--source/blender/makesrna/RNA_enum_types.h2
-rw-r--r--source/blender/makesrna/RNA_types.h5
-rw-r--r--source/blender/makesrna/SConscript1
-rw-r--r--source/blender/makesrna/intern/CMakeLists.txt2
-rw-r--r--source/blender/makesrna/intern/SConscript2
-rw-r--r--source/blender/makesrna/intern/makesrna.c14
-rw-r--r--source/blender/makesrna/intern/rna_ID.c2
-rw-r--r--source/blender/makesrna/intern/rna_access.c30
-rw-r--r--source/blender/makesrna/intern/rna_actuator.c214
-rw-r--r--source/blender/makesrna/intern/rna_fluidsim.c6
-rw-r--r--source/blender/makesrna/intern/rna_internal.h1
-rw-r--r--source/blender/makesrna/intern/rna_main_api.c4
-rw-r--r--source/blender/makesrna/intern/rna_modifier.c455
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c440
-rw-r--r--source/blender/makesrna/intern/rna_nodetree_types.h10
-rw-r--r--source/blender/makesrna/intern/rna_object.c45
-rw-r--r--source/blender/makesrna/intern/rna_particle.c16
-rw-r--r--source/blender/makesrna/intern/rna_rna.c36
-rw-r--r--source/blender/makesrna/intern/rna_scene.c133
-rw-r--r--source/blender/makesrna/intern/rna_scene_api.c2
-rw-r--r--source/blender/makesrna/intern/rna_screen.c3
-rw-r--r--source/blender/makesrna/intern/rna_smoke.c2
-rw-r--r--source/blender/makesrna/intern/rna_space.c56
-rw-r--r--source/blender/makesrna/intern/rna_texture.c4
-rwxr-xr-xsource/blender/makesrna/intern/rna_texture_api.c54
-rw-r--r--source/blender/makesrna/intern/rna_ui_api.c2
-rw-r--r--source/blender/makesrna/intern/rna_userdef.c32
-rw-r--r--source/blender/makesrna/intern/rna_wm.c17
-rw-r--r--source/blender/makesrna/intern/rna_world.c2
-rw-r--r--source/blender/modifiers/CMakeLists.txt17
-rw-r--r--source/blender/modifiers/MOD_modifiertypes.h4
-rw-r--r--source/blender/modifiers/SConscript11
-rw-r--r--source/blender/modifiers/intern/MOD_navmesh.cpp300
-rw-r--r--source/blender/modifiers/intern/MOD_screw.c4
-rw-r--r--source/blender/modifiers/intern/MOD_util.c4
-rw-r--r--source/blender/modifiers/intern/MOD_warp.c4
-rw-r--r--source/blender/modifiers/intern/MOD_weightvg_util.c306
-rw-r--r--source/blender/modifiers/intern/MOD_weightvg_util.h90
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgedit.c326
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgmix.c466
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgproximity.c557
-rw-r--r--source/blender/nodes/CMakeLists.txt230
-rw-r--r--source/blender/nodes/NOD_composite.h (renamed from source/blender/nodes/CMP_node.h)12
-rw-r--r--source/blender/nodes/NOD_shader.h (renamed from source/blender/nodes/SHD_node.h)12
-rw-r--r--source/blender/nodes/NOD_socket.h90
-rw-r--r--source/blender/nodes/NOD_texture.h (renamed from source/blender/nodes/TEX_node.h)12
-rw-r--r--source/blender/nodes/SConscript8
-rw-r--r--source/blender/nodes/composite/node_composite_tree.c837
-rw-r--r--source/blender/nodes/composite/node_composite_util.c (renamed from source/blender/nodes/intern/CMP_util.c)10
-rw-r--r--source/blender/nodes/composite/node_composite_util.h (renamed from source/blender/nodes/intern/CMP_util.h)7
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_alphaOver.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c)22
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_bilateralblur.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c)22
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_blur.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_blur.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_brightness.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_brightness.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_channelMatte.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_chromaMatte.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c)22
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_colorMatte.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c)22
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_colorSpill.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_colorbalance.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c)22
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_common.c373
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_composite.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_composite.c)16
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_crop.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_crop.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_curves.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_curves.c)48
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_defocus.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_defocus.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_diffMatte.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c)22
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_dilate.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_dilate.c)16
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_directionalblur.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c)19
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_displace.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_displace.c)22
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_distanceMatte.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c)22
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_filter.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_filter.c)18
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_flip.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_flip.c)16
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_gamma.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_gamma.c)18
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_glare.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_glare.c)19
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_hueSatVal.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_huecorrect.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_idMask.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_idMask.c)16
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_image.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_image.c)30
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_invert.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_invert.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_lensdist.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c)23
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_levels.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_levels.c)35
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_lummaMatte.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_mapUV.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c)18
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_mapValue.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c)18
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_math.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_math.c)19
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_mixrgb.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_normal.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_normal.c)34
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_normalize.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_normalize.c)16
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_outputFile.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c)16
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_premulkey.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c)16
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_rgb.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_rgb.c)27
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_rotate.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_rotate.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_scale.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_scale.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c)40
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c)40
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c)40
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c)40
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_setalpha.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c)18
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_splitViewer.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c)16
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_texture.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_texture.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_tonemap.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c)19
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_translate.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_translate.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_valToRgb.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c)30
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_value.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_value.c)27
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_vecBlur.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c)22
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_viewer.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_viewer.c)20
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_zcombine.c (renamed from source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c)24
-rw-r--r--source/blender/nodes/intern/SHD_util.c219
-rw-r--r--source/blender/nodes/intern/node_common.c983
-rw-r--r--source/blender/nodes/intern/node_common.h66
-rw-r--r--source/blender/nodes/intern/node_exec.c309
-rw-r--r--source/blender/nodes/intern/node_exec.h90
-rw-r--r--source/blender/nodes/intern/node_socket.c433
-rw-r--r--source/blender/nodes/intern/node_util.c18
-rw-r--r--source/blender/nodes/intern/node_util.h13
-rw-r--r--source/blender/nodes/shader/node_shader_tree.c225
-rw-r--r--source/blender/nodes/shader/node_shader_util.c287
-rw-r--r--source/blender/nodes/shader/node_shader_util.h (renamed from source/blender/nodes/intern/SHD_util.h)13
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_camera.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_camera.c)16
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_common.c327
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_curves.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_curves.c)36
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_dynamic.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c)8
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_geom.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_geom.c)40
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_hueSatVal.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c)26
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_invert.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_invert.c)18
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_mapping.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_mapping.c)18
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_material.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_material.c)90
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_math.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_math.c)18
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_mixRgb.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c)22
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_normal.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_normal.c)34
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_output.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_output.c)16
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_rgb.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_rgb.c)30
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c)38
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_squeeze.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c)26
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_texture.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_texture.c)20
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_valToRgb.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c)32
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_value.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_value.c)30
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_vectMath.c (renamed from source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c)20
-rw-r--r--source/blender/nodes/texture/node_texture_tree.c251
-rw-r--r--source/blender/nodes/texture/node_texture_util.c (renamed from source/blender/nodes/intern/TEX_util.c)53
-rw-r--r--source/blender/nodes/texture/node_texture_util.h (renamed from source/blender/nodes/intern/TEX_util.h)10
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_at.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_at.c)21
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_bricks.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_bricks.c)34
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_checker.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_checker.c)23
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_common.c271
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_compose.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_compose.c)25
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_coord.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_coord.c)15
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_curves.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_curves.c)31
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_decompose.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_decompose.c)25
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_distance.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_distance.c)21
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_hueSatVal.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c)27
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_image.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_image.c)16
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_invert.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_invert.c)19
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_math.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_math.c)21
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_mixRgb.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c)23
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_output.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_output.c)19
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_proc.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_proc.c)88
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_rotate.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_rotate.c)23
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_scale.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_scale.c)19
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_texture.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_texture.c)25
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_translate.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_translate.c)21
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_valToNor.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c)21
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_valToRgb.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c)30
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_viewer.c (renamed from source/blender/nodes/intern/TEX_nodes/TEX_viewer.c)17
-rw-r--r--source/blender/python/SConscript2
-rw-r--r--source/blender/python/generic/bpy_internal_import.c4
-rw-r--r--source/blender/python/generic/py_capi_utils.c109
-rw-r--r--source/blender/python/generic/py_capi_utils.h1
-rw-r--r--source/blender/python/intern/CMakeLists.txt3
-rw-r--r--source/blender/python/intern/bpy_driver.c7
-rw-r--r--source/blender/python/intern/bpy_interface.c2
-rw-r--r--source/blender/python/intern/bpy_rna.c367
-rw-r--r--source/blender/python/intern/gpu.c289
-rw-r--r--source/blender/python/intern/gpu.h41
-rw-r--r--[-rwxr-xr-x]source/blender/python/mathutils/mathutils_geometry.c12
-rw-r--r--source/blender/render/extern/include/RE_render_ext.h4
-rw-r--r--source/blender/render/intern/include/pixelshading.h6
-rw-r--r--source/blender/render/intern/include/render_types.h6
-rw-r--r--source/blender/render/intern/include/rendercore.h4
-rw-r--r--source/blender/render/intern/include/renderdatabase.h2
-rw-r--r--source/blender/render/intern/include/shadbuf.h4
-rw-r--r--source/blender/render/intern/include/shading.h4
-rw-r--r--source/blender/render/intern/include/texture.h12
-rw-r--r--source/blender/render/intern/include/volumetric.h4
-rw-r--r--source/blender/render/intern/include/zbuf.h6
-rw-r--r--source/blender/render/intern/source/convertblender.c198
-rw-r--r--source/blender/render/intern/source/imagetexture.c10
-rw-r--r--source/blender/render/intern/source/occlusion.c20
-rw-r--r--source/blender/render/intern/source/pixelshading.c45
-rw-r--r--source/blender/render/intern/source/render_texture.c132
-rw-r--r--source/blender/render/intern/source/rendercore.c4
-rw-r--r--source/blender/render/intern/source/renderdatabase.c29
-rw-r--r--source/blender/render/intern/source/shadbuf.c41
-rw-r--r--source/blender/render/intern/source/shadeinput.c96
-rw-r--r--source/blender/render/intern/source/shadeoutput.c78
-rw-r--r--source/blender/render/intern/source/sss.c8
-rw-r--r--source/blender/render/intern/source/volume_precache.c8
-rw-r--r--source/blender/render/intern/source/volumetric.c70
-rw-r--r--source/blender/render/intern/source/zbuf.c6
-rw-r--r--source/blender/windowmanager/intern/wm_dragdrop.c2
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c25
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c12
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c38
-rw-r--r--source/blenderplayer/CMakeLists.txt1
-rw-r--r--source/blenderplayer/bad_level_call_stubs/stubs.c6
-rw-r--r--source/creator/CMakeLists.txt29
-rw-r--r--source/creator/creator.c19
-rw-r--r--source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp20
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h334
-rw-r--r--source/gameengine/Converter/BL_ActionActuator.cpp111
-rw-r--r--source/gameengine/Converter/BL_ActionActuator.h4
-rw-r--r--source/gameengine/Converter/BL_ArmatureObject.cpp4
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.cpp52
-rw-r--r--source/gameengine/Converter/BL_MeshDeformer.h2
-rw-r--r--source/gameengine/Converter/BL_ShapeDeformer.h4
-rw-r--r--source/gameengine/Converter/BL_SkinDeformer.cpp6
-rw-r--r--source/gameengine/Converter/CMakeLists.txt1
-rw-r--r--source/gameengine/Converter/KX_BlenderSceneConverter.cpp8
-rw-r--r--source/gameengine/Converter/KX_ConvertActuators.cpp64
-rw-r--r--source/gameengine/Converter/KX_IpoConvert.cpp2
-rw-r--r--source/gameengine/Converter/SConscript1
-rw-r--r--source/gameengine/Expressions/IfExpr.h2
-rw-r--r--source/gameengine/Expressions/ListValue.cpp4
-rw-r--r--source/gameengine/Expressions/Value.cpp4
-rw-r--r--source/gameengine/GameLogic/SCA_2DFilterActuator.h22
-rw-r--r--source/gameengine/GameLogic/SCA_IActuator.h1
-rw-r--r--source/gameengine/GameLogic/SCA_PythonController.h2
-rw-r--r--source/gameengine/GameLogic/SCA_RandomActuator.cpp4
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_Application.cpp22
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_Application.h7
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_ghost.cpp14
-rw-r--r--source/gameengine/Ketsji/CMakeLists.txt8
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.h4
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.cpp25
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.h14
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.cpp30
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.h13
-rw-r--r--source/gameengine/Ketsji/KX_NavMeshObject.cpp709
-rw-r--r--source/gameengine/Ketsji/KX_NavMeshObject.h83
-rw-r--r--source/gameengine/Ketsji/KX_ObjectActuator.cpp6
-rw-r--r--source/gameengine/Ketsji/KX_ObstacleSimulation.cpp869
-rw-r--r--source/gameengine/Ketsji/KX_ObstacleSimulation.h145
-rw-r--r--source/gameengine/Ketsji/KX_OrientationInterpolator.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_PolygonMaterial.cpp2
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.cpp53
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.h3
-rw-r--r--source/gameengine/Ketsji/KX_PythonInitTypes.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_Scene.cpp53
-rw-r--r--source/gameengine/Ketsji/KX_Scene.h13
-rw-r--r--source/gameengine/Ketsji/KX_SoundActuator.cpp10
-rw-r--r--source/gameengine/Ketsji/KX_SteeringActuator.cpp630
-rw-r--r--source/gameengine/Ketsji/KX_SteeringActuator.h130
-rw-r--r--source/gameengine/Ketsji/KX_TrackToActuator.h2
-rw-r--r--source/gameengine/Ketsji/SConscript1
-rw-r--r--source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h4
-rw-r--r--source/gameengine/Network/NG_NetworkDeviceInterface.h2
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.h12
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp4
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h2
-rw-r--r--source/gameengine/Rasterizer/RAS_2DFilterManager.cpp7
-rw-r--r--source/gameengine/Rasterizer/RAS_CameraData.h26
-rw-r--r--source/gameengine/Rasterizer/RAS_IRasterizer.h4
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Blur2DFilter.h18
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Dilation2DFilter.h18
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Erosion2DFilter.h22
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Laplacian2DFilter.h20
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Prewitt2DFilter.h26
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sharpen2DFilter.h20
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sobel2DFilter.h26
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp64
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h39
-rw-r--r--source/gameengine/SceneGraph/SG_DList.h130
-rw-r--r--source/gameengine/SceneGraph/SG_IObject.h2
-rw-r--r--source/gameengine/SceneGraph/SG_QList.h100
-rw-r--r--source/gameengine/SceneGraph/SG_Spatial.cpp2
-rw-r--r--source/gameengine/VideoTexture/CMakeLists.txt1
-rw-r--r--source/gameengine/VideoTexture/Exception.h10
-rw-r--r--source/gameengine/VideoTexture/ImageBase.cpp2
-rw-r--r--source/gameengine/VideoTexture/ImageRender.cpp10
-rw-r--r--source/gameengine/VideoTexture/blendVideoTex.cpp4
-rw-r--r--source/tests/check_deprecated.py2
588 files changed, 42596 insertions, 17911 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 38ce8689855..d6e6bf06f31 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -452,15 +452,8 @@ if(UNIX AND NOT APPLE)
if(WITH_OPENCOLLADA)
find_package(OpenCOLLADA)
if(OPENCOLLADA_FOUND)
- set(PCRE /usr CACHE PATH "PCRE Directory")
- mark_as_advanced(PCRE)
- set(PCRE_LIBPATH ${PCRE}/lib)
- set(PCRE_LIB pcre)
-
- set(EXPAT /usr CACHE PATH "Expat Directory")
- mark_as_advanced(EXPAT)
- set(EXPAT_LIBPATH ${EXPAT}/lib)
- set(EXPAT_LIB expat)
+ find_package(XML2)
+ find_package(PCRE)
else()
set(WITH_OPENCOLLADA OFF)
endif()
@@ -649,11 +642,7 @@ elseif(WIN32)
set(GETTEXT ${LIBDIR}/gettext)
set(GETTEXT_INC ${GETTEXT}/include)
set(GETTEXT_LIBPATH ${GETTEXT}/lib)
- if(CMAKE_CL_64)
- set(GETTEXT_LIB gettext)
- else()
- set(GETTEXT_LIB gnu_gettext)
- endif()
+ set(GETTEXT_LIB gnu_gettext)
endif()
if(CMAKE_CL_64)
@@ -709,7 +698,7 @@ elseif(WIN32)
${LIBDIR}/opencollada/lib/ftoa.lib
${LIBDIR}/opencollada/lib/UTF.lib
)
- set(PCRE_LIB
+ set(PCRE_LIBRARIES
${LIBDIR}/opencollada/lib/pcre.lib
)
endif()
@@ -797,7 +786,7 @@ elseif(WIN32)
else()
# keep GCC spesific stuff here
if(CMAKE_COMPILER_IS_GNUCC)
- set(PLATFORM_LINKLIBS "-lshell32 -lshfolder -lgdi32 -lmsvcrt -lwinmm -lmingw32 -lm -lws2_32 -lz -lstdc++ -lole32 -luuid")
+ set(PLATFORM_LINKLIBS "-lshell32 -lshfolder -lgdi32 -lmsvcrt -lwinmm -lmingw32 -lm -lws2_32 -lz -lstdc++ -lole32 -luuid -lwsock32")
set(PLATFORM_CFLAGS "-pipe -funsigned-char -fno-strict-aliasing")
add_definitions(-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE)
@@ -851,7 +840,7 @@ elseif(WIN32)
)
set(OPENCOLLADA_LIBPATH ${OPENCOLLADA}/lib ${OPENCOLLADA}/lib)
set(OPENCOLLADA_LIBRARIES OpenCOLLADAStreamWriter OpenCOLLADASaxFrameworkLoader OpenCOLLADAFramework OpenCOLLADABaseUtils GeneratedSaxParser UTF MathMLSolver expat pcre buffer ftoa)
- set(PCRE_LIB pcre)
+ set(PCRE_LIBRARIES pcre)
endif()
if(WITH_CODEC_FFMPEG)
@@ -1073,7 +1062,7 @@ elseif(APPLE)
#pcre is bundled with openCollada
#set(PCRE ${LIBDIR}/pcre)
#set(PCRE_LIBPATH ${PCRE}/lib)
- set(PCRE_LIB pcre)
+ set(PCRE_LIBRARIES pcre)
#libxml2 is used
#set(EXPAT ${LIBDIR}/expat)
#set(EXPAT_LIBPATH ${EXPAT}/lib)
@@ -1267,6 +1256,7 @@ if(CMAKE_COMPILER_IS_GNUCC)
ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_POINTER_ARITH -Wpointer-arith)
ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_UNUSED_PARAMETER -Wunused-parameter)
ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_WRITE_STRINGS -Wwrite-strings)
+ ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_UNDEFINED -Wundef)
# disable because it gives warnings for printf() & friends.
# ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_DOUBLE_PROMOTION -Wdouble-promotion -Wno-error=double-promotion)
ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_NO_ERROR_UNUSED_BUT_SET_VARIABLE -Wno-error=unused-but-set-variable)
@@ -1274,6 +1264,7 @@ if(CMAKE_COMPILER_IS_GNUCC)
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_ALL -Wall)
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_INVALID_OFFSETOF -Wno-invalid-offsetof)
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_SIGN_COMPARE -Wno-sign-compare)
+ ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_UNDEFINED -Wundef)
elseif(CMAKE_C_COMPILER_ID MATCHES "Intel")
diff --git a/SConstruct b/SConstruct
index 4690e12c735..fb9e96bf66b 100644
--- a/SConstruct
+++ b/SConstruct
@@ -645,7 +645,7 @@ else:
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'win64-vc', 'linuxcross'):
dllsources = []
- if not env['OURPLATFORM'] in ('win32-mingw', 'win64-vc', 'linuxcross'):
+ if not env['OURPLATFORM'] in ('win32-mingw', 'linuxcross'):
# For MinGW and linuxcross static linking will be used
dllsources += ['${LCGDIR}/gettext/lib/gnu_gettext.dll']
diff --git a/build_files/buildbot/config/user-config-i686.py b/build_files/buildbot/config/user-config-i686.py
index 07dc4a9d831..5fe3d6891fd 100644
--- a/build_files/buildbot/config/user-config-i686.py
+++ b/build_files/buildbot/config/user-config-i686.py
@@ -87,6 +87,10 @@ WITH_BF_STATIC3DMOUSE = True
BF_3DMOUSE = '/home/sources/staticlibs/spnav'
BF_3DMOUSE_LIBPATH = '${BF_3DMOUSE}/lib32'
+# FFT
+WITH_BF_FFTW3 = True
+WITH_BF_STATICFFTW3 = True
+
# Compilation and optimization
BF_DEBUG = False
REL_CFLAGS = ['-O2']
diff --git a/build_files/buildbot/config/user-config-x86_64.py b/build_files/buildbot/config/user-config-x86_64.py
index 9c569ff4458..b8b2d7f7a5f 100644
--- a/build_files/buildbot/config/user-config-x86_64.py
+++ b/build_files/buildbot/config/user-config-x86_64.py
@@ -87,6 +87,10 @@ WITH_BF_STATIC3DMOUSE = True
BF_3DMOUSE = '/home/sources/staticlibs/spnav'
BF_3DMOUSE_LIBPATH = '${BF_3DMOUSE}/lib64'
+# FFT
+WITH_BF_FFTW3 = True
+WITH_BF_STATICFFTW3 = True
+
# Compilation and optimization
BF_DEBUG = False
REL_CFLAGS = ['-O2']
diff --git a/build_files/cmake/Modules/FindOpenCOLLADA.cmake b/build_files/cmake/Modules/FindOpenCOLLADA.cmake
index c7637283514..0c8d8c8d841 100644
--- a/build_files/cmake/Modules/FindOpenCOLLADA.cmake
+++ b/build_files/cmake/Modules/FindOpenCOLLADA.cmake
@@ -49,12 +49,14 @@ SET(_opencollada_FIND_COMPONENTS
OpenCOLLADAFramework
OpenCOLLADABaseUtils
GeneratedSaxParser
- UTF
MathMLSolver
- pcre
+)
+
+# Fedora openCOLLADA package links these statically
+SET(_opencollada_FIND_STATIC_COMPONENTS
+ UTF
ftoa
buffer
- xml2
)
SET(_opencollada_SEARCH_DIRS
@@ -104,6 +106,25 @@ FOREACH(COMPONENT ${_opencollada_FIND_COMPONENTS})
LIST(APPEND _opencollada_LIBRARIES "${OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY}")
ENDFOREACH()
+FOREACH(COMPONENT ${_opencollada_FIND_STATIC_COMPONENTS})
+ STRING(TOUPPER ${COMPONENT} UPPERCOMPONENT)
+
+ FIND_LIBRARY(OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY
+ NAMES
+ ${COMPONENT}
+ HINTS
+ ${_opencollada_SEARCH_DIRS}
+ PATH_SUFFIXES
+ lib64 lib
+ # Ubuntu ppa needs this.
+ lib64/opencollada lib/opencollada
+ )
+ MARK_AS_ADVANCED(OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY)
+ IF(OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY)
+ LIST(APPEND _opencollada_LIBRARIES "${OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY}")
+ ENDIF()
+ENDFOREACH()
+
# handle the QUIETLY and REQUIRED arguments and set OPENCOLLADA_FOUND to TRUE if
# all listed variables are TRUE
diff --git a/build_files/cmake/Modules/FindPCRE.cmake b/build_files/cmake/Modules/FindPCRE.cmake
new file mode 100644
index 00000000000..9d73e9200d9
--- /dev/null
+++ b/build_files/cmake/Modules/FindPCRE.cmake
@@ -0,0 +1,69 @@
+# - Find PCRE library
+# Find the native PCRE includes and library
+# This module defines
+# PCRE_INCLUDE_DIRS, where to find pcre.h, Set when
+# PCRE_INCLUDE_DIR is found.
+# PCRE_LIBRARIES, libraries to link against to use PCRE.
+# PCRE_ROOT_DIR, The base directory to search for PCRE.
+# This can also be an environment variable.
+# PCRE_FOUND, If false, do not try to use PCRE.
+#
+# also defined, but not for general use are
+# PCRE_LIBRARY, where to find the PCRE library.
+
+#=============================================================================
+# Copyright 2011 Blender Foundation.
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+
+# If PCRE_ROOT_DIR was defined in the environment, use it.
+IF(NOT PCRE_ROOT_DIR AND NOT $ENV{PCRE_ROOT_DIR} STREQUAL "")
+ SET(PCRE_ROOT_DIR $ENV{PCRE_ROOT_DIR})
+ENDIF()
+
+SET(_pcre_SEARCH_DIRS
+ ${PCRE_ROOT_DIR}
+ /usr/local
+ /sw # Fink
+ /opt/local # DarwinPorts
+ /opt/csw # Blastwave
+)
+
+FIND_PATH(PCRE_INCLUDE_DIR pcre.h
+ HINTS
+ ${_pcre_SEARCH_DIRS}
+ PATH_SUFFIXES
+ include
+ include
+)
+
+FIND_LIBRARY(PCRE_LIBRARY
+ NAMES
+ pcre
+ HINTS
+ ${_pcre_SEARCH_DIRS}
+ PATH_SUFFIXES
+ lib64 lib
+ )
+
+# handle the QUIETLY and REQUIRED arguments and set PCRE_FOUND to TRUE if
+# all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(PCRE DEFAULT_MSG
+ PCRE_LIBRARY PCRE_INCLUDE_DIR)
+
+IF(PCRE_FOUND)
+ SET(PCRE_LIBRARIES ${PCRE_LIBRARY})
+ SET(PCRE_INCLUDE_DIRS ${PCRE_INCLUDE_DIR})
+ENDIF(PCRE_FOUND)
+
+MARK_AS_ADVANCED(
+ PCRE_INCLUDE_DIR
+ PCRE_LIBRARY
+)
diff --git a/build_files/cmake/Modules/FindXML2.cmake b/build_files/cmake/Modules/FindXML2.cmake
new file mode 100644
index 00000000000..40cc332fb88
--- /dev/null
+++ b/build_files/cmake/Modules/FindXML2.cmake
@@ -0,0 +1,68 @@
+# - Find XML2 library
+# Find the native XML2 includes and library
+# This module defines
+# XML2_INCLUDE_DIRS, where to find xml2.h, Set when
+# XML2_INCLUDE_DIR is found.
+# XML2_LIBRARIES, libraries to link against to use XML2.
+# XML2_ROOT_DIR, The base directory to search for XML2.
+# This can also be an environment variable.
+# XML2_FOUND, If false, do not try to use XML2.
+#
+# also defined, but not for general use are
+# XML2_LIBRARY, where to find the XML2 library.
+
+#=============================================================================
+# Copyright 2011 Blender Foundation.
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+
+# If XML2_ROOT_DIR was defined in the environment, use it.
+IF(NOT XML2_ROOT_DIR AND NOT $ENV{XML2_ROOT_DIR} STREQUAL "")
+ SET(XML2_ROOT_DIR $ENV{XML2_ROOT_DIR})
+ENDIF()
+
+SET(_xml2_SEARCH_DIRS
+ ${XML2_ROOT_DIR}
+ /usr/local
+ /sw # Fink
+ /opt/local # DarwinPorts
+ /opt/csw # Blastwave
+)
+
+FIND_PATH(XML2_INCLUDE_DIR libxml2/libxml/xpath.h
+ HINTS
+ ${_xml2_SEARCH_DIRS}
+ PATH_SUFFIXES
+ include
+)
+
+FIND_LIBRARY(XML2_LIBRARY
+ NAMES
+ xml2
+ HINTS
+ ${_xml2_SEARCH_DIRS}
+ PATH_SUFFIXES
+ lib64 lib
+ )
+
+# handle the QUIETLY and REQUIRED arguments and set XML2_FOUND to TRUE if
+# all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(XML2 DEFAULT_MSG
+ XML2_LIBRARY XML2_INCLUDE_DIR)
+
+IF(XML2_FOUND)
+ SET(XML2_LIBRARIES ${XML2_LIBRARY})
+ SET(XML2_INCLUDE_DIRS ${XML2_INCLUDE_DIR})
+ENDIF(XML2_FOUND)
+
+MARK_AS_ADVANCED(
+ XML2_INCLUDE_DIR
+ XML2_LIBRARY
+)
diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake
index 58938c8b0b0..aec7a9fd96c 100644
--- a/build_files/cmake/macros.cmake
+++ b/build_files/cmake/macros.cmake
@@ -295,10 +295,10 @@ macro(setup_liblinks
target_link_libraries_optimized(${target} "${OPENCOLLADA_LIBRARIES}")
unset(OPENCOLLADA_LIBRARIES_DEBUG)
- file_list_suffix(PCRE_LIB_DEBUG "${PCRE_LIB}" "_d")
- target_link_libraries_debug(${target} "${PCRE_LIB_DEBUG}")
- target_link_libraries_optimized(${target} "${PCRE_LIB}")
- unset(PCRE_LIB_DEBUG)
+ file_list_suffix(PCRE_LIBRARIES_DEBUG "${PCRE_LIBRARIES}" "_d")
+ target_link_libraries_debug(${target} "${PCRE_LIBRARIES_DEBUG}")
+ target_link_libraries_optimized(${target} "${PCRE_LIBRARIES}")
+ unset(PCRE_LIBRARIES_DEBUG)
if(EXPAT_LIB)
file_list_suffix(EXPAT_LIB_DEBUG "${EXPAT_LIB}" "_d")
@@ -309,7 +309,8 @@ macro(setup_liblinks
else()
target_link_libraries(${target}
${OPENCOLLADA_LIBRARIES}
- ${PCRE_LIB}
+ ${PCRE_LIBRARIES}
+ ${XML2_LIBRARIES}
${EXPAT_LIB})
endif()
endif()
@@ -392,6 +393,7 @@ macro(remove_strict_flags)
remove_flag("-Wstrict-prototypes")
remove_flag("-Wunused-parameter")
remove_flag("-Wwrite-strings")
+ remove_flag("-Wundef")
remove_flag("-Wshadow")
remove_flag("-Werror=[^ ]+")
remove_flag("-Werror")
diff --git a/build_files/scons/config/darwin-config.py b/build_files/scons/config/darwin-config.py
index 102ec73a4e3..29d2b39323e 100644
--- a/build_files/scons/config/darwin-config.py
+++ b/build_files/scons/config/darwin-config.py
@@ -14,7 +14,7 @@ USE_SDK=True
################### Cocoa & architecture settings ##################
#############################################################################
WITH_GHOST_COCOA=True
-MACOSX_ARCHITECTURE = 'x86_64' # valid archs: ppc, i386, ppc64, x86_64
+MACOSX_ARCHITECTURE = 'i386' # valid archs: ppc, i386, ppc64, x86_64
cmd = 'uname -p'
diff --git a/build_files/scons/config/linuxcross-config.py b/build_files/scons/config/linuxcross-config.py
index 1bdf735f458..8057d478c31 100644
--- a/build_files/scons/config/linuxcross-config.py
+++ b/build_files/scons/config/linuxcross-config.py
@@ -127,6 +127,7 @@ WITH_BF_BINRELOC = False
WITH_BF_FFMPEG = True # -DWITH_FFMPEG
BF_FFMPEG = LIBDIR + '/ffmpeg'
BF_FFMPEG_LIB = 'avformat-53 avcodec-53 avdevice-53 avutil-51 swscale-2'
+BF_FFMPEG_DLL = '${BF_FFMPEG_LIBPATH}/avformat-53.dll ${BF_FFMPEG_LIBPATH}/avcodec-53.dll ${BF_FFMPEG_LIBPATH}/avdevice-53.dll ${BF_FFMPEG_LIBPATH}/avutil-51.dll ${BF_FFMPEG_LIBPATH}/swscale-2.dll'
BF_FFMPEG_INC = '${BF_FFMPEG}/include'
BF_FFMPEG_LIBPATH = '${BF_FFMPEG}/lib'
BF_FFMPEG_DLL = '${BF_FFMPEG_LIBPATH}/avformat-53.dll ${BF_FFMPEG_LIBPATH}/avcodec-53.dll ${BF_FFMPEG_LIBPATH}/avdevice-53.dll ${BF_FFMPEG_LIBPATH}/avutil-51.dll ${BF_FFMPEG_LIBPATH}/swscale-2.dll'
diff --git a/build_files/scons/config/win32-mingw-config.py b/build_files/scons/config/win32-mingw-config.py
index c815b76ef73..37d693db560 100644
--- a/build_files/scons/config/win32-mingw-config.py
+++ b/build_files/scons/config/win32-mingw-config.py
@@ -174,7 +174,7 @@ C_WARN = ['-Wno-char-subscripts', '-Wdeclaration-after-statement', '-Wstrict-pro
CC_WARN = [ '-Wall' ]
-LLIBS = ['-lshell32', '-lshfolder', '-lgdi32', '-lmsvcrt', '-lwinmm', '-lmingw32', '-lm', '-lws2_32', '-lz', '-lstdc++','-lole32','-luuid']
+LLIBS = ['-lshell32', '-lshfolder', '-lgdi32', '-lmsvcrt', '-lwinmm', '-lmingw32', '-lm', '-lws2_32', '-lz', '-lstdc++','-lole32','-luuid', '-lwsock32']
PLATFORM_LINKFLAGS = ['--stack,2097152']
diff --git a/build_files/scons/config/win64-vc-config.py b/build_files/scons/config/win64-vc-config.py
index ba9633a6b4c..3e22e9a634f 100644
--- a/build_files/scons/config/win64-vc-config.py
+++ b/build_files/scons/config/win64-vc-config.py
@@ -100,7 +100,7 @@ WITH_BF_INTERNATIONAL = False
BF_GETTEXT = LIBDIR + '/gettext'
BF_GETTEXT_INC = '${BF_GETTEXT}/include'
-BF_GETTEXT_LIB = 'gettext'
+BF_GETTEXT_LIB = 'gnu_gettext'
BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib'
WITH_BF_GAMEENGINE = True
diff --git a/doc/python_api/examples/bge.texture.1.py b/doc/python_api/examples/bge.texture.1.py
index faa0ae736e8..4be6f51de67 100644
--- a/doc/python_api/examples/bge.texture.1.py
+++ b/doc/python_api/examples/bge.texture.1.py
@@ -14,7 +14,7 @@ def createTexture(cont):
object = cont.owner
# get the reference pointer (ID) of the internal texture
- ID = texture.materialID(obj, 'IMoriginal.png')
+ ID = texture.materialID(object, 'IMoriginal.png')
# create a texture object
object_texture = texture.Texture(object, ID)
diff --git a/doc/python_api/examples/bpy.types.Operator.py b/doc/python_api/examples/bpy.types.Operator.py
index 52edfa0a61b..0981712e1ff 100644
--- a/doc/python_api/examples/bpy.types.Operator.py
+++ b/doc/python_api/examples/bpy.types.Operator.py
@@ -21,7 +21,7 @@ class HelloWorldOperator(bpy.types.Operator):
print("Hello World")
return {'FINISHED'}
-bpy.utils.register_class(SimpleOperator)
+bpy.utils.register_class(HelloWorldOperator)
# test call to the newly defined operator
bpy.ops.wm.hello_world()
diff --git a/doc/python_api/rst/bge.types.rst b/doc/python_api/rst/bge.types.rst
index d9a93a945ed..b1277df4c90 100644
--- a/doc/python_api/rst/bge.types.rst
+++ b/doc/python_api/rst/bge.types.rst
@@ -1539,7 +1539,7 @@ Game Types (bge.types)
Return the value matching key, or the default value if its not found.
:return: The key value or a default.
- .. method:: playAction(name, start_frame, end_frame, layer=0, priority=0 blendin=0, play_mode=ACT_MODE_PLAY, layer_weight=0.0, ipo_flags=0, speed=1.0)
+ .. method:: playAction(name, start_frame, end_frame, layer=0, priority=0, blendin=0, play_mode=ACT_MODE_PLAY, layer_weight=0.0, ipo_flags=0, speed=1.0)
Plays an action.
diff --git a/doc/python_api/rst/bgl.rst b/doc/python_api/rst/bgl.rst
index 5f3158bf5dd..61400351d16 100644
--- a/doc/python_api/rst/bgl.rst
+++ b/doc/python_api/rst/bgl.rst
@@ -56,9 +56,9 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type n: int
:arg n: Specifies the number of textures to be queried.
- :type textures: :class:`Buffer` object I{type GL_INT}
+ :type textures: :class:`bgl.Buffer` object I{type GL_INT}
:arg textures: Specifies an array containing the names of the textures to be queried
- :type residences: :class:`Buffer` object I{type GL_INT}(boolean)
+ :type residences: :class:`bgl.Buffer` object I{type GL_INT}(boolean)
:arg residences: An array in which the texture residence status in returned.
The residence status of a texture named by an element of textures is
returned in the corresponding element of residences.
@@ -101,7 +101,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type xmove, ymove: float
:arg xmove, ymove: Specify the x and y offsets to be added to the current raster position after
the bitmap is drawn.
- :type bitmap: :class:`Buffer` object I{type GL_BYTE}
+ :type bitmap: :class:`bgl.Buffer` object I{type GL_BYTE}
:arg bitmap: Specifies the address of the bitmap image.
@@ -139,7 +139,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg n: Specifies the number of display lists to be executed.
:type type: Enumerated constant
:arg type: Specifies the type of values in lists.
- :type lists: :class:`Buffer` object
+ :type lists: :class:`bgl.Buffer` object
:arg lists: Specifies the address of an array of name offsets in the display list.
The pointer type is void because the offsets can be bytes, shorts, ints, or floats,
depending on the value of type.
@@ -217,7 +217,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type plane: Enumerated constant
:arg plane: Specifies which clipping plane is being positioned.
- :type equation: :class:`Buffer` object I{type GL_FLOAT}(double)
+ :type equation: :class:`bgl.Buffer` object I{type GL_FLOAT}(double)
:arg equation: Specifies the address of an array of four double- precision
floating-point values. These values are interpreted as a plane equation.
@@ -340,7 +340,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type n: int
:arg n: Specifies the number of textures to be deleted
- :type textures: :class:`Buffer` I{GL_INT}
+ :type textures: :class:`bgl.Buffer` I{GL_INT}
:arg textures: Specifies an array of textures to be deleted
@@ -413,7 +413,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg format: Specifies the format of the pixel data.
:type type: Enumerated constant
:arg type: Specifies the data type for pixels.
- :type pixels: :class:`Buffer` object
+ :type pixels: :class:`bgl.Buffer` object
:arg pixels: Specifies a pointer to the pixel data.
@@ -512,7 +512,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type type: Enumerated constant
:arg type: Specifies a symbolic constant that describes the information that
will be returned for each vertex.
- :type buffer: :class:`Buffer` object I{GL_FLOAT}
+ :type buffer: :class:`bgl.Buffer` object I{GL_FLOAT}
:arg buffer: Returns the feedback data.
@@ -592,7 +592,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type n: int
:arg n: Specifies the number of textures name to be generated.
- :type textures: :class:`Buffer` object I{type GL_INT}
+ :type textures: :class:`bgl.Buffer` object I{type GL_INT}
:arg textures: Specifies an array in which the generated textures names are stored.
@@ -620,7 +620,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg plane: Specifies a clipping plane. The number of clipping planes depends on the
implementation, but at least six clipping planes are supported. They are identified by
symbolic names of the form GL_CLIP_PLANEi where 0 < i < GL_MAX_CLIP_PLANES.
- :type equation: :class:`Buffer` object I{type GL_FLOAT}
+ :type equation: :class:`bgl.Buffer` object I{type GL_FLOAT}
:arg equation: Returns four float (double)-precision values that are the coefficients of the
plane equation of plane in eye coordinates. The initial value is (0, 0, 0, 0).
@@ -646,7 +646,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
names of the form GL_LIGHTi where 0 < i < GL_MAX_LIGHTS.
:type pname: Enumerated constant
:arg pname: Specifies a light source parameter for light.
- :type params: :class:`Buffer` object. Depends on function prototype.
+ :type params: :class:`bgl.Buffer` object. Depends on function prototype.
:arg params: Returns the requested data.
@@ -662,7 +662,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg target: Specifies the symbolic name of a map.
:type query: Enumerated constant
:arg query: Specifies which parameter to return.
- :type v: :class:`Buffer` object. Depends on function prototype.
+ :type v: :class:`bgl.Buffer` object. Depends on function prototype.
:arg v: Returns the requested data.
@@ -679,7 +679,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
representing the front and back materials, respectively.
:type pname: Enumerated constant
:arg pname: Specifies the material parameter to return.
- :type params: :class:`Buffer` object. Depends on function prototype.
+ :type params: :class:`bgl.Buffer` object. Depends on function prototype.
:arg params: Returns the requested data.
@@ -693,7 +693,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type map: Enumerated constant
:arg map: Specifies the name of the pixel map to return.
- :type values: :class:`Buffer` object. Depends on function prototype.
+ :type values: :class:`bgl.Buffer` object. Depends on function prototype.
:arg values: Returns the pixel map contents.
@@ -703,7 +703,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
.. seealso:: `OpenGL Docs <http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/getpolygonstipple.html>`_
- :type mask: :class:`Buffer` object I{type GL_BYTE}
+ :type mask: :class:`bgl.Buffer` object I{type GL_BYTE}
:arg mask: Returns the stipple pattern. The initial value is all 1's.
@@ -730,7 +730,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg target: Specifies a texture environment. Must be GL_TEXTURE_ENV.
:type pname: Enumerated constant
:arg pname: Specifies the symbolic name of a texture environment parameter.
- :type params: :class:`Buffer` object. Depends on function prototype.
+ :type params: :class:`bgl.Buffer` object. Depends on function prototype.
:arg params: Returns the requested data.
@@ -746,7 +746,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg coord: Specifies a texture coordinate.
:type pname: Enumerated constant
:arg pname: Specifies the symbolic name of the value(s) to be returned.
- :type params: :class:`Buffer` object. Depends on function prototype.
+ :type params: :class:`bgl.Buffer` object. Depends on function prototype.
:arg params: Returns the requested data.
@@ -765,7 +765,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg format: Specifies a pixel format for the returned data.
:type type: Enumerated constant
:arg type: Specifies a pixel type for the returned data.
- :type pixels: :class:`Buffer` object.
+ :type pixels: :class:`bgl.Buffer` object.
:arg pixels: Returns the texture image. Should be a pointer to an array of the
type specified by type
@@ -785,7 +785,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
Level 0 is the base image level. Level n is the nth mipmap reduction image.
:type pname: Enumerated constant
:arg pname: Specifies the symbolic name of a texture parameter.
- :type params: :class:`Buffer` object. Depends on function prototype.
+ :type params: :class:`bgl.Buffer` object. Depends on function prototype.
:arg params: Returns the requested data.
@@ -801,7 +801,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg target: Specifies the symbolic name of the target texture.
:type pname: Enumerated constant
:arg pname: Specifies the symbolic name the target texture.
- :type params: :class:`Buffer` object. Depends on function prototype.
+ :type params: :class:`bgl.Buffer` object. Depends on function prototype.
:arg params: Returns the texture parameters.
@@ -826,7 +826,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
.. seealso:: `OpenGL Docs <http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/index_.html>`_
- :type c: :class:`Buffer` object. Depends on function prototype.
+ :type c: :class:`bgl.Buffer` object. Depends on function prototype.
:arg c: Specifies a pointer to a one element array that contains the new value for
the current color index.
@@ -956,7 +956,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
.. seealso:: `OpenGL Docs <http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/loadmatrix.html>`_
- :type m: :class:`Buffer` object. Depends on function prototype.
+ :type m: :class:`bgl.Buffer` object. Depends on function prototype.
:arg m: Specifies a pointer to 16 consecutive values, which are used as the elements
of a 4x4 column-major matrix.
@@ -1002,7 +1002,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
occupy contiguous memory locations.
:type order: int
:arg order: Specifies the number of control points. Must be positive.
- :type points: :class:`Buffer` object. Depends on function prototype.
+ :type points: :class:`bgl.Buffer` object. Depends on function prototype.
:arg points: Specifies a pointer to the array of control points.
@@ -1043,7 +1043,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type vorder: int
:arg vorder: Specifies the dimension of the control point array in the v axis.
Must be positive. The initial value is 1.
- :type points: :class:`Buffer` object. Depends on function prototype.
+ :type points: :class:`bgl.Buffer` object. Depends on function prototype.
:arg points: Specifies a pointer to the array of control points.
@@ -1103,7 +1103,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
.. seealso:: `OpenGL Docs <http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/multmatrix.html>`_
- :type m: :class:`Buffer` object. Depends on function prototype.
+ :type m: :class:`bgl.Buffer` object. Depends on function prototype.
:arg m: Points to 16 consecutive values that are used as the elements of a 4x4 column
major matrix.
@@ -1132,7 +1132,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type nx, ny, nz: Depends on function prototype. (non - 'v' prototypes only)
:arg nx, ny, nz: Specify the x, y, and z coordinates of the new current normal.
The initial value of the current normal is the unit vector, (0, 0, 1).
- :type v: :class:`Buffer` object. Depends on function prototype. ('v' prototypes)
+ :type v: :class:`bgl.Buffer` object. Depends on function prototype. ('v' prototypes)
:arg v: Specifies a pointer to an array of three elements: the x, y, and z coordinates
of the new current normal.
@@ -1177,7 +1177,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg map: Specifies a symbolic map name.
:type mapsize: int
:arg mapsize: Specifies the size of the map being defined.
- :type values: :class:`Buffer` object. Depends on function prototype.
+ :type values: :class:`bgl.Buffer` object. Depends on function prototype.
:arg values: Specifies an array of mapsize values.
@@ -1266,7 +1266,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
.. seealso:: `OpenGL Docs <http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/polygonstipple.html>`_
- :type mask: :class:`Buffer` object I{type GL_BYTE}
+ :type mask: :class:`bgl.Buffer` object I{type GL_BYTE}
:arg mask: Specifies a pointer to a 32x32 stipple pattern that will be unpacked
from memory in the same way that glDrawPixels unpacks pixels.
@@ -1307,9 +1307,9 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type n: int
:arg n: Specifies the number of textures to be prioritized.
- :type textures: :class:`Buffer` I{type GL_INT}
+ :type textures: :class:`bgl.Buffer` I{type GL_INT}
:arg textures: Specifies an array containing the names of the textures to be prioritized.
- :type priorities: :class:`Buffer` I{type GL_FLOAT}
+ :type priorities: :class:`bgl.Buffer` I{type GL_FLOAT}
:arg priorities: Specifies an array containing the texture priorities.
A priority given in an element of priorities applies to the texture named
by the corresponding element of textures.
@@ -1417,7 +1417,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg format: Specifies the format of the pixel data.
:type type: Enumerated constant
:arg type: Specifies the data type of the pixel data.
- :type pixels: :class:`Buffer` object
+ :type pixels: :class:`bgl.Buffer` object
:arg pixels: Returns the pixel data.
@@ -1496,7 +1496,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type size: int
:arg size: Specifies the size of buffer
- :type buffer: :class:`Buffer` I{type GL_INT}
+ :type buffer: :class:`bgl.Buffer` I{type GL_INT}
:arg buffer: Returns the selection data
@@ -1575,7 +1575,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type s, t, r, q: Depends on function prototype. (r and q for '3' and '4' prototypes only)
:arg s, t, r, q: Specify s, t, r, and q texture coordinates. Not all parameters are
present in all forms of the command.
- :type v: :class:`Buffer` object. Depends on function prototype. (for 'v' prototypes only)
+ :type v: :class:`bgl.Buffer` object. Depends on function prototype. (for 'v' prototypes only)
:arg v: Specifies a pointer to an array of one, two, three, or four elements,
which in turn specify the s, t, r, and q texture coordinates.
@@ -1642,7 +1642,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg format: Specifies the format of the pixel data.
:type type: Enumerated constant
:arg type: Specifies the data type of the pixel data.
- :type pixels: :class:`Buffer` object.
+ :type pixels: :class:`bgl.Buffer` object.
:arg pixels: Specifies a pointer to the image data in memory.
@@ -1673,7 +1673,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg format: Specifies the format of the pixel data.
:type type: Enumerated constant
:arg type: Specifies the data type of the pixel data.
- :type pixels: :class:`Buffer` object.
+ :type pixels: :class:`bgl.Buffer` object.
:arg pixels: Specifies a pointer to the image data in memory.
@@ -1720,7 +1720,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type x, y, z, w: Depends on function prototype (z and w for '3' and '4' prototypes only)
:arg x, y, z, w: Specify x, y, z, and w coordinates of a vertex. Not all parameters
are present in all forms of the command.
- :type v: :class:`Buffer` object. Depends of function prototype (for 'v'
+ :type v: :class:`bgl.Buffer` object. Depends of function prototype (for 'v'
prototypes only)
:arg v: Specifies a pointer to an array of two, three, or four elements. The
elements of a two-element array are x and y; of a three-element array,
@@ -1795,7 +1795,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:arg x, y: Specify the center of a picking region in window coordinates.
:type width, height: double
:arg width, height: Specify the width and height, respectively, of the picking region in window coordinates.
- :type viewport: :class:`Buffer` object. [int]
+ :type viewport: :class:`bgl.Buffer` object. [int]
:arg viewport: Specifies the current viewport.
@@ -1807,13 +1807,13 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type objx, objy, objz: double
:arg objx, objy, objz: Specify the object coordinates.
- :type modelMatrix: :class:`Buffer` object. [double]
+ :type modelMatrix: :class:`bgl.Buffer` object. [double]
:arg modelMatrix: Specifies the current modelview matrix (as from a glGetDoublev call).
- :type projMatrix: :class:`Buffer` object. [double]
+ :type projMatrix: :class:`bgl.Buffer` object. [double]
:arg projMatrix: Specifies the current projection matrix (as from a glGetDoublev call).
- :type viewport: :class:`Buffer` object. [int]
+ :type viewport: :class:`bgl.Buffer` object. [int]
:arg viewport: Specifies the current viewport (as from a glGetIntegerv call).
- :type winx, winy, winz: :class:`Buffer` object. [double]
+ :type winx, winy, winz: :class:`bgl.Buffer` object. [double]
:arg winx, winy, winz: Return the computed window coordinates.
@@ -1825,13 +1825,13 @@ OpenGL}" and the online NeHe tutorials are two of the best resources.
:type winx, winy, winz: double
:arg winx, winy, winz: Specify the window coordinates to be mapped.
- :type modelMatrix: :class:`Buffer` object. [double]
+ :type modelMatrix: :class:`bgl.Buffer` object. [double]
:arg modelMatrix: Specifies the current modelview matrix (as from a glGetDoublev call).
- :type projMatrix: :class:`Buffer` object. [double]
+ :type projMatrix: :class:`bgl.Buffer` object. [double]
:arg projMatrix: Specifies the current projection matrix (as from a glGetDoublev call).
- :type viewport: :class:`Buffer` object. [int]
+ :type viewport: :class:`bgl.Buffer` object. [int]
:arg viewport: Specifies the current viewport (as from a glGetIntegerv call).
- :type objx, objy, objz: :class:`Buffer` object. [double]
+ :type objx, objy, objz: :class:`bgl.Buffer` object. [double]
:arg objx, objy, objz: Return the computed object coordinates.
diff --git a/doc/python_api/rst/gpu.rst b/doc/python_api/rst/gpu.rst
new file mode 100644
index 00000000000..72a5dc2f5d3
--- /dev/null
+++ b/doc/python_api/rst/gpu.rst
@@ -0,0 +1,531 @@
+
+GPU functions (gpu)
+===================
+
+*****
+Intro
+*****
+
+Module to provide functions concerning the GPU implementation in Blender, in particular
+the GLSL shaders that blender generates automatically to render materials in the 3D view
+and in the game engine.
+
+.. warning::
+
+ The API provided by this module should be consider unstable. The data exposed by the API
+ are are closely related to Blender's internal GLSL code and may change if the GLSL code
+ is modified (e.g. new uniform type).
+
+.. module:: gpu
+
+*********
+Constants
+*********
+
+--------------
+GLSL data type
+--------------
+
+.. _data-type:
+
+Type of GLSL data.
+For shader uniforms, the data type determines which glUniform function
+variant to use to send the uniform value to the GPU.
+For vertex attributes, the data type determines which glVertexAttrib function
+variant to use to send the vertex attribute to the GPU.
+
+See export_shader_
+
+.. data:: GPU_DATA_1I
+
+ one integer
+
+ :value: 1
+
+.. data:: GPU_DATA_1F
+
+ one float
+
+ :value: 2
+
+.. data:: GPU_DATA_2F
+
+ two floats
+
+ :value: 3
+
+.. data:: GPU_DATA_3F
+
+ three floats
+
+ :value: 4
+
+.. data:: GPU_DATA_4F
+
+ four floats
+
+ :value: 5
+
+.. data:: GPU_DATA_9F
+
+ matrix 3x3 in column-major order
+
+ :value: 6
+
+.. data:: GPU_DATA_16F
+
+ matrix 4x4 in column-major order
+
+ :value: 7
+
+.. data:: GPU_DATA_4UB
+
+ four unsigned byte
+
+ :value: 8
+
+-----------------
+GLSL uniform type
+-----------------
+
+.. _uniform-type:
+
+Constants that specify the type of uniform used in a GLSL shader.
+The uniform type determines the data type, origin and method
+of calculation used by Blender to compute the uniform value.
+
+The calculation of some of the uniforms is based on matrices available in the scene:
+
+ .. _mat4_cam_to_world:
+ .. _mat4_world_to_cam:
+
+ *mat4_cam_to_world*
+ Model matrix of the camera. OpenGL 4x4 matrix that converts
+ camera local coordinates to world coordinates. In blender this is obtained from the
+ 'matrix_world' attribute of the camera object.
+
+ Some uniform will need the *mat4_world_to_cam*
+ matrix computed as the inverse of this matrix.
+
+ .. _mat4_object_to_world:
+ .. _mat4_world_to_object:
+
+ *mat4_object_to_world*
+ Model matrix of the object that is being rendered. OpenGL 4x4 matric that converts
+ object local coordinates to world coordinates. In blender this is obtained from the
+ 'matrix_world' attribute of the object.
+
+ Some uniform will need the *mat4_world_to_object* matrix, computed as the inverse of this matrix.
+
+ .. _mat4_lamp_to_world:
+ .. _mat4_world_to_lamp:
+
+ *mat4_lamp_to_world*
+ Model matrix of the lamp lighting the object. OpenGL 4x4 matrix that converts lamp
+ local coordinates to world coordinates. In blender this is obtained from the
+ 'matrix_world' attribute of the lamp object.
+
+ Some uniform will need the *mat4_world_to_lamp* matrix
+ computed as the inverse of this matrix.
+
+.. data:: GPU_DYNAMIC_OBJECT_VIEWMAT
+
+ The uniform is a 4x4 GL matrix that converts world coordinates to
+ camera coordinates (see mat4_world_to_cam_). Can be set once per frame.
+ There is at most one uniform of that type per shader.
+
+ :value: 1
+
+.. data:: GPU_DYNAMIC_OBJECT_MAT
+
+ The uniform is a 4x4 GL matrix that converts object coordinates
+ to world coordinates (see mat4_object_to_world_). Must be set before drawing the object.
+ There is at most one uniform of that type per shader.
+
+ :value: 2
+
+.. data:: GPU_DYNAMIC_OBJECT_VIEWIMAT
+
+ The uniform is a 4x4 GL matrix that converts coordinates
+ in camera space to world coordinates (see mat4_cam_to_world_).
+ Can be set once per frame.
+ There is at most one uniform of that type per shader.
+
+ :value: 3
+
+.. data:: GPU_DYNAMIC_OBJECT_IMAT
+
+ The uniform is a 4x4 GL matrix that converts world coodinates
+ to object coordinates (see mat4_world_to_object_).
+ Must be set before drawing the object.
+ There is at most one uniform of that type per shader.
+
+ :value: 4
+
+.. data:: GPU_DYNAMIC_OBJECT_COLOR
+
+ The uniform is a vector of 4 float representing a RGB color + alpha defined at object level.
+ Each values between 0.0 and 1.0. In blender it corresponds to the 'color' attribute of the object.
+ Must be set before drawing the object.
+ There is at most one uniform of that type per shader.
+
+ :value: 5
+
+.. data:: GPU_DYNAMIC_LAMP_DYNVEC
+
+ The uniform is a vector of 3 float representing the direction of light in camera space.
+ In Blender, this is computed by
+
+ mat4_world_to_cam_ * (-vec3_lamp_Z_axis)
+
+ as the lamp Z axis points to the opposite direction of light.
+ The norm of the vector should be unity. Can be set once per frame.
+ There is one uniform of that type per lamp lighting the material.
+
+ :value: 6
+
+.. data:: GPU_DYNAMIC_LAMP_DYNCO
+
+ The uniform is a vector of 3 float representing the position of the light in camera space.
+ Computed as
+
+ mat4_world_to_cam_ * vec3_lamp_pos
+
+ Can be set once per frame.
+ There is one uniform of that type per lamp lighting the material.
+
+ :value: 7
+
+.. data:: GPU_DYNAMIC_LAMP_DYNIMAT
+
+ The uniform is a 4x4 GL matrix that converts vector in camera space to lamp space.
+ Computed as
+
+ mat4_world_to_lamp_ * mat4_cam_to_world_
+
+ Can be set once per frame.
+ There is one uniform of that type per lamp lighting the material.
+
+ :value: 8
+
+.. data:: GPU_DYNAMIC_LAMP_DYNPERSMAT
+
+ The uniform is a 4x4 GL matrix that converts a vector in camera space to shadow buffer depth space.
+ Computed as
+
+ mat4_perspective_to_depth_ * mat4_lamp_to_perspective_ * mat4_world_to_lamp_ * mat4_cam_to_world_.
+
+ .. _mat4_perspective_to_depth:
+
+ *mat4_perspective_to_depth* is a fixed matrix defined as follow::
+
+ 0.5 0.0 0.0 0.5
+ 0.0 0.5 0.0 0.5
+ 0.0 0.0 0.5 0.5
+ 0.0 0.0 0.0 1.0
+
+ This uniform can be set once per frame. There is one uniform of that type per lamp casting shadow in the scene.
+
+ :value: 9
+
+.. data:: GPU_DYNAMIC_LAMP_DYNENERGY
+
+ The uniform is a single float representing the lamp energy. In blender it corresponds
+ to the 'energy' attribute of the lamp data block.
+ There is one uniform of that type per lamp lighting the material.
+
+ :value: 10
+
+.. data:: GPU_DYNAMIC_LAMP_DYNCOL
+
+ The uniform is a vector of 3 float representing the lamp color.
+ Color elements are between 0.0 and 1.0. In blender it corresponds
+ to the 'color' attribute of the lamp data block.
+ There is one uniform of that type per lamp lighting the material.
+
+ :value: 11
+
+.. data:: GPU_DYNAMIC_SAMPLER_2DBUFFER
+
+ The uniform is an integer representing an internal texture used for certain effect
+ (color band, etc).
+
+ :value: 12
+
+.. data:: GPU_DYNAMIC_SAMPLER_2DIMAGE
+
+ The uniform is an integer representing a texture loaded from an image file.
+
+ :value: 13
+
+.. data:: GPU_DYNAMIC_SAMPLER_2DSHADOW
+
+ The uniform is an integer representing a shadow buffer corresponding to a lamp
+ casting shadow.
+
+ :value: 14
+
+-------------------
+GLSL attribute type
+-------------------
+
+.. _attribute-type:
+
+Type of the vertex attribute used in the GLSL shader. Determines the mesh custom data
+layer that contains the vertex attribute.
+
+.. data:: CD_MTFACE
+
+ Vertex attribute is a UV layer. Data type is vector of 2 float.
+
+ There can be more than one attribute of that type, they are differenciated by name.
+ In blender, you can retrieve the attribute data with:
+
+ .. code-block:: python
+
+ mesh.uv_textures[attribute['name']]
+
+ :value: 5
+
+.. data:: CD_MCOL
+
+ Vertex attribute is color layer. Data type is vector 4 unsigned byte (RGBA).
+
+ There can be more than one attribute of that type, they are differenciated by name.
+ In blender you can retrieve the attribute data with:
+
+ .. code-block:: python
+
+ mesh.vertex_colors[attribute['name']]
+
+ :value: 6
+
+.. data:: CD_ORCO
+
+ Vertex attribute is original coordinates. Data type is vector 3 float.
+
+ There can be only 1 attribute of that type per shader.
+ In blender you can retrieve the attribute data with:
+
+ .. code-block:: python
+
+ mesh.vertices
+
+ :value: 14
+
+.. data:: CD_TANGENT
+
+ Vertex attribute is the tangent vector. Data type is vector 4 float.
+
+ There can be only 1 attribute of that type per shader.
+ There is currently no way to retrieve this attribute data via the RNA API but a standalone
+ C function to compute the tangent layer from the other layers can be obtained from
+ blender.org.
+
+ :value: 18
+
+*********
+Functions
+*********
+
+.. _export_shader:
+
+.. function:: export_shader(scene,material)
+
+ Extracts the GLSL shader producing the visual effect of material in scene for the purpose of
+ reusing the shader in an external engine. This function is meant to be used in material exporter
+ so that the GLSL shader can be exported entirely. The return value is a dictionary containing the
+ shader source code and all associated data.
+
+ :arg scene: the scene in which the material in rendered.
+ :type scene: :class:`bpy.types.Scene`
+ :arg material: the material that you want to export the GLSL shader
+ :type material: :class:`bpy.types.Material`
+ :return: the shader source code and all associated data in a dictionary
+ :rtype: dictionary
+
+ The dictionary contains the following elements:
+
+ * ['fragment'] : string
+ fragment shader source code.
+
+ * ['vertex'] : string
+ vertex shader source code.
+
+ * ['uniforms'] : sequence
+ list of uniforms used in fragment shader, can be empty list. Each element of the
+ sequence is a dictionary with the following elements:
+
+ * ['varname'] : string
+ name of the uniform in the fragment shader. Always of the form 'unf<number>'.
+
+ * ['datatype'] : integer
+ data type of the uniform variable. Can be one of the following:
+
+ * :data:`gpu.GPU_DATA_1I` : use glUniform1i
+ * :data:`gpu.GPU_DATA_1F` : use glUniform1fv
+ * :data:`gpu.GPU_DATA_2F` : use glUniform2fv
+ * :data:`gpu.GPU_DATA_3F` : use glUniform3fv
+ * :data:`gpu.GPU_DATA_4F` : use glUniform4fv
+ * :data:`gpu.GPU_DATA_9F` : use glUniformMatrix3fv
+ * :data:`gpu.GPU_DATA_16F` : use glUniformMatrix4fv
+
+ * ['type'] : integer
+ type of uniform, determines the origin and method of calculation. See uniform-type_.
+ Depending on the type, more elements will be be present.
+
+ * ['lamp'] : :class:`bpy.types.Object`
+ Reference to the lamp object from which the uniforms value are extracted. Set for the following uniforms types:
+
+ .. hlist::
+ :columns: 3
+
+ * :data:`gpu.GPU_DYNAMIC_LAMP_DYNVEC`
+ * :data:`gpu.GPU_DYNAMIC_LAMP_DYNCO`
+ * :data:`gpu.GPU_DYNAMIC_LAMP_DYNIMAT`
+ * :data:`gpu.GPU_DYNAMIC_LAMP_DYNPERSMAT`
+ * :data:`gpu.GPU_DYNAMIC_LAMP_DYNENERGY`
+ * :data:`gpu.GPU_DYNAMIC_LAMP_DYNCOL`
+ * :data:`gpu.GPU_DYNAMIC_SAMPLER_2DSHADOW`
+
+ Notes:
+
+ * The uniforms :data:`gpu.GPU_DYNAMIC_LAMP_DYNVEC`, :data:`gpu.GPU_DYNAMIC_LAMP_DYNCO`, :data:`gpu.GPU_DYNAMIC_LAMP_DYNIMAT` and :data:`gpu.GPU_DYNAMIC_LAMP_DYNPERSMAT`
+ refer to the lamp object position and orientation, both of can be derived from the object world matrix:
+
+ .. code-block:: python
+
+ obmat = uniform['lamp'].matrix_world
+
+ where obmat is the mat4_lamp_to_world_ matrix of the lamp as a 2 dimensional array,
+ the lamp world location location is in obmat[3].
+
+ * The uniform types :data:`gpu.GPU_DYNAMIC_LAMP_DYNENERGY` and :data:`gpu.GPU_DYNAMIC_LAMP_DYNCOL` refer to the lamp data bloc that you get from:
+
+ .. code-block:: python
+
+ la = uniform['lamp'].data
+
+ from which you get la.energy and la.color
+
+ * Lamp duplication is not supported: if you have duplicated lamps in your scene
+ (i.e. lamp that are instantiated by dupligroup, etc), this element will only
+ give you a reference to the orignal lamp and you will not know which instance
+ of the lamp it is refering too. You can still handle that case in the exporter
+ by distributing the uniforms amongst the duplicated lamps.
+
+ * ['image'] : :class:`bpy.types.Image`
+ Reference to the image databloc. Set for uniform type :data:`gpu.GPU_DYNAMIC_SAMPLER_2DIMAGE`. You can get the image data from:
+
+ .. code-block:: python
+
+ # full path to image file
+ uniform['image'].filepath
+ # image size as a 2-dimensional array of int
+ uniform['image'].size
+
+ * ['texnumber'] : integer
+ Channel number to which the texture is bound when drawing the object.
+ Set for uniform types :data:`gpu.GPU_DYNAMIC_SAMPLER_2DBUFFER`, :data:`gpu.GPU_DYNAMIC_SAMPLER_2DIMAGE` and :data:`gpu.GPU_DYNAMIC_SAMPLER_2DSHADOW`.
+
+ This is provided for information only: when reusing the shader outside blencer,
+ you are free to assign the textures to the channel of your choice and to pass
+ that number channel to the GPU in the uniform.
+
+ * ['texpixels'] : byte array
+ texture data for uniform type :data:`gpu.GPU_DYNAMIC_SAMPLER_2DBUFFER`. Although
+ the corresponding uniform is a 2D sampler, the texture is always a 1D texture
+ of n x 1 pixel. The texture size n is provided in ['texsize'] element.
+ These texture are only used for computer generated texture (colorband, etc).
+ The texture data is provided so that you can make a real image out of it in the
+ exporter.
+
+ * ['texsize'] : integer
+ horizontal size of texture for uniform type :data:`gpu.GPU_DYNAMIC_SAMPLER_2DBUFFER`.
+ The texture data is in ['texpixels'].
+
+ * ['attributes'] : sequence
+ list of attributes used in vertex shader, can be empty. Blender doesn't use
+ standard attributes except for vertex position and normal. All other vertex
+ attributes must be passed using the generic glVertexAttrib functions.
+ The attribute data can be found in the derived mesh custom data using RNA.
+ Each element of the sequence is a dictionary containing the following elements:
+
+ * ['varname'] : string
+ name of the uniform in the vertex shader. Always of the form 'att<number>'.
+
+ * ['datatype'] : integer
+ data type of vertex attribute, can be one of the following:
+
+ * :data:`gpu.GPU_DATA_2F` : use glVertexAttrib2fv
+ * :data:`gpu.GPU_DATA_3F` : use glVertexAttrib3fv
+ * :data:`gpu.GPU_DATA_4F` : use glVertexAttrib4fv
+ * :data:`gpu.GPU_DATA_4UB` : use glVertexAttrib4ubv
+
+ * ['number'] : integer
+ generic attribute number. This is provided for information only. Blender
+ doesn't use glBindAttribLocation to place generic attributes at specific location,
+ it lets the shader compiler place the attributes automatically and query the
+ placement with glGetAttribLocation. The result of this placement is returned in
+ this element.
+
+ When using this shader in a render engine, you should either use
+ glBindAttribLocation to force the attribute at this location or use
+ glGetAttribLocation to get the placement chosen by the compiler of your GPU.
+
+ * ['type'] : integer
+ type of the mesh custom data from which the vertex attribute is loaded.
+ See attribute-type_.
+
+ * ['name'] : string or integer
+ custom data layer name, used for attribute type :data:`gpu.CD_MTFACE` and :data:`gpu.CD_MCOL`.
+
+ Example:
+
+ .. code-block:: python
+
+ import gpu
+ # get GLSL shader of material Mat.001 in scene Scene.001
+ scene = bpy.data.scenes['Scene.001']
+ material = bpy.data.materials['Mat.001']
+ shader = gpu.export_shader(scene,material)
+ # scan the uniform list and find the images used in the shader
+ for uniform in shader['uniforms']:
+ if uniform['type'] == gpu.GPU_DYNAMIC_SAMPLER_2DIMAGE:
+ print("uniform {0} is using image {1}".format(uniform['varname'], uniform['image'].filepath))
+ # scan the attribute list and find the UV layer used in the shader
+ for attribute in shader['attributes']:
+ if attribute['type'] == gpu.CD_MTFACE:
+ print("attribute {0} is using UV layer {1}".format(attribute['varname'], attribute['name']))
+
+*****
+Notes
+*****
+
+.. _mat4_lamp_to_perspective:
+
+1. Calculation of the *mat4_lamp_to_perspective* matrix for a spot lamp.
+
+ The following pseudo code shows how the *mat4_lamp_to_perspective* matrix is computed
+ in blender for uniforms of :data:`gpu.GPU_DYNAMIC_LAMP_DYNPERSMAT` type::
+
+ #Get the lamp datablock with:
+ lamp=bpy.data.objects[uniform['lamp']].data
+
+ #Compute the projection matrix:
+ # You will need these lamp attributes:
+ # lamp.clipsta : near clip plane in world unit
+ # lamp.clipend : far clip plane in world unit
+ # lamp.spotsize : angle in degree of the spot light
+
+ #The size of the projection plane is computed with the usual formula:
+ wsize = lamp.clista * tan(lamp.spotsize/2)
+
+ #And the projection matrix:
+ mat4_lamp_to_perspective = glFrustum(-wsize,wsize,-wsize,wsize,lamp.clista,lamp.clipend)
+
+2. Creation of the shadow map for a spot lamp.
+
+ The shadow map is the depth buffer of a render performed by placing the camera at the
+ spot light position. The size of the shadow map is given by the attribute lamp.bufsize :
+ shadow map size in pixel, same size in both dimensions.
diff --git a/doc/python_api/rst/info_best_practice.rst b/doc/python_api/rst/info_best_practice.rst
new file mode 100644
index 00000000000..2fbc636613c
--- /dev/null
+++ b/doc/python_api/rst/info_best_practice.rst
@@ -0,0 +1,65 @@
+*************
+Best Practice
+*************
+
+
+TODO: Intro text
+
+
+Style Conventions
+=================
+
+For Blender 2.5 we have chosen to follow python suggested style guide to avoid mixing styles amongst our own scripts and make it easier to use python scripts from other projects.
+
+Using our style guide for your own scripts makes it easier if you eventually want to contribute them to blender.
+
+This style guide is known as pep8 and can be found `here <http://www.python.org/dev/peps/pep-0008>`_
+
+A brief listing of pep8 criteria.
+
+* camel caps for class names: MyClass
+
+* all lower case underscore separated module names: my_module
+
+* indentation of 4 spaces (no tabs)
+
+* spaces around operators. ``1 + 1``, not ``1+1``
+
+* only use explicit imports, (no importing '*')
+
+* don't use single line: ``if val: body``, separate onto 2 lines instead.
+
+
+As well as pep8 we have other conventions used for blender python scripts.
+
+* Use single quotes for enums, and double quotes for strings.
+
+ Both are of course strings but in our internal API enums are unique items from a limited set. eg.
+
+ .. code-block:: python
+
+ bpy.context.scene.render.file_format = 'PNG'
+ bpy.context.scene.render.filepath = "//render_out"
+
+* pep8 also defines that lines should not exceed 79 characters, we felt this is too restrictive so this is optional per script.
+
+Periodically we run checks for pep8 compliance on blender scripts, for scripts to be included in this check add this line as a comment at the top of the script.
+
+``# <pep8 compliant>``
+
+To enable line length checks use this instead.
+
+``# <pep8-80 compliant>``
+
+
+User Interface Layout
+=====================
+
+TODO: Thomas
+
+
+Script Efficiency
+=================
+
+TODO: Campbell
+
diff --git a/doc/python_api/rst/info_gotcha.rst b/doc/python_api/rst/info_gotcha.rst
index c97fc3ab427..e7903dcf96a 100644
--- a/doc/python_api/rst/info_gotcha.rst
+++ b/doc/python_api/rst/info_gotcha.rst
@@ -1,6 +1,6 @@
-********
-Gotcha's
-********
+*******
+Gotchas
+*******
This document attempts to help you work with the Blender API in areas that can be troublesome and avoid practices that are known to give instability.
@@ -32,12 +32,12 @@ Which raises the question as to what the correct context might be?
Typically operators check for the active area type, a selection or active object they can operate on, but some operators are more picky about when they run.
-In most cases you can figure out what context an operator needs simply be seeing how its used in Blender and thinking about what it does.
+In most cases you can figure out what context an operator needs simply be seeing how it's used in Blender and thinking about what it does.
Unfortunately if you're still stuck - the only way to **really** know whats going on is to read the source code for the poll function and see what its checking.
-For python operators its not so hard to find the source since its included with with Blender and the source file/line is included in the operator reference docs.
+For python operators it's not so hard to find the source since it's included with Blender and the source file/line is included in the operator reference docs.
Downloading and searching the C code isn't so simple, especially if you're not familiar with the C language but by searching the operator name or description you should be able to find the poll function with no knowledge of C.
@@ -74,7 +74,7 @@ Sometimes you want to modify values from python and immediately access the updat
Once changing the objects :class:`bpy.types.Object.location` you may want to access its transformation right after from :class:`bpy.types.Object.matrix_world`, but this doesn't work as you might expect.
-Consider the calculations that might go into working out the objects final transformation, this includes:
+Consider the calculations that might go into working out the object's final transformation, this includes:
* animation function curves.
* drivers and their pythons expressions.
@@ -106,7 +106,7 @@ Modal operators execute on user input or setup their own timers to run frequentl
Transform, Painting, Fly-Mode and File-Select are example of a modal operators.
-Writing modal operators takes more effort then a simple ``for`` loop that happens to redraw but is more flexible and integrates better with Blenders design.
+Writing modal operators takes more effort than a simple ``for`` loop that happens to redraw but is more flexible and integrates better with Blenders design.
**Ok, Ok! I still want to draw from python**
@@ -129,7 +129,7 @@ This is different to **numpy** which is row-major which matches what you would e
I can't edit the mesh in edit-mode!
===================================
-Blenders EditMesh is an internal data structure (not saved and not exposed to python), this gives the main annoyance that you need to exit edit-mode to edit the mesh from python.
+Blender's EditMesh is an internal data structure (not saved and not exposed to python), this gives the main annoyance that you need to exit edit-mode to edit the mesh from python.
The reason we have not made much attempt to fix this yet is because we
will likely move to BMesh mesh API eventually, so any work on the API now will be wasted effort.
@@ -226,13 +226,13 @@ This is mainly an issue with editmode since pose data can be manipulated without
Unicode Problems
================
-Python supports many different encpdings so there is nothing stopping you from writing a script in latin1 or iso-8859-15.
+Python supports many different encodings so there is nothing stopping you from writing a script in latin1 or iso-8859-15.
See `pep-0263 <http://www.python.org/dev/peps/pep-0263/>`_
-However this complicates things for the python api because blend files themselves dont have an encoding.
+However this complicates things for the python api because blend files themselves don't have an encoding.
-To simplify the problem for python integration and script authors we have decieded all strings in blend files **must** be UTF-8 or ASCII compatible.
+To simplify the problem for python integration and script authors we have decided all strings in blend files **must** be UTF-8 or ASCII compatible.
This means assigning strings with different encodings to an object names for instance will raise an error.
@@ -331,13 +331,13 @@ This an example of a timer which runs many times a second and moves the default
my_timer()
-Use cases like the one above which leave the thread running once the script finishes may seem to work for a while but end up causing random crashes or errors in Blenders own drawing code.
+Use cases like the one above which leave the thread running once the script finishes may seem to work for a while but end up causing random crashes or errors in Blender's own drawing code.
-So far no work has gone into making Blenders python integration thread safe, so until its properly supported, best not make use of this.
+So far, no work has gone into making Blender's python integration thread safe, so until its properly supported, best not make use of this.
.. note::
- Pythons threads only allow co-currency and wont speed up you're scripts on multi-processor systems, the ``subprocess`` and ``multiprocess`` modules can be used with blender and make use of multiple CPU's too.
+ Pythons threads only allow co-currency and won't speed up your scripts on multi-processor systems, the ``subprocess`` and ``multiprocess`` modules can be used with blender and make use of multiple CPU's too.
Help! My script crashes Blender
@@ -378,6 +378,41 @@ This example shows how you can tell undo changes the memory locations.
As suggested above, simply not holding references to data when Blender is used interactively by the user is the only way to ensure the script doesn't become unstable.
+Edit Mode / Memory Access
+-------------------------
+
+Switching edit-mode ``bpy.ops.object.mode_set(mode='EDIT')`` / ``bpy.ops.object.mode_set(mode='OBJECT')`` will re-allocate objects data, any references to a meshes vertices/faces/uvs, armatures bones, curves points etc cannot be accessed after switching edit-mode.
+
+Only the reference to the data its self can be re-accessed, the following example will crash.
+
+.. code-block:: python
+
+ mesh = bpy.context.active_object.data
+ faces = mesh.faces
+ bpy.ops.object.mode_set(mode='EDIT')
+ bpy.ops.object.mode_set(mode='OBJECT')
+
+ # this will crash
+ print(faces)
+
+
+So after switching edit-mode you need to re-access any object data variables, the following example shows how to avoid the crash above.
+
+.. code-block:: python
+
+ mesh = bpy.context.active_object.data
+ faces = mesh.faces
+ bpy.ops.object.mode_set(mode='EDIT')
+ bpy.ops.object.mode_set(mode='OBJECT')
+
+ # faces have been re-allocated
+ faces = mesh.faces
+ print(faces)
+
+
+These kinds of problems can happen for any functions which re-allocate the object data but are most common when switching edit-mode.
+
+
Array Re-Allocation
-------------------
diff --git a/doc/python_api/rst/info_quickstart.rst b/doc/python_api/rst/info_quickstart.rst
index e77e9a76d7f..e7f2900b212 100644
--- a/doc/python_api/rst/info_quickstart.rst
+++ b/doc/python_api/rst/info_quickstart.rst
@@ -156,7 +156,7 @@ Note that these properties can only be assigned basic Python types.
* array of ints/floats
-* dictionary (only string keys types on this list)
+* dictionary (only string keys are supported, values must be basic types too)
These properties are valid outside of Python. They can be animated by curves or used in driver paths.
@@ -420,49 +420,3 @@ Using Low-Level Functions:
fcu_z.keyframe_points[0].co = 10.0, 0.0
fcu_z.keyframe_points[1].co = 20.0, 1.0
-
-Style Conventions
-=================
-
-For Blender 2.5 we have chosen to follow python suggested style guide to avoid mixing styles amongst our own scripts and make it easier to use python scripts from other projects.
-
-Using our style guide for your own scripts makes it easier if you eventually want to contribute them to blender.
-
-This style guide is known as pep8 and can be found `here <http://www.python.org/dev/peps/pep-0008>`_
-
-A brief listing of pep8 criteria.
-
-* camel caps for class names: MyClass
-
-* all lower case underscore separated module names: my_module
-
-* indentation of 4 spaces (no tabs)
-
-* spaces around operators. ``1 + 1``, not ``1+1``
-
-* only use explicit imports, (no importing '*')
-
-* don't use single line: ``if val: body``, separate onto 2 lines instead.
-
-
-As well as pep8 we have other conventions used for blender python scripts.
-
-* Use single quotes for enums, and double quotes for strings.
-
- Both are of course strings but in our internal API enums are unique items from a limited set. eg.
-
- .. code-block:: python
-
- bpy.context.scene.render.file_format = 'PNG'
- bpy.context.scene.render.filepath = "//render_out"
-
-* pep8 also defines that lines should not exceed 79 characters, we felt this is too restrictive so this is optional per script.
-
-Periodically we run checks for pep8 compliance on blender scripts, for scripts to be included in this check add this line as a comment at the top of the script.
-
-``# <pep8 compliant>``
-
-To enable line length checks use this instead.
-
-``# <pep8-80 compliant>``
-
diff --git a/doc/python_api/rst/info_tips_and_tricks.rst b/doc/python_api/rst/info_tips_and_tricks.rst
new file mode 100644
index 00000000000..f88be5de3a8
--- /dev/null
+++ b/doc/python_api/rst/info_tips_and_tricks.rst
@@ -0,0 +1,235 @@
+***************
+Tips and Tricks
+***************
+
+Here are various suggestions that you might find useful when writing scripts.
+
+Some of these are just python features that scripters may not have thought to use with blender, others are blender specific.
+
+
+Use The Terminal
+================
+
+When writing python scripts, it's useful to have a terminal open, this is not the built-in python console but a terminal application which is used to start blender.
+
+There are 3 main uses for the terminal, these are:
+
+* You can see the output of ``print()`` as you're script runs, which is useful to view debug info.
+
+* The error trace-back is printed in full to the terminal which won't always generate an error popup in blender's user interface (depending on how the script is executed).
+
+* If the script runs for too long or you accidentally enter an infinite loop, Ctrl+C in the terminal (Ctrl+Break on Windows) will quit the script early.
+
+.. note::
+ For Linux and OSX users this means starting the terminal first, then running blender from within it. On Windows the terminal can be enabled from the help menu.
+
+
+Show All Operators
+==================
+
+While blender logs operators in the Info space, this only reports operators with the ``REGISTER`` option enabeld so as not to flood the Info view with calls to ``bpy.ops.view3d.smoothview`` and ``bpy.ops.view3d.zoom``.
+
+However, for testing it can be useful to see **every** operator called in a terminal, do this by enabling the debug option either by passing the ``--debug`` argument when starting blender or by setting :mod:`bpy.app.debug` to True while blender is running.
+
+
+Use an External Editor
+======================
+
+Blenders text editor is fine for small changes and writing tests but its not full featured, for larger projects you'll probably want to use a standalone editor or python IDE.
+
+Editing a text file externally and having the same text open in blender does work but isn't that optimal so here are 2 ways you can easily use an external file from blender.
+
+Using the following examples you'll still need textblock in blender to execute, but reference an external file rather then including it directly.
+
+Executing External Scripts
+--------------------------
+
+This is the equivalent to running the script directly, referencing a scripts path from a 2 line textblock.
+
+.. code-block:: python
+
+ filename = "/full/path/to/myscript.py"
+ exec(compile(open(filename).read(), filename, 'exec'))
+
+
+You might want to reference a script relative to the blend file.
+
+.. code-block:: python
+
+ import bpy
+ import os
+
+ filename = os.path.join(os.path.basename(bpy.data.filepath), "myscript.py")
+ exec(compile(open(filename).read(), filename, 'exec'))
+
+
+Executing Modules
+-----------------
+
+This example shows loading a script in as a module and executing a module function.
+
+.. code-block:: python
+
+ import myscript
+ import imp
+
+ imp.reload(myscript)
+ myscript.main()
+
+
+Notice that the script is reloaded every time, this forces use of the modified version, otherwise the cached one in ``sys.modules`` would be used until blender was restarted.
+
+The important difference between this and executing the script directly is it has to call a function in the module, in this case ``main()`` but it can be any function, an advantage with this is you can pass arguments to the function from this small script which is often useful for testing different settings quickly.
+
+The other issue with this is the script has to be in pythons module search path.
+While this is not best practice - for testing you can extend the search path, this example adds the current blend files directory to the search path, then loads the script as a module.
+
+.. code-block:: python
+
+ import sys
+ import os
+ import bpy
+
+ blend_dir = os.path.basename(bpy.data.filepath)
+ if blend_dir not in sys.path:
+ sys.path.append(blend_dir)
+
+ import myscript
+ import imp
+ imp.reload(myscript)
+ myscript.main()
+
+
+Don't Use Blender!
+==================
+
+While developing your own scripts blenders interface can get in the way, manually reloading, running the scripts, opening file import etc. adds overhead.
+
+For scripts that are not interactive it can end up being more efficient not to use blenders interface at all and instead execute the script on the command line.
+
+.. code-block:: python
+
+ blender --background --python myscript.py
+
+
+You might want to run this with a blend file so the script has some data to operate on.
+
+.. code-block:: python
+
+ blender myscene.blend --background --python myscript.py
+
+
+.. note::
+
+ Depending on your setup you might have to enter the full path to the blender executable.
+
+
+Once the script is running properly in background mode, you'll want to check the output of the script, this depends completely on the task at hand however here are some suggestions.
+
+* render the output to an image, use an image viewer and keep writing over the same image each time.
+
+* save a new blend file, or export the file using one of blenders exporters.
+
+* if the results can be displayed as text - print them or write them to a file.
+
+
+This can take a little time to setup, but it can be well worth the effort to reduce the time it takes to test changes - you can even have blender running the script ever few seconds with a viewer updating the results, so no need to leave you're text editor to see changes.
+
+
+Use External Tools
+==================
+
+When there are no readily available python modules to perform specific tasks it's worth keeping in mind you may be able to have python execute an external command on you're data and read the result back in.
+
+Using external programs adds an extra dependency and may limit who can use the script but to quickly setup you're own custom pipeline or writing one-off scripts this can be handy.
+
+Examples include:
+
+* Run The Gimp in batch mode to execute custom scripts for advanced image processing.
+
+* Write out 3D models to use external mesh manipulation tools and read back in the results.
+
+* Convert files into recognizable formats before reading.
+
+
+Bundled Python & Extensions
+===========================
+
+The Blender releases distributed from blender.org include a complete python installation on all platforms, this has the disadvantage that any extensions you have installed in you're systems python wont be found by blender.
+
+There are 2 ways around this:
+
+* remove blender python sub-directory, blender will then fallback on the systems python and use that instead **python version must match the one that blender comes with**.
+
+* copy the extensions into blender's python sub-directory so blender can access them, you could also copy the entire python installation into blenders sub-directory, replacing the one blender comes with. This works as long as the python versions match and the paths are created in the same relative locations. Doing this has the advantage that you can redistribute this bundle to others with blender and/or the game player, including any extensions you rely on.
+
+
+Drop Into a Python Interpreter in You're Script
+===============================================
+
+In the middle of a script you may want to inspect some variables, run some function and generally dig about to see whats going on.
+
+.. code-block:: python
+
+ import code
+ code.interact(local=locals())
+
+
+If you want to access both global and local variables do this...
+
+.. code-block:: python
+
+ import code
+ namespace = globals().copy()
+ namespace.update(locals())
+ code.interact(local=namespace)
+
+
+The next example is an equivalent single line version of the script above which is easier to paste into you're code:
+
+.. code-block:: python
+
+ __import__('code').interact(local={k: v for ns in (globals(), locals()) for k, v in ns.items()})
+
+
+``code.interact`` can be added at any line in the script and will pause the script an launch an interactive interpreter in the terminal, when you're done you can quit the interpreter and the script will continue execution.
+
+
+Admittedly this highlights the lack of any python debugging support built into blender, but its still handy to know.
+
+.. note::
+
+ This works in the game engine as well, it can be handy to inspect the state of a running game.
+
+
+Advanced
+========
+
+
+Blender as a module
+-------------------
+
+From a python perspective it's nicer to have everything as an extension which lets the python script combine many components.
+
+Advantages include:
+
+* you can use external editors/IDE's with blenders python API and execute scripts within the IDE (step over code, inspect variables as the script runs).
+
+* editors/IDE's can auto complete blender modules & variables.
+
+* existing scripts can import blender API's without having to run inside blender.
+
+
+This is marked advanced because to run blender as a python module requires a special build option.
+
+For instructions on building see `Building blender as a python module <http://wiki.blender.org/index.php/User:Ideasman42/BlenderAsPyModule>`_
+
+
+Python Safety (Build Option)
+----------------------------
+
+Since it's possible to access data which has been removed (see Gotcha's), this can be hard to track down the cause of crashes.
+
+To raise python exceptions on accessing freed data (rather then crashing), enable the CMake build option WITH_PYTHON_SAFETY.
+
+This enables data tracking which makes data access about 2x slower which is why the option is not enabled in release builds.
diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py
index e378dd19e73..ac2a498efc2 100644
--- a/doc/python_api/sphinx_doc_gen.py
+++ b/doc/python_api/sphinx_doc_gen.py
@@ -103,6 +103,8 @@ sphinx-build doc/python_api/sphinx-in doc/python_api/sphinx-out
INFO_DOCS = (
("info_quickstart.rst", "Blender/Python Quickstart: new to blender/scripting and want to get you're feet wet?"),
("info_overview.rst", "Blender/Python API Overview: a more complete explanation of python integration"),
+ ("info_best_practice.rst", "Best Practice: Conventions to follow for writing good scripts"),
+ ("info_tips_and_tricks.rst", "Tips and Tricks: Hints to help you while writeing scripts for blender"),
("info_gotcha.rst", "Gotcha's: some of the problems you may come up against when writing scripts"),
)
@@ -578,6 +580,7 @@ def pycontext2sphinx(BASEPATH):
"sequences": ("Sequence", True),
"smoke": ("SmokeModifier", False),
"soft_body": ("SoftBodyModifier", False),
+ "speaker": ("Speaker", False),
"texture": ("Texture", False),
"texture_slot": ("MaterialTextureSlot", False),
"vertex_paint_object": ("Object", False),
diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt
index 3990d132757..0386b3d71d8 100644
--- a/extern/CMakeLists.txt
+++ b/extern/CMakeLists.txt
@@ -43,6 +43,10 @@ if(WITH_BUILTIN_GLEW)
add_subdirectory(glew)
endif()
+if(WITH_GAMEENGINE)
+ add_subdirectory(recastnavigation)
+endif()
+
if(WITH_IMAGE_OPENJPEG AND (NOT UNIX OR APPLE))
add_subdirectory(libopenjpeg)
endif()
diff --git a/extern/SConscript b/extern/SConscript
index 061bd1ba6a3..6bb060adeda 100644
--- a/extern/SConscript
+++ b/extern/SConscript
@@ -4,6 +4,9 @@ Import('env')
SConscript(['glew/SConscript'])
+if env['WITH_BF_GAMEENGINE']:
+ SConscript(['recastnavigation/SConscript'])
+
if env['WITH_BF_ELTOPO']:
SConscript(['eltopo/SConscript'])
diff --git a/extern/recastnavigation/CMakeLists.txt b/extern/recastnavigation/CMakeLists.txt
new file mode 100644
index 00000000000..1af01b1b427
--- /dev/null
+++ b/extern/recastnavigation/CMakeLists.txt
@@ -0,0 +1,66 @@
+# $Id$
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# The Original Code is Copyright (C) 2006, Blender Foundation
+# All rights reserved.
+#
+# The Original Code is: all of this file.
+#
+# Contributor(s): Daniel Genrich
+#
+# ***** END GPL LICENSE BLOCK *****
+
+set(INC
+ Recast/Include
+ Detour/Include
+)
+
+set(INC_SYS
+
+)
+
+set(SRC
+ Detour/Source/DetourCommon.cpp
+ Detour/Source/DetourNode.cpp
+ Detour/Source/DetourStatNavMesh.cpp
+ Detour/Source/DetourStatNavMeshBuilder.cpp
+ Detour/Source/DetourTileNavMesh.cpp
+ Detour/Source/DetourTileNavMeshBuilder.cpp
+
+ Detour/Include/DetourCommon.h
+ Detour/Include/DetourNode.h
+ Detour/Include/DetourStatNavMesh.h
+ Detour/Include/DetourStatNavMeshBuilder.h
+ Detour/Include/DetourTileNavMesh.h
+ Detour/Include/DetourTileNavMeshBuilder.h
+
+ Recast/Source/Recast.cpp
+ Recast/Source/RecastContour.cpp
+ Recast/Source/RecastFilter.cpp
+ Recast/Source/RecastLog.cpp
+ Recast/Source/RecastMesh.cpp
+ Recast/Source/RecastMeshDetail.cpp
+ Recast/Source/RecastRasterization.cpp
+ Recast/Source/RecastRegion.cpp
+ Recast/Source/RecastTimer.cpp
+
+ Recast/Include/Recast.h
+ Recast/Include/RecastLog.h
+ Recast/Include/RecastTimer.h
+)
+
+blender_add_lib(extern_recastnavigation "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/extern/recastnavigation/Detour/Include/DetourCommon.h b/extern/recastnavigation/Detour/Include/DetourCommon.h
new file mode 100644
index 00000000000..d824efc06e4
--- /dev/null
+++ b/extern/recastnavigation/Detour/Include/DetourCommon.h
@@ -0,0 +1,167 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#ifndef DETOURCOMMON_H
+#define DETOURCOMMON_H
+
+//////////////////////////////////////////////////////////////////////////////////////////
+
+template<class T> inline void swap(T& a, T& b) { T t = a; a = b; b = t; }
+template<class T> inline T min(T a, T b) { return a < b ? a : b; }
+template<class T> inline T max(T a, T b) { return a > b ? a : b; }
+template<class T> inline T abs(T a) { return a < 0 ? -a : a; }
+template<class T> inline T sqr(T a) { return a*a; }
+template<class T> inline T clamp(T v, T mn, T mx) { return v < mn ? mn : (v > mx ? mx : v); }
+
+inline void vcross(float* dest, const float* v1, const float* v2)
+{
+ dest[0] = v1[1]*v2[2] - v1[2]*v2[1];
+ dest[1] = v1[2]*v2[0] - v1[0]*v2[2];
+ dest[2] = v1[0]*v2[1] - v1[1]*v2[0];
+}
+
+inline float vdot(const float* v1, const float* v2)
+{
+ return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
+}
+
+inline void vmad(float* dest, const float* v1, const float* v2, const float s)
+{
+ dest[0] = v1[0]+v2[0]*s;
+ dest[1] = v1[1]+v2[1]*s;
+ dest[2] = v1[2]+v2[2]*s;
+}
+
+inline void vadd(float* dest, const float* v1, const float* v2)
+{
+ dest[0] = v1[0]+v2[0];
+ dest[1] = v1[1]+v2[1];
+ dest[2] = v1[2]+v2[2];
+}
+
+inline void vsub(float* dest, const float* v1, const float* v2)
+{
+ dest[0] = v1[0]-v2[0];
+ dest[1] = v1[1]-v2[1];
+ dest[2] = v1[2]-v2[2];
+}
+
+inline void vmin(float* mn, const float* v)
+{
+ mn[0] = min(mn[0], v[0]);
+ mn[1] = min(mn[1], v[1]);
+ mn[2] = min(mn[2], v[2]);
+}
+
+inline void vmax(float* mx, const float* v)
+{
+ mx[0] = max(mx[0], v[0]);
+ mx[1] = max(mx[1], v[1]);
+ mx[2] = max(mx[2], v[2]);
+}
+
+inline void vcopy(float* dest, const float* a)
+{
+ dest[0] = a[0];
+ dest[1] = a[1];
+ dest[2] = a[2];
+}
+
+inline float vdist(const float* v1, const float* v2)
+{
+ float dx = v2[0] - v1[0];
+ float dy = v2[1] - v1[1];
+ float dz = v2[2] - v1[2];
+ return sqrtf(dx*dx + dy*dy + dz*dz);
+}
+
+inline float vdistSqr(const float* v1, const float* v2)
+{
+ float dx = v2[0] - v1[0];
+ float dy = v2[1] - v1[1];
+ float dz = v2[2] - v1[2];
+ return dx*dx + dy*dy + dz*dz;
+}
+
+inline void vnormalize(float* v)
+{
+ float d = 1.0f / sqrtf(sqr(v[0]) + sqr(v[1]) + sqr(v[2]));
+ v[0] *= d;
+ v[1] *= d;
+ v[2] *= d;
+}
+
+inline bool vequal(const float* p0, const float* p1)
+{
+ static const float thr = sqr(1.0f/16384.0f);
+ const float d = vdistSqr(p0, p1);
+ return d < thr;
+}
+
+inline int nextPow2(int v)
+{
+ v--;
+ v |= v >> 1;
+ v |= v >> 2;
+ v |= v >> 4;
+ v |= v >> 8;
+ v |= v >> 16;
+ v++;
+ return v;
+}
+
+inline float vdot2D(const float* u, const float* v)
+{
+ return u[0]*v[0] + u[2]*v[2];
+}
+
+inline float vperp2D(const float* u, const float* v)
+{
+ return u[2]*v[0] - u[0]*v[2];
+}
+
+inline float triArea2D(const float* a, const float* b, const float* c)
+{
+ return ((b[0]*a[2] - a[0]*b[2]) + (c[0]*b[2] - b[0]*c[2]) + (a[0]*c[2] - c[0]*a[2])) * 0.5f;
+}
+
+inline bool checkOverlapBox(const unsigned short amin[3], const unsigned short amax[3],
+ const unsigned short bmin[3], const unsigned short bmax[3])
+{
+ bool overlap = true;
+ overlap = (amin[0] > bmax[0] || amax[0] < bmin[0]) ? false : overlap;
+ overlap = (amin[1] > bmax[1] || amax[1] < bmin[1]) ? false : overlap;
+ overlap = (amin[2] > bmax[2] || amax[2] < bmin[2]) ? false : overlap;
+ return overlap;
+}
+
+void closestPtPointTriangle(float* closest, const float* p,
+ const float* a, const float* b, const float* c);
+
+bool closestHeightPointTriangle(const float* p, const float* a, const float* b, const float* c, float& h);
+
+bool intersectSegmentPoly2D(const float* p0, const float* p1,
+ const float* verts, int nverts,
+ float& tmin, float& tmax,
+ int& segMin, int& segMax);
+
+float distancePtSegSqr2D(const float* pt, const float* p, const float* q, float& t);
+
+void calcPolyCenter(float* tc, const unsigned short* idx, int nidx, const float* verts);
+
+#endif // DETOURCOMMON_H \ No newline at end of file
diff --git a/extern/recastnavigation/Detour/Include/DetourNode.h b/extern/recastnavigation/Detour/Include/DetourNode.h
new file mode 100644
index 00000000000..316d5bf4cf6
--- /dev/null
+++ b/extern/recastnavigation/Detour/Include/DetourNode.h
@@ -0,0 +1,149 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#ifndef DETOURNODE_H
+#define DETOURNODE_H
+
+enum dtNodeFlags
+{
+ DT_NODE_OPEN = 0x01,
+ DT_NODE_CLOSED = 0x02,
+};
+
+struct dtNode
+{
+ float cost;
+ float total;
+ unsigned int id;
+ unsigned int pidx : 30;
+ unsigned int flags : 2;
+};
+
+class dtNodePool
+{
+public:
+ dtNodePool(int maxNodes, int hashSize);
+ ~dtNodePool();
+ inline void operator=(const dtNodePool&) {}
+ void clear();
+ dtNode* getNode(unsigned int id);
+ const dtNode* findNode(unsigned int id) const;
+
+ inline unsigned int getNodeIdx(const dtNode* node) const
+ {
+ if (!node) return 0;
+ return (unsigned int)(node - m_nodes)+1;
+ }
+
+ inline dtNode* getNodeAtIdx(unsigned int idx)
+ {
+ if (!idx) return 0;
+ return &m_nodes[idx-1];
+ }
+
+ inline int getMemUsed() const
+ {
+ return sizeof(*this) +
+ sizeof(dtNode)*m_maxNodes +
+ sizeof(unsigned short)*m_maxNodes +
+ sizeof(unsigned short)*m_hashSize;
+ }
+
+private:
+ inline unsigned int hashint(unsigned int a) const
+ {
+ a += ~(a<<15);
+ a ^= (a>>10);
+ a += (a<<3);
+ a ^= (a>>6);
+ a += ~(a<<11);
+ a ^= (a>>16);
+ return a;
+ }
+
+ dtNode* m_nodes;
+ unsigned short* m_first;
+ unsigned short* m_next;
+ const int m_maxNodes;
+ const int m_hashSize;
+ int m_nodeCount;
+};
+
+class dtNodeQueue
+{
+public:
+ dtNodeQueue(int n);
+ ~dtNodeQueue();
+ inline void operator=(dtNodeQueue&) {}
+
+ inline void clear()
+ {
+ m_size = 0;
+ }
+
+ inline dtNode* top()
+ {
+ return m_heap[0];
+ }
+
+ inline dtNode* pop()
+ {
+ dtNode* result = m_heap[0];
+ m_size--;
+ trickleDown(0, m_heap[m_size]);
+ return result;
+ }
+
+ inline void push(dtNode* node)
+ {
+ m_size++;
+ bubbleUp(m_size-1, node);
+ }
+
+ inline void modify(dtNode* node)
+ {
+ for (int i = 0; i < m_size; ++i)
+ {
+ if (m_heap[i] == node)
+ {
+ bubbleUp(i, node);
+ return;
+ }
+ }
+ }
+
+ inline bool empty() const { return m_size == 0; }
+
+ inline int getMemUsed() const
+ {
+ return sizeof(*this) +
+ sizeof(dtNode*)*(m_capacity+1);
+ }
+
+
+private:
+ void bubbleUp(int i, dtNode* node);
+ void trickleDown(int i, dtNode* node);
+
+ dtNode** m_heap;
+ const int m_capacity;
+ int m_size;
+};
+
+
+#endif // DETOURNODE_H \ No newline at end of file
diff --git a/extern/recastnavigation/Detour/Include/DetourStatNavMesh.h b/extern/recastnavigation/Detour/Include/DetourStatNavMesh.h
new file mode 100644
index 00000000000..5a3e04a2074
--- /dev/null
+++ b/extern/recastnavigation/Detour/Include/DetourStatNavMesh.h
@@ -0,0 +1,234 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#ifndef DETOURSTATNAVMESH_H
+#define DETOURSTATNAVMESH_H
+
+// Reference to navigation polygon.
+typedef unsigned short dtStatPolyRef;
+
+// Maximum number of vertices per navigation polygon.
+static const int DT_STAT_VERTS_PER_POLYGON = 6;
+
+// Structure holding the navigation polygon data.
+struct dtStatPoly
+{
+ unsigned short v[DT_STAT_VERTS_PER_POLYGON]; // Indices to vertices of the poly.
+ dtStatPolyRef n[DT_STAT_VERTS_PER_POLYGON]; // Refs to neighbours of the poly.
+ unsigned char nv; // Number of vertices.
+ unsigned char flags; // Flags (not used).
+};
+
+struct dtStatPolyDetail
+{
+ unsigned short vbase; // Offset to detail vertex array.
+ unsigned short nverts; // Number of vertices in the detail mesh.
+ unsigned short tbase; // Offset to detail triangle array.
+ unsigned short ntris; // Number of triangles.
+};
+
+const int DT_STAT_NAVMESH_MAGIC = (('N'<<24) | ('A'<<16) | ('V'<<8) | 'M');
+const int DT_STAT_NAVMESH_VERSION = 3;
+
+struct dtStatBVNode
+{
+ unsigned short bmin[3], bmax[3];
+ int i;
+};
+
+struct dtStatNavMeshHeader
+{
+ int magic;
+ int version;
+ int npolys;
+ int nverts;
+ int nnodes;
+ int ndmeshes;
+ int ndverts;
+ int ndtris;
+ float cs;
+ float bmin[3], bmax[3];
+ dtStatPoly* polys;
+ float* verts;
+ dtStatBVNode* bvtree;
+ dtStatPolyDetail* dmeshes;
+ float* dverts;
+ unsigned char* dtris;
+};
+
+class dtStatNavMesh
+{
+public:
+
+ dtStatNavMesh();
+ ~dtStatNavMesh();
+
+ // Initializes the navmesh with data.
+ // Params:
+ // data - (in) Pointer to navmesh data.
+ // dataSize - (in) size of the navmesh data.
+ // ownsData - (in) Flag indicating if the navmesh should own and delete the data.
+ bool init(unsigned char* data, int dataSize, bool ownsData);
+
+ // Finds the nearest navigation polygon around the center location.
+ // Params:
+ // center - (in) The center of the search box.
+ // extents - (in) The extents of the search box.
+ // Returns: Reference identifier for the polygon, or 0 if no polygons found.
+ dtStatPolyRef findNearestPoly(const float* center, const float* extents);
+
+ // Returns polygons which touch the query box.
+ // Params:
+ // center - (in) the center of the search box.
+ // extents - (in) the extents of the search box.
+ // polys - (out) array holding the search result.
+ // maxPolys - (in) The max number of polygons the polys array can hold.
+ // Returns: Number of polygons in search result array.
+ int queryPolygons(const float* center, const float* extents,
+ dtStatPolyRef* polys, const int maxPolys);
+
+ // Finds path from start polygon to end polygon.
+ // If target polygon canno be reached through the navigation graph,
+ // the last node on the array is nearest node to the end polygon.
+ // Params:
+ // startRef - (in) ref to path start polygon.
+ // endRef - (in) ref to path end polygon.
+ // path - (out) array holding the search result.
+ // maxPathSize - (in) The max number of polygons the path array can hold.
+ // Returns: Number of polygons in search result array.
+ int findPath(dtStatPolyRef startRef, dtStatPolyRef endRef,
+ const float* startPos, const float* endPos,
+ dtStatPolyRef* path, const int maxPathSize);
+
+ // Finds a straight path from start to end locations within the corridor
+ // described by the path polygons.
+ // Start and end locations will be clamped on the corridor.
+ // Params:
+ // startPos - (in) Path start location.
+ // endPos - (in) Path end location.
+ // path - (in) Array of connected polygons describing the corridor.
+ // pathSize - (in) Number of polygons in path array.
+ // straightPath - (out) Points describing the straight path.
+ // maxStraightPathSize - (in) The max number of points the straight path array can hold.
+ // Returns: Number of points in the path.
+ int findStraightPath(const float* startPos, const float* endPos,
+ const dtStatPolyRef* path, const int pathSize,
+ float* straightPath, const int maxStraightPathSize);
+
+ // Finds intersection againts walls starting from start pos.
+ // Params:
+ // startRef - (in) ref to the polygon where the start lies.
+ // startPos - (in) start position of the query.
+ // endPos - (in) end position of the query.
+ // t - (out) hit parameter along the segment, 0 if no hit.
+ // endRef - (out) ref to the last polygon which was processed.
+ // Returns: Number of polygons in path or 0 if failed.
+ int raycast(dtStatPolyRef startRef, const float* startPos, const float* endPos,
+ float& t, dtStatPolyRef* path, const int pathSize);
+
+ // Returns distance to nearest wall from the specified location.
+ // Params:
+ // centerRef - (in) ref to the polygon where the center lies.
+ // centerPos - (in) center if the query circle.
+ // maxRadius - (in) max search radius.
+ // hitPos - (out) location of the nearest hit.
+ // hitNormal - (out) normal of the nearest hit.
+ // Returns: Distance to nearest wall from the test location.
+ float findDistanceToWall(dtStatPolyRef centerRef, const float* centerPos, float maxRadius,
+ float* hitPos, float* hitNormal);
+
+ // Finds polygons found along the navigation graph which touch the specified circle.
+ // Params:
+ // centerRef - (in) ref to the polygon where the center lies.
+ // centerPos - (in) center if the query circle
+ // radius - (in) radius of the query circle
+ // resultRef - (out, opt) refs to the polygons touched by the circle.
+ // resultParent - (out, opt) parent of each result polygon.
+ // resultCost - (out, opt) search cost at each result polygon.
+ // maxResult - (int) maximum capacity of search results.
+ // Returns: Number of results.
+ int findPolysAround(dtStatPolyRef centerRef, const float* centerPos, float radius,
+ dtStatPolyRef* resultRef, dtStatPolyRef* resultParent, float* resultCost,
+ const int maxResult);
+
+ // Returns closest point on navigation polygon.
+ // Params:
+ // ref - (in) ref to the polygon.
+ // pos - (in) the point to check.
+ // closest - (out) closest point.
+ // Returns: true if closest point found.
+ bool closestPointToPoly(dtStatPolyRef ref, const float* pos, float* closest) const;
+
+ // Returns height of the polygon at specified location.
+ // Params:
+ // ref - (in) ref to the polygon.
+ // pos - (in) the point where to locate the height.
+ // height - (out) height at the location.
+ // Returns: true if oer polygon.
+ bool getPolyHeight(dtStatPolyRef ref, const float* pos, float* height) const;
+
+ // Returns pointer to a polygon based on ref.
+ const dtStatPoly* getPolyByRef(dtStatPolyRef ref) const;
+ // Returns polygon index based on ref, or -1 if failed.
+ int getPolyIndexByRef(dtStatPolyRef ref) const;
+ // Returns number of navigation polygons.
+ inline int getPolyCount() const { return m_header ? m_header->npolys : 0; }
+ // Rerturns pointer to specified navigation polygon.
+ inline const dtStatPoly* getPoly(int i) const { return &m_header->polys[i]; }
+ // Returns number of vertices.
+ inline int getVertexCount() const { return m_header ? m_header->nverts : 0; }
+ // Returns pointer to specified vertex.
+ inline const float* getVertex(int i) const { return &m_header->verts[i*3]; }
+ // Returns number of navigation polygons details.
+ inline int getPolyDetailCount() const { return m_header ? m_header->ndmeshes : 0; }
+ // Rerturns pointer to specified navigation polygon detail.
+ const dtStatPolyDetail* getPolyDetail(int i) const { return &m_header->dmeshes[i]; }
+ // Returns pointer to specified vertex.
+ inline const float* getDetailVertex(int i) const { return &m_header->dverts[i*3]; }
+ // Returns pointer to specified vertex.
+ inline const unsigned char* getDetailTri(int i) const { return &m_header->dtris[i*4]; }
+
+ bool isInClosedList(dtStatPolyRef ref) const;
+
+ int getMemUsed() const;
+
+ inline unsigned char* getData() const { return m_data; }
+ inline int getDataSize() const { return m_dataSize; }
+ inline const dtStatNavMeshHeader* getHeader() const { return m_header; }
+ inline const dtStatBVNode* getBvTreeNodes() const { return m_header ? m_header->bvtree : 0; }
+ inline int getBvTreeNodeCount() const { return m_header ? m_header->nnodes : 0; }
+
+private:
+
+ // Copies the locations of vertices of a polygon to an array.
+ int getPolyVerts(dtStatPolyRef ref, float* verts) const;
+ // Returns portal points between two polygons.
+ bool getPortalPoints(dtStatPolyRef from, dtStatPolyRef to, float* left, float* right) const;
+ // Returns edge mid point between two polygons.
+ bool getEdgeMidPoint(dtStatPolyRef from, dtStatPolyRef to, float* mid) const;
+
+ unsigned char* m_data;
+ int m_dataSize;
+
+ dtStatNavMeshHeader* m_header;
+
+ class dtNodePool* m_nodePool;
+ class dtNodeQueue* m_openList;
+};
+
+#endif // DETOURSTATNAVMESH_H
diff --git a/extern/recastnavigation/Detour/Include/DetourStatNavMeshBuilder.h b/extern/recastnavigation/Detour/Include/DetourStatNavMeshBuilder.h
new file mode 100644
index 00000000000..03c79c429e7
--- /dev/null
+++ b/extern/recastnavigation/Detour/Include/DetourStatNavMeshBuilder.h
@@ -0,0 +1,33 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#ifndef DETOURSTATNAVMESHBUILDER_H
+#define DETOURSTATNAVMESHBUILDER_H
+
+bool dtCreateNavMeshData(const unsigned short* verts, const int nverts,
+ const unsigned short* polys, const int npolys, const int nvp,
+ const float* bmin, const float* bmax, float cs, float ch,
+ const unsigned short* dmeshes, const float* dverts, const int ndverts,
+ const unsigned char* dtris, const int ndtris,
+ unsigned char** outData, int* outDataSize);
+
+int createBVTree(const unsigned short* verts, const int nverts,
+ const unsigned short* polys, const int npolys, const int nvp,
+ float cs, float ch, int nnodes, dtStatBVNode* nodes);
+
+#endif // DETOURSTATNAVMESHBUILDER_H \ No newline at end of file
diff --git a/extern/recastnavigation/Detour/Include/DetourTileNavMesh.h b/extern/recastnavigation/Detour/Include/DetourTileNavMesh.h
new file mode 100644
index 00000000000..50ccdd118e8
--- /dev/null
+++ b/extern/recastnavigation/Detour/Include/DetourTileNavMesh.h
@@ -0,0 +1,315 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#ifndef DETOURTILENAVMESH_H
+#define DETOURTILENAVMESH_H
+
+// Reference to navigation polygon.
+typedef unsigned int dtTilePolyRef;
+
+// The bits used in the poly ref.
+static const int DT_TILE_REF_SALT_BITS = 12;
+static const int DT_TILE_REF_TILE_BITS = 12;
+static const int DT_TILE_REF_POLY_BITS = 8;
+static const int DT_TILE_REF_SALT_MASK = (1<<DT_TILE_REF_SALT_BITS)-1;
+static const int DT_TILE_REF_TILE_MASK = (1<<DT_TILE_REF_TILE_BITS)-1;
+static const int DT_TILE_REF_POLY_MASK = (1<<DT_TILE_REF_POLY_BITS)-1;
+
+// Maximum number of vertices per navigation polygon.
+static const int DT_TILE_VERTS_PER_POLYGON = 6;
+
+static const int DT_MAX_TILES = 1 << DT_TILE_REF_TILE_BITS;
+static const int DT_MAX_POLYGONS = 1 << DT_TILE_REF_POLY_BITS;
+
+static const int DT_TILE_NAVMESH_MAGIC = (('N'<<24) | ('A'<<16) | ('V'<<8) | 'T');
+static const int DT_TILE_NAVMESH_VERSION = 2;
+
+// Structure holding the navigation polygon data.
+struct dtTilePoly
+{
+ unsigned short v[DT_TILE_VERTS_PER_POLYGON]; // Indices to vertices of the poly.
+ unsigned short n[DT_TILE_VERTS_PER_POLYGON]; // Refs to neighbours of the poly.
+ unsigned short links; // Base index to header 'links' array.
+ unsigned char nlinks; // Number of links for
+ unsigned char nv; // Number of vertices.
+ unsigned char flags; // Flags (not used).
+};
+
+struct dtTilePolyDetail
+{
+ unsigned short vbase; // Offset to detail vertex array.
+ unsigned short nverts; // Number of vertices in the detail mesh.
+ unsigned short tbase; // Offset to detail triangle array.
+ unsigned short ntris; // Number of triangles.
+};
+
+// Stucture holding a link to another polygon.
+struct dtTileLink
+{
+ dtTilePolyRef ref; // Neighbour reference.
+ unsigned short p; // Index to polygon which owns this link.
+ unsigned char e; // Index to polygon edge which owns this link.
+ unsigned char side; // If boundary link, defines on which side the link is.
+ unsigned char bmin, bmax; // If boundary link, defines the sub edge area.
+};
+
+struct dtTileHeader
+{
+ int magic; // Magic number, used to identify the data.
+ int version; // Data version number.
+ int npolys; // Number of polygons in the tile.
+ int nverts; // Number of vertices in the tile.
+ int nlinks; // Number of links in the tile (will be updated when tile is added).
+ int maxlinks; // Number of allocated links.
+ int ndmeshes;
+ int ndverts;
+ int ndtris;
+ float bmin[3], bmax[3]; // Bounding box of the tile.
+ dtTilePoly* polys; // Pointer to the polygons (will be updated when tile is added).
+ float* verts; // Pointer to the vertices (will be updated when tile added).
+ dtTileLink* links; // Pointer to the links (will be updated when tile added).
+ dtTilePolyDetail* dmeshes;
+ float* dverts;
+ unsigned char* dtris;
+};
+
+struct dtTile
+{
+ int salt; // Counter describing modifications to the tile.
+ int x,y; // Grid location of the tile.
+ dtTileHeader* header; // Pointer to tile header.
+ unsigned char* data; // Pointer to tile data.
+ int dataSize; // Size of the tile data.
+ bool ownsData; // Flag indicating of the navmesh should release the data.
+ dtTile* next; // Next free tile or, next tile in spatial grid.
+};
+
+// Encodes a tile id.
+inline dtTilePolyRef dtEncodeTileId(unsigned int salt, unsigned int it, unsigned int ip)
+{
+ return (salt << (DT_TILE_REF_POLY_BITS+DT_TILE_REF_TILE_BITS)) | ((it+1) << DT_TILE_REF_POLY_BITS) | ip;
+}
+
+// Decodes a tile id.
+inline void dtDecodeTileId(dtTilePolyRef ref, unsigned int& salt, unsigned int& it, unsigned int& ip)
+{
+ salt = (ref >> (DT_TILE_REF_POLY_BITS+DT_TILE_REF_TILE_BITS)) & DT_TILE_REF_SALT_MASK;
+ it = ((ref >> DT_TILE_REF_POLY_BITS) & DT_TILE_REF_TILE_MASK) - 1;
+ ip = ref & DT_TILE_REF_POLY_MASK;
+}
+
+static const int DT_TILE_LOOKUP_SIZE = DT_MAX_TILES/4;
+
+class dtTiledNavMesh
+{
+public:
+ dtTiledNavMesh();
+ ~dtTiledNavMesh();
+
+ // Initializes the nav mesh.
+ // Params:
+ // orig - (in) origin of the nav mesh tile space.
+ // tileSiz - (in) size of a tile.
+ // portalheight - (in) height of the portal region between tiles.
+ // Returns: True if succeed, else false.
+ bool init(const float* orig, float tileSize, float portalHeight);
+
+ // Adds new tile into the navmesh.
+ // The add will fail if the data is in wrong format,
+ // there is not enough tiles left, or if there is a tile already at the location.
+ // Params:
+ // x,y - (in) Location of the new tile.
+ // data - (in) Data of the new tile mesh.
+ // dataSize - (in) Data size of the new tile mesh.
+ // ownsData - (in) Flag indicating if the navmesh should own and delete the data.
+ // Returns: True if tile was added, else false.
+ bool addTileAt(int x, int y, unsigned char* data, int dataSize, bool ownsData);
+
+ // Removes tile at specified location.
+ // Params:
+ // x,y - (in) Location of the tile to remove.
+ // data - (out) Data associated with deleted tile.
+ // dataSize - (out) Size of the data associated with deleted tile.
+ // Returns: True if remove suceed, else false.
+ bool removeTileAt(int x, int y, unsigned char** data, int* dataSize);
+
+ // Returns pointer to tile at specified location.
+ // Params:
+ // x,y - (in) Location of the tile to get.
+ // Returns: pointer to tile if tile exists or 0 tile does not exists.
+ dtTile* getTileAt(int x, int y);
+
+ // Returns pointer to tile in the tile array.
+ // Params:
+ // i - (in) Index to the tile to retrieve, must be in range [0,DT_MAX_TILES[
+ // Returns: Pointer to specified tile.
+ dtTile* getTile(int i);
+ const dtTile* getTile(int i) const;
+
+ // Finds the nearest navigation polygon around the center location.
+ // Params:
+ // center - (in) The center of the search box.
+ // extents - (in) The extents of the search box.
+ // Returns: Reference identifier for the polygon, or 0 if no polygons found.
+ dtTilePolyRef findNearestPoly(const float* center, const float* extents);
+
+ // Returns polygons which touch the query box.
+ // Params:
+ // center - (in) the center of the search box.
+ // extents - (in) the extents of the search box.
+ // polys - (out) array holding the search result.
+ // maxPolys - (in) The max number of polygons the polys array can hold.
+ // Returns: Number of polygons in search result array.
+ int queryPolygons(const float* center, const float* extents,
+ dtTilePolyRef* polys, const int maxPolys);
+
+ // Finds path from start polygon to end polygon.
+ // If target polygon canno be reached through the navigation graph,
+ // the last node on the array is nearest node to the end polygon.
+ // Params:
+ // startRef - (in) ref to path start polygon.
+ // endRef - (in) ref to path end polygon.
+ // path - (out) array holding the search result.
+ // maxPathSize - (in) The max number of polygons the path array can hold.
+ // Returns: Number of polygons in search result array.
+ int findPath(dtTilePolyRef startRef, dtTilePolyRef endRef,
+ const float* startPos, const float* endPos,
+ dtTilePolyRef* path, const int maxPathSize);
+
+ // Finds a straight path from start to end locations within the corridor
+ // described by the path polygons.
+ // Start and end locations will be clamped on the corridor.
+ // Params:
+ // startPos - (in) Path start location.
+ // endPos - (in) Path end location.
+ // path - (in) Array of connected polygons describing the corridor.
+ // pathSize - (in) Number of polygons in path array.
+ // straightPath - (out) Points describing the straight path.
+ // maxStraightPathSize - (in) The max number of points the straight path array can hold.
+ // Returns: Number of points in the path.
+ int findStraightPath(const float* startPos, const float* endPos,
+ const dtTilePolyRef* path, const int pathSize,
+ float* straightPath, const int maxStraightPathSize);
+
+ // Finds intersection againts walls starting from start pos.
+ // Params:
+ // startRef - (in) ref to the polygon where the start lies.
+ // startPos - (in) start position of the query.
+ // endPos - (in) end position of the query.
+ // t - (out) hit parameter along the segment, 0 if no hit.
+ // endRef - (out) ref to the last polygon which was processed.
+ // Returns: Number of polygons in path or 0 if failed.
+ int raycast(dtTilePolyRef startRef, const float* startPos, const float* endPos,
+ float& t, dtTilePolyRef* path, const int pathSize);
+
+ // Returns distance to nearest wall from the specified location.
+ // Params:
+ // centerRef - (in) ref to the polygon where the center lies.
+ // centerPos - (in) center if the query circle.
+ // maxRadius - (in) max search radius.
+ // hitPos - (out) location of the nearest hit.
+ // hitNormal - (out) normal of the nearest hit.
+ // Returns: Distance to nearest wall from the test location.
+ float findDistanceToWall(dtTilePolyRef centerRef, const float* centerPos, float maxRadius,
+ float* hitPos, float* hitNormal);
+
+ // Finds polygons found along the navigation graph which touch the specified circle.
+ // Params:
+ // centerRef - (in) ref to the polygon where the center lies.
+ // centerPos - (in) center if the query circle
+ // radius - (in) radius of the query circle
+ // resultRef - (out, opt) refs to the polygons touched by the circle.
+ // resultParent - (out, opt) parent of each result polygon.
+ // resultCost - (out, opt) search cost at each result polygon.
+ // maxResult - (int) maximum capacity of search results.
+ // Returns: Number of results.
+ int findPolysAround(dtTilePolyRef centerRef, const float* centerPos, float radius,
+ dtTilePolyRef* resultRef, dtTilePolyRef* resultParent, float* resultCost,
+ const int maxResult);
+
+ // Returns closest point on navigation polygon.
+ // Params:
+ // ref - (in) ref to the polygon.
+ // pos - (in) the point to check.
+ // closest - (out) closest point.
+ // Returns: true if closest point found.
+ bool closestPointToPoly(dtTilePolyRef ref, const float* pos, float* closest) const;
+
+ // Returns height of the polygon at specified location.
+ // Params:
+ // ref - (in) ref to the polygon.
+ // pos - (in) the point where to locate the height.
+ // height - (out) height at the location.
+ // Returns: true if over polygon.
+ bool getPolyHeight(dtTilePolyRef ref, const float* pos, float* height) const;
+
+ // Returns pointer to a polygon based on ref.
+ const dtTilePoly* getPolyByRef(dtTilePolyRef ref) const;
+
+ // Returns pointer to a polygon vertices based on ref.
+ const float* getPolyVertsByRef(dtTilePolyRef ref) const;
+
+ // Returns pointer to a polygon link based on ref.
+ const dtTileLink* getPolyLinksByRef(dtTilePolyRef ref) const;
+
+private:
+
+ // Returns base id for the tile.
+ dtTilePolyRef getTileId(dtTile* tile);
+ // Returns neighbour tile based on side.
+ dtTile* getNeighbourTileAt(int x, int y, int side);
+ // Returns all polygons in neighbour tile based on portal defined by the segment.
+ int findConnectingPolys(const float* va, const float* vb,
+ dtTile* tile, int side,
+ dtTilePolyRef* con, float* conarea, int maxcon);
+ // Builds internal polygons links for a tile.
+ void buildIntLinks(dtTile* tile);
+ // Builds external polygon links for a tile.
+ void buildExtLinks(dtTile* tile, dtTile* target, int side);
+ // Removes external links at specified side.
+ void removeExtLinks(dtTile* tile, int side);
+ // Queries polygons within a tile.
+ int queryTilePolygons(dtTile* tile, const float* qmin, const float* qmax,
+ dtTilePolyRef* polys, const int maxPolys);
+
+ float getCost(dtTilePolyRef prev, dtTilePolyRef from, dtTilePolyRef to) const;
+ float getFirstCost(const float* pos, dtTilePolyRef from, dtTilePolyRef to) const;
+ float getLastCost(dtTilePolyRef from, dtTilePolyRef to, const float* pos) const;
+ float getHeuristic(const float* from, const float* to) const;
+
+ // Returns portal points between two polygons.
+ bool getPortalPoints(dtTilePolyRef from, dtTilePolyRef to, float* left, float* right) const;
+ // Returns edge mid point between two polygons.
+ bool getEdgeMidPoint(dtTilePolyRef from, dtTilePolyRef to, float* mid) const;
+
+ float m_orig[3];
+ float m_tileSize;
+ float m_portalHeight;
+
+ dtTile* m_posLookup[DT_TILE_LOOKUP_SIZE];
+ dtTile* m_nextFree;
+ dtTile m_tiles[DT_MAX_TILES];
+
+ dtTileLink* m_tmpLinks;
+ int m_ntmpLinks;
+
+ class dtNodePool* m_nodePool;
+ class dtNodeQueue* m_openList;
+};
+
+#endif // DETOURTILENAVMESH_H
diff --git a/extern/recastnavigation/Detour/Include/DetourTileNavMeshBuilder.h b/extern/recastnavigation/Detour/Include/DetourTileNavMeshBuilder.h
new file mode 100644
index 00000000000..643dec1edb1
--- /dev/null
+++ b/extern/recastnavigation/Detour/Include/DetourTileNavMeshBuilder.h
@@ -0,0 +1,29 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#ifndef DETOURTILEDNAVMESHBUILDER_H
+#define DETOURTILEDNAVMESHBUILDER_H
+
+bool dtCreateNavMeshTileData(const unsigned short* verts, const int nverts,
+ const unsigned short* polys, const int npolys, const int nvp,
+ const unsigned short* dmeshes, const float* dverts, const int ndverts,
+ const unsigned char* dtris, const int ndtris,
+ const float* bmin, const float* bmax, float cs, float ch, int tileSize, int walkableClimb,
+ unsigned char** outData, int* outDataSize);
+
+#endif // DETOURTILEDNAVMESHBUILDER_H \ No newline at end of file
diff --git a/extern/recastnavigation/Detour/Source/DetourCommon.cpp b/extern/recastnavigation/Detour/Source/DetourCommon.cpp
new file mode 100644
index 00000000000..e55ce5e6351
--- /dev/null
+++ b/extern/recastnavigation/Detour/Source/DetourCommon.cpp
@@ -0,0 +1,244 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#include <math.h>
+#include "DetourCommon.h"
+
+void closestPtPointTriangle(float* closest, const float* p,
+ const float* a, const float* b, const float* c)
+{
+ // Check if P in vertex region outside A
+ float ab[3], ac[3], ap[3];
+ vsub(ab, b, a);
+ vsub(ac, c, a);
+ vsub(ap, p, a);
+ float d1 = vdot(ab, ap);
+ float d2 = vdot(ac, ap);
+ if (d1 <= 0.0f && d2 <= 0.0f)
+ {
+ // barycentric coordinates (1,0,0)
+ vcopy(closest, a);
+ return;
+ }
+
+ // Check if P in vertex region outside B
+ float bp[3];
+ vsub(bp, p, b);
+ float d3 = vdot(ab, bp);
+ float d4 = vdot(ac, bp);
+ if (d3 >= 0.0f && d4 <= d3)
+ {
+ // barycentric coordinates (0,1,0)
+ vcopy(closest, b);
+ return;
+ }
+
+ // Check if P in edge region of AB, if so return projection of P onto AB
+ float vc = d1*d4 - d3*d2;
+ if (vc <= 0.0f && d1 >= 0.0f && d3 <= 0.0f)
+ {
+ // barycentric coordinates (1-v,v,0)
+ float v = d1 / (d1 - d3);
+ closest[0] = a[0] + v * ab[0];
+ closest[1] = a[1] + v * ab[1];
+ closest[2] = a[2] + v * ab[2];
+ return;
+ }
+
+ // Check if P in vertex region outside C
+ float cp[3];
+ vsub(cp, p, c);
+ float d5 = vdot(ab, cp);
+ float d6 = vdot(ac, cp);
+ if (d6 >= 0.0f && d5 <= d6)
+ {
+ // barycentric coordinates (0,0,1)
+ vcopy(closest, c);
+ return;
+ }
+
+ // Check if P in edge region of AC, if so return projection of P onto AC
+ float vb = d5*d2 - d1*d6;
+ if (vb <= 0.0f && d2 >= 0.0f && d6 <= 0.0f)
+ {
+ // barycentric coordinates (1-w,0,w)
+ float w = d2 / (d2 - d6);
+ closest[0] = a[0] + w * ac[0];
+ closest[1] = a[1] + w * ac[1];
+ closest[2] = a[2] + w * ac[2];
+ return;
+ }
+
+ // Check if P in edge region of BC, if so return projection of P onto BC
+ float va = d3*d6 - d5*d4;
+ if (va <= 0.0f && (d4 - d3) >= 0.0f && (d5 - d6) >= 0.0f)
+ {
+ // barycentric coordinates (0,1-w,w)
+ float w = (d4 - d3) / ((d4 - d3) + (d5 - d6));
+ closest[0] = b[0] + w * (c[0] - b[0]);
+ closest[1] = b[1] + w * (c[1] - b[1]);
+ closest[2] = b[2] + w * (c[2] - b[2]);
+ return;
+ }
+
+ // P inside face region. Compute Q through its barycentric coordinates (u,v,w)
+ float denom = 1.0f / (va + vb + vc);
+ float v = vb * denom;
+ float w = vc * denom;
+ closest[0] = a[0] + ab[0] * v + ac[0] * w;
+ closest[1] = a[1] + ab[1] * v + ac[1] * w;
+ closest[2] = a[2] + ab[2] * v + ac[2] * w;
+}
+
+bool intersectSegmentPoly2D(const float* p0, const float* p1,
+ const float* verts, int nverts,
+ float& tmin, float& tmax,
+ int& segMin, int& segMax)
+{
+ static const float EPS = 0.00000001f;
+
+ tmin = 0;
+ tmax = 1;
+ segMin = -1;
+ segMax = -1;
+
+ float dir[3];
+ vsub(dir, p1, p0);
+
+ for (int i = 0, j = nverts-1; i < nverts; j=i++)
+ {
+ float edge[3], diff[3];
+ vsub(edge, &verts[i*3], &verts[j*3]);
+ vsub(diff, p0, &verts[j*3]);
+ float n = vperp2D(edge, diff);
+ float d = -vperp2D(edge, dir);
+ if (fabs(d) < EPS)
+ {
+ // S is nearly parallel to this edge
+ if (n < 0)
+ return false;
+ else
+ continue;
+ }
+ float t = n / d;
+ if (d < 0)
+ {
+ // segment S is entering across this edge
+ if (t > tmin)
+ {
+ tmin = t;
+ segMin = j;
+ // S enters after leaving polygon
+ if (tmin > tmax)
+ return false;
+ }
+ }
+ else
+ {
+ // segment S is leaving across this edge
+ if (t < tmax)
+ {
+ tmax = t;
+ segMax = j;
+ // S leaves before entering polygon
+ if (tmax < tmin)
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+float distancePtSegSqr2D(const float* pt, const float* p, const float* q, float& t)
+{
+ float pqx = q[0] - p[0];
+ float pqz = q[2] - p[2];
+ float dx = pt[0] - p[0];
+ float dz = pt[2] - p[2];
+ float d = pqx*pqx + pqz*pqz;
+ t = pqx*dx + pqz*dz;
+ if (d > 0)
+ t /= d;
+ if (t < 0)
+ t = 0;
+ else if (t > 1)
+ t = 1;
+
+ dx = p[0] + t*pqx - pt[0];
+ dz = p[2] + t*pqz - pt[2];
+
+ return dx*dx + dz*dz;
+}
+
+void calcPolyCenter(float* tc, const unsigned short* idx, int nidx, const float* verts)
+{
+ tc[0] = 0.0f;
+ tc[1] = 0.0f;
+ tc[2] = 0.0f;
+ for (int j = 0; j < nidx; ++j)
+ {
+ const float* v = &verts[idx[j]*3];
+ tc[0] += v[0];
+ tc[1] += v[1];
+ tc[2] += v[2];
+ }
+ const float s = 1.0f / nidx;
+ tc[0] *= s;
+ tc[1] *= s;
+ tc[2] *= s;
+}
+
+inline float vdot2(const float* a, const float* b)
+{
+ return a[0]*b[0] + a[2]*b[2];
+}
+
+#include <stdio.h>
+
+bool closestHeightPointTriangle(const float* p, const float* a, const float* b, const float* c, float& h)
+{
+ float v0[3], v1[3], v2[3];
+ vsub(v0, c,a);
+ vsub(v1, b,a);
+ vsub(v2, p,a);
+
+ const float dot00 = vdot2(v0, v0);
+ const float dot01 = vdot2(v0, v1);
+ const float dot02 = vdot2(v0, v2);
+ const float dot11 = vdot2(v1, v1);
+ const float dot12 = vdot2(v1, v2);
+
+ // Compute barycentric coordinates
+ float invDenom = 1.0f / (dot00 * dot11 - dot01 * dot01);
+ float u = (dot11 * dot02 - dot01 * dot12) * invDenom;
+ float v = (dot00 * dot12 - dot01 * dot02) * invDenom;
+
+ // The (sloppy) epsilon is needed to allow to get height of points which
+ // are interpolated along the edges of the triangles.
+ static const float EPS = 1e-4f;
+
+ // If point lies inside the triangle, return interpolated ycoord.
+ if (u >= -EPS && v >= -EPS && (u+v) <= 1+EPS)
+ {
+ h = a[1] + v0[1]*u + v1[1]*v;
+ return true;
+ }
+
+ return false;
+}
diff --git a/extern/recastnavigation/Detour/Source/DetourNode.cpp b/extern/recastnavigation/Detour/Source/DetourNode.cpp
new file mode 100644
index 00000000000..1a2305fcede
--- /dev/null
+++ b/extern/recastnavigation/Detour/Source/DetourNode.cpp
@@ -0,0 +1,140 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#include "DetourNode.h"
+#include <string.h>
+
+//////////////////////////////////////////////////////////////////////////////////////////
+dtNodePool::dtNodePool(int maxNodes, int hashSize) :
+
+ m_nodes(0),
+ m_first(0),
+ m_next(0),
+ m_maxNodes(maxNodes),
+ m_hashSize(hashSize),
+ m_nodeCount(0)
+{
+ m_nodes = new dtNode[m_maxNodes];
+ m_next = new unsigned short[m_maxNodes];
+ m_first = new unsigned short[hashSize];
+ memset(m_first, 0xff, sizeof(unsigned short)*m_hashSize);
+ memset(m_next, 0xff, sizeof(unsigned short)*m_maxNodes);
+}
+
+dtNodePool::~dtNodePool()
+{
+ delete [] m_nodes;
+ delete [] m_next;
+ delete [] m_first;
+}
+
+void dtNodePool::clear()
+{
+ memset(m_first, 0xff, sizeof(unsigned short)*m_hashSize);
+ m_nodeCount = 0;
+}
+
+const dtNode* dtNodePool::findNode(unsigned int id) const
+{
+ unsigned int bucket = hashint(id) & (m_hashSize-1);
+ unsigned short i = m_first[bucket];
+ while (i != 0xffff)
+ {
+ if (m_nodes[i].id == id)
+ return &m_nodes[i];
+ i = m_next[i];
+ }
+ return 0;
+}
+
+dtNode* dtNodePool::getNode(unsigned int id)
+{
+ unsigned int bucket = hashint(id) & (m_hashSize-1);
+ unsigned short i = m_first[bucket];
+ dtNode* node = 0;
+ while (i != 0xffff)
+ {
+ if (m_nodes[i].id == id)
+ return &m_nodes[i];
+ i = m_next[i];
+ }
+
+ if (m_nodeCount >= m_maxNodes)
+ return 0;
+
+ i = (unsigned short)m_nodeCount;
+ m_nodeCount++;
+
+ // Init node
+ node = &m_nodes[i];
+ node->pidx = 0;
+ node->cost = 0;
+ node->total = 0;
+ node->id = id;
+ node->flags = 0;
+
+ m_next[i] = m_first[bucket];
+ m_first[bucket] = i;
+
+ return node;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+dtNodeQueue::dtNodeQueue(int n) :
+ m_heap(0),
+ m_capacity(n),
+ m_size(0)
+{
+ m_heap = new dtNode*[m_capacity+1];
+}
+
+dtNodeQueue::~dtNodeQueue()
+{
+ delete [] m_heap;
+}
+
+void dtNodeQueue::bubbleUp(int i, dtNode* node)
+{
+ int parent = (i-1)/2;
+ // note: (index > 0) means there is a parent
+ while ((i > 0) && (m_heap[parent]->total > node->total))
+ {
+ m_heap[i] = m_heap[parent];
+ i = parent;
+ parent = (i-1)/2;
+ }
+ m_heap[i] = node;
+}
+
+void dtNodeQueue::trickleDown(int i, dtNode* node)
+{
+ int child = (i*2)+1;
+ while (child < m_size)
+ {
+ if (((child+1) < m_size) &&
+ (m_heap[child]->total > m_heap[child+1]->total))
+ {
+ child++;
+ }
+ m_heap[i] = m_heap[child];
+ i = child;
+ child = (i*2)+1;
+ }
+ bubbleUp(i, node);
+}
diff --git a/extern/recastnavigation/Detour/Source/DetourStatNavMesh.cpp b/extern/recastnavigation/Detour/Source/DetourStatNavMesh.cpp
new file mode 100644
index 00000000000..bf59cd89dda
--- /dev/null
+++ b/extern/recastnavigation/Detour/Source/DetourStatNavMesh.cpp
@@ -0,0 +1,876 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#include <math.h>
+#include <float.h>
+#include <string.h>
+#include <stdio.h>
+#include "DetourStatNavMesh.h"
+#include "DetourNode.h"
+#include "DetourCommon.h"
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+dtStatNavMesh::dtStatNavMesh() :
+ m_data(0),
+ m_dataSize(0),
+ m_header(0),
+ m_nodePool(0),
+ m_openList(0)
+{
+}
+
+dtStatNavMesh::~dtStatNavMesh()
+{
+ delete m_nodePool;
+ delete m_openList;
+ if (m_data)
+ delete [] m_data;
+}
+
+bool dtStatNavMesh::init(unsigned char* data, int dataSize, bool ownsData)
+{
+ dtStatNavMeshHeader* header = (dtStatNavMeshHeader*)data;
+
+ if (header->magic != DT_STAT_NAVMESH_MAGIC)
+ return false;
+ if (header->version != DT_STAT_NAVMESH_VERSION)
+ return false;
+
+ const int headerSize = sizeof(dtStatNavMeshHeader);
+ const int vertsSize = sizeof(float)*3*header->nverts;
+ const int polysSize = sizeof(dtStatPoly)*header->npolys;
+ const int nodesSize = sizeof(dtStatBVNode)*header->npolys*2;
+ const int detailMeshesSize = sizeof(dtStatPolyDetail)*header->ndmeshes;
+ const int detailVertsSize = sizeof(float)*3*header->ndverts;
+ const int detailTrisSize = sizeof(unsigned char)*4*header->ndtris;
+
+
+ unsigned char* d = data + headerSize;
+ header->verts = (float*)d; d += vertsSize;
+ header->polys = (dtStatPoly*)d; d += polysSize;
+ header->bvtree = (dtStatBVNode*)d; d += nodesSize;
+ header->dmeshes = (dtStatPolyDetail*)d; d += detailMeshesSize;
+ header->dverts = (float*)d; d += detailVertsSize;
+ header->dtris = (unsigned char*)d; d += detailTrisSize;
+
+ m_nodePool = new dtNodePool(2048, 256);
+ if (!m_nodePool)
+ return false;
+
+ m_openList = new dtNodeQueue(2048);
+ if (!m_openList)
+ return false;
+
+ if (ownsData)
+ {
+ m_data = data;
+ m_dataSize = dataSize;
+ }
+
+ m_header = header;
+
+ return true;
+}
+
+const dtStatPoly* dtStatNavMesh::getPolyByRef(dtStatPolyRef ref) const
+{
+ if (!m_header || ref == 0 || (int)ref > m_header->npolys) return 0;
+ return &m_header->polys[ref-1];
+}
+
+int dtStatNavMesh::getPolyIndexByRef(dtStatPolyRef ref) const
+{
+ if (!m_header || ref == 0 || (int)ref > m_header->npolys) return -1;
+ return (int)ref-1;
+}
+
+int dtStatNavMesh::findPath(dtStatPolyRef startRef, dtStatPolyRef endRef,
+ const float* startPos, const float* endPos,
+ dtStatPolyRef* path, const int maxPathSize)
+{
+ if (!m_header) return 0;
+
+ if (!startRef || !endRef)
+ return 0;
+
+ if (!maxPathSize)
+ return 0;
+
+ if (startRef == endRef)
+ {
+ path[0] = startRef;
+ return 1;
+ }
+
+ m_nodePool->clear();
+ m_openList->clear();
+
+ static const float H_SCALE = 1.1f; // Heuristic scale.
+
+ dtNode* startNode = m_nodePool->getNode(startRef);
+ startNode->pidx = 0;
+ startNode->cost = 0;
+ startNode->total = vdist(startPos, endPos) * H_SCALE;
+ startNode->id = startRef;
+ startNode->flags = DT_NODE_OPEN;
+ m_openList->push(startNode);
+
+ dtNode* lastBestNode = startNode;
+ float lastBestNodeCost = startNode->total;
+ while (!m_openList->empty())
+ {
+ dtNode* bestNode = m_openList->pop();
+
+ if (bestNode->id == endRef)
+ {
+ lastBestNode = bestNode;
+ break;
+ }
+
+ const dtStatPoly* poly = getPoly(bestNode->id-1);
+ for (int i = 0; i < (int)poly->nv; ++i)
+ {
+ dtStatPolyRef neighbour = poly->n[i];
+ if (neighbour)
+ {
+ // Skip parent node.
+ if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour)
+ continue;
+
+ dtNode* parent = bestNode;
+ dtNode newNode;
+ newNode.pidx = m_nodePool->getNodeIdx(parent);
+ newNode.id = neighbour;
+
+ // Calculate cost.
+ float p0[3], p1[3];
+ if (!parent->pidx)
+ vcopy(p0, startPos);
+ else
+ getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0);
+ getEdgeMidPoint(parent->id, newNode.id, p1);
+ newNode.cost = parent->cost + vdist(p0,p1);
+ // Special case for last node.
+ if (newNode.id == endRef)
+ newNode.cost += vdist(p1, endPos);
+
+ // Heuristic
+ const float h = vdist(p1,endPos)*H_SCALE;
+ newNode.total = newNode.cost + h;
+
+ dtNode* actualNode = m_nodePool->getNode(newNode.id);
+ if (!actualNode)
+ continue;
+
+ if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) &&
+ !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total))
+ {
+ actualNode->flags &= ~DT_NODE_CLOSED;
+ actualNode->pidx = newNode.pidx;
+ actualNode->cost = newNode.cost;
+ actualNode->total = newNode.total;
+
+ if (h < lastBestNodeCost)
+ {
+ lastBestNodeCost = h;
+ lastBestNode = actualNode;
+ }
+
+ if (actualNode->flags & DT_NODE_OPEN)
+ {
+ m_openList->modify(actualNode);
+ }
+ else
+ {
+ actualNode->flags |= DT_NODE_OPEN;
+ m_openList->push(actualNode);
+ }
+ }
+ }
+ }
+ bestNode->flags |= DT_NODE_CLOSED;
+ }
+
+ // Reverse the path.
+ dtNode* prev = 0;
+ dtNode* node = lastBestNode;
+ do
+ {
+ dtNode* next = m_nodePool->getNodeAtIdx(node->pidx);
+ node->pidx = m_nodePool->getNodeIdx(prev);
+ prev = node;
+ node = next;
+ }
+ while (node);
+
+ // Store path
+ node = prev;
+ int n = 0;
+ do
+ {
+ path[n++] = node->id;
+ node = m_nodePool->getNodeAtIdx(node->pidx);
+ }
+ while (node && n < maxPathSize);
+
+ return n;
+}
+
+bool dtStatNavMesh::closestPointToPoly(dtStatPolyRef ref, const float* pos, float* closest) const
+{
+ int idx = getPolyIndexByRef(ref);
+ if (idx == -1)
+ return false;
+
+ float closestDistSqr = FLT_MAX;
+ const dtStatPoly* p = getPoly(idx);
+ const dtStatPolyDetail* pd = getPolyDetail(idx);
+
+ for (int j = 0; j < pd->ntris; ++j)
+ {
+ const unsigned char* t = getDetailTri(pd->tbase+j);
+ const float* v[3];
+ for (int k = 0; k < 3; ++k)
+ {
+ if (t[k] < p->nv)
+ v[k] = getVertex(p->v[t[k]]);
+ else
+ v[k] = getDetailVertex(pd->vbase+(t[k]-p->nv));
+ }
+ float pt[3];
+ closestPtPointTriangle(pt, pos, v[0], v[1], v[2]);
+ float d = vdistSqr(pos, pt);
+ if (d < closestDistSqr)
+ {
+ vcopy(closest, pt);
+ closestDistSqr = d;
+ }
+ }
+
+ return true;
+}
+
+bool dtStatNavMesh::getPolyHeight(dtStatPolyRef ref, const float* pos, float* height) const
+{
+ int idx = getPolyIndexByRef(ref);
+ if (idx == -1)
+ return false;
+
+ const dtStatPoly* p = getPoly(idx);
+ const dtStatPolyDetail* pd = getPolyDetail(idx);
+
+ for (int i = 0; i < pd->ntris; ++i)
+ {
+ const unsigned char* t = getDetailTri(pd->tbase+i);
+ const float* v[3];
+ for (int j = 0; j < 3; ++j)
+ {
+ if (t[j] < p->nv)
+ v[j] = getVertex(p->v[t[j]]);
+ else
+ v[j] = getDetailVertex(pd->vbase+(t[j]-p->nv));
+ }
+ float h;
+ if (closestHeightPointTriangle(pos, v[0], v[1], v[2], h))
+ {
+ if (height)
+ *height = h;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+int dtStatNavMesh::findStraightPath(const float* startPos, const float* endPos,
+ const dtStatPolyRef* path, const int pathSize,
+ float* straightPath, const int maxStraightPathSize)
+{
+ if (!m_header) return 0;
+
+ if (!maxStraightPathSize)
+ return 0;
+
+ if (!path[0])
+ return 0;
+
+ int straightPathSize = 0;
+
+ float closestStartPos[3];
+ if (!closestPointToPoly(path[0], startPos, closestStartPos))
+ return 0;
+
+ // Add start point.
+ vcopy(&straightPath[straightPathSize*3], closestStartPos);
+ straightPathSize++;
+ if (straightPathSize >= maxStraightPathSize)
+ return straightPathSize;
+
+ float closestEndPos[3];
+ if (!closestPointToPoly(path[pathSize-1], endPos, closestEndPos))
+ return 0;
+
+ float portalApex[3], portalLeft[3], portalRight[3];
+
+ if (pathSize > 1)
+ {
+ vcopy(portalApex, closestStartPos);
+ vcopy(portalLeft, portalApex);
+ vcopy(portalRight, portalApex);
+ int apexIndex = 0;
+ int leftIndex = 0;
+ int rightIndex = 0;
+
+ for (int i = 0; i < pathSize; ++i)
+ {
+ float left[3], right[3];
+ if (i < pathSize-1)
+ {
+ // Next portal.
+ getPortalPoints(path[i], path[i+1], left, right);
+ }
+ else
+ {
+ // End of the path.
+ vcopy(left, closestEndPos);
+ vcopy(right, closestEndPos);
+ }
+
+ // Right vertex.
+ if (vequal(portalApex, portalRight))
+ {
+ vcopy(portalRight, right);
+ rightIndex = i;
+ }
+ else
+ {
+ if (triArea2D(portalApex, portalRight, right) <= 0.0f)
+ {
+ if (triArea2D(portalApex, portalLeft, right) > 0.0f)
+ {
+ vcopy(portalRight, right);
+ rightIndex = i;
+ }
+ else
+ {
+ vcopy(portalApex, portalLeft);
+ apexIndex = leftIndex;
+
+ if (!vequal(&straightPath[(straightPathSize-1)*3], portalApex))
+ {
+ vcopy(&straightPath[straightPathSize*3], portalApex);
+ straightPathSize++;
+ if (straightPathSize >= maxStraightPathSize)
+ return straightPathSize;
+ }
+
+ vcopy(portalLeft, portalApex);
+ vcopy(portalRight, portalApex);
+ leftIndex = apexIndex;
+ rightIndex = apexIndex;
+
+ // Restart
+ i = apexIndex;
+
+ continue;
+ }
+ }
+ }
+
+ // Left vertex.
+ if (vequal(portalApex, portalLeft))
+ {
+ vcopy(portalLeft, left);
+ leftIndex = i;
+ }
+ else
+ {
+ if (triArea2D(portalApex, portalLeft, left) >= 0.0f)
+ {
+ if (triArea2D(portalApex, portalRight, left) < 0.0f)
+ {
+ vcopy(portalLeft, left);
+ leftIndex = i;
+ }
+ else
+ {
+ vcopy(portalApex, portalRight);
+ apexIndex = rightIndex;
+
+ if (!vequal(&straightPath[(straightPathSize-1)*3], portalApex))
+ {
+ vcopy(&straightPath[straightPathSize*3], portalApex);
+ straightPathSize++;
+ if (straightPathSize >= maxStraightPathSize)
+ return straightPathSize;
+ }
+
+ vcopy(portalLeft, portalApex);
+ vcopy(portalRight, portalApex);
+ leftIndex = apexIndex;
+ rightIndex = apexIndex;
+
+ // Restart
+ i = apexIndex;
+
+ continue;
+ }
+ }
+ }
+ }
+ }
+
+ // Add end point.
+ vcopy(&straightPath[straightPathSize*3], closestEndPos);
+ straightPathSize++;
+
+ return straightPathSize;
+}
+
+int dtStatNavMesh::getPolyVerts(dtStatPolyRef ref, float* verts) const
+{
+ if (!m_header) return 0;
+ const dtStatPoly* poly = getPolyByRef(ref);
+ if (!poly) return 0;
+ float* v = verts;
+ for (int i = 0; i < (int)poly->nv; ++i)
+ {
+ const float* cv = &m_header->verts[poly->v[i]*3];
+ *v++ = cv[0];
+ *v++ = cv[1];
+ *v++ = cv[2];
+ }
+ return (int)poly->nv;
+}
+
+int dtStatNavMesh::raycast(dtStatPolyRef centerRef, const float* startPos, const float* endPos,
+ float& t, dtStatPolyRef* path, const int pathSize)
+{
+ if (!m_header) return 0;
+ if (!centerRef) return 0;
+
+ dtStatPolyRef prevRef = centerRef;
+ dtStatPolyRef curRef = centerRef;
+ t = 0;
+
+ float verts[DT_STAT_VERTS_PER_POLYGON*3];
+ int n = 0;
+
+ while (curRef)
+ {
+ // Cast ray against current polygon.
+ int nv = getPolyVerts(curRef, verts);
+ if (nv < 3)
+ {
+ // Hit bad polygon, report hit.
+ return n;
+ }
+
+ float tmin, tmax;
+ int segMin, segMax;
+ if (!intersectSegmentPoly2D(startPos, endPos, verts, nv, tmin, tmax, segMin, segMax))
+ {
+ // Could not a polygon, keep the old t and report hit.
+ return n;
+ }
+ // Keep track of furthest t so far.
+ if (tmax > t)
+ t = tmax;
+
+ if (n < pathSize)
+ path[n++] = curRef;
+
+ // Check the neighbour of this polygon.
+ const dtStatPoly* poly = getPolyByRef(curRef);
+ dtStatPolyRef nextRef = poly->n[segMax];
+ if (!nextRef)
+ {
+ // No neighbour, we hit a wall.
+ return n;
+ }
+
+ // No hit, advance to neighbour polygon.
+ prevRef = curRef;
+ curRef = nextRef;
+ }
+
+ return n;
+}
+
+
+float dtStatNavMesh::findDistanceToWall(dtStatPolyRef centerRef, const float* centerPos, float maxRadius,
+ float* hitPos, float* hitNormal)
+{
+ if (!m_header) return 0;
+ if (!centerRef) return 0;
+
+ m_nodePool->clear();
+ m_openList->clear();
+
+ dtNode* startNode = m_nodePool->getNode(centerRef);
+ startNode->pidx = 0;
+ startNode->cost = 0;
+ startNode->total = 0;
+ startNode->id = centerRef;
+ startNode->flags = DT_NODE_OPEN;
+ m_openList->push(startNode);
+
+ float radiusSqr = sqr(maxRadius);
+
+ hitNormal[0] = 1;
+ hitNormal[1] = 0;
+ hitNormal[2] = 0;
+
+ while (!m_openList->empty())
+ {
+ dtNode* bestNode = m_openList->pop();
+ const dtStatPoly* poly = getPoly(bestNode->id-1);
+
+ // Hit test walls.
+ for (int i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j = i++)
+ {
+ // Skip non-solid edges.
+ if (poly->n[j]) continue;
+
+ // Calc distance to the edge.
+ const float* vj = getVertex(poly->v[j]);
+ const float* vi = getVertex(poly->v[i]);
+ float tseg;
+ float distSqr = distancePtSegSqr2D(centerPos, vj, vi, tseg);
+
+ // Edge is too far, skip.
+ if (distSqr > radiusSqr)
+ continue;
+
+ // Hit wall, update radius.
+ radiusSqr = distSqr;
+ // Calculate hit pos.
+ hitPos[0] = vj[0] + (vi[0] - vj[0])*tseg;
+ hitPos[1] = vj[1] + (vi[1] - vj[1])*tseg;
+ hitPos[2] = vj[2] + (vi[2] - vj[2])*tseg;
+ }
+
+ // Check to see if teh circle expands to one of the neighbours and expand.
+ for (int i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j = i++)
+ {
+ // Skip solid edges.
+ if (!poly->n[j]) continue;
+
+ // Expand to neighbour if not visited yet.
+ dtStatPolyRef neighbour = poly->n[j];
+
+ // Skip parent node.
+ if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour)
+ continue;
+
+ // Calc distance to the edge.
+ const float* vj = getVertex(poly->v[j]);
+ const float* vi = getVertex(poly->v[i]);
+ float tseg;
+ float distSqr = distancePtSegSqr2D(centerPos, vj, vi, tseg);
+
+ // Edge is too far, skip.
+ if (distSqr > radiusSqr)
+ continue;
+
+ dtNode* parent = bestNode;
+ dtNode newNode;
+ newNode.pidx = m_nodePool->getNodeIdx(parent);
+ newNode.id = neighbour;
+
+ // Cost
+ float p0[3], p1[3];
+ if (!parent->pidx)
+ vcopy(p0, centerPos);
+ else
+ getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0);
+ getEdgeMidPoint(parent->id, newNode.id, p1);
+ newNode.total = parent->total + vdist(p0,p1);
+
+ dtNode* actualNode = m_nodePool->getNode(newNode.id);
+ if (!actualNode)
+ continue;
+
+ if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) &&
+ !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total))
+ {
+ actualNode->flags &= ~DT_NODE_CLOSED;
+ actualNode->pidx = newNode.pidx;
+ actualNode->total = newNode.total;
+
+ if (actualNode->flags & DT_NODE_OPEN)
+ {
+ m_openList->modify(actualNode);
+ }
+ else
+ {
+ actualNode->flags |= DT_NODE_OPEN;
+ m_openList->push(actualNode);
+ }
+ }
+ }
+ bestNode->flags |= DT_NODE_CLOSED;
+ }
+
+ // Calc hit normal.
+ vsub(hitNormal, centerPos, hitPos);
+ vnormalize(hitNormal);
+
+ return sqrtf(radiusSqr);
+}
+
+int dtStatNavMesh::findPolysAround(dtStatPolyRef centerRef, const float* centerPos, float radius,
+ dtStatPolyRef* resultRef, dtStatPolyRef* resultParent, float* resultCost,
+ const int maxResult)
+{
+ if (!m_header) return 0;
+ if (!centerRef) return 0;
+
+ m_nodePool->clear();
+ m_openList->clear();
+
+ dtNode* startNode = m_nodePool->getNode(centerRef);
+ startNode->pidx = 0;
+ startNode->cost = 0;
+ startNode->total = 0;
+ startNode->id = centerRef;
+ startNode->flags = DT_NODE_OPEN;
+ m_openList->push(startNode);
+
+ int n = 0;
+ if (n < maxResult)
+ {
+ if (resultRef)
+ resultRef[n] = startNode->id;
+ if (resultParent)
+ resultParent[n] = 0;
+ if (resultCost)
+ resultCost[n] = 0;
+ ++n;
+ }
+
+ const float radiusSqr = sqr(radius);
+
+ while (!m_openList->empty())
+ {
+ dtNode* bestNode = m_openList->pop();
+ const dtStatPoly* poly = getPoly(bestNode->id-1);
+ for (unsigned i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j=i++)
+ {
+ dtStatPolyRef neighbour = poly->n[j];
+
+ if (neighbour)
+ {
+ // Skip parent node.
+ if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour)
+ continue;
+
+ // Calc distance to the edge.
+ const float* vj = getVertex(poly->v[j]);
+ const float* vi = getVertex(poly->v[i]);
+ float tseg;
+ float distSqr = distancePtSegSqr2D(centerPos, vj, vi, tseg);
+
+ // If the circle is not touching the next polygon, skip it.
+ if (distSqr > radiusSqr)
+ continue;
+
+ dtNode* parent = bestNode;
+ dtNode newNode;
+ newNode.pidx = m_nodePool->getNodeIdx(parent);
+ newNode.id = neighbour;
+
+ // Cost
+ float p0[3], p1[3];
+ if (!parent->pidx)
+ vcopy(p0, centerPos);
+ else
+ getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0);
+ getEdgeMidPoint(parent->id, newNode.id, p1);
+ newNode.total = parent->total + vdist(p0,p1);
+
+ dtNode* actualNode = m_nodePool->getNode(newNode.id);
+ if (!actualNode)
+ continue;
+
+ if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) &&
+ !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total))
+ {
+ actualNode->flags &= ~DT_NODE_CLOSED;
+ actualNode->pidx = newNode.pidx;
+ actualNode->total = newNode.total;
+
+ if (actualNode->flags & DT_NODE_OPEN)
+ {
+ m_openList->modify(actualNode);
+ }
+ else
+ {
+ if (n < maxResult)
+ {
+ if (resultRef)
+ resultRef[n] = actualNode->id;
+ if (resultParent)
+ resultParent[n] = m_nodePool->getNodeAtIdx(actualNode->pidx)->id;
+ if (resultCost)
+ resultCost[n] = actualNode->total;
+ ++n;
+ }
+ actualNode->flags |= DT_NODE_OPEN;
+ m_openList->push(actualNode);
+ }
+ }
+ }
+ }
+ bestNode->flags |= DT_NODE_CLOSED;
+
+ }
+
+ return n;
+}
+
+// Returns polygons which are withing certain radius from the query location.
+int dtStatNavMesh::queryPolygons(const float* center, const float* extents,
+ dtStatPolyRef* polys, const int maxIds)
+{
+ if (!m_header) return 0;
+
+ const dtStatBVNode* node = &m_header->bvtree[0];
+ const dtStatBVNode* end = &m_header->bvtree[m_header->nnodes];
+
+ // Calculate quantized box
+ const float ics = 1.0f / m_header->cs;
+ unsigned short bmin[3], bmax[3];
+ // Clamp query box to world box.
+ float minx = clamp(center[0] - extents[0], m_header->bmin[0], m_header->bmax[0]) - m_header->bmin[0];
+ float miny = clamp(center[1] - extents[1], m_header->bmin[1], m_header->bmax[1]) - m_header->bmin[1];
+ float minz = clamp(center[2] - extents[2], m_header->bmin[2], m_header->bmax[2]) - m_header->bmin[2];
+ float maxx = clamp(center[0] + extents[0], m_header->bmin[0], m_header->bmax[0]) - m_header->bmin[0];
+ float maxy = clamp(center[1] + extents[1], m_header->bmin[1], m_header->bmax[1]) - m_header->bmin[1];
+ float maxz = clamp(center[2] + extents[2], m_header->bmin[2], m_header->bmax[2]) - m_header->bmin[2];
+ // Quantize
+ bmin[0] = (unsigned short)(ics * minx) & 0xfffe;
+ bmin[1] = (unsigned short)(ics * miny) & 0xfffe;
+ bmin[2] = (unsigned short)(ics * minz) & 0xfffe;
+ bmax[0] = (unsigned short)(ics * maxx + 1) | 1;
+ bmax[1] = (unsigned short)(ics * maxy + 1) | 1;
+ bmax[2] = (unsigned short)(ics * maxz + 1) | 1;
+
+ // Traverse tree
+ int n = 0;
+ while (node < end)
+ {
+ bool overlap = checkOverlapBox(bmin, bmax, node->bmin, node->bmax);
+ bool isLeafNode = node->i >= 0;
+
+ if (isLeafNode && overlap)
+ {
+ if (n < maxIds)
+ {
+ polys[n] = (dtStatPolyRef)node->i;
+ n++;
+ }
+ }
+
+ if (overlap || isLeafNode)
+ node++;
+ else
+ {
+ const int escapeIndex = -node->i;
+ node += escapeIndex;
+ }
+ }
+
+ return n;
+}
+
+dtStatPolyRef dtStatNavMesh::findNearestPoly(const float* center, const float* extents)
+{
+ if (!m_header) return 0;
+
+ // Get nearby polygons from proximity grid.
+ dtStatPolyRef polys[128];
+ int npolys = queryPolygons(center, extents, polys, 128);
+
+ // Find nearest polygon amongst the nearby polygons.
+ dtStatPolyRef nearest = 0;
+ float nearestDistanceSqr = FLT_MAX;
+ for (int i = 0; i < npolys; ++i)
+ {
+ dtStatPolyRef ref = polys[i];
+ float closest[3];
+ if (!closestPointToPoly(ref, center, closest))
+ continue;
+ float d = vdistSqr(center, closest);
+ if (d < nearestDistanceSqr)
+ {
+ nearestDistanceSqr = d;
+ nearest = ref;
+ }
+ }
+
+ return nearest;
+}
+
+bool dtStatNavMesh::getPortalPoints(dtStatPolyRef from, dtStatPolyRef to, float* left, float* right) const
+{
+ const dtStatPoly* fromPoly = getPolyByRef(from);
+ if (!fromPoly)
+ return false;
+
+ // Find common edge between the polygons and returns the segment end points.
+ for (unsigned i = 0, j = (int)fromPoly->nv - 1; i < (int)fromPoly->nv; j = i++)
+ {
+ unsigned short neighbour = fromPoly->n[j];
+ if (neighbour == to)
+ {
+ vcopy(left, getVertex(fromPoly->v[j]));
+ vcopy(right, getVertex(fromPoly->v[i]));
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool dtStatNavMesh::getEdgeMidPoint(dtStatPolyRef from, dtStatPolyRef to, float* mid) const
+{
+ float left[3], right[3];
+ if (!getPortalPoints(from, to, left,right)) return false;
+ mid[0] = (left[0]+right[0])*0.5f;
+ mid[1] = (left[1]+right[1])*0.5f;
+ mid[2] = (left[2]+right[2])*0.5f;
+ return true;
+}
+
+bool dtStatNavMesh::isInClosedList(dtStatPolyRef ref) const
+{
+ if (!m_nodePool) return false;
+ const dtNode* node = m_nodePool->findNode(ref);
+ return node && node->flags & DT_NODE_CLOSED;
+}
+
+int dtStatNavMesh::getMemUsed() const
+{
+ if (!m_nodePool || ! m_openList)
+ return 0;
+ return sizeof(*this) + m_dataSize +
+ m_nodePool->getMemUsed() +
+ m_openList->getMemUsed();
+}
diff --git a/extern/recastnavigation/Detour/Source/DetourStatNavMeshBuilder.cpp b/extern/recastnavigation/Detour/Source/DetourStatNavMeshBuilder.cpp
new file mode 100644
index 00000000000..2ca455fb53d
--- /dev/null
+++ b/extern/recastnavigation/Detour/Source/DetourStatNavMeshBuilder.cpp
@@ -0,0 +1,346 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include "DetourStatNavMesh.h"
+
+struct BVItem
+{
+ unsigned short bmin[3];
+ unsigned short bmax[3];
+ int i;
+};
+
+static int compareItemX(const void* va, const void* vb)
+{
+ const BVItem* a = (const BVItem*)va;
+ const BVItem* b = (const BVItem*)vb;
+ if (a->bmin[0] < b->bmin[0])
+ return -1;
+ if (a->bmin[0] > b->bmin[0])
+ return 1;
+ return 0;
+}
+
+static int compareItemY(const void* va, const void* vb)
+{
+ const BVItem* a = (const BVItem*)va;
+ const BVItem* b = (const BVItem*)vb;
+ if (a->bmin[1] < b->bmin[1])
+ return -1;
+ if (a->bmin[1] > b->bmin[1])
+ return 1;
+ return 0;
+}
+
+static int compareItemZ(const void* va, const void* vb)
+{
+ const BVItem* a = (const BVItem*)va;
+ const BVItem* b = (const BVItem*)vb;
+ if (a->bmin[2] < b->bmin[2])
+ return -1;
+ if (a->bmin[2] > b->bmin[2])
+ return 1;
+ return 0;
+}
+
+static void calcExtends(BVItem* items, int nitems, int imin, int imax,
+ unsigned short* bmin, unsigned short* bmax)
+{
+ bmin[0] = items[imin].bmin[0];
+ bmin[1] = items[imin].bmin[1];
+ bmin[2] = items[imin].bmin[2];
+
+ bmax[0] = items[imin].bmax[0];
+ bmax[1] = items[imin].bmax[1];
+ bmax[2] = items[imin].bmax[2];
+
+ for (int i = imin+1; i < imax; ++i)
+ {
+ const BVItem& it = items[i];
+ if (it.bmin[0] < bmin[0]) bmin[0] = it.bmin[0];
+ if (it.bmin[1] < bmin[1]) bmin[1] = it.bmin[1];
+ if (it.bmin[2] < bmin[2]) bmin[2] = it.bmin[2];
+
+ if (it.bmax[0] > bmax[0]) bmax[0] = it.bmax[0];
+ if (it.bmax[1] > bmax[1]) bmax[1] = it.bmax[1];
+ if (it.bmax[2] > bmax[2]) bmax[2] = it.bmax[2];
+ }
+}
+
+inline int longestAxis(unsigned short x, unsigned short y, unsigned short z)
+{
+ int axis = 0;
+ unsigned short maxVal = x;
+ if (y > maxVal)
+ {
+ axis = 1;
+ maxVal = y;
+ }
+ if (z > maxVal)
+ {
+ axis = 2;
+ maxVal = z;
+ }
+ return axis;
+}
+
+static void subdivide(BVItem* items, int nitems, int imin, int imax, int& curNode, dtStatBVNode* nodes)
+{
+ int inum = imax - imin;
+ int icur = curNode;
+
+ dtStatBVNode& node = nodes[curNode++];
+
+ if (inum == 1)
+ {
+ // Leaf
+ node.bmin[0] = items[imin].bmin[0];
+ node.bmin[1] = items[imin].bmin[1];
+ node.bmin[2] = items[imin].bmin[2];
+
+ node.bmax[0] = items[imin].bmax[0];
+ node.bmax[1] = items[imin].bmax[1];
+ node.bmax[2] = items[imin].bmax[2];
+
+ node.i = items[imin].i;
+ }
+ else
+ {
+ // Split
+ calcExtends(items, nitems, imin, imax, node.bmin, node.bmax);
+
+ int axis = longestAxis(node.bmax[0] - node.bmin[0],
+ node.bmax[1] - node.bmin[1],
+ node.bmax[2] - node.bmin[2]);
+
+ if (axis == 0)
+ {
+ // Sort along x-axis
+ qsort(items+imin, inum, sizeof(BVItem), compareItemX);
+ }
+ else if (axis == 1)
+ {
+ // Sort along y-axis
+ qsort(items+imin, inum, sizeof(BVItem), compareItemY);
+ }
+ else
+ {
+ // Sort along z-axis
+ qsort(items+imin, inum, sizeof(BVItem), compareItemZ);
+ }
+
+ int isplit = imin+inum/2;
+
+ // Left
+ subdivide(items, nitems, imin, isplit, curNode, nodes);
+ // Right
+ subdivide(items, nitems, isplit, imax, curNode, nodes);
+
+ int iescape = curNode - icur;
+ // Negative index means escape.
+ node.i = -iescape;
+ }
+}
+
+/*static*/ int createBVTree(const unsigned short* verts, const int nverts,
+ const unsigned short* polys, const int npolys, const int nvp,
+ float cs, float ch,
+ int nnodes, dtStatBVNode* nodes)
+{
+ // Build tree
+ BVItem* items = new BVItem[npolys];
+ for (int i = 0; i < npolys; i++)
+ {
+ BVItem& it = items[i];
+ it.i = i+1;
+ // Calc polygon bounds.
+ const unsigned short* p = &polys[i*nvp*2];
+ it.bmin[0] = it.bmax[0] = verts[p[0]*3+0];
+ it.bmin[1] = it.bmax[1] = verts[p[0]*3+1];
+ it.bmin[2] = it.bmax[2] = verts[p[0]*3+2];
+
+ for (int j = 1; j < nvp; ++j)
+ {
+ if (p[j] == 0xffff) break;
+ unsigned short x = verts[p[j]*3+0];
+ unsigned short y = verts[p[j]*3+1];
+ unsigned short z = verts[p[j]*3+2];
+
+ if (x < it.bmin[0]) it.bmin[0] = x;
+ if (y < it.bmin[1]) it.bmin[1] = y;
+ if (z < it.bmin[2]) it.bmin[2] = z;
+
+ if (x > it.bmax[0]) it.bmax[0] = x;
+ if (y > it.bmax[1]) it.bmax[1] = y;
+ if (z > it.bmax[2]) it.bmax[2] = z;
+ }
+ // Remap y
+ it.bmin[1] = (unsigned short)floorf((float)it.bmin[1]*ch/cs);
+ it.bmax[1] = (unsigned short)ceilf((float)it.bmax[1]*ch/cs);
+ }
+
+ int curNode = 0;
+ subdivide(items, npolys, 0, npolys, curNode, nodes);
+
+ delete [] items;
+
+ return curNode;
+}
+
+
+bool dtCreateNavMeshData(const unsigned short* verts, const int nverts,
+ const unsigned short* polys, const int npolys, const int nvp,
+ const float* bmin, const float* bmax, float cs, float ch,
+ const unsigned short* dmeshes, const float* dverts, const int ndverts,
+ const unsigned char* dtris, const int ndtris,
+ unsigned char** outData, int* outDataSize)
+{
+ if (nvp > DT_STAT_VERTS_PER_POLYGON)
+ return false;
+ if (nverts >= 0xffff)
+ return false;
+
+ if (!nverts)
+ return false;
+ if (!npolys)
+ return false;
+ if (!dmeshes || !dverts || ! dtris)
+ return false;
+
+ // Find unique detail vertices.
+ int uniqueDetailVerts = 0;
+ if (dmeshes)
+ {
+ for (int i = 0; i < npolys; ++i)
+ {
+ const unsigned short* p = &polys[i*nvp*2];
+ int ndv = dmeshes[i*4+1];
+ int nv = 0;
+ for (int j = 0; j < nvp; ++j)
+ {
+ if (p[j] == 0xffff) break;
+ nv++;
+ }
+ ndv -= nv;
+ uniqueDetailVerts += ndv;
+ }
+ }
+
+ // Calculate data size
+ const int headerSize = sizeof(dtStatNavMeshHeader);
+ const int vertsSize = sizeof(float)*3*nverts;
+ const int polysSize = sizeof(dtStatPoly)*npolys;
+ const int nodesSize = sizeof(dtStatBVNode)*npolys*2;
+ const int detailMeshesSize = sizeof(dtStatPolyDetail)*npolys;
+ const int detailVertsSize = sizeof(float)*3*uniqueDetailVerts;
+ const int detailTrisSize = sizeof(unsigned char)*4*ndtris;
+
+ const int dataSize = headerSize + vertsSize + polysSize + nodesSize +
+ detailMeshesSize + detailVertsSize + detailTrisSize;
+ unsigned char* data = new unsigned char[dataSize];
+ if (!data)
+ return false;
+ memset(data, 0, dataSize);
+
+ unsigned char* d = data;
+ dtStatNavMeshHeader* header = (dtStatNavMeshHeader*)d; d += headerSize;
+ float* navVerts = (float*)d; d += vertsSize;
+ dtStatPoly* navPolys = (dtStatPoly*)d; d += polysSize;
+ dtStatBVNode* navNodes = (dtStatBVNode*)d; d += nodesSize;
+ dtStatPolyDetail* navDMeshes = (dtStatPolyDetail*)d; d += detailMeshesSize;
+ float* navDVerts = (float*)d; d += detailVertsSize;
+ unsigned char* navDTris = (unsigned char*)d; d += detailTrisSize;
+
+ // Store header
+ header->magic = DT_STAT_NAVMESH_MAGIC;
+ header->version = DT_STAT_NAVMESH_VERSION;
+ header->npolys = npolys;
+ header->nverts = nverts;
+ header->cs = cs;
+ header->bmin[0] = bmin[0];
+ header->bmin[1] = bmin[1];
+ header->bmin[2] = bmin[2];
+ header->bmax[0] = bmax[0];
+ header->bmax[1] = bmax[1];
+ header->bmax[2] = bmax[2];
+ header->ndmeshes = dmeshes ? npolys : 0;
+ header->ndverts = dmeshes ? uniqueDetailVerts : 0;
+ header->ndtris = dmeshes ? ndtris : 0;
+
+ // Store vertices
+ for (int i = 0; i < nverts; ++i)
+ {
+ const unsigned short* iv = &verts[i*3];
+ float* v = &navVerts[i*3];
+ v[0] = bmin[0] + iv[0] * cs;
+ v[1] = bmin[1] + iv[1] * ch;
+ v[2] = bmin[2] + iv[2] * cs;
+ }
+
+ // Store polygons
+ const unsigned short* src = polys;
+ for (int i = 0; i < npolys; ++i)
+ {
+ dtStatPoly* p = &navPolys[i];
+ p->nv = 0;
+ for (int j = 0; j < nvp; ++j)
+ {
+ if (src[j] == 0xffff) break;
+ p->v[j] = src[j];
+ p->n[j] = src[nvp+j]+1;
+ p->nv++;
+ }
+ src += nvp*2;
+ }
+
+ header->nnodes = createBVTree(verts, nverts, polys, npolys, nvp,
+ cs, ch, npolys*2, navNodes);
+
+
+ // Store detail meshes and vertices.
+ // The nav polygon vertices are stored as the first vertices on each mesh.
+ // We compress the mesh data by skipping them and using the navmesh coordinates.
+ unsigned short vbase = 0;
+ for (int i = 0; i < npolys; ++i)
+ {
+ dtStatPolyDetail& dtl = navDMeshes[i];
+ const int vb = dmeshes[i*4+0];
+ const int ndv = dmeshes[i*4+1];
+ const int nv = navPolys[i].nv;
+ dtl.vbase = vbase;
+ dtl.nverts = ndv-nv;
+ dtl.tbase = dmeshes[i*4+2];
+ dtl.ntris = dmeshes[i*4+3];
+ // Copy vertices except the first 'nv' verts which are equal to nav poly verts.
+ if (ndv-nv)
+ {
+ memcpy(&navDVerts[vbase*3], &dverts[(vb+nv)*3], sizeof(float)*3*(ndv-nv));
+ vbase += ndv-nv;
+ }
+ }
+ // Store triangles.
+ memcpy(navDTris, dtris, sizeof(unsigned char)*4*ndtris);
+
+ *outData = data;
+ *outDataSize = dataSize;
+
+ return true;
+}
diff --git a/extern/recastnavigation/Detour/Source/DetourTileNavMesh.cpp b/extern/recastnavigation/Detour/Source/DetourTileNavMesh.cpp
new file mode 100644
index 00000000000..0813c7755cc
--- /dev/null
+++ b/extern/recastnavigation/Detour/Source/DetourTileNavMesh.cpp
@@ -0,0 +1,1428 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#include <math.h>
+#include <float.h>
+#include <string.h>
+#include <stdio.h>
+#include "DetourTileNavMesh.h"
+#include "DetourNode.h"
+#include "DetourCommon.h"
+
+
+inline int opposite(int side) { return (side+2) & 0x3; }
+
+inline bool overlapBoxes(const float* amin, const float* amax,
+ const float* bmin, const float* bmax)
+{
+ bool overlap = true;
+ overlap = (amin[0] > bmax[0] || amax[0] < bmin[0]) ? false : overlap;
+ overlap = (amin[1] > bmax[1] || amax[1] < bmin[1]) ? false : overlap;
+ overlap = (amin[2] > bmax[2] || amax[2] < bmin[2]) ? false : overlap;
+ return overlap;
+}
+
+inline bool overlapRects(const float* amin, const float* amax,
+ const float* bmin, const float* bmax)
+{
+ bool overlap = true;
+ overlap = (amin[0] > bmax[0] || amax[0] < bmin[0]) ? false : overlap;
+ overlap = (amin[1] > bmax[1] || amax[1] < bmin[1]) ? false : overlap;
+ return overlap;
+}
+
+static void calcRect(const float* va, const float* vb,
+ float* bmin, float* bmax,
+ int side, float padx, float pady)
+{
+ if ((side&1) == 0)
+ {
+ bmin[0] = min(va[2],vb[2]) + padx;
+ bmin[1] = min(va[1],vb[1]) - pady;
+ bmax[0] = max(va[2],vb[2]) - padx;
+ bmax[1] = max(va[1],vb[1]) + pady;
+ }
+ else
+ {
+ bmin[0] = min(va[0],vb[0]) + padx;
+ bmin[1] = min(va[1],vb[1]) - pady;
+ bmax[0] = max(va[0],vb[0]) - padx;
+ bmax[1] = max(va[1],vb[1]) + pady;
+ }
+}
+
+inline int computeTileHash(int x, int y)
+{
+ const unsigned int h1 = 0x8da6b343; // Large multiplicative constants;
+ const unsigned int h2 = 0xd8163841; // here arbitrarily chosen primes
+ unsigned int n = h1 * x + h2 * y;
+ return (int)(n & (DT_TILE_LOOKUP_SIZE-1));
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+dtTiledNavMesh::dtTiledNavMesh() :
+ m_tileSize(0),
+ m_portalHeight(0),
+ m_nextFree(0),
+ m_tmpLinks(0),
+ m_ntmpLinks(0),
+ m_nodePool(0),
+ m_openList(0)
+{
+}
+
+dtTiledNavMesh::~dtTiledNavMesh()
+{
+ for (int i = 0; i < DT_MAX_TILES; ++i)
+ {
+ if (m_tiles[i].data && m_tiles[i].dataSize < 0)
+ {
+ delete [] m_tiles[i].data;
+ m_tiles[i].data = 0;
+ m_tiles[i].dataSize = 0;
+ }
+ }
+ delete [] m_tmpLinks;
+ delete m_nodePool;
+ delete m_openList;
+}
+
+bool dtTiledNavMesh::init(const float* orig, float tileSize, float portalHeight)
+{
+ vcopy(m_orig, orig);
+ m_tileSize = tileSize;
+ m_portalHeight = portalHeight;
+
+ // Init tiles
+ memset(m_tiles, 0, sizeof(dtTile)*DT_MAX_TILES);
+ memset(m_posLookup, 0, sizeof(dtTile*)*DT_TILE_LOOKUP_SIZE);
+ m_nextFree = 0;
+ for (int i = DT_MAX_TILES-1; i >= 0; --i)
+ {
+ m_tiles[i].next = m_nextFree;
+ m_nextFree = &m_tiles[i];
+ }
+
+ if (!m_nodePool)
+ {
+ m_nodePool = new dtNodePool(2048, 256);
+ if (!m_nodePool)
+ return false;
+ }
+
+ if (!m_openList)
+ {
+ m_openList = new dtNodeQueue(2048);
+ if (!m_openList)
+ return false;
+ }
+
+ return true;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+int dtTiledNavMesh::findConnectingPolys(const float* va, const float* vb,
+ dtTile* tile, int side,
+ dtTilePolyRef* con, float* conarea, int maxcon)
+{
+ if (!tile) return 0;
+ dtTileHeader* h = tile->header;
+
+ float amin[2], amax[2];
+ calcRect(va,vb, amin,amax, side, 0.01f, m_portalHeight);
+
+ // Remove links pointing to 'side' and compact the links array.
+ float bmin[2], bmax[2];
+ unsigned short m = 0x8000 | (unsigned short)side;
+ int n = 0;
+
+ dtTilePolyRef base = getTileId(tile);
+
+ for (int i = 0; i < h->npolys; ++i)
+ {
+ dtTilePoly* poly = &h->polys[i];
+ for (int j = 0; j < poly->nv; ++j)
+ {
+ // Skip edges which do not point to the right side.
+ if (poly->n[j] != m) continue;
+ // Check if the segments touch.
+ const float* vc = &h->verts[poly->v[j]*3];
+ const float* vd = &h->verts[poly->v[(j+1) % (int)poly->nv]*3];
+ calcRect(vc,vd, bmin,bmax, side, 0.01f, m_portalHeight);
+ if (!overlapRects(amin,amax, bmin,bmax)) continue;
+ // Add return value.
+ if (n < maxcon)
+ {
+ conarea[n*2+0] = max(amin[0], bmin[0]);
+ conarea[n*2+1] = min(amax[0], bmax[0]);
+ con[n] = base | (unsigned int)i;
+ n++;
+ }
+ break;
+ }
+ }
+ return n;
+}
+
+void dtTiledNavMesh::removeExtLinks(dtTile* tile, int side)
+{
+ if (!tile) return;
+ dtTileHeader* h = tile->header;
+
+ // Remove links pointing to 'side' and compact the links array.
+ dtTileLink* pool = m_tmpLinks;
+ int nlinks = 0;
+ for (int i = 0; i < h->npolys; ++i)
+ {
+ dtTilePoly* poly = &h->polys[i];
+ int plinks = nlinks;
+ int nplinks = 0;
+ for (int j = 0; j < poly->nlinks; ++j)
+ {
+ dtTileLink* link = &h->links[poly->links+j];
+ if ((int)link->side != side)
+ {
+ if (nlinks < h->maxlinks)
+ {
+ dtTileLink* dst = &pool[nlinks++];
+ memcpy(dst, link, sizeof(dtTileLink));
+ nplinks++;
+ }
+ }
+ }
+ poly->links = plinks;
+ poly->nlinks = nplinks;
+ }
+ h->nlinks = nlinks;
+ if (h->nlinks)
+ memcpy(h->links, m_tmpLinks, sizeof(dtTileLink)*nlinks);
+}
+
+void dtTiledNavMesh::buildExtLinks(dtTile* tile, dtTile* target, int side)
+{
+ if (!tile) return;
+ dtTileHeader* h = tile->header;
+
+ // Remove links pointing to 'side' and compact the links array.
+ dtTileLink* pool = m_tmpLinks;
+ int nlinks = 0;
+ for (int i = 0; i < h->npolys; ++i)
+ {
+ dtTilePoly* poly = &h->polys[i];
+ int plinks = nlinks;
+ int nplinks = 0;
+ // Copy internal and other external links.
+ for (int j = 0; j < poly->nlinks; ++j)
+ {
+ dtTileLink* link = &h->links[poly->links+j];
+ if ((int)link->side != side)
+ {
+ if (nlinks < h->maxlinks)
+ {
+ dtTileLink* dst = &pool[nlinks++];
+ memcpy(dst, link, sizeof(dtTileLink));
+ nplinks++;
+ }
+ }
+ }
+ // Create new links.
+ unsigned short m = 0x8000 | (unsigned short)side;
+ for (int j = 0; j < poly->nv; ++j)
+ {
+ // Skip edges which do not point to the right side.
+ if (poly->n[j] != m) continue;
+
+ // Create new links
+ const float* va = &h->verts[poly->v[j]*3];
+ const float* vb = &h->verts[poly->v[(j+1)%(int)poly->nv]*3];
+ dtTilePolyRef nei[4];
+ float neia[4*2];
+ int nnei = findConnectingPolys(va,vb, target, opposite(side), nei,neia,4);
+ for (int k = 0; k < nnei; ++k)
+ {
+ if (nlinks < h->maxlinks)
+ {
+ dtTileLink* link = &pool[nlinks++];
+ link->ref = nei[k];
+ link->p = (unsigned short)i;
+ link->e = (unsigned char)j;
+ link->side = (unsigned char)side;
+
+ // Compress portal limits to a byte value.
+ if (side == 0 || side == 2)
+ {
+ const float lmin = min(va[2], vb[2]);
+ const float lmax = max(va[2], vb[2]);
+ link->bmin = (unsigned char)(clamp((neia[k*2+0]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f);
+ link->bmax = (unsigned char)(clamp((neia[k*2+1]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f);
+ }
+ else
+ {
+ const float lmin = min(va[0], vb[0]);
+ const float lmax = max(va[0], vb[0]);
+ link->bmin = (unsigned char)(clamp((neia[k*2+0]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f);
+ link->bmax = (unsigned char)(clamp((neia[k*2+1]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f);
+ }
+ nplinks++;
+ }
+ }
+ }
+
+ poly->links = plinks;
+ poly->nlinks = nplinks;
+ }
+ h->nlinks = nlinks;
+ if (h->nlinks)
+ memcpy(h->links, m_tmpLinks, sizeof(dtTileLink)*nlinks);
+}
+
+void dtTiledNavMesh::buildIntLinks(dtTile* tile)
+{
+ if (!tile) return;
+ dtTileHeader* h = tile->header;
+
+ dtTilePolyRef base = getTileId(tile);
+ dtTileLink* pool = h->links;
+ int nlinks = 0;
+ for (int i = 0; i < h->npolys; ++i)
+ {
+ dtTilePoly* poly = &h->polys[i];
+ poly->links = nlinks;
+ poly->nlinks = 0;
+ for (int j = 0; j < poly->nv; ++j)
+ {
+ // Skip hard and non-internal edges.
+ if (poly->n[j] == 0 || (poly->n[j] & 0x8000)) continue;
+
+ if (nlinks < h->maxlinks)
+ {
+ dtTileLink* link = &pool[nlinks++];
+ link->ref = base | (unsigned int)(poly->n[j]-1);
+ link->p = (unsigned short)i;
+ link->e = (unsigned char)j;
+ link->side = 0xff;
+ link->bmin = link->bmax = 0;
+ poly->nlinks++;
+ }
+ }
+ }
+ h->nlinks = nlinks;
+}
+
+bool dtTiledNavMesh::addTileAt(int x, int y, unsigned char* data, int dataSize, bool ownsData)
+{
+ if (getTileAt(x,y))
+ return false;
+ // Make sure there is enough space for new tile.
+ if (!m_nextFree)
+ return false;
+ // Make sure the data is in right format.
+ dtTileHeader* header = (dtTileHeader*)data;
+ if (header->magic != DT_TILE_NAVMESH_MAGIC)
+ return false;
+ if (header->version != DT_TILE_NAVMESH_VERSION)
+ return false;
+
+ // Make sure the tmp link array is large enough.
+ if (header->maxlinks > m_ntmpLinks)
+ {
+ m_ntmpLinks = header->maxlinks;
+ delete [] m_tmpLinks;
+ m_tmpLinks = 0;
+ m_tmpLinks = new dtTileLink[m_ntmpLinks];
+ }
+ if (!m_tmpLinks)
+ return false;
+
+ // Allocate a tile.
+ dtTile* tile = m_nextFree;
+ m_nextFree = tile->next;
+ tile->next = 0;
+
+ // Insert tile into the position lut.
+ int h = computeTileHash(x,y);
+ tile->next = m_posLookup[h];
+ m_posLookup[h] = tile;
+
+ // Patch header pointers.
+ const int headerSize = sizeof(dtTileHeader);
+ const int vertsSize = sizeof(float)*3*header->nverts;
+ const int polysSize = sizeof(dtTilePoly)*header->npolys;
+ const int linksSize = sizeof(dtTileLink)*(header->maxlinks);
+ const int detailMeshesSize = sizeof(dtTilePolyDetail)*header->ndmeshes;
+ const int detailVertsSize = sizeof(float)*3*header->ndverts;
+ const int detailTrisSize = sizeof(unsigned char)*4*header->ndtris;
+
+ unsigned char* d = data + headerSize;
+ header->verts = (float*)d; d += vertsSize;
+ header->polys = (dtTilePoly*)d; d += polysSize;
+ header->links = (dtTileLink*)d; d += linksSize;
+ header->dmeshes = (dtTilePolyDetail*)d; d += detailMeshesSize;
+ header->dverts = (float*)d; d += detailVertsSize;
+ header->dtris = (unsigned char*)d; d += detailTrisSize;
+
+ // Init tile.
+ tile->header = header;
+ tile->x = x;
+ tile->y = y;
+ tile->data = data;
+ tile->dataSize = dataSize;
+ tile->ownsData = ownsData;
+
+ buildIntLinks(tile);
+
+ // Create connections connections.
+ for (int i = 0; i < 4; ++i)
+ {
+ dtTile* nei = getNeighbourTileAt(x,y,i);
+ if (nei)
+ {
+ buildExtLinks(tile, nei, i);
+ buildExtLinks(nei, tile, opposite(i));
+ }
+ }
+
+ return true;
+}
+
+dtTile* dtTiledNavMesh::getTileAt(int x, int y)
+{
+ // Find tile based on hash.
+ int h = computeTileHash(x,y);
+ dtTile* tile = m_posLookup[h];
+ while (tile)
+ {
+ if (tile->x == x && tile->y == y)
+ return tile;
+ tile = tile->next;
+ }
+ return 0;
+}
+
+dtTile* dtTiledNavMesh::getTile(int i)
+{
+ return &m_tiles[i];
+}
+
+const dtTile* dtTiledNavMesh::getTile(int i) const
+{
+ return &m_tiles[i];
+}
+
+dtTile* dtTiledNavMesh::getNeighbourTileAt(int x, int y, int side)
+{
+ switch (side)
+ {
+ case 0: x++; break;
+ case 1: y++; break;
+ case 2: x--; break;
+ case 3: y--; break;
+ };
+ return getTileAt(x,y);
+}
+
+bool dtTiledNavMesh::removeTileAt(int x, int y, unsigned char** data, int* dataSize)
+{
+ // Remove tile from hash lookup.
+ int h = computeTileHash(x,y);
+ dtTile* prev = 0;
+ dtTile* tile = m_posLookup[h];
+ while (tile)
+ {
+ if (tile->x == x && tile->y == y)
+ {
+ if (prev)
+ prev->next = tile->next;
+ else
+ m_posLookup[h] = tile->next;
+ break;
+ }
+ prev = tile;
+ tile = tile->next;
+ }
+ if (!tile)
+ return false;
+
+ // Remove connections to neighbour tiles.
+ for (int i = 0; i < 4; ++i)
+ {
+ dtTile* nei = getNeighbourTileAt(x,y,i);
+ if (!nei) continue;
+ removeExtLinks(nei, opposite(i));
+ }
+
+
+ // Reset tile.
+ if (tile->ownsData)
+ {
+ // Owns data
+ delete [] tile->data;
+ tile->data = 0;
+ tile->dataSize = 0;
+ if (data) *data = 0;
+ if (dataSize) *dataSize = 0;
+ }
+ else
+ {
+ if (data) *data = tile->data;
+ if (dataSize) *dataSize = tile->dataSize;
+ }
+ tile->header = 0;
+ tile->x = tile->y = 0;
+ tile->salt++;
+
+ // Add to free list.
+ tile->next = m_nextFree;
+ m_nextFree = tile;
+
+ return true;
+}
+
+
+
+bool dtTiledNavMesh::closestPointToPoly(dtTilePolyRef ref, const float* pos, float* closest) const
+{
+ unsigned int salt, it, ip;
+ dtDecodeTileId(ref, salt, it, ip);
+ if (it >= DT_MAX_TILES) return false;
+ if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return false;
+ const dtTileHeader* header = m_tiles[it].header;
+
+ if (ip >= (unsigned int)header->npolys) return false;
+ const dtTilePoly* poly = &header->polys[ip];
+
+ float closestDistSqr = FLT_MAX;
+ const dtTilePolyDetail* pd = &header->dmeshes[ip];
+
+ for (int j = 0; j < pd->ntris; ++j)
+ {
+ const unsigned char* t = &header->dtris[(pd->tbase+j)*4];
+ const float* v[3];
+ for (int k = 0; k < 3; ++k)
+ {
+ if (t[k] < poly->nv)
+ v[k] = &header->verts[poly->v[t[k]]*3];
+ else
+ v[k] = &header->dverts[(pd->vbase+(t[k]-poly->nv))*3];
+ }
+ float pt[3];
+ closestPtPointTriangle(pt, pos, v[0], v[1], v[2]);
+ float d = vdistSqr(pos, pt);
+ if (d < closestDistSqr)
+ {
+ vcopy(closest, pt);
+ closestDistSqr = d;
+ }
+ }
+
+ return true;
+}
+
+bool dtTiledNavMesh::getPolyHeight(dtTilePolyRef ref, const float* pos, float* height) const
+{
+ unsigned int salt, it, ip;
+ dtDecodeTileId(ref, salt, it, ip);
+ if (it >= DT_MAX_TILES) return false;
+ if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return false;
+ const dtTileHeader* header = m_tiles[it].header;
+
+ if (ip >= (unsigned int)header->npolys) return false;
+ const dtTilePoly* poly = &header->polys[ip];
+
+ const dtTilePolyDetail* pd = &header->dmeshes[ip];
+ for (int j = 0; j < pd->ntris; ++j)
+ {
+ const unsigned char* t = &header->dtris[(pd->tbase+j)*4];
+ const float* v[3];
+ for (int k = 0; k < 3; ++k)
+ {
+ if (t[k] < poly->nv)
+ v[k] = &header->verts[poly->v[t[k]]*3];
+ else
+ v[k] = &header->dverts[(pd->vbase+(t[k]-poly->nv))*3];
+ }
+ float h;
+ if (closestHeightPointTriangle(pos, v[0], v[1], v[2], h))
+ {
+ if (height)
+ *height = h;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+dtTilePolyRef dtTiledNavMesh::findNearestPoly(const float* center, const float* extents)
+{
+ // Get nearby polygons from proximity grid.
+ dtTilePolyRef polys[128];
+ int npolys = queryPolygons(center, extents, polys, 128);
+
+ // Find nearest polygon amongst the nearby polygons.
+ dtTilePolyRef nearest = 0;
+ float nearestDistanceSqr = FLT_MAX;
+ for (int i = 0; i < npolys; ++i)
+ {
+ dtTilePolyRef ref = polys[i];
+ float closest[3];
+ if (!closestPointToPoly(ref, center, closest))
+ continue;
+ float d = vdistSqr(center, closest);
+ if (d < nearestDistanceSqr)
+ {
+ nearestDistanceSqr = d;
+ nearest = ref;
+ }
+ }
+
+ return nearest;
+}
+
+dtTilePolyRef dtTiledNavMesh::getTileId(dtTile* tile)
+{
+ if (!tile) return 0;
+ const unsigned int it = tile - m_tiles;
+ return dtEncodeTileId(tile->salt, it, 0);
+}
+
+int dtTiledNavMesh::queryTilePolygons(dtTile* tile,
+ const float* qmin, const float* qmax,
+ dtTilePolyRef* polys, const int maxPolys)
+{
+ float bmin[3], bmax[3];
+ const dtTileHeader* header = tile->header;
+ int n = 0;
+ dtTilePolyRef base = getTileId(tile);
+ for (int i = 0; i < header->npolys; ++i)
+ {
+ // Calc polygon bounds.
+ dtTilePoly* p = &header->polys[i];
+ const float* v = &header->verts[p->v[0]*3];
+ vcopy(bmin, v);
+ vcopy(bmax, v);
+ for (int j = 1; j < p->nv; ++j)
+ {
+ v = &header->verts[p->v[j]*3];
+ vmin(bmin, v);
+ vmax(bmax, v);
+ }
+ if (overlapBoxes(qmin,qmax, bmin,bmax))
+ {
+ if (n < maxPolys)
+ polys[n++] = base | (dtTilePolyRef)i;
+ }
+ }
+ return n;
+}
+
+int dtTiledNavMesh::queryPolygons(const float* center, const float* extents,
+ dtTilePolyRef* polys, const int maxPolys)
+{
+ float bmin[3], bmax[3];
+ bmin[0] = center[0] - extents[0];
+ bmin[1] = center[1] - extents[1];
+ bmin[2] = center[2] - extents[2];
+
+ bmax[0] = center[0] + extents[0];
+ bmax[1] = center[1] + extents[1];
+ bmax[2] = center[2] + extents[2];
+
+ // Find tiles the query touches.
+ const int minx = (int)floorf((bmin[0]-m_orig[0]) / m_tileSize);
+ const int maxx = (int)ceilf((bmax[0]-m_orig[0]) / m_tileSize);
+
+ const int miny = (int)floorf((bmin[2]-m_orig[2]) / m_tileSize);
+ const int maxy = (int)ceilf((bmax[2]-m_orig[2]) / m_tileSize);
+
+ int n = 0;
+ for (int y = miny; y < maxy; ++y)
+ {
+ for (int x = minx; x < maxx; ++x)
+ {
+ dtTile* tile = getTileAt(x,y);
+ if (!tile) continue;
+ n += queryTilePolygons(tile, bmin, bmax, polys+n, maxPolys-n);
+ if (n >= maxPolys) return n;
+ }
+ }
+
+ return n;
+}
+
+int dtTiledNavMesh::findPath(dtTilePolyRef startRef, dtTilePolyRef endRef,
+ const float* startPos, const float* endPos,
+ dtTilePolyRef* path, const int maxPathSize)
+{
+ if (!startRef || !endRef)
+ return 0;
+
+ if (!maxPathSize)
+ return 0;
+
+ if (!getPolyByRef(startRef) || !getPolyByRef(endRef))
+ return 0;
+
+ if (startRef == endRef)
+ {
+ path[0] = startRef;
+ return 1;
+ }
+
+ if (!m_nodePool || !m_openList)
+ return 0;
+
+ m_nodePool->clear();
+ m_openList->clear();
+
+ static const float H_SCALE = 1.1f; // Heuristic scale.
+
+ dtNode* startNode = m_nodePool->getNode(startRef);
+ startNode->pidx = 0;
+ startNode->cost = 0;
+ startNode->total = vdist(startPos, endPos) * H_SCALE;
+ startNode->id = startRef;
+ startNode->flags = DT_NODE_OPEN;
+ m_openList->push(startNode);
+
+ dtNode* lastBestNode = startNode;
+ float lastBestNodeCost = startNode->total;
+ while (!m_openList->empty())
+ {
+ dtNode* bestNode = m_openList->pop();
+
+ if (bestNode->id == endRef)
+ {
+ lastBestNode = bestNode;
+ break;
+ }
+
+ // Get poly and tile.
+ unsigned int salt, it, ip;
+ dtDecodeTileId(bestNode->id, salt, it, ip);
+ // The API input has been cheked already, skip checking internal data.
+ const dtTileHeader* header = m_tiles[it].header;
+ const dtTilePoly* poly = &header->polys[ip];
+
+ for (int i = 0; i < poly->nlinks; ++i)
+ {
+ dtTilePolyRef neighbour = header->links[poly->links+i].ref;
+ if (neighbour)
+ {
+ // Skip parent node.
+ if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour)
+ continue;
+
+ dtNode* parent = bestNode;
+ dtNode newNode;
+ newNode.pidx = m_nodePool->getNodeIdx(parent);
+ newNode.id = neighbour;
+
+ // Calculate cost.
+ float p0[3], p1[3];
+ if (!parent->pidx)
+ vcopy(p0, startPos);
+ else
+ getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0);
+ getEdgeMidPoint(parent->id, newNode.id, p1);
+ newNode.cost = parent->cost + vdist(p0,p1);
+ // Special case for last node.
+ if (newNode.id == endRef)
+ newNode.cost += vdist(p1, endPos);
+
+ // Heuristic
+ const float h = vdist(p1,endPos)*H_SCALE;
+ newNode.total = newNode.cost + h;
+
+ dtNode* actualNode = m_nodePool->getNode(newNode.id);
+ if (!actualNode)
+ continue;
+
+ if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) &&
+ !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total))
+ {
+ actualNode->flags &= DT_NODE_CLOSED;
+ actualNode->pidx = newNode.pidx;
+ actualNode->cost = newNode.cost;
+ actualNode->total = newNode.total;
+
+ if (h < lastBestNodeCost)
+ {
+ lastBestNodeCost = h;
+ lastBestNode = actualNode;
+ }
+
+ if (actualNode->flags & DT_NODE_OPEN)
+ {
+ m_openList->modify(actualNode);
+ }
+ else
+ {
+ actualNode->flags |= DT_NODE_OPEN;
+ m_openList->push(actualNode);
+ }
+ }
+ }
+ }
+ bestNode->flags |= DT_NODE_CLOSED;
+ }
+
+ // Reverse the path.
+ dtNode* prev = 0;
+ dtNode* node = lastBestNode;
+ do
+ {
+ dtNode* next = m_nodePool->getNodeAtIdx(node->pidx);
+ node->pidx = m_nodePool->getNodeIdx(prev);
+ prev = node;
+ node = next;
+ }
+ while (node);
+
+ // Store path
+ node = prev;
+ int n = 0;
+ do
+ {
+ path[n++] = node->id;
+ node = m_nodePool->getNodeAtIdx(node->pidx);
+ }
+ while (node && n < maxPathSize);
+
+ return n;
+}
+
+int dtTiledNavMesh::findStraightPath(const float* startPos, const float* endPos,
+ const dtTilePolyRef* path, const int pathSize,
+ float* straightPath, const int maxStraightPathSize)
+{
+ if (!maxStraightPathSize)
+ return 0;
+
+ if (!path[0])
+ return 0;
+
+ int straightPathSize = 0;
+
+ float closestStartPos[3];
+ if (!closestPointToPoly(path[0], startPos, closestStartPos))
+ return 0;
+
+ // Add start point.
+ vcopy(&straightPath[straightPathSize*3], closestStartPos);
+ straightPathSize++;
+ if (straightPathSize >= maxStraightPathSize)
+ return straightPathSize;
+
+ float closestEndPos[3];
+ if (!closestPointToPoly(path[pathSize-1], endPos, closestEndPos))
+ return 0;
+
+ float portalApex[3], portalLeft[3], portalRight[3];
+
+ if (pathSize > 1)
+ {
+ vcopy(portalApex, closestStartPos);
+ vcopy(portalLeft, portalApex);
+ vcopy(portalRight, portalApex);
+ int apexIndex = 0;
+ int leftIndex = 0;
+ int rightIndex = 0;
+
+ for (int i = 0; i < pathSize; ++i)
+ {
+ float left[3], right[3];
+ if (i < pathSize-1)
+ {
+ // Next portal.
+ if (!getPortalPoints(path[i], path[i+1], left, right))
+ {
+ if (!closestPointToPoly(path[i], endPos, closestEndPos))
+ return 0;
+ vcopy(&straightPath[straightPathSize*3], closestEndPos);
+ straightPathSize++;
+ return straightPathSize;
+ }
+ }
+ else
+ {
+ // End of the path.
+ vcopy(left, closestEndPos);
+ vcopy(right, closestEndPos);
+ }
+
+ // Right vertex.
+ if (vequal(portalApex, portalRight))
+ {
+ vcopy(portalRight, right);
+ rightIndex = i;
+ }
+ else
+ {
+ if (triArea2D(portalApex, portalRight, right) <= 0.0f)
+ {
+ if (triArea2D(portalApex, portalLeft, right) > 0.0f)
+ {
+ vcopy(portalRight, right);
+ rightIndex = i;
+ }
+ else
+ {
+ vcopy(portalApex, portalLeft);
+ apexIndex = leftIndex;
+
+ if (!vequal(&straightPath[(straightPathSize-1)*3], portalApex))
+ {
+ vcopy(&straightPath[straightPathSize*3], portalApex);
+ straightPathSize++;
+ if (straightPathSize >= maxStraightPathSize)
+ return straightPathSize;
+ }
+
+ vcopy(portalLeft, portalApex);
+ vcopy(portalRight, portalApex);
+ leftIndex = apexIndex;
+ rightIndex = apexIndex;
+
+ // Restart
+ i = apexIndex;
+
+ continue;
+ }
+ }
+ }
+
+ // Left vertex.
+ if (vequal(portalApex, portalLeft))
+ {
+ vcopy(portalLeft, left);
+ leftIndex = i;
+ }
+ else
+ {
+ if (triArea2D(portalApex, portalLeft, left) >= 0.0f)
+ {
+ if (triArea2D(portalApex, portalRight, left) < 0.0f)
+ {
+ vcopy(portalLeft, left);
+ leftIndex = i;
+ }
+ else
+ {
+ vcopy(portalApex, portalRight);
+ apexIndex = rightIndex;
+
+ if (!vequal(&straightPath[(straightPathSize-1)*3], portalApex))
+ {
+ vcopy(&straightPath[straightPathSize*3], portalApex);
+ straightPathSize++;
+ if (straightPathSize >= maxStraightPathSize)
+ return straightPathSize;
+ }
+
+ vcopy(portalLeft, portalApex);
+ vcopy(portalRight, portalApex);
+ leftIndex = apexIndex;
+ rightIndex = apexIndex;
+
+ // Restart
+ i = apexIndex;
+
+ continue;
+ }
+ }
+ }
+ }
+ }
+
+ // Add end point.
+ vcopy(&straightPath[straightPathSize*3], closestEndPos);
+ straightPathSize++;
+
+ return straightPathSize;
+}
+
+// Returns portal points between two polygons.
+bool dtTiledNavMesh::getPortalPoints(dtTilePolyRef from, dtTilePolyRef to, float* left, float* right) const
+{
+ unsigned int salt, it, ip;
+ dtDecodeTileId(from, salt, it, ip);
+ if (it >= DT_MAX_TILES) return false;
+ if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return false;
+ if (ip >= (unsigned int)m_tiles[it].header->npolys) return false;
+ const dtTileHeader* fromHeader = m_tiles[it].header;
+ const dtTilePoly* fromPoly = &fromHeader->polys[ip];
+
+ for (int i = 0; i < fromPoly->nlinks; ++i)
+ {
+ const dtTileLink* link = &fromHeader->links[fromPoly->links+i];
+ if (link->ref == to)
+ {
+ // Find portal vertices.
+ const int v0 = fromPoly->v[link->e];
+ const int v1 = fromPoly->v[(link->e+1) % fromPoly->nv];
+ vcopy(left, &fromHeader->verts[v0*3]);
+ vcopy(right, &fromHeader->verts[v1*3]);
+ // If the link is at tile boundary, clamp the vertices to
+ // the link width.
+ if (link->side == 0 || link->side == 2)
+ {
+ // Unpack portal limits.
+ const float smin = min(left[2],right[2]);
+ const float smax = max(left[2],right[2]);
+ const float s = (smax-smin) / 255.0f;
+ const float lmin = smin + link->bmin*s;
+ const float lmax = smin + link->bmax*s;
+ left[2] = max(left[2],lmin);
+ left[2] = min(left[2],lmax);
+ right[2] = max(right[2],lmin);
+ right[2] = min(right[2],lmax);
+ }
+ else if (link->side == 1 || link->side == 3)
+ {
+ // Unpack portal limits.
+ const float smin = min(left[0],right[0]);
+ const float smax = max(left[0],right[0]);
+ const float s = (smax-smin) / 255.0f;
+ const float lmin = smin + link->bmin*s;
+ const float lmax = smin + link->bmax*s;
+ left[0] = max(left[0],lmin);
+ left[0] = min(left[0],lmax);
+ right[0] = max(right[0],lmin);
+ right[0] = min(right[0],lmax);
+ }
+ return true;
+ }
+ }
+ return false;
+}
+
+// Returns edge mid point between two polygons.
+bool dtTiledNavMesh::getEdgeMidPoint(dtTilePolyRef from, dtTilePolyRef to, float* mid) const
+{
+ float left[3], right[3];
+ if (!getPortalPoints(from, to, left,right)) return false;
+ mid[0] = (left[0]+right[0])*0.5f;
+ mid[1] = (left[1]+right[1])*0.5f;
+ mid[2] = (left[2]+right[2])*0.5f;
+ return true;
+}
+
+int dtTiledNavMesh::raycast(dtTilePolyRef centerRef, const float* startPos, const float* endPos,
+ float& t, dtTilePolyRef* path, const int pathSize)
+{
+ t = 0;
+
+ if (!centerRef || !getPolyByRef(centerRef))
+ return 0;
+
+ dtTilePolyRef curRef = centerRef;
+ float verts[DT_TILE_VERTS_PER_POLYGON*3];
+ int n = 0;
+
+ while (curRef)
+ {
+ // Cast ray against current polygon.
+
+ // The API input has been cheked already, skip checking internal data.
+ unsigned int salt, it, ip;
+ dtDecodeTileId(curRef, salt, it, ip);
+ const dtTileHeader* header = m_tiles[it].header;
+ const dtTilePoly* poly = &header->polys[ip];
+
+ // Collect vertices.
+ int nv = 0;
+ for (int i = 0; i < (int)poly->nv; ++i)
+ {
+ vcopy(&verts[nv*3], &header->verts[poly->v[i]*3]);
+ nv++;
+ }
+ if (nv < 3)
+ {
+ // Hit bad polygon, report hit.
+ return n;
+ }
+
+ float tmin, tmax;
+ int segMin, segMax;
+ if (!intersectSegmentPoly2D(startPos, endPos, verts, nv, tmin, tmax, segMin, segMax))
+ {
+ // Could not hit the polygon, keep the old t and report hit.
+ return n;
+ }
+ // Keep track of furthest t so far.
+ if (tmax > t)
+ t = tmax;
+
+ if (n < pathSize)
+ path[n++] = curRef;
+
+ // Follow neighbours.
+ dtTilePolyRef nextRef = 0;
+ for (int i = 0; i < poly->nlinks; ++i)
+ {
+ const dtTileLink* link = &header->links[poly->links+i];
+ if ((int)link->e == segMax)
+ {
+ // If the link is internal, just return the ref.
+ if (link->side == 0xff)
+ {
+ nextRef = link->ref;
+ break;
+ }
+
+ // If the link is at tile boundary,
+ const int v0 = poly->v[link->e];
+ const int v1 = poly->v[(link->e+1) % poly->nv];
+ const float* left = &header->verts[v0*3];
+ const float* right = &header->verts[v1*3];
+
+ // Check that the intersection lies inside the link portal.
+ if (link->side == 0 || link->side == 2)
+ {
+ // Calculate link size.
+ const float smin = min(left[2],right[2]);
+ const float smax = max(left[2],right[2]);
+ const float s = (smax-smin) / 255.0f;
+ const float lmin = smin + link->bmin*s;
+ const float lmax = smin + link->bmax*s;
+ // Find Z intersection.
+ float z = startPos[2] + (endPos[2]-startPos[2])*tmax;
+ if (z >= lmin && z <= lmax)
+ {
+ nextRef = link->ref;
+ break;
+ }
+ }
+ else if (link->side == 1 || link->side == 3)
+ {
+ // Calculate link size.
+ const float smin = min(left[0],right[0]);
+ const float smax = max(left[0],right[0]);
+ const float s = (smax-smin) / 255.0f;
+ const float lmin = smin + link->bmin*s;
+ const float lmax = smin + link->bmax*s;
+ // Find X intersection.
+ float x = startPos[0] + (endPos[0]-startPos[0])*tmax;
+ if (x >= lmin && x <= lmax)
+ {
+ nextRef = link->ref;
+ break;
+ }
+ }
+ }
+ }
+
+ if (!nextRef)
+ {
+ // No neighbour, we hit a wall.
+ return n;
+ }
+
+ // No hit, advance to neighbour polygon.
+ curRef = nextRef;
+ }
+
+ return n;
+}
+
+int dtTiledNavMesh::findPolysAround(dtTilePolyRef centerRef, const float* centerPos, float radius,
+ dtTilePolyRef* resultRef, dtTilePolyRef* resultParent, float* resultCost,
+ const int maxResult)
+{
+ if (!centerRef) return 0;
+ if (!getPolyByRef(centerRef)) return 0;
+ if (!m_nodePool || !m_openList) return 0;
+
+ m_nodePool->clear();
+ m_openList->clear();
+
+ dtNode* startNode = m_nodePool->getNode(centerRef);
+ startNode->pidx = 0;
+ startNode->cost = 0;
+ startNode->total = 0;
+ startNode->id = centerRef;
+ startNode->flags = DT_NODE_OPEN;
+ m_openList->push(startNode);
+
+ int n = 0;
+ if (n < maxResult)
+ {
+ if (resultRef)
+ resultRef[n] = startNode->id;
+ if (resultParent)
+ resultParent[n] = 0;
+ if (resultCost)
+ resultCost[n] = 0;
+ ++n;
+ }
+
+ const float radiusSqr = sqr(radius);
+
+ while (!m_openList->empty())
+ {
+ dtNode* bestNode = m_openList->pop();
+
+ // Get poly and tile.
+ unsigned int salt, it, ip;
+ dtDecodeTileId(bestNode->id, salt, it, ip);
+ // The API input has been cheked already, skip checking internal data.
+ const dtTileHeader* header = m_tiles[it].header;
+ const dtTilePoly* poly = &header->polys[ip];
+
+ for (int i = 0; i < poly->nlinks; ++i)
+ {
+ const dtTileLink* link = &header->links[poly->links+i];
+ dtTilePolyRef neighbour = link->ref;
+ if (neighbour)
+ {
+ // Skip parent node.
+ if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour)
+ continue;
+
+ // Calc distance to the edge.
+ const float* va = &header->verts[poly->v[link->e]*3];
+ const float* vb = &header->verts[poly->v[(link->e+1)%poly->nv]*3];
+ float tseg;
+ float distSqr = distancePtSegSqr2D(centerPos, va, vb, tseg);
+
+ // If the circle is not touching the next polygon, skip it.
+ if (distSqr > radiusSqr)
+ continue;
+
+ dtNode* parent = bestNode;
+ dtNode newNode;
+ newNode.pidx = m_nodePool->getNodeIdx(parent);
+ newNode.id = neighbour;
+
+ // Cost
+ float p0[3], p1[3];
+ if (!parent->pidx)
+ vcopy(p0, centerPos);
+ else
+ getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0);
+ getEdgeMidPoint(parent->id, newNode.id, p1);
+ newNode.total = parent->total + vdist(p0,p1);
+
+ dtNode* actualNode = m_nodePool->getNode(newNode.id);
+ if (!actualNode)
+ continue;
+
+ if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) &&
+ !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total))
+ {
+ actualNode->flags &= ~DT_NODE_CLOSED;
+ actualNode->pidx = newNode.pidx;
+ actualNode->total = newNode.total;
+
+ if (actualNode->flags & DT_NODE_OPEN)
+ {
+ m_openList->modify(actualNode);
+ }
+ else
+ {
+ if (n < maxResult)
+ {
+ if (resultRef)
+ resultRef[n] = actualNode->id;
+ if (resultParent)
+ resultParent[n] = m_nodePool->getNodeAtIdx(actualNode->pidx)->id;
+ if (resultCost)
+ resultCost[n] = actualNode->total;
+ ++n;
+ }
+ actualNode->flags = DT_NODE_OPEN;
+ m_openList->push(actualNode);
+ }
+ }
+ }
+ }
+ }
+
+ return n;
+}
+
+float dtTiledNavMesh::findDistanceToWall(dtTilePolyRef centerRef, const float* centerPos, float maxRadius,
+ float* hitPos, float* hitNormal)
+{
+ if (!centerRef) return 0;
+ if (!getPolyByRef(centerRef)) return 0;
+ if (!m_nodePool || !m_openList) return 0;
+
+ m_nodePool->clear();
+ m_openList->clear();
+
+ dtNode* startNode = m_nodePool->getNode(centerRef);
+ startNode->pidx = 0;
+ startNode->cost = 0;
+ startNode->total = 0;
+ startNode->id = centerRef;
+ startNode->flags = DT_NODE_OPEN;
+ m_openList->push(startNode);
+
+ float radiusSqr = sqr(maxRadius);
+
+ while (!m_openList->empty())
+ {
+ dtNode* bestNode = m_openList->pop();
+
+ // Get poly and tile.
+ unsigned int salt, it, ip;
+ dtDecodeTileId(bestNode->id, salt, it, ip);
+ // The API input has been cheked already, skip checking internal data.
+ const dtTileHeader* header = m_tiles[it].header;
+ const dtTilePoly* poly = &header->polys[ip];
+
+ // Hit test walls.
+ for (int i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j = i++)
+ {
+ // Skip non-solid edges.
+ if (poly->n[j] & 0x8000)
+ {
+ // Tile border.
+ bool solid = true;
+ for (int i = 0; i < poly->nlinks; ++i)
+ {
+ const dtTileLink* link = &header->links[poly->links+i];
+ if (link->e == j && link->ref != 0)
+ {
+ solid = false;
+ break;
+ }
+ }
+ if (!solid) continue;
+ }
+ else if (poly->n[j])
+ {
+ // Internal edge
+ continue;
+ }
+
+ // Calc distance to the edge.
+ const float* vj = &header->verts[poly->v[j]*3];
+ const float* vi = &header->verts[poly->v[i]*3];
+ float tseg;
+ float distSqr = distancePtSegSqr2D(centerPos, vj, vi, tseg);
+
+ // Edge is too far, skip.
+ if (distSqr > radiusSqr)
+ continue;
+
+ // Hit wall, update radius.
+ radiusSqr = distSqr;
+ // Calculate hit pos.
+ hitPos[0] = vj[0] + (vi[0] - vj[0])*tseg;
+ hitPos[1] = vj[1] + (vi[1] - vj[1])*tseg;
+ hitPos[2] = vj[2] + (vi[2] - vj[2])*tseg;
+ }
+
+ for (int i = 0; i < poly->nlinks; ++i)
+ {
+ const dtTileLink* link = &header->links[poly->links+i];
+ dtTilePolyRef neighbour = link->ref;
+ if (neighbour)
+ {
+ // Skip parent node.
+ if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour)
+ continue;
+
+ // Calc distance to the edge.
+ const float* va = &header->verts[poly->v[link->e]*3];
+ const float* vb = &header->verts[poly->v[(link->e+1)%poly->nv]*3];
+ float tseg;
+ float distSqr = distancePtSegSqr2D(centerPos, va, vb, tseg);
+
+ // If the circle is not touching the next polygon, skip it.
+ if (distSqr > radiusSqr)
+ continue;
+
+ dtNode* parent = bestNode;
+ dtNode newNode;
+ newNode.pidx = m_nodePool->getNodeIdx(parent);
+ newNode.id = neighbour;
+
+ float p0[3], p1[3];
+ if (!parent->pidx)
+ vcopy(p0, centerPos);
+ else
+ getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0);
+ getEdgeMidPoint(parent->id, newNode.id, p1);
+ newNode.total = parent->total + vdist(p0,p1);
+
+ dtNode* actualNode = m_nodePool->getNode(newNode.id);
+ if (!actualNode)
+ continue;
+
+ if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) &&
+ !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total))
+ {
+ actualNode->flags &= ~DT_NODE_CLOSED;
+ actualNode->pidx = newNode.pidx;
+ actualNode->total = newNode.total;
+
+ if (actualNode->flags & DT_NODE_OPEN)
+ {
+ m_openList->modify(actualNode);
+ }
+ else
+ {
+ actualNode->flags = DT_NODE_OPEN;
+ m_openList->push(actualNode);
+ }
+ }
+ }
+ }
+ }
+
+ // Calc hit normal.
+ vsub(hitNormal, centerPos, hitPos);
+ vnormalize(hitNormal);
+
+ return sqrtf(radiusSqr);
+}
+
+const dtTilePoly* dtTiledNavMesh::getPolyByRef(dtTilePolyRef ref) const
+{
+ unsigned int salt, it, ip;
+ dtDecodeTileId(ref, salt, it, ip);
+ if (it >= DT_MAX_TILES) return 0;
+ if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return 0;
+ if (ip >= (unsigned int)m_tiles[it].header->npolys) return 0;
+ return &m_tiles[it].header->polys[ip];
+}
+
+const float* dtTiledNavMesh::getPolyVertsByRef(dtTilePolyRef ref) const
+{
+ unsigned int salt, it, ip;
+ dtDecodeTileId(ref, salt, it, ip);
+ if (it >= DT_MAX_TILES) return 0;
+ if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return 0;
+ if (ip >= (unsigned int)m_tiles[it].header->npolys) return 0;
+ return m_tiles[it].header->verts;
+}
+
+const dtTileLink* dtTiledNavMesh::getPolyLinksByRef(dtTilePolyRef ref) const
+{
+ unsigned int salt, it, ip;
+ dtDecodeTileId(ref, salt, it, ip);
+ if (it >= DT_MAX_TILES) return 0;
+ if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return 0;
+ if (ip >= (unsigned int)m_tiles[it].header->npolys) return 0;
+ return m_tiles[it].header->links;
+}
diff --git a/extern/recastnavigation/Detour/Source/DetourTileNavMeshBuilder.cpp b/extern/recastnavigation/Detour/Source/DetourTileNavMeshBuilder.cpp
new file mode 100644
index 00000000000..95dd34b04f6
--- /dev/null
+++ b/extern/recastnavigation/Detour/Source/DetourTileNavMeshBuilder.cpp
@@ -0,0 +1,213 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "DetourTileNavMesh.h"
+#include "DetourCommon.h"
+
+bool dtCreateNavMeshTileData(const unsigned short* verts, const int nverts,
+ const unsigned short* polys, const int npolys, const int nvp,
+ const unsigned short* dmeshes, const float* dverts, const int ndverts,
+ const unsigned char* dtris, const int ndtris,
+ const float* bmin, const float* bmax, float cs, float ch, int tileSize, int walkableClimb,
+ unsigned char** outData, int* outDataSize)
+{
+ if (nvp != DT_TILE_VERTS_PER_POLYGON)
+ return false;
+ if (nverts >= 0xffff)
+ return false;
+
+ if (!nverts)
+ return false;
+ if (!npolys)
+ return false;
+ if (!dmeshes || !dverts || ! dtris)
+ return false;
+
+ // Find portal edges which are at tile borders.
+ int nedges = 0;
+ int nportals = 0;
+ for (int i = 0; i < npolys; ++i)
+ {
+ const unsigned short* p = &polys[i*2*nvp];
+ for (int j = 0; j < nvp; ++j)
+ {
+ if (p[j] == 0xffff) break;
+ int nj = j+1;
+ if (nj >= nvp || p[nj] == 0xffff) nj = 0;
+ const unsigned short* va = &verts[p[j]*3];
+ const unsigned short* vb = &verts[p[nj]*3];
+
+ nedges++;
+
+ if (va[0] == tileSize && vb[0] == tileSize)
+ nportals++; // x+
+ else if (va[2] == tileSize && vb[2] == tileSize)
+ nportals++; // z+
+ else if (va[0] == 0 && vb[0] == 0)
+ nportals++; // x-
+ else if (va[2] == 0 && vb[2] == 0)
+ nportals++; // z-
+ }
+ }
+
+ const int maxLinks = nedges + nportals*2;
+
+
+ // Find unique detail vertices.
+ int uniqueDetailVerts = 0;
+ if (dmeshes)
+ {
+ for (int i = 0; i < npolys; ++i)
+ {
+ const unsigned short* p = &polys[i*nvp*2];
+ int ndv = dmeshes[i*4+1];
+ int nv = 0;
+ for (int j = 0; j < nvp; ++j)
+ {
+ if (p[j] == 0xffff) break;
+ nv++;
+ }
+ ndv -= nv;
+ uniqueDetailVerts += ndv;
+ }
+ }
+
+ // Calculate data size
+ const int headerSize = sizeof(dtTileHeader);
+ const int vertsSize = sizeof(float)*3*nverts;
+ const int polysSize = sizeof(dtTilePoly)*npolys;
+ const int linksSize = sizeof(dtTileLink)*maxLinks;
+ const int detailMeshesSize = sizeof(dtTilePolyDetail)*npolys;
+ const int detailVertsSize = sizeof(float)*3*uniqueDetailVerts;
+ const int detailTrisSize = sizeof(unsigned char)*4*ndtris;
+
+ const int dataSize = headerSize + vertsSize + polysSize + linksSize +
+ detailMeshesSize + detailVertsSize + detailTrisSize;
+ unsigned char* data = new unsigned char[dataSize];
+ if (!data)
+ return false;
+ memset(data, 0, dataSize);
+
+ unsigned char* d = data;
+ dtTileHeader* header = (dtTileHeader*)d; d += headerSize;
+ float* navVerts = (float*)d; d += vertsSize;
+ dtTilePoly* navPolys = (dtTilePoly*)d; d += polysSize;
+ d += linksSize;
+ dtTilePolyDetail* navDMeshes = (dtTilePolyDetail*)d; d += detailMeshesSize;
+ float* navDVerts = (float*)d; d += detailVertsSize;
+ unsigned char* navDTris = (unsigned char*)d; d += detailTrisSize;
+
+
+ // Store header
+ header->magic = DT_TILE_NAVMESH_MAGIC;
+ header->version = DT_TILE_NAVMESH_VERSION;
+ header->npolys = npolys;
+ header->nverts = nverts;
+ header->maxlinks = maxLinks;
+ header->bmin[0] = bmin[0];
+ header->bmin[1] = bmin[1];
+ header->bmin[2] = bmin[2];
+ header->bmax[0] = bmax[0];
+ header->bmax[1] = bmax[1];
+ header->bmax[2] = bmax[2];
+ header->ndmeshes = npolys;
+ header->ndverts = uniqueDetailVerts;
+ header->ndtris = ndtris;
+
+ // Store vertices
+ for (int i = 0; i < nverts; ++i)
+ {
+ const unsigned short* iv = &verts[i*3];
+ float* v = &navVerts[i*3];
+ v[0] = bmin[0] + iv[0] * cs;
+ v[1] = bmin[1] + iv[1] * ch;
+ v[2] = bmin[2] + iv[2] * cs;
+ }
+
+ // Store polygons
+ const unsigned short* src = polys;
+ for (int i = 0; i < npolys; ++i)
+ {
+ dtTilePoly* p = &navPolys[i];
+ p->nv = 0;
+ for (int j = 0; j < nvp; ++j)
+ {
+ if (src[j] == 0xffff) break;
+ p->v[j] = src[j];
+ p->n[j] = (src[nvp+j]+1) & 0xffff;
+ p->nv++;
+ }
+ src += nvp*2;
+ }
+
+ // Store portal edges.
+ for (int i = 0; i < npolys; ++i)
+ {
+ dtTilePoly* poly = &navPolys[i];
+ for (int j = 0; j < poly->nv; ++j)
+ {
+ int nj = j+1;
+ if (nj >= poly->nv) nj = 0;
+
+ const unsigned short* va = &verts[poly->v[j]*3];
+ const unsigned short* vb = &verts[poly->v[nj]*3];
+
+ if (va[0] == tileSize && vb[0] == tileSize) // x+
+ poly->n[j] = 0x8000 | 0;
+ else if (va[2] == tileSize && vb[2] == tileSize) // z+
+ poly->n[j] = 0x8000 | 1;
+ else if (va[0] == 0 && vb[0] == 0) // x-
+ poly->n[j] = 0x8000 | 2;
+ else if (va[2] == 0 && vb[2] == 0) // z-
+ poly->n[j] = 0x8000 | 3;
+ }
+ }
+
+ // Store detail meshes and vertices.
+ // The nav polygon vertices are stored as the first vertices on each mesh.
+ // We compress the mesh data by skipping them and using the navmesh coordinates.
+ unsigned short vbase = 0;
+ for (int i = 0; i < npolys; ++i)
+ {
+ dtTilePolyDetail& dtl = navDMeshes[i];
+ const int vb = dmeshes[i*4+0];
+ const int ndv = dmeshes[i*4+1];
+ const int nv = navPolys[i].nv;
+ dtl.vbase = vbase;
+ dtl.nverts = ndv-nv;
+ dtl.tbase = dmeshes[i*4+2];
+ dtl.ntris = dmeshes[i*4+3];
+ // Copy vertices except the first 'nv' verts which are equal to nav poly verts.
+ if (ndv-nv)
+ {
+ memcpy(&navDVerts[vbase*3], &dverts[(vb+nv)*3], sizeof(float)*3*(ndv-nv));
+ vbase += ndv-nv;
+ }
+ }
+ // Store triangles.
+ memcpy(navDTris, dtris, sizeof(unsigned char)*4*ndtris);
+
+ *outData = data;
+ *outDataSize = dataSize;
+
+ return true;
+}
diff --git a/extern/recastnavigation/License.txt b/extern/recastnavigation/License.txt
new file mode 100644
index 00000000000..95f4bfc9654
--- /dev/null
+++ b/extern/recastnavigation/License.txt
@@ -0,0 +1,18 @@
+Copyright (c) 2009 Mikko Mononen memon@inside.org
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+claim that you wrote the original software. If you use this software
+in a product, an acknowledgment in the product documentation would be
+appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
diff --git a/extern/recastnavigation/Readme.txt b/extern/recastnavigation/Readme.txt
new file mode 100644
index 00000000000..0c2f7b1675f
--- /dev/null
+++ b/extern/recastnavigation/Readme.txt
@@ -0,0 +1,120 @@
+
+Recast & Detour Version 1.4
+
+
+Recast
+
+Recast is state of the art navigation mesh construction toolset for games.
+
+ * It is automatic, which means that you can throw any level geometry
+ at it and you will get robust mesh out
+ * It is fast which means swift turnaround times for level designers
+ * It is open source so it comes with full source and you can
+ customize it to your hearts content.
+
+The Recast process starts with constructing a voxel mold from a level geometry
+and then casting a navigation mesh over it. The process consists of three steps,
+building the voxel mold, partitioning the mold into simple regions, peeling off
+the regions as simple polygons.
+
+ 1. The voxel mold is build from the input triangle mesh by rasterizing
+ the triangles into a multi-layer heightfield. Some simple filters are
+ then applied to the mold to prune out locations where the character
+ would not be able to move.
+ 2. The walkable areas described by the mold are divided into simple
+ overlayed 2D regions. The resulting regions have only one non-overlapping
+ contour, which simplifies the final step of the process tremendously.
+ 3. The navigation polygons are peeled off from the regions by first tracing
+ the boundaries and then simplifying them. The resulting polygons are
+ finally converted to convex polygons which makes them perfect for
+ pathfinding and spatial reasoning about the level.
+
+The toolset code is located in the Recast folder and demo application using the Recast
+toolset is located in the RecastDemo folder.
+
+The project files with this distribution can be compiled with Microsoft Visual C++ 2008
+(you can download it for free) and XCode 3.1.
+
+
+Detour
+
+Recast is accompanied with Detour, path-finding and spatial reasoning toolkit. You can use any navigation mesh with Detour, but of course the data generated with Recast fits perfectly.
+
+Detour offers simple static navigation mesh which is suitable for many simple cases, as well as tiled navigation mesh which allows you to plug in and out pieces of the mesh. The tiled mesh allows to create systems where you stream new navigation data in and out as the player progresses the level, or you may regenerate tiles as the world changes.
+
+
+Latest code available at http://code.google.com/p/recastnavigation/
+
+
+--
+
+Release Notes
+
+----------------
+* Recast 1.4
+ Released August 24th, 2009
+
+- Added detail height mesh generation (RecastDetailMesh.cpp) for single,
+ tiled statmeshes as well as tilemesh.
+- Added feature to contour tracing which detects extra vertices along
+ tile edges which should be removed later.
+- Changed the tiled stat mesh preprocess, so that it first generated
+ polymeshes per tile and finally combines them.
+- Fixed bug in the GUI code where invisible buttons could be pressed.
+
+----------------
+* Recast 1.31
+ Released July 24th, 2009
+
+- Better cost and heuristic functions.
+- Fixed tile navmesh raycast on tile borders.
+
+----------------
+* Recast 1.3
+ Released July 14th, 2009
+
+- Added dtTileNavMesh which allows to dynamically add and remove navmesh pieces at runtime.
+- Renamed stat navmesh types to dtStat* (i.e. dtPoly is now dtStatPoly).
+- Moved common code used by tile and stat navmesh to DetourNode.h/cpp and DetourCommon.h/cpp.
+- Refactores the demo code.
+
+----------------
+* Recast 1.2
+ Released June 17th, 2009
+
+- Added tiled mesh generation. The tiled generation allows to generate navigation for
+ much larger worlds, it removes some of the artifacts that comes from distance fields
+ in open areas, and allows later streaming and dynamic runtime generation
+- Improved and added some debug draw modes
+- API change: The helper function rcBuildNavMesh does not exists anymore,
+ had to change few internal things to cope with the tiled processing,
+ similar API functionality will be added later once the tiled process matures
+- The demo is getting way too complicated, need to split demos
+- Fixed several filtering functions so that the mesh is tighter to the geometry,
+ sometimes there could be up error up to tow voxel units close to walls,
+ now it should be just one.
+
+----------------
+* Recast 1.1
+ Released April 11th, 2009
+
+This is the first release of Detour.
+
+----------------
+* Recast 1.0
+ Released March 29th, 2009
+
+This is the first release of Recast.
+
+The process is not always as robust as I would wish. The watershed phase sometimes swallows tiny islands
+which are close to edges. These droppings are handled in rcBuildContours, but the code is not
+particularly robust either.
+
+Another non-robust case is when portal contours (contours shared between two regions) are always
+assumed to be straight. That can lead to overlapping contours specially when the level has
+large open areas.
+
+
+
+Mikko Mononen
+memon@inside.org
diff --git a/extern/recastnavigation/Recast/Include/Recast.h b/extern/recastnavigation/Recast/Include/Recast.h
new file mode 100644
index 00000000000..f25ab47f8fa
--- /dev/null
+++ b/extern/recastnavigation/Recast/Include/Recast.h
@@ -0,0 +1,501 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#ifndef RECAST_H
+#define RECAST_H
+
+// The units of the parameters are specified in parenthesis as follows:
+// (vx) voxels, (wu) world units
+struct rcConfig
+{
+ int width, height; // Dimensions of the rasterized heighfield (vx)
+ int tileSize; // Width and Height of a tile (vx)
+ int borderSize; // Non-navigable Border around the heightfield (vx)
+ float cs, ch; // Grid cell size and height (wu)
+ float bmin[3], bmax[3]; // Grid bounds (wu)
+ float walkableSlopeAngle; // Maximum walkble slope angle in degrees.
+ int walkableHeight; // Minimum height where the agent can still walk (vx)
+ int walkableClimb; // Maximum height between grid cells the agent can climb (vx)
+ int walkableRadius; // Radius of the agent in cells (vx)
+ int maxEdgeLen; // Maximum contour edge length (vx)
+ float maxSimplificationError; // Maximum distance error from contour to cells (vx)
+ int minRegionSize; // Minimum regions size. Smaller regions will be deleted (vx)
+ int mergeRegionSize; // Minimum regions size. Smaller regions will be merged (vx)
+ int maxVertsPerPoly; // Max number of vertices per polygon
+ float detailSampleDist; // Detail mesh sample spacing.
+ float detailSampleMaxError; // Detail mesh simplification max sample error.
+};
+
+// Heightfield span.
+struct rcSpan
+{
+ unsigned int smin : 15; // Span min height.
+ unsigned int smax : 15; // Span max height.
+ unsigned int flags : 2; // Span flags.
+ rcSpan* next; // Next span in column.
+};
+
+static const int RC_SPANS_PER_POOL = 2048;
+
+// Memory pool used for quick span allocation.
+struct rcSpanPool
+{
+ rcSpanPool* next; // Pointer to next pool.
+ rcSpan items[1]; // Array of spans (size RC_SPANS_PER_POOL).
+};
+
+// Dynamic span-heightfield.
+struct rcHeightfield
+{
+ inline rcHeightfield() : width(0), height(0), spans(0), pools(0), freelist(0) {}
+ inline ~rcHeightfield()
+ {
+ // Delete span array.
+ delete [] spans;
+ // Delete span pools.
+ while (pools)
+ {
+ rcSpanPool* next = pools->next;
+ delete [] reinterpret_cast<unsigned char*>(pools);
+ pools = next;
+ }
+ }
+ int width, height; // Dimension of the heightfield.
+ float bmin[3], bmax[3]; // Bounding box of the heightfield
+ float cs, ch; // Cell size and height.
+ rcSpan** spans; // Heightfield of spans (width*height).
+ rcSpanPool* pools; // Linked list of span pools.
+ rcSpan* freelist; // Pointer to next free span.
+};
+
+struct rcCompactCell
+{
+ unsigned int index : 24; // Index to first span in column.
+ unsigned int count : 8; // Number of spans in this column.
+};
+
+struct rcCompactSpan
+{
+ unsigned short y; // Bottom coordinate of the span.
+ unsigned short reg; // Region ID
+ unsigned short dist; // Distance to border
+ unsigned short con; // Connections to neighbour cells.
+ unsigned char h; // Height of the span.
+ unsigned char flags; // Flags.
+};
+
+// Compact static heightfield.
+struct rcCompactHeightfield
+{
+ inline rcCompactHeightfield() : maxDistance(0), maxRegions(0), cells(0), spans(0) {}
+ inline ~rcCompactHeightfield() { delete [] cells; delete [] spans; }
+ int width, height; // Width and height of the heighfield.
+ int spanCount; // Number of spans in the heightfield.
+ int walkableHeight, walkableClimb; // Agent properties.
+ unsigned short maxDistance; // Maximum distance value stored in heightfield.
+ unsigned short maxRegions; // Maximum Region Id stored in heightfield.
+ float bmin[3], bmax[3]; // Bounding box of the heightfield.
+ float cs, ch; // Cell size and height.
+ rcCompactCell* cells; // Pointer to width*height cells.
+ rcCompactSpan* spans; // Pointer to spans.
+};
+
+struct rcContour
+{
+ inline rcContour() : verts(0), nverts(0), rverts(0), nrverts(0) { }
+ inline ~rcContour() { delete [] verts; delete [] rverts; }
+ int* verts; // Vertex coordinates, each vertex contains 4 components.
+ int nverts; // Number of vertices.
+ int* rverts; // Raw vertex coordinates, each vertex contains 4 components.
+ int nrverts; // Number of raw vertices.
+ unsigned short reg; // Region ID of the contour.
+};
+
+struct rcContourSet
+{
+ inline rcContourSet() : conts(0), nconts(0) {}
+ inline ~rcContourSet() { delete [] conts; }
+ rcContour* conts; // Pointer to all contours.
+ int nconts; // Number of contours.
+ float bmin[3], bmax[3]; // Bounding box of the heightfield.
+ float cs, ch; // Cell size and height.
+};
+
+// Polymesh store a connected mesh of polygons.
+// The polygons are store in an array where each polygons takes
+// 'nvp*2' elements. The first 'nvp' elements are indices to vertices
+// and the second 'nvp' elements are indices to neighbour polygons.
+// If a polygona has less than 'bvp' vertices, the remaining indices
+// are set os 0xffff. If an polygon edge does not have a neighbour
+// the neighbour index is set to 0xffff.
+// Vertices can be transformed into world space as follows:
+// x = bmin[0] + verts[i*3+0]*cs;
+// y = bmin[1] + verts[i*3+1]*ch;
+// z = bmin[2] + verts[i*3+2]*cs;
+struct rcPolyMesh
+{
+ inline rcPolyMesh() : verts(0), polys(0), regs(0), nverts(0), npolys(0), nvp(3) {}
+ inline ~rcPolyMesh() { delete [] verts; delete [] polys; delete [] regs; }
+ unsigned short* verts; // Vertices of the mesh, 3 elements per vertex.
+ unsigned short* polys; // Polygons of the mesh, nvp*2 elements per polygon.
+ unsigned short* regs; // Regions of the polygons.
+ int nverts; // Number of vertices.
+ int npolys; // Number of polygons.
+ int nvp; // Max number of vertices per polygon.
+ float bmin[3], bmax[3]; // Bounding box of the mesh.
+ float cs, ch; // Cell size and height.
+};
+
+// Detail mesh generated from a rcPolyMesh.
+// Each submesh represents a polygon in the polymesh and they are stored in
+// excatly same order. Each submesh is described as 4 values:
+// base vertex, vertex count, base triangle, triangle count. That is,
+// const unsigned char* t = &dtl.tris[(tbase+i)*3]; and
+// const float* v = &dtl.verts[(vbase+t[j])*3];
+// If the input polygon has 'n' vertices, those vertices are first in the
+// submesh vertex list. This allows to compres the mesh by not storing the
+// first vertices and using the polymesh vertices instead.
+
+struct rcPolyMeshDetail
+{
+ inline rcPolyMeshDetail() :
+ meshes(0), verts(0), tris(0),
+ nmeshes(0), nverts(0), ntris(0) {}
+ inline ~rcPolyMeshDetail()
+ {
+ delete [] meshes; delete [] verts; delete [] tris;
+ }
+
+ unsigned short* meshes; // Pointer to all mesh data.
+ float* verts; // Pointer to all vertex data.
+ unsigned char* tris; // Pointer to all triangle data.
+ int nmeshes; // Number of meshes.
+ int nverts; // Number of total vertices.
+ int ntris; // Number of triangles.
+};
+
+
+// Simple dynamic array ints.
+class rcIntArray
+{
+ int* m_data;
+ int m_size, m_cap;
+public:
+ inline rcIntArray() : m_data(0), m_size(0), m_cap(0) {}
+ inline rcIntArray(int n) : m_data(0), m_size(0), m_cap(n) { m_data = new int[n]; }
+ inline ~rcIntArray() { delete [] m_data; }
+ void resize(int n);
+ inline void push(int item) { resize(m_size+1); m_data[m_size-1] = item; }
+ inline int pop() { if (m_size > 0) m_size--; return m_data[m_size]; }
+ inline const int& operator[](int i) const { return m_data[i]; }
+ inline int& operator[](int i) { return m_data[i]; }
+ inline int size() const { return m_size; }
+};
+
+enum rcSpanFlags
+{
+ RC_WALKABLE = 0x01,
+ RC_REACHABLE = 0x02,
+};
+
+// If heightfield region ID has the following bit set, the region is on border area
+// and excluded from many calculations.
+static const unsigned short RC_BORDER_REG = 0x8000;
+
+// If contour region ID has the following bit set, the vertex will be later
+// removed in order to match the segments and vertices at tile boundaries.
+static const int RC_BORDER_VERTEX = 0x10000;
+
+// Compact span neighbour helpers.
+inline int rcGetCon(const rcCompactSpan& s, int dir)
+{
+ return (s.con >> (dir*4)) & 0xf;
+}
+
+inline int rcGetDirOffsetX(int dir)
+{
+ const int offset[4] = { -1, 0, 1, 0, };
+ return offset[dir&0x03];
+}
+
+inline int rcGetDirOffsetY(int dir)
+{
+ const int offset[4] = { 0, 1, 0, -1 };
+ return offset[dir&0x03];
+}
+
+// Common helper functions
+template<class T> inline void rcSwap(T& a, T& b) { T t = a; a = b; b = t; }
+template<class T> inline T rcMin(T a, T b) { return a < b ? a : b; }
+template<class T> inline T rcMax(T a, T b) { return a > b ? a : b; }
+template<class T> inline T rcAbs(T a) { return a < 0 ? -a : a; }
+template<class T> inline T rcSqr(T a) { return a*a; }
+template<class T> inline T rcClamp(T v, T mn, T mx) { return v < mn ? mn : (v > mx ? mx : v); }
+
+// Common vector helper functions.
+inline void vcross(float* dest, const float* v1, const float* v2)
+{
+ dest[0] = v1[1]*v2[2] - v1[2]*v2[1];
+ dest[1] = v1[2]*v2[0] - v1[0]*v2[2];
+ dest[2] = v1[0]*v2[1] - v1[1]*v2[0];
+}
+
+inline float vdot(const float* v1, const float* v2)
+{
+ return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
+}
+
+inline void vmad(float* dest, const float* v1, const float* v2, const float s)
+{
+ dest[0] = v1[0]+v2[0]*s;
+ dest[1] = v1[1]+v2[1]*s;
+ dest[2] = v1[2]+v2[2]*s;
+}
+
+inline void vadd(float* dest, const float* v1, const float* v2)
+{
+ dest[0] = v1[0]+v2[0];
+ dest[1] = v1[1]+v2[1];
+ dest[2] = v1[2]+v2[2];
+}
+
+inline void vsub(float* dest, const float* v1, const float* v2)
+{
+ dest[0] = v1[0]-v2[0];
+ dest[1] = v1[1]-v2[1];
+ dest[2] = v1[2]-v2[2];
+}
+
+inline void vmin(float* mn, const float* v)
+{
+ mn[0] = rcMin(mn[0], v[0]);
+ mn[1] = rcMin(mn[1], v[1]);
+ mn[2] = rcMin(mn[2], v[2]);
+}
+
+inline void vmax(float* mx, const float* v)
+{
+ mx[0] = rcMax(mx[0], v[0]);
+ mx[1] = rcMax(mx[1], v[1]);
+ mx[2] = rcMax(mx[2], v[2]);
+}
+
+inline void vcopy(float* dest, const float* v)
+{
+ dest[0] = v[0];
+ dest[1] = v[1];
+ dest[2] = v[2];
+}
+
+inline float vdist(const float* v1, const float* v2)
+{
+ float dx = v2[0] - v1[0];
+ float dy = v2[1] - v1[1];
+ float dz = v2[2] - v1[2];
+ return sqrtf(dx*dx + dy*dy + dz*dz);
+}
+
+inline float vdistSqr(const float* v1, const float* v2)
+{
+ float dx = v2[0] - v1[0];
+ float dy = v2[1] - v1[1];
+ float dz = v2[2] - v1[2];
+ return dx*dx + dy*dy + dz*dz;
+}
+
+inline void vnormalize(float* v)
+{
+ float d = 1.0f / sqrtf(rcSqr(v[0]) + rcSqr(v[1]) + rcSqr(v[2]));
+ v[0] *= d;
+ v[1] *= d;
+ v[2] *= d;
+}
+
+inline bool vequal(const float* p0, const float* p1)
+{
+ static const float thr = rcSqr(1.0f/16384.0f);
+ const float d = vdistSqr(p0, p1);
+ return d < thr;
+}
+
+
+// Calculated bounding box of array of vertices.
+// Params:
+// verts - (in) array of vertices
+// nv - (in) vertex count
+// bmin, bmax - (out) bounding box
+void rcCalcBounds(const float* verts, int nv, float* bmin, float* bmax);
+
+// Calculates grid size based on bounding box and grid cell size.
+// Params:
+// bmin, bmax - (in) bounding box
+// cs - (in) grid cell size
+// w - (out) grid width
+// h - (out) grid height
+void rcCalcGridSize(const float* bmin, const float* bmax, float cs, int* w, int* h);
+
+// Creates and initializes new heightfield.
+// Params:
+// hf - (in/out) heightfield to initialize.
+// width - (in) width of the heightfield.
+// height - (in) height of the heightfield.
+// bmin, bmax - (in) bounding box of the heightfield
+// cs - (in) grid cell size
+// ch - (in) grid cell height
+bool rcCreateHeightfield(rcHeightfield& hf, int width, int height,
+ const float* bmin, const float* bmax,
+ float cs, float ch);
+
+// Sets the WALKABLE flag for every triangle whose slope is below
+// the maximun walkable slope angle.
+// Params:
+// walkableSlopeAngle - (in) maximun slope angle in degrees.
+// verts - (in) array of vertices
+// nv - (in) vertex count
+// tris - (in) array of triangle vertex indices
+// nt - (in) triangle count
+// flags - (out) array of triangle flags
+void rcMarkWalkableTriangles(const float walkableSlopeAngle,
+ const float* verts, int nv,
+ const int* tris, int nt,
+ unsigned char* flags);
+
+// Rasterizes a triangle into heightfield spans.
+// Params:
+// v0,v1,v2 - (in) the vertices of the triangle.
+// flags - (in) triangle flags (uses WALKABLE)
+// solid - (in) heighfield where the triangle is rasterized
+void rcRasterizeTriangle(const float* v0, const float* v1, const float* v2,
+ unsigned char flags, rcHeightfield& solid);
+
+// Rasterizes the triangles into heightfield spans.
+// Params:
+// verts - (in) array of vertices
+// nv - (in) vertex count
+// tris - (in) array of triangle vertex indices
+// norms - (in) array of triangle normals
+// flags - (in) array of triangle flags (uses WALKABLE)
+// nt - (in) triangle count
+// solid - (in) heighfield where the triangles are rasterized
+void rcRasterizeTriangles(const float* verts, int nv,
+ const int* tris, const unsigned char* flags, int nt,
+ rcHeightfield& solid);
+
+// Removes WALKABLE flag from all spans that are at ledges. This filtering
+// removes possible overestimation of the conservative voxelization so that
+// the resulting mesh will not have regions hanging in air over ledges.
+// Params:
+// walkableHeight - (in) minimum height where the agent can still walk
+// walkableClimb - (in) maximum height between grid cells the agent can climb
+// solid - (in/out) heightfield describing the solid space
+void rcFilterLedgeSpans(const int walkableHeight,
+ const int walkableClimb,
+ rcHeightfield& solid);
+
+// Removes WALKABLE flag from all spans which have smaller than
+// 'walkableHeight' clearane above them.
+// Params:
+// walkableHeight - (in) minimum height where the agent can still walk
+// solid - (in/out) heightfield describing the solid space
+void rcFilterWalkableLowHeightSpans(int walkableHeight,
+ rcHeightfield& solid);
+
+// Marks spans which are reachable from any of the topmost spans.
+// Params:
+// walkableHeight - (in) minimum height where the agent can still walk
+// walkableClimb - (in) maximum height between grid cells the agent can climb
+// solid - (in/out) heightfield describing the solid space
+// Returns false if operation ran out of memory.
+bool rcMarkReachableSpans(const int walkableHeight,
+ const int walkableClimb,
+ rcHeightfield& solid);
+
+// Builds compact representation of the heightfield.
+// Params:
+// walkableHeight - (in) minimum height where the agent can still walk
+// walkableClimb - (in) maximum height between grid cells the agent can climb
+// hf - (in) heightfield to be compacted
+// chf - (out) compact heightfield representing the open space.
+// Returns false if operation ran out of memory.
+bool rcBuildCompactHeightfield(const int walkableHeight, const int walkableClimb,
+ unsigned char flags,
+ rcHeightfield& hf,
+ rcCompactHeightfield& chf);
+
+// Builds distance field and stores it into the combat heightfield.
+// Params:
+// chf - (in/out) compact heightfield representing the open space.
+// Returns false if operation ran out of memory.
+bool rcBuildDistanceField(rcCompactHeightfield& chf);
+
+// Divides the walkable heighfied into simple regions.
+// Each region has only one contour and no overlaps.
+// The regions are stored in the compact heightfield 'reg' field.
+// The regions will be shrinked by the radius of the agent.
+// The process sometimes creates small regions. The parameter
+// 'minRegionSize' specifies the smallest allowed regions size.
+// If the area of a regions is smaller than allowed, the regions is
+// removed or merged to neighbour region.
+// Params:
+// chf - (in/out) compact heightfield representing the open space.
+// walkableRadius - (in) the radius of the agent.
+// minRegionSize - (in) the smallest allowed regions size.
+// maxMergeRegionSize - (in) the largest allowed regions size which can be merged.
+// Returns false if operation ran out of memory.
+bool rcBuildRegions(rcCompactHeightfield& chf,
+ int walkableRadius, int borderSize,
+ int minRegionSize, int mergeRegionSize);
+
+// Builds simplified contours from the regions outlines.
+// Params:
+// chf - (in) compact heightfield which has regions set.
+// maxError - (in) maximum allowed distance between simplified countour and cells.
+// maxEdgeLen - (in) maximum allowed contour edge length in cells.
+// cset - (out) Resulting contour set.
+// Returns false if operation ran out of memory.
+bool rcBuildContours(rcCompactHeightfield& chf,
+ const float maxError, const int maxEdgeLen,
+ rcContourSet& cset);
+
+// Builds connected convex polygon mesh from contour polygons.
+// Params:
+// cset - (in) contour set.
+// nvp - (in) maximum number of vertices per polygon.
+// mesh - (out) poly mesh.
+// Returns false if operation ran out of memory.
+bool rcBuildPolyMesh(rcContourSet& cset, int nvp, rcPolyMesh& mesh);
+
+bool rcMergePolyMeshes(rcPolyMesh** meshes, const int nmeshes, rcPolyMesh& mesh);
+
+// Builds detail triangle mesh for each polygon in the poly mesh.
+// Params:
+// mesh - (in) poly mesh to detail.
+// chf - (in) compacy height field, used to query height for new vertices.
+// sampleDist - (in) spacing between height samples used to generate more detail into mesh.
+// sampleMaxError - (in) maximum allowed distance between simplified detail mesh and height sample.
+// pmdtl - (out) detail mesh.
+// Returns false if operation ran out of memory.
+bool rcBuildPolyMeshDetail(const rcPolyMesh& mesh, const rcCompactHeightfield& chf,
+ const float sampleDist, const float sampleMaxError,
+ rcPolyMeshDetail& dmesh);
+
+bool rcMergePolyMeshDetails(rcPolyMeshDetail** meshes, const int nmeshes, rcPolyMeshDetail& mesh);
+
+bool buildMeshAdjacency(unsigned short* polys, const int npolys, const int nverts, const int vertsPerPoly);
+
+#endif // RECAST_H
diff --git a/extern/recastnavigation/Recast/Include/RecastLog.h b/extern/recastnavigation/Recast/Include/RecastLog.h
new file mode 100644
index 00000000000..026ef73a3aa
--- /dev/null
+++ b/extern/recastnavigation/Recast/Include/RecastLog.h
@@ -0,0 +1,80 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#ifndef RECAST_LOG_H
+#define RECAST_LOG_H
+
+enum rcLogCategory
+{
+ RC_LOG_PROGRESS = 1,
+ RC_LOG_WARNING,
+ RC_LOG_ERROR,
+};
+
+class rcLog
+{
+public:
+ rcLog();
+ ~rcLog();
+
+ void log(rcLogCategory category, const char* format, ...);
+ inline void clear() { m_messageCount = 0; m_textPoolSize = 0; }
+ inline int getMessageCount() const { return m_messageCount; }
+ inline char getMessageType(int i) const { return *m_messages[i]; }
+ inline const char* getMessageText(int i) const { return m_messages[i]+1; }
+
+private:
+ static const int MAX_MESSAGES = 1000;
+ const char* m_messages[MAX_MESSAGES];
+ int m_messageCount;
+ static const int TEXT_POOL_SIZE = 8000;
+ char m_textPool[TEXT_POOL_SIZE];
+ int m_textPoolSize;
+};
+
+struct rcBuildTimes
+{
+ int rasterizeTriangles;
+ int buildCompact;
+ int buildContours;
+ int buildContoursTrace;
+ int buildContoursSimplify;
+ int filterBorder;
+ int filterWalkable;
+ int filterMarkReachable;
+ int buildPolymesh;
+ int buildDistanceField;
+ int buildDistanceFieldDist;
+ int buildDistanceFieldBlur;
+ int buildRegions;
+ int buildRegionsReg;
+ int buildRegionsExp;
+ int buildRegionsFlood;
+ int buildRegionsFilter;
+ int buildDetailMesh;
+ int mergePolyMesh;
+ int mergePolyMeshDetail;
+};
+
+void rcSetLog(rcLog* log);
+rcLog* rcGetLog();
+
+void rcSetBuildTimes(rcBuildTimes* btimes);
+rcBuildTimes* rcGetBuildTimes();
+
+#endif // RECAST_LOG_H
diff --git a/extern/recastnavigation/Recast/Include/RecastTimer.h b/extern/recastnavigation/Recast/Include/RecastTimer.h
new file mode 100644
index 00000000000..d4f21e58776
--- /dev/null
+++ b/extern/recastnavigation/Recast/Include/RecastTimer.h
@@ -0,0 +1,31 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+#ifndef RECAST_TIMER_H
+#define RECAST_TIMER_H
+
+#ifdef __GNUC__
+#include <stdint.h>
+typedef int64_t rcTimeVal;
+#else
+typedef __int64 rcTimeVal;
+#endif
+
+rcTimeVal rcGetPerformanceTimer();
+int rcGetDeltaTimeUsec(rcTimeVal start, rcTimeVal end);
+
+#endif // RECAST_TIMER_H
diff --git a/extern/recastnavigation/Recast/Source/Recast.cpp b/extern/recastnavigation/Recast/Source/Recast.cpp
new file mode 100644
index 00000000000..0db26c2c1cd
--- /dev/null
+++ b/extern/recastnavigation/Recast/Source/Recast.cpp
@@ -0,0 +1,272 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#include <float.h>
+#define _USE_MATH_DEFINES
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "Recast.h"
+#include "RecastLog.h"
+#include "RecastTimer.h"
+
+
+void rcIntArray::resize(int n)
+{
+ if (n > m_cap)
+ {
+ if (!m_cap) m_cap = 8;
+ while (m_cap < n) m_cap *= 2;
+ int* newData = new int[m_cap];
+ if (m_size && newData) memcpy(newData, m_data, m_size*sizeof(int));
+ delete [] m_data;
+ m_data = newData;
+ }
+ m_size = n;
+}
+
+void rcCalcBounds(const float* verts, int nv, float* bmin, float* bmax)
+{
+ // Calculate bounding box.
+ vcopy(bmin, verts);
+ vcopy(bmax, verts);
+ for (int i = 1; i < nv; ++i)
+ {
+ const float* v = &verts[i*3];
+ vmin(bmin, v);
+ vmax(bmax, v);
+ }
+}
+
+void rcCalcGridSize(const float* bmin, const float* bmax, float cs, int* w, int* h)
+{
+ *w = (int)((bmax[0] - bmin[0])/cs+0.5f);
+ *h = (int)((bmax[2] - bmin[2])/cs+0.5f);
+}
+
+bool rcCreateHeightfield(rcHeightfield& hf, int width, int height,
+ const float* bmin, const float* bmax,
+ float cs, float ch)
+{
+ hf.width = width;
+ hf.height = height;
+ hf.spans = new rcSpan*[hf.width*hf.height];
+ vcopy(hf.bmin, bmin);
+ vcopy(hf.bmax, bmax);
+ hf.cs = cs;
+ hf.ch = ch;
+ if (!hf.spans)
+ return false;
+ memset(hf.spans, 0, sizeof(rcSpan*)*hf.width*hf.height);
+ return true;
+}
+
+static void calcTriNormal(const float* v0, const float* v1, const float* v2, float* norm)
+{
+ float e0[3], e1[3];
+ vsub(e0, v1, v0);
+ vsub(e1, v2, v0);
+ vcross(norm, e0, e1);
+ vnormalize(norm);
+}
+
+void rcMarkWalkableTriangles(const float walkableSlopeAngle,
+ const float* verts, int nv,
+ const int* tris, int nt,
+ unsigned char* flags)
+{
+ const float walkableThr = cosf(walkableSlopeAngle/180.0f*(float)M_PI);
+
+ float norm[3];
+
+ for (int i = 0; i < nt; ++i)
+ {
+ const int* tri = &tris[i*3];
+ calcTriNormal(&verts[tri[0]*3], &verts[tri[1]*3], &verts[tri[2]*3], norm);
+ // Check if the face is walkable.
+ if (norm[1] > walkableThr)
+ flags[i] |= RC_WALKABLE;
+ }
+}
+
+static int getSpanCount(unsigned char flags, rcHeightfield& hf)
+{
+ const int w = hf.width;
+ const int h = hf.height;
+ int spanCount = 0;
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ for (rcSpan* s = hf.spans[x + y*w]; s; s = s->next)
+ {
+ if (s->flags == flags)
+ spanCount++;
+ }
+ }
+ }
+ return spanCount;
+}
+
+inline void setCon(rcCompactSpan& s, int dir, int i)
+{
+ s.con &= ~(0xf << (dir*4));
+ s.con |= (i&0xf) << (dir*4);
+}
+
+bool rcBuildCompactHeightfield(const int walkableHeight, const int walkableClimb,
+ unsigned char flags, rcHeightfield& hf,
+ rcCompactHeightfield& chf)
+{
+ rcTimeVal startTime = rcGetPerformanceTimer();
+
+ const int w = hf.width;
+ const int h = hf.height;
+ const int spanCount = getSpanCount(flags, hf);
+
+ // Fill in header.
+ chf.width = w;
+ chf.height = h;
+ chf.spanCount = spanCount;
+ chf.walkableHeight = walkableHeight;
+ chf.walkableClimb = walkableClimb;
+ chf.maxRegions = 0;
+ vcopy(chf.bmin, hf.bmin);
+ vcopy(chf.bmax, hf.bmax);
+ chf.bmax[1] += walkableHeight*hf.ch;
+ chf.cs = hf.cs;
+ chf.ch = hf.ch;
+ chf.cells = new rcCompactCell[w*h];
+ if (!chf.cells)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildCompactHeightfield: Out of memory 'chf.cells' (%d)", w*h);
+ return false;
+ }
+ memset(chf.cells, 0, sizeof(rcCompactCell)*w*h);
+ chf.spans = new rcCompactSpan[spanCount];
+ if (!chf.spans)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildCompactHeightfield: Out of memory 'chf.spans' (%d)", spanCount);
+ return false;
+ }
+ memset(chf.spans, 0, sizeof(rcCompactSpan)*spanCount);
+
+ const int MAX_HEIGHT = 0xffff;
+
+ // Fill in cells and spans.
+ int idx = 0;
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ const rcSpan* s = hf.spans[x + y*w];
+ // If there are no spans at this cell, just leave the data to index=0, count=0.
+ if (!s) continue;
+ rcCompactCell& c = chf.cells[x+y*w];
+ c.index = idx;
+ c.count = 0;
+ while (s)
+ {
+ if (s->flags == flags)
+ {
+ const int bot = (int)s->smax;
+ const int top = s->next ? (int)s->next->smin : MAX_HEIGHT;
+ chf.spans[idx].y = (unsigned short)rcClamp(bot, 0, 0xffff);
+ chf.spans[idx].h = (unsigned char)rcClamp(top - bot, 0, 0xff);
+ idx++;
+ c.count++;
+ }
+ s = s->next;
+ }
+ }
+ }
+
+ // Find neighbour connections.
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ rcCompactSpan& s = chf.spans[i];
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ setCon(s, dir, 0xf);
+ const int nx = x + rcGetDirOffsetX(dir);
+ const int ny = y + rcGetDirOffsetY(dir);
+ // First check that the neighbour cell is in bounds.
+ if (nx < 0 || ny < 0 || nx >= w || ny >= h)
+ continue;
+ // Iterate over all neighbour spans and check if any of the is
+ // accessible from current cell.
+ const rcCompactCell& nc = chf.cells[nx+ny*w];
+ for (int k = (int)nc.index, nk = (int)(nc.index+nc.count); k < nk; ++k)
+ {
+ const rcCompactSpan& ns = chf.spans[k];
+ const int bot = rcMax(s.y, ns.y);
+ const int top = rcMin(s.y+s.h, ns.y+ns.h);
+
+ // Check that the gap between the spans is walkable,
+ // and that the climb height between the gaps is not too high.
+ if ((top - bot) >= walkableHeight && rcAbs((int)ns.y - (int)s.y) <= walkableClimb)
+ {
+ // Mark direction as walkable.
+ setCon(s, dir, k - (int)nc.index);
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ rcTimeVal endTime = rcGetPerformanceTimer();
+
+ if (rcGetBuildTimes())
+ rcGetBuildTimes()->buildCompact += rcGetDeltaTimeUsec(startTime, endTime);
+
+ return true;
+}
+
+static int getHeightfieldMemoryUsage(const rcHeightfield& hf)
+{
+ int size = 0;
+ size += sizeof(hf);
+ size += hf.width * hf.height * sizeof(rcSpan*);
+
+ rcSpanPool* pool = hf.pools;
+ while (pool)
+ {
+ size += (sizeof(rcSpanPool) - sizeof(rcSpan)) + sizeof(rcSpan)*RC_SPANS_PER_POOL;
+ pool = pool->next;
+ }
+ return size;
+}
+
+static int getCompactHeightFieldMemoryusage(const rcCompactHeightfield& chf)
+{
+ int size = 0;
+ size += sizeof(rcCompactHeightfield);
+ size += sizeof(rcCompactSpan) * chf.spanCount;
+ size += sizeof(rcCompactCell) * chf.width * chf.height;
+ return size;
+}
diff --git a/extern/recastnavigation/Recast/Source/RecastContour.cpp b/extern/recastnavigation/Recast/Source/RecastContour.cpp
new file mode 100644
index 00000000000..96f763a18f3
--- /dev/null
+++ b/extern/recastnavigation/Recast/Source/RecastContour.cpp
@@ -0,0 +1,732 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#define _USE_MATH_DEFINES
+#include <math.h>
+#include <string.h>
+#include <stdio.h>
+#include "Recast.h"
+#include "RecastLog.h"
+#include "RecastTimer.h"
+
+
+static int getCornerHeight(int x, int y, int i, int dir,
+ const rcCompactHeightfield& chf,
+ bool& isBorderVertex)
+{
+ const rcCompactSpan& s = chf.spans[i];
+ int ch = (int)s.y;
+ int dirp = (dir+1) & 0x3;
+
+ unsigned short regs[4] = {0,0,0,0};
+
+ regs[0] = s.reg;
+
+ if (rcGetCon(s, dir) != 0xf)
+ {
+ const int ax = x + rcGetDirOffsetX(dir);
+ const int ay = y + rcGetDirOffsetY(dir);
+ const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(s, dir);
+ const rcCompactSpan& as = chf.spans[ai];
+ ch = rcMax(ch, (int)as.y);
+ regs[1] = as.reg;
+ if (rcGetCon(as, dirp) != 0xf)
+ {
+ const int ax2 = ax + rcGetDirOffsetX(dirp);
+ const int ay2 = ay + rcGetDirOffsetY(dirp);
+ const int ai2 = (int)chf.cells[ax2+ay2*chf.width].index + rcGetCon(as, dirp);
+ const rcCompactSpan& as2 = chf.spans[ai2];
+ ch = rcMax(ch, (int)as2.y);
+ regs[2] = as2.reg;
+ }
+ }
+ if (rcGetCon(s, dirp) != 0xf)
+ {
+ const int ax = x + rcGetDirOffsetX(dirp);
+ const int ay = y + rcGetDirOffsetY(dirp);
+ const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(s, dirp);
+ const rcCompactSpan& as = chf.spans[ai];
+ ch = rcMax(ch, (int)as.y);
+ regs[3] = as.reg;
+ if (rcGetCon(as, dir) != 0xf)
+ {
+ const int ax2 = ax + rcGetDirOffsetX(dir);
+ const int ay2 = ay + rcGetDirOffsetY(dir);
+ const int ai2 = (int)chf.cells[ax2+ay2*chf.width].index + rcGetCon(as, dir);
+ const rcCompactSpan& as2 = chf.spans[ai2];
+ ch = rcMax(ch, (int)as2.y);
+ regs[2] = as2.reg;
+ }
+ }
+
+ // Check if the vertex is special edge vertex, these vertices will be removed later.
+ for (int j = 0; j < 4; ++j)
+ {
+ const int a = j;
+ const int b = (j+1) & 0x3;
+ const int c = (j+2) & 0x3;
+ const int d = (j+3) & 0x3;
+
+ // The vertex is a border vertex there are two same exterior cells in a row,
+ // followed by two interior cells and none of the regions are out of bounds.
+ const bool twoSameExts = (regs[a] & regs[b] & RC_BORDER_REG) != 0 && regs[a] == regs[b];
+ const bool twoInts = ((regs[c] | regs[d]) & RC_BORDER_REG) == 0;
+ const bool noZeros = regs[a] != 0 && regs[b] != 0 && regs[c] != 0 && regs[d] != 0;
+ if (twoSameExts && twoInts && noZeros)
+ {
+ isBorderVertex = true;
+ break;
+ }
+ }
+
+ return ch;
+}
+
+static void walkContour(int x, int y, int i,
+ rcCompactHeightfield& chf,
+ unsigned char* flags, rcIntArray& points)
+{
+ // Choose the first non-connected edge
+ unsigned char dir = 0;
+ while ((flags[i] & (1 << dir)) == 0)
+ dir++;
+
+ unsigned char startDir = dir;
+ int starti = i;
+
+ int iter = 0;
+ while (++iter < 40000)
+ {
+ if (flags[i] & (1 << dir))
+ {
+ // Choose the edge corner
+ bool isBorderVertex = false;
+ int px = x;
+ int py = getCornerHeight(x, y, i, dir, chf, isBorderVertex);
+ int pz = y;
+ switch(dir)
+ {
+ case 0: pz++; break;
+ case 1: px++; pz++; break;
+ case 2: px++; break;
+ }
+ int r = 0;
+ const rcCompactSpan& s = chf.spans[i];
+ if (rcGetCon(s, dir) != 0xf)
+ {
+ const int ax = x + rcGetDirOffsetX(dir);
+ const int ay = y + rcGetDirOffsetY(dir);
+ const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(s, dir);
+ const rcCompactSpan& as = chf.spans[ai];
+ r = (int)as.reg;
+ }
+ if (isBorderVertex)
+ r |= RC_BORDER_VERTEX;
+ points.push(px);
+ points.push(py);
+ points.push(pz);
+ points.push(r);
+
+ flags[i] &= ~(1 << dir); // Remove visited edges
+ dir = (dir+1) & 0x3; // Rotate CW
+ }
+ else
+ {
+ int ni = -1;
+ const int nx = x + rcGetDirOffsetX(dir);
+ const int ny = y + rcGetDirOffsetY(dir);
+ const rcCompactSpan& s = chf.spans[i];
+ if (rcGetCon(s, dir) != 0xf)
+ {
+ const rcCompactCell& nc = chf.cells[nx+ny*chf.width];
+ ni = (int)nc.index + rcGetCon(s, dir);
+ }
+ if (ni == -1)
+ {
+ // Should not happen.
+ return;
+ }
+ x = nx;
+ y = ny;
+ i = ni;
+ dir = (dir+3) & 0x3; // Rotate CCW
+ }
+
+ if (starti == i && startDir == dir)
+ {
+ break;
+ }
+ }
+}
+
+static float distancePtSeg(int x, int y, int z,
+ int px, int py, int pz,
+ int qx, int qy, int qz)
+{
+/* float pqx = (float)(qx - px);
+ float pqy = (float)(qy - py);
+ float pqz = (float)(qz - pz);
+ float dx = (float)(x - px);
+ float dy = (float)(y - py);
+ float dz = (float)(z - pz);
+ float d = pqx*pqx + pqy*pqy + pqz*pqz;
+ float t = pqx*dx + pqy*dy + pqz*dz;
+ if (d > 0)
+ t /= d;
+ if (t < 0)
+ t = 0;
+ else if (t > 1)
+ t = 1;
+
+ dx = px + t*pqx - x;
+ dy = py + t*pqy - y;
+ dz = pz + t*pqz - z;
+
+ return dx*dx + dy*dy + dz*dz;*/
+
+ float pqx = (float)(qx - px);
+ float pqz = (float)(qz - pz);
+ float dx = (float)(x - px);
+ float dz = (float)(z - pz);
+ float d = pqx*pqx + pqz*pqz;
+ float t = pqx*dx + pqz*dz;
+ if (d > 0)
+ t /= d;
+ if (t < 0)
+ t = 0;
+ else if (t > 1)
+ t = 1;
+
+ dx = px + t*pqx - x;
+ dz = pz + t*pqz - z;
+
+ return dx*dx + dz*dz;
+}
+
+static void simplifyContour(rcIntArray& points, rcIntArray& simplified, float maxError, int maxEdgeLen)
+{
+ // Add initial points.
+ bool noConnections = true;
+ for (int i = 0; i < points.size(); i += 4)
+ {
+ if ((points[i+3] & 0xffff) != 0)
+ {
+ noConnections = false;
+ break;
+ }
+ }
+
+ if (noConnections)
+ {
+ // If there is no connections at all,
+ // create some initial points for the simplification process.
+ // Find lower-left and upper-right vertices of the contour.
+ int llx = points[0];
+ int lly = points[1];
+ int llz = points[2];
+ int lli = 0;
+ int urx = points[0];
+ int ury = points[1];
+ int urz = points[2];
+ int uri = 0;
+ for (int i = 0; i < points.size(); i += 4)
+ {
+ int x = points[i+0];
+ int y = points[i+1];
+ int z = points[i+2];
+ if (x < llx || (x == llx && z < llz))
+ {
+ llx = x;
+ lly = y;
+ llz = z;
+ lli = i/4;
+ }
+ if (x >= urx || (x == urx && z > urz))
+ {
+ urx = x;
+ ury = y;
+ urz = z;
+ uri = i/4;
+ }
+ }
+ simplified.push(llx);
+ simplified.push(lly);
+ simplified.push(llz);
+ simplified.push(lli);
+
+ simplified.push(urx);
+ simplified.push(ury);
+ simplified.push(urz);
+ simplified.push(uri);
+ }
+ else
+ {
+ // The contour has some portals to other regions.
+ // Add a new point to every location where the region changes.
+ for (int i = 0, ni = points.size()/4; i < ni; ++i)
+ {
+ int ii = (i+1) % ni;
+ if ((points[i*4+3] & 0xffff) != (points[ii*4+3] & 0xffff))
+ {
+ simplified.push(points[i*4+0]);
+ simplified.push(points[i*4+1]);
+ simplified.push(points[i*4+2]);
+ simplified.push(i);
+ }
+ }
+ }
+
+ // Add points until all raw points are within
+ // error tolerance to the simplified shape.
+ const int pn = points.size()/4;
+ for (int i = 0; i < simplified.size()/4; )
+ {
+ int ii = (i+1) % (simplified.size()/4);
+
+ int ax = simplified[i*4+0];
+ int ay = simplified[i*4+1];
+ int az = simplified[i*4+2];
+ int ai = simplified[i*4+3];
+
+ int bx = simplified[ii*4+0];
+ int by = simplified[ii*4+1];
+ int bz = simplified[ii*4+2];
+ int bi = simplified[ii*4+3];
+
+ // Find maximum deviation from the segment.
+ float maxd = 0;
+ int maxi = -1;
+ int ci = (ai+1) % pn;
+
+ // Tesselate only outer edges.
+ if ((points[ci*4+3] & 0xffff) == 0)
+ {
+ while (ci != bi)
+ {
+ float d = distancePtSeg(points[ci*4+0], points[ci*4+1]/4, points[ci*4+2],
+ ax, ay/4, az, bx, by/4, bz);
+ if (d > maxd)
+ {
+ maxd = d;
+ maxi = ci;
+ }
+ ci = (ci+1) % pn;
+ }
+ }
+
+
+ // If the max deviation is larger than accepted error,
+ // add new point, else continue to next segment.
+ if (maxi != -1 && maxd > (maxError*maxError))
+ {
+ // Add space for the new point.
+ simplified.resize(simplified.size()+4);
+ int n = simplified.size()/4;
+ for (int j = n-1; j > i; --j)
+ {
+ simplified[j*4+0] = simplified[(j-1)*4+0];
+ simplified[j*4+1] = simplified[(j-1)*4+1];
+ simplified[j*4+2] = simplified[(j-1)*4+2];
+ simplified[j*4+3] = simplified[(j-1)*4+3];
+ }
+ // Add the point.
+ simplified[(i+1)*4+0] = points[maxi*4+0];
+ simplified[(i+1)*4+1] = points[maxi*4+1];
+ simplified[(i+1)*4+2] = points[maxi*4+2];
+ simplified[(i+1)*4+3] = maxi;
+ }
+ else
+ {
+ ++i;
+ }
+ }
+
+ // Split too long edges.
+ if (maxEdgeLen > 0)
+ {
+ for (int i = 0; i < simplified.size()/4; )
+ {
+ int ii = (i+1) % (simplified.size()/4);
+
+ int ax = simplified[i*4+0];
+ int az = simplified[i*4+2];
+ int ai = simplified[i*4+3];
+
+ int bx = simplified[ii*4+0];
+ int bz = simplified[ii*4+2];
+ int bi = simplified[ii*4+3];
+
+ // Find maximum deviation from the segment.
+ int maxi = -1;
+ int ci = (ai+1) % pn;
+
+ // Tesselate only outer edges.
+ if ((points[ci*4+3] & 0xffff) == 0)
+ {
+ int dx = bx - ax;
+ int dz = bz - az;
+ if (dx*dx + dz*dz > maxEdgeLen*maxEdgeLen)
+ {
+ int n = bi < ai ? (bi+pn - ai) : (bi - ai);
+ maxi = (ai + n/2) % pn;
+ }
+ }
+
+ // If the max deviation is larger than accepted error,
+ // add new point, else continue to next segment.
+ if (maxi != -1)
+ {
+ // Add space for the new point.
+ simplified.resize(simplified.size()+4);
+ int n = simplified.size()/4;
+ for (int j = n-1; j > i; --j)
+ {
+ simplified[j*4+0] = simplified[(j-1)*4+0];
+ simplified[j*4+1] = simplified[(j-1)*4+1];
+ simplified[j*4+2] = simplified[(j-1)*4+2];
+ simplified[j*4+3] = simplified[(j-1)*4+3];
+ }
+ // Add the point.
+ simplified[(i+1)*4+0] = points[maxi*4+0];
+ simplified[(i+1)*4+1] = points[maxi*4+1];
+ simplified[(i+1)*4+2] = points[maxi*4+2];
+ simplified[(i+1)*4+3] = maxi;
+ }
+ else
+ {
+ ++i;
+ }
+ }
+ }
+
+ for (int i = 0; i < simplified.size()/4; ++i)
+ {
+ // The edge vertex flag is take from the current raw point,
+ // and the neighbour region is take from the next raw point.
+ const int ai = (simplified[i*4+3]+1) % pn;
+ const int bi = simplified[i*4+3];
+ simplified[i*4+3] = (points[ai*4+3] & 0xffff) | (points[bi*4+3] & RC_BORDER_VERTEX);
+ }
+
+}
+
+static void removeDegenerateSegments(rcIntArray& simplified)
+{
+ // Remove adjacent vertices which are equal on xz-plane,
+ // or else the triangulator will get confused.
+ for (int i = 0; i < simplified.size()/4; ++i)
+ {
+ int ni = i+1;
+ if (ni >= (simplified.size()/4))
+ ni = 0;
+
+ if (simplified[i*4+0] == simplified[ni*4+0] &&
+ simplified[i*4+2] == simplified[ni*4+2])
+ {
+ // Degenerate segment, remove.
+ for (int j = i; j < simplified.size()/4-1; ++j)
+ {
+ simplified[j*4+0] = simplified[(j+1)*4+0];
+ simplified[j*4+1] = simplified[(j+1)*4+1];
+ simplified[j*4+2] = simplified[(j+1)*4+2];
+ simplified[j*4+3] = simplified[(j+1)*4+3];
+ }
+ simplified.pop();
+ }
+ }
+}
+
+static int calcAreaOfPolygon2D(const int* verts, const int nverts)
+{
+ int area = 0;
+ for (int i = 0, j = nverts-1; i < nverts; j=i++)
+ {
+ const int* vi = &verts[i*4];
+ const int* vj = &verts[j*4];
+ area += vi[0] * vj[2] - vj[0] * vi[2];
+ }
+ return (area+1) / 2;
+}
+
+static void getClosestIndices(const int* vertsa, const int nvertsa,
+ const int* vertsb, const int nvertsb,
+ int& ia, int& ib)
+{
+ int closestDist = 0xfffffff;
+ for (int i = 0; i < nvertsa; ++i)
+ {
+ const int* va = &vertsa[i*4];
+ for (int j = 0; j < nvertsb; ++j)
+ {
+ const int* vb = &vertsb[j*4];
+ const int dx = vb[0] - va[0];
+ const int dz = vb[2] - va[2];
+ const int d = dx*dx + dz*dz;
+ if (d < closestDist)
+ {
+ ia = i;
+ ib = j;
+ closestDist = d;
+ }
+ }
+ }
+}
+
+static bool mergeContours(rcContour& ca, rcContour& cb, int ia, int ib)
+{
+ const int maxVerts = ca.nverts + cb.nverts + 2;
+ int* verts = new int[maxVerts*4];
+ if (!verts)
+ return false;
+
+ int nv = 0;
+
+ // Copy contour A.
+ for (int i = 0; i <= ca.nverts; ++i)
+ {
+ int* dst = &verts[nv*4];
+ const int* src = &ca.verts[((ia+i)%ca.nverts)*4];
+ dst[0] = src[0];
+ dst[1] = src[1];
+ dst[2] = src[2];
+ dst[3] = src[3];
+ nv++;
+ }
+
+ // Copy contour B
+ for (int i = 0; i <= cb.nverts; ++i)
+ {
+ int* dst = &verts[nv*4];
+ const int* src = &cb.verts[((ib+i)%cb.nverts)*4];
+ dst[0] = src[0];
+ dst[1] = src[1];
+ dst[2] = src[2];
+ dst[3] = src[3];
+ nv++;
+ }
+
+ delete [] ca.verts;
+ ca.verts = verts;
+ ca.nverts = nv;
+
+ delete [] cb.verts;
+ cb.verts = 0;
+ cb.nverts = 0;
+
+ return true;
+}
+
+bool rcBuildContours(rcCompactHeightfield& chf,
+ const float maxError, const int maxEdgeLen,
+ rcContourSet& cset)
+{
+ const int w = chf.width;
+ const int h = chf.height;
+
+ rcTimeVal startTime = rcGetPerformanceTimer();
+
+ vcopy(cset.bmin, chf.bmin);
+ vcopy(cset.bmax, chf.bmax);
+ cset.cs = chf.cs;
+ cset.ch = chf.ch;
+
+ const int maxContours = chf.maxRegions*2;
+ cset.conts = new rcContour[maxContours];
+ if (!cset.conts)
+ return false;
+ cset.nconts = 0;
+
+ unsigned char* flags = new unsigned char[chf.spanCount];
+ if (!flags)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildContours: Out of memory 'flags'.");
+ return false;
+ }
+
+ rcTimeVal traceStartTime = rcGetPerformanceTimer();
+
+
+ // Mark boundaries.
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ unsigned char res = 0;
+ const rcCompactSpan& s = chf.spans[i];
+ if (!s.reg || (s.reg & RC_BORDER_REG))
+ {
+ flags[i] = 0;
+ continue;
+ }
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ unsigned short r = 0;
+ if (rcGetCon(s, dir) != 0xf)
+ {
+ const int ax = x + rcGetDirOffsetX(dir);
+ const int ay = y + rcGetDirOffsetY(dir);
+ const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, dir);
+ const rcCompactSpan& as = chf.spans[ai];
+ r = as.reg;
+ }
+ if (r == s.reg)
+ res |= (1 << dir);
+ }
+ flags[i] = res ^ 0xf; // Inverse, mark non connected edges.
+ }
+ }
+ }
+
+ rcTimeVal traceEndTime = rcGetPerformanceTimer();
+
+ rcTimeVal simplifyStartTime = rcGetPerformanceTimer();
+
+ rcIntArray verts(256);
+ rcIntArray simplified(64);
+
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ if (flags[i] == 0 || flags[i] == 0xf)
+ {
+ flags[i] = 0;
+ continue;
+ }
+ unsigned short reg = chf.spans[i].reg;
+ if (!reg || (reg & RC_BORDER_REG))
+ continue;
+
+ verts.resize(0);
+ simplified.resize(0);
+ walkContour(x, y, i, chf, flags, verts);
+ simplifyContour(verts, simplified, maxError, maxEdgeLen);
+ removeDegenerateSegments(simplified);
+
+ // Store region->contour remap info.
+ // Create contour.
+ if (simplified.size()/4 >= 3)
+ {
+ if (cset.nconts >= maxContours)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildContours: Too many contours %d, max %d.", cset.nconts, maxContours);
+ return false;
+ }
+
+ rcContour* cont = &cset.conts[cset.nconts++];
+
+ cont->nverts = simplified.size()/4;
+ cont->verts = new int[cont->nverts*4];
+ memcpy(cont->verts, &simplified[0], sizeof(int)*cont->nverts*4);
+
+ cont->nrverts = verts.size()/4;
+ cont->rverts = new int[cont->nrverts*4];
+ memcpy(cont->rverts, &verts[0], sizeof(int)*cont->nrverts*4);
+
+/* cont->cx = cont->cy = cont->cz = 0;
+ for (int i = 0; i < cont->nverts; ++i)
+ {
+ cont->cx += cont->verts[i*4+0];
+ cont->cy += cont->verts[i*4+1];
+ cont->cz += cont->verts[i*4+2];
+ }
+ cont->cx /= cont->nverts;
+ cont->cy /= cont->nverts;
+ cont->cz /= cont->nverts;*/
+
+ cont->reg = reg;
+ }
+ }
+ }
+ }
+
+ // Check and merge droppings.
+ // Sometimes the previous algorithms can fail and create several countours
+ // per area. This pass will try to merge the holes into the main region.
+ for (int i = 0; i < cset.nconts; ++i)
+ {
+ rcContour& cont = cset.conts[i];
+ // Check if the contour is would backwards.
+ if (calcAreaOfPolygon2D(cont.verts, cont.nverts) < 0)
+ {
+ // Find another contour which has the same region ID.
+ int mergeIdx = -1;
+ for (int j = 0; j < cset.nconts; ++j)
+ {
+ if (i == j) continue;
+ if (cset.conts[j].nverts && cset.conts[j].reg == cont.reg)
+ {
+ // Make sure the polygon is correctly oriented.
+ if (calcAreaOfPolygon2D(cset.conts[j].verts, cset.conts[j].nverts))
+ {
+ mergeIdx = j;
+ break;
+ }
+ }
+ }
+ if (mergeIdx == -1)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "rcBuildContours: Could not find merge target for bad contour %d.", i);
+ }
+ else
+ {
+ rcContour& mcont = cset.conts[mergeIdx];
+ // Merge by closest points.
+ int ia, ib;
+ getClosestIndices(mcont.verts, mcont.nverts, cont.verts, cont.nverts, ia, ib);
+ if (!mergeContours(mcont, cont, ia, ib))
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "rcBuildContours: Failed to merge contours %d and %d.", i, mergeIdx);
+ }
+ }
+ }
+ }
+
+
+ delete [] flags;
+
+ rcTimeVal simplifyEndTime = rcGetPerformanceTimer();
+
+ rcTimeVal endTime = rcGetPerformanceTimer();
+
+// if (rcGetLog())
+// {
+// rcGetLog()->log(RC_LOG_PROGRESS, "Create contours: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f);
+// rcGetLog()->log(RC_LOG_PROGRESS, " - boundary: %.3f ms", rcGetDeltaTimeUsec(boundaryStartTime, boundaryEndTime)/1000.0f);
+// rcGetLog()->log(RC_LOG_PROGRESS, " - contour: %.3f ms", rcGetDeltaTimeUsec(contourStartTime, contourEndTime)/1000.0f);
+// }
+
+ if (rcGetBuildTimes())
+ {
+ rcGetBuildTimes()->buildContours += rcGetDeltaTimeUsec(startTime, endTime);
+ rcGetBuildTimes()->buildContoursTrace += rcGetDeltaTimeUsec(traceStartTime, traceEndTime);
+ rcGetBuildTimes()->buildContoursSimplify += rcGetDeltaTimeUsec(simplifyStartTime, simplifyEndTime);
+ }
+
+ return true;
+}
diff --git a/extern/recastnavigation/Recast/Source/RecastFilter.cpp b/extern/recastnavigation/Recast/Source/RecastFilter.cpp
new file mode 100644
index 00000000000..ebe60714a18
--- /dev/null
+++ b/extern/recastnavigation/Recast/Source/RecastFilter.cpp
@@ -0,0 +1,249 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#define _USE_MATH_DEFINES
+#include <math.h>
+#include <stdio.h>
+#include "Recast.h"
+#include "RecastLog.h"
+#include "RecastTimer.h"
+
+
+void rcFilterLedgeSpans(const int walkableHeight,
+ const int walkableClimb,
+ rcHeightfield& solid)
+{
+ rcTimeVal startTime = rcGetPerformanceTimer();
+
+ const int w = solid.width;
+ const int h = solid.height;
+ const int MAX_HEIGHT = 0xffff;
+
+ // Mark border spans.
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ for (rcSpan* s = solid.spans[x + y*w]; s; s = s->next)
+ {
+ // Skip non walkable spans.
+ if ((s->flags & RC_WALKABLE) == 0)
+ continue;
+
+ const int bot = (int)s->smax;
+ const int top = s->next ? (int)s->next->smin : MAX_HEIGHT;
+
+ // Find neighbours minimum height.
+ int minh = MAX_HEIGHT;
+
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ int dx = x + rcGetDirOffsetX(dir);
+ int dy = y + rcGetDirOffsetY(dir);
+ // Skip neighbours which are out of bounds.
+ if (dx < 0 || dy < 0 || dx >= w || dy >= h)
+ {
+ minh = rcMin(minh, -walkableClimb - bot);
+ continue;
+ }
+
+ // From minus infinity to the first span.
+ rcSpan* ns = solid.spans[dx + dy*w];
+ int nbot = -walkableClimb;
+ int ntop = ns ? (int)ns->smin : MAX_HEIGHT;
+ // Skip neightbour if the gap between the spans is too small.
+ if (rcMin(top,ntop) - rcMax(bot,nbot) > walkableHeight)
+ minh = rcMin(minh, nbot - bot);
+
+ // Rest of the spans.
+ for (ns = solid.spans[dx + dy*w]; ns; ns = ns->next)
+ {
+ nbot = (int)ns->smax;
+ ntop = ns->next ? (int)ns->next->smin : MAX_HEIGHT;
+ // Skip neightbour if the gap between the spans is too small.
+ if (rcMin(top,ntop) - rcMax(bot,nbot) > walkableHeight)
+ minh = rcMin(minh, nbot - bot);
+ }
+ }
+
+ // The current span is close to a ledge if the drop to any
+ // neighbour span is less than the walkableClimb.
+ if (minh < -walkableClimb)
+ s->flags &= ~RC_WALKABLE;
+
+ }
+ }
+ }
+
+ rcTimeVal endTime = rcGetPerformanceTimer();
+// if (rcGetLog())
+// rcGetLog()->log(RC_LOG_PROGRESS, "Filter border: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f);
+ if (rcGetBuildTimes())
+ rcGetBuildTimes()->filterBorder += rcGetDeltaTimeUsec(startTime, endTime);
+}
+
+void rcFilterWalkableLowHeightSpans(int walkableHeight,
+ rcHeightfield& solid)
+{
+ rcTimeVal startTime = rcGetPerformanceTimer();
+
+ const int w = solid.width;
+ const int h = solid.height;
+ const int MAX_HEIGHT = 0xffff;
+
+ // Remove walkable flag from spans which do not have enough
+ // space above them for the agent to stand there.
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ for (rcSpan* s = solid.spans[x + y*w]; s; s = s->next)
+ {
+ const int bot = (int)s->smax;
+ const int top = s->next ? (int)s->next->smin : MAX_HEIGHT;
+ if ((top - bot) <= walkableHeight)
+ s->flags &= ~RC_WALKABLE;
+ }
+ }
+ }
+
+ rcTimeVal endTime = rcGetPerformanceTimer();
+
+// if (rcGetLog())
+// rcGetLog()->log(RC_LOG_PROGRESS, "Filter walkable: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f);
+ if (rcGetBuildTimes())
+ rcGetBuildTimes()->filterWalkable += rcGetDeltaTimeUsec(startTime, endTime);
+}
+
+
+struct rcReachableSeed
+{
+ inline void set(int ix, int iy, rcSpan* is)
+ {
+ x = (unsigned short)ix;
+ y = (unsigned short)iy;
+ s = is;
+ }
+ unsigned short x, y;
+ rcSpan* s;
+};
+
+bool rcMarkReachableSpans(const int walkableHeight,
+ const int walkableClimb,
+ rcHeightfield& solid)
+{
+ const int w = solid.width;
+ const int h = solid.height;
+ const int MAX_HEIGHT = 0xffff;
+
+ rcTimeVal startTime = rcGetPerformanceTimer();
+
+ // Build navigable space.
+ const int MAX_SEEDS = w*h;
+ rcReachableSeed* stack = new rcReachableSeed[MAX_SEEDS];
+ if (!stack)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcMarkReachableSpans: Out of memory 'stack' (%d).", MAX_SEEDS);
+ return false;
+ }
+ int stackSize = 0;
+
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ rcSpan* topSpan = solid.spans[x + y*w];
+ if (!topSpan)
+ continue;
+ while (topSpan->next)
+ topSpan = topSpan->next;
+
+ // If the span is not walkable, skip it.
+ if ((topSpan->flags & RC_WALKABLE) == 0)
+ continue;
+ // If the span has been visited already, skip it.
+ if (topSpan->flags & RC_REACHABLE)
+ continue;
+
+ // Start flood fill.
+ topSpan->flags |= RC_REACHABLE;
+ stackSize = 0;
+ stack[stackSize].set(x, y, topSpan);
+ stackSize++;
+
+ while (stackSize)
+ {
+ // Pop a seed from the stack.
+ stackSize--;
+ rcReachableSeed cur = stack[stackSize];
+
+ const int bot = (int)cur.s->smax;
+ const int top = cur.s->next ? (int)cur.s->next->smin : MAX_HEIGHT;
+
+ // Visit neighbours in all 4 directions.
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ int dx = (int)cur.x + rcGetDirOffsetX(dir);
+ int dy = (int)cur.y + rcGetDirOffsetY(dir);
+ // Skip neighbour which are out of bounds.
+ if (dx < 0 || dy < 0 || dx >= w || dy >= h)
+ continue;
+ for (rcSpan* ns = solid.spans[dx + dy*w]; ns; ns = ns->next)
+ {
+ // Skip neighbour if it is not walkable.
+ if ((ns->flags & RC_WALKABLE) == 0)
+ continue;
+ // Skip the neighbour if it has been visited already.
+ if (ns->flags & RC_REACHABLE)
+ continue;
+
+ const int nbot = (int)ns->smax;
+ const int ntop = ns->next ? (int)ns->next->smin : MAX_HEIGHT;
+ // Skip neightbour if the gap between the spans is too small.
+ if (rcMin(top,ntop) - rcMax(bot,nbot) < walkableHeight)
+ continue;
+ // Skip neightbour if the climb height to the neighbour is too high.
+ if (rcAbs(nbot - bot) >= walkableClimb)
+ continue;
+
+ // This neighbour has not been visited yet.
+ // Mark it as reachable and add it to the seed stack.
+ ns->flags |= RC_REACHABLE;
+ if (stackSize < MAX_SEEDS)
+ {
+ stack[stackSize].set(dx, dy, ns);
+ stackSize++;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ delete [] stack;
+
+ rcTimeVal endTime = rcGetPerformanceTimer();
+
+// if (rcGetLog())
+// rcGetLog()->log(RC_LOG_PROGRESS, "Mark reachable: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f);
+ if (rcGetBuildTimes())
+ rcGetBuildTimes()->filterMarkReachable += rcGetDeltaTimeUsec(startTime, endTime);
+
+ return true;
+}
diff --git a/extern/recastnavigation/Recast/Source/RecastLog.cpp b/extern/recastnavigation/Recast/Source/RecastLog.cpp
new file mode 100644
index 00000000000..27868042a1c
--- /dev/null
+++ b/extern/recastnavigation/Recast/Source/RecastLog.cpp
@@ -0,0 +1,77 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#include "RecastLog.h"
+#include <stdio.h>
+#include <stdarg.h>
+
+static rcLog* g_log = 0;
+static rcBuildTimes* g_btimes = 0;
+
+rcLog::rcLog() :
+ m_messageCount(0),
+ m_textPoolSize(0)
+{
+}
+
+rcLog::~rcLog()
+{
+ if (g_log == this)
+ g_log = 0;
+}
+
+void rcLog::log(rcLogCategory category, const char* format, ...)
+{
+ if (m_messageCount >= MAX_MESSAGES)
+ return;
+ char* dst = &m_textPool[m_textPoolSize];
+ int n = TEXT_POOL_SIZE - m_textPoolSize;
+ if (n < 2)
+ return;
+ // Store category
+ *dst = (char)category;
+ n--;
+ // Store message
+ va_list ap;
+ va_start(ap, format);
+ int ret = vsnprintf(dst+1, n-1, format, ap);
+ va_end(ap);
+ if (ret > 0)
+ m_textPoolSize += ret+2;
+ m_messages[m_messageCount++] = dst;
+}
+
+void rcSetLog(rcLog* log)
+{
+ g_log = log;
+}
+
+rcLog* rcGetLog()
+{
+ return g_log;
+}
+
+void rcSetBuildTimes(rcBuildTimes* btimes)
+{
+ g_btimes = btimes;
+}
+
+rcBuildTimes* rcGetBuildTimes()
+{
+ return g_btimes;
+}
diff --git a/extern/recastnavigation/Recast/Source/RecastMesh.cpp b/extern/recastnavigation/Recast/Source/RecastMesh.cpp
new file mode 100644
index 00000000000..38d62904213
--- /dev/null
+++ b/extern/recastnavigation/Recast/Source/RecastMesh.cpp
@@ -0,0 +1,1218 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#define _USE_MATH_DEFINES
+#include <math.h>
+#include <string.h>
+#include <stdio.h>
+#include "Recast.h"
+#include "RecastLog.h"
+#include "RecastTimer.h"
+
+
+struct rcEdge
+{
+ unsigned short vert[2];
+ unsigned short polyEdge[2];
+ unsigned short poly[2];
+};
+
+/*static */bool buildMeshAdjacency(unsigned short* polys, const int npolys,
+ const int nverts, const int vertsPerPoly)
+{
+ // Based on code by Eric Lengyel from:
+ // http://www.terathon.com/code/edges.php
+
+ int maxEdgeCount = npolys*vertsPerPoly;
+ unsigned short* firstEdge = new unsigned short[nverts + maxEdgeCount];
+ if (!firstEdge)
+ return false;
+ unsigned short* nextEdge = firstEdge + nverts;
+ int edgeCount = 0;
+
+ rcEdge* edges = new rcEdge[maxEdgeCount];
+ if (!edges)
+ return false;
+
+ for (int i = 0; i < nverts; i++)
+ firstEdge[i] = 0xffff;
+
+ // Invalida indices are marked as 0xffff, the following code
+ // handles them just fine.
+
+ for (int i = 0; i < npolys; ++i)
+ {
+ unsigned short* t = &polys[i*vertsPerPoly*2];
+ for (int j = 0; j < vertsPerPoly; ++j)
+ {
+ unsigned short v0 = t[j];
+ unsigned short v1 = (j+1 >= vertsPerPoly || t[j+1] == 0xffff) ? t[0] : t[j+1];
+ if (v0 < v1)
+ {
+ rcEdge& edge = edges[edgeCount];
+ edge.vert[0] = v0;
+ edge.vert[1] = v1;
+ edge.poly[0] = (unsigned short)i;
+ edge.polyEdge[0] = (unsigned short)j;
+ edge.poly[1] = (unsigned short)i;
+ edge.polyEdge[1] = 0;
+ // Insert edge
+ nextEdge[edgeCount] = firstEdge[v0];
+ firstEdge[v0] = edgeCount;
+ edgeCount++;
+ }
+ }
+ }
+
+ for (int i = 0; i < npolys; ++i)
+ {
+ unsigned short* t = &polys[i*vertsPerPoly*2];
+ for (int j = 0; j < vertsPerPoly; ++j)
+ {
+ unsigned short v0 = t[j];
+ unsigned short v1 = (j+1 >= vertsPerPoly || t[j+1] == 0xffff) ? t[0] : t[j+1];
+ if (v0 > v1)
+ {
+ for (unsigned short e = firstEdge[v1]; e != 0xffff; e = nextEdge[e])
+ {
+ rcEdge& edge = edges[e];
+ if (edge.vert[1] == v0 && edge.poly[0] == edge.poly[1])
+ {
+ edge.poly[1] = (unsigned short)i;
+ edge.polyEdge[1] = (unsigned short)j;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Store adjacency
+ for (int i = 0; i < edgeCount; ++i)
+ {
+ const rcEdge& e = edges[i];
+ if (e.poly[0] != e.poly[1])
+ {
+ unsigned short* p0 = &polys[e.poly[0]*vertsPerPoly*2];
+ unsigned short* p1 = &polys[e.poly[1]*vertsPerPoly*2];
+ p0[vertsPerPoly + e.polyEdge[0]] = e.poly[1];
+ p1[vertsPerPoly + e.polyEdge[1]] = e.poly[0];
+ }
+ }
+
+ delete [] firstEdge;
+ delete [] edges;
+
+ return true;
+}
+
+
+static const int VERTEX_BUCKET_COUNT = (1<<12);
+
+inline int computeVertexHash(int x, int y, int z)
+{
+ const unsigned int h1 = 0x8da6b343; // Large multiplicative constants;
+ const unsigned int h2 = 0xd8163841; // here arbitrarily chosen primes
+ const unsigned int h3 = 0xcb1ab31f;
+ unsigned int n = h1 * x + h2 * y + h3 * z;
+ return (int)(n & (VERTEX_BUCKET_COUNT-1));
+}
+
+static int addVertex(unsigned short x, unsigned short y, unsigned short z,
+ unsigned short* verts, int* firstVert, int* nextVert, int& nv)
+{
+ int bucket = computeVertexHash(x, 0, z);
+ int i = firstVert[bucket];
+
+ while (i != -1)
+ {
+ const unsigned short* v = &verts[i*3];
+ if (v[0] == x && (rcAbs(v[1] - y) <= 2) && v[2] == z)
+ return i;
+ i = nextVert[i]; // next
+ }
+
+ // Could not find, create new.
+ i = nv; nv++;
+ unsigned short* v = &verts[i*3];
+ v[0] = x;
+ v[1] = y;
+ v[2] = z;
+ nextVert[i] = firstVert[bucket];
+ firstVert[bucket] = i;
+
+ return i;
+}
+
+inline int prev(int i, int n) { return i-1 >= 0 ? i-1 : n-1; }
+inline int next(int i, int n) { return i+1 < n ? i+1 : 0; }
+
+inline int area2(const int* a, const int* b, const int* c)
+{
+ return (b[0] - a[0]) * (c[2] - a[2]) - (c[0] - a[0]) * (b[2] - a[2]);
+}
+
+// Exclusive or: true iff exactly one argument is true.
+// The arguments are negated to ensure that they are 0/1
+// values. Then the bitwise Xor operator may apply.
+// (This idea is due to Michael Baldwin.)
+inline bool xorb(bool x, bool y)
+{
+ return !x ^ !y;
+}
+
+// Returns true iff c is strictly to the left of the directed
+// line through a to b.
+inline bool left(const int* a, const int* b, const int* c)
+{
+ return area2(a, b, c) < 0;
+}
+
+inline bool leftOn(const int* a, const int* b, const int* c)
+{
+ return area2(a, b, c) <= 0;
+}
+
+inline bool collinear(const int* a, const int* b, const int* c)
+{
+ return area2(a, b, c) == 0;
+}
+
+// Returns true iff ab properly intersects cd: they share
+// a point interior to both segments. The properness of the
+// intersection is ensured by using strict leftness.
+bool intersectProp(const int* a, const int* b, const int* c, const int* d)
+{
+ // Eliminate improper cases.
+ if (collinear(a,b,c) || collinear(a,b,d) ||
+ collinear(c,d,a) || collinear(c,d,b))
+ return false;
+
+ return xorb(left(a,b,c), left(a,b,d)) && xorb(left(c,d,a), left(c,d,b));
+}
+
+// Returns T iff (a,b,c) are collinear and point c lies
+// on the closed segement ab.
+static bool between(const int* a, const int* b, const int* c)
+{
+ if (!collinear(a, b, c))
+ return false;
+ // If ab not vertical, check betweenness on x; else on y.
+ if (a[0] != b[0])
+ return ((a[0] <= c[0]) && (c[0] <= b[0])) || ((a[0] >= c[0]) && (c[0] >= b[0]));
+ else
+ return ((a[2] <= c[2]) && (c[2] <= b[2])) || ((a[2] >= c[2]) && (c[2] >= b[2]));
+}
+
+// Returns true iff segments ab and cd intersect, properly or improperly.
+static bool intersect(const int* a, const int* b, const int* c, const int* d)
+{
+ if (intersectProp(a, b, c, d))
+ return true;
+ else if (between(a, b, c) || between(a, b, d) ||
+ between(c, d, a) || between(c, d, b))
+ return true;
+ else
+ return false;
+}
+
+static bool vequal(const int* a, const int* b)
+{
+ return a[0] == b[0] && a[2] == b[2];
+}
+
+// Returns T iff (v_i, v_j) is a proper internal *or* external
+// diagonal of P, *ignoring edges incident to v_i and v_j*.
+static bool diagonalie(int i, int j, int n, const int* verts, int* indices)
+{
+ const int* d0 = &verts[(indices[i] & 0x0fffffff) * 4];
+ const int* d1 = &verts[(indices[j] & 0x0fffffff) * 4];
+
+ // For each edge (k,k+1) of P
+ for (int k = 0; k < n; k++)
+ {
+ int k1 = next(k, n);
+ // Skip edges incident to i or j
+ if (!((k == i) || (k1 == i) || (k == j) || (k1 == j)))
+ {
+ const int* p0 = &verts[(indices[k] & 0x0fffffff) * 4];
+ const int* p1 = &verts[(indices[k1] & 0x0fffffff) * 4];
+
+ if (vequal(d0, p0) || vequal(d1, p0) || vequal(d0, p1) || vequal(d1, p1))
+ continue;
+
+ if (intersect(d0, d1, p0, p1))
+ return false;
+ }
+ }
+ return true;
+}
+
+// Returns true iff the diagonal (i,j) is strictly internal to the
+// polygon P in the neighborhood of the i endpoint.
+static bool inCone(int i, int j, int n, const int* verts, int* indices)
+{
+ const int* pi = &verts[(indices[i] & 0x0fffffff) * 4];
+ const int* pj = &verts[(indices[j] & 0x0fffffff) * 4];
+ const int* pi1 = &verts[(indices[next(i, n)] & 0x0fffffff) * 4];
+ const int* pin1 = &verts[(indices[prev(i, n)] & 0x0fffffff) * 4];
+
+ // If P[i] is a convex vertex [ i+1 left or on (i-1,i) ].
+ if (leftOn(pin1, pi, pi1))
+ return left(pi, pj, pin1) && left(pj, pi, pi1);
+ // Assume (i-1,i,i+1) not collinear.
+ // else P[i] is reflex.
+ return !(leftOn(pi, pj, pi1) && leftOn(pj, pi, pin1));
+}
+
+// Returns T iff (v_i, v_j) is a proper internal
+// diagonal of P.
+static bool diagonal(int i, int j, int n, const int* verts, int* indices)
+{
+ return inCone(i, j, n, verts, indices) && diagonalie(i, j, n, verts, indices);
+}
+
+int triangulate(int n, const int* verts, int* indices, int* tris)
+{
+ int ntris = 0;
+ int* dst = tris;
+
+ // The last bit of the index is used to indicate if the vertex can be removed.
+ for (int i = 0; i < n; i++)
+ {
+ int i1 = next(i, n);
+ int i2 = next(i1, n);
+ if (diagonal(i, i2, n, verts, indices))
+ indices[i1] |= 0x80000000;
+ }
+
+ while (n > 3)
+ {
+ int minLen = -1;
+ int mini = -1;
+ for (int i = 0; i < n; i++)
+ {
+ int i1 = next(i, n);
+ if (indices[i1] & 0x80000000)
+ {
+ const int* p0 = &verts[(indices[i] & 0x0fffffff) * 4];
+ const int* p2 = &verts[(indices[next(i1, n)] & 0x0fffffff) * 4];
+
+ int dx = p2[0] - p0[0];
+ int dy = p2[2] - p0[2];
+ int len = dx*dx + dy*dy;
+
+ if (minLen < 0 || len < minLen)
+ {
+ minLen = len;
+ mini = i;
+ }
+ }
+ }
+
+ if (mini == -1)
+ {
+ // Should not happen.
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "triangulate: Failed to triangulate polygon.");
+/* printf("mini == -1 ntris=%d n=%d\n", ntris, n);
+ for (int i = 0; i < n; i++)
+ {
+ printf("%d ", indices[i] & 0x0fffffff);
+ }
+ printf("\n");*/
+ return -ntris;
+ }
+
+ int i = mini;
+ int i1 = next(i, n);
+ int i2 = next(i1, n);
+
+ *dst++ = indices[i] & 0x0fffffff;
+ *dst++ = indices[i1] & 0x0fffffff;
+ *dst++ = indices[i2] & 0x0fffffff;
+ ntris++;
+
+ // Removes P[i1] by copying P[i+1]...P[n-1] left one index.
+ n--;
+ for (int k = i1; k < n; k++)
+ indices[k] = indices[k+1];
+
+ if (i1 >= n) i1 = 0;
+ i = prev(i1,n);
+ // Update diagonal flags.
+ if (diagonal(prev(i, n), i1, n, verts, indices))
+ indices[i] |= 0x80000000;
+ else
+ indices[i] &= 0x0fffffff;
+
+ if (diagonal(i, next(i1, n), n, verts, indices))
+ indices[i1] |= 0x80000000;
+ else
+ indices[i1] &= 0x0fffffff;
+ }
+
+ // Append the remaining triangle.
+ *dst++ = indices[0] & 0x0fffffff;
+ *dst++ = indices[1] & 0x0fffffff;
+ *dst++ = indices[2] & 0x0fffffff;
+ ntris++;
+
+ return ntris;
+}
+
+static int countPolyVerts(const unsigned short* p, const int nvp)
+{
+ for (int i = 0; i < nvp; ++i)
+ if (p[i] == 0xffff)
+ return i;
+ return nvp;
+}
+
+inline bool uleft(const unsigned short* a, const unsigned short* b, const unsigned short* c)
+{
+ return ((int)b[0] - (int)a[0]) * ((int)c[2] - (int)a[2]) -
+ ((int)c[0] - (int)a[0]) * ((int)b[2] - (int)a[2]) < 0;
+}
+
+static int getPolyMergeValue(unsigned short* pa, unsigned short* pb,
+ const unsigned short* verts, int& ea, int& eb,
+ const int nvp)
+{
+ const int na = countPolyVerts(pa, nvp);
+ const int nb = countPolyVerts(pb, nvp);
+
+ // If the merged polygon would be too big, do not merge.
+ if (na+nb-2 > nvp)
+ return -1;
+
+ // Check if the polygons share an edge.
+ ea = -1;
+ eb = -1;
+
+ for (int i = 0; i < na; ++i)
+ {
+ unsigned short va0 = pa[i];
+ unsigned short va1 = pa[(i+1) % na];
+ if (va0 > va1)
+ rcSwap(va0, va1);
+ for (int j = 0; j < nb; ++j)
+ {
+ unsigned short vb0 = pb[j];
+ unsigned short vb1 = pb[(j+1) % nb];
+ if (vb0 > vb1)
+ rcSwap(vb0, vb1);
+ if (va0 == vb0 && va1 == vb1)
+ {
+ ea = i;
+ eb = j;
+ break;
+ }
+ }
+ }
+
+ // No common edge, cannot merge.
+ if (ea == -1 || eb == -1)
+ return -1;
+
+ // Check to see if the merged polygon would be convex.
+ unsigned short va, vb, vc;
+
+ va = pa[(ea+na-1) % na];
+ vb = pa[ea];
+ vc = pb[(eb+2) % nb];
+ if (!uleft(&verts[va*3], &verts[vb*3], &verts[vc*3]))
+ return -1;
+
+ va = pb[(eb+nb-1) % nb];
+ vb = pb[eb];
+ vc = pa[(ea+2) % na];
+ if (!uleft(&verts[va*3], &verts[vb*3], &verts[vc*3]))
+ return -1;
+
+ va = pa[ea];
+ vb = pa[(ea+1)%na];
+
+ int dx = (int)verts[va*3+0] - (int)verts[vb*3+0];
+ int dy = (int)verts[va*3+2] - (int)verts[vb*3+2];
+
+ return dx*dx + dy*dy;
+}
+
+static void mergePolys(unsigned short* pa, unsigned short* pb,
+ const unsigned short* verts, int ea, int eb,
+ unsigned short* tmp, const int nvp)
+{
+ const int na = countPolyVerts(pa, nvp);
+ const int nb = countPolyVerts(pb, nvp);
+
+ // Merge polygons.
+ memset(tmp, 0xff, sizeof(unsigned short)*nvp);
+ int n = 0;
+ // Add pa
+ for (int i = 0; i < na-1; ++i)
+ tmp[n++] = pa[(ea+1+i) % na];
+ // Add pb
+ for (int i = 0; i < nb-1; ++i)
+ tmp[n++] = pb[(eb+1+i) % nb];
+
+ memcpy(pa, tmp, sizeof(unsigned short)*nvp);
+}
+
+static void pushFront(int v, int* arr, int& an)
+{
+ an++;
+ for (int i = an-1; i > 0; --i) arr[i] = arr[i-1];
+ arr[0] = v;
+}
+
+static void pushBack(int v, int* arr, int& an)
+{
+ arr[an] = v;
+ an++;
+}
+
+static bool removeVertex(rcPolyMesh& mesh, const unsigned short rem, const int maxTris)
+{
+ unsigned short* tmpPoly;
+ int ntris;
+
+ static const int nvp = mesh.nvp;
+
+ int* edges = 0;
+ int nedges = 0;
+ int* hole = 0;
+ int nhole = 0;
+ int* hreg = 0;
+ int nhreg = 0;
+ int* tris = 0;
+ int* tverts = 0;
+ int* thole = 0;
+ unsigned short* polys = 0;
+ unsigned short* pregs = 0;
+ int npolys = 0;
+
+ // Count number of polygons to remove.
+ int nrem = 0;
+ for (int i = 0; i < mesh.npolys; ++i)
+ {
+ unsigned short* p = &mesh.polys[i*nvp*2];
+ for (int j = 0; j < nvp; ++j)
+ if (p[j] == rem) { nrem++; break; }
+ }
+
+ edges = new int[nrem*nvp*3];
+ if (!edges)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'edges' (%d).", nrem*nvp*3);
+ goto failure;
+ }
+
+ hole = new int[nrem*nvp];
+ if (!hole)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'hole' (%d).", nrem*nvp);
+ goto failure;
+ }
+ hreg = new int[nrem*nvp];
+ if (!hreg)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'hreg' (%d).", nrem*nvp);
+ goto failure;
+ }
+
+
+ for (int i = 0; i < mesh.npolys; ++i)
+ {
+ unsigned short* p = &mesh.polys[i*nvp*2];
+ const int nv = countPolyVerts(p, nvp);
+ bool hasRem = false;
+ for (int j = 0; j < nv; ++j)
+ if (p[j] == rem) hasRem = true;
+ if (hasRem)
+ {
+ // Collect edges which does not touch the removed vertex.
+ for (int j = 0, k = nv-1; j < nv; k = j++)
+ {
+ if (p[j] != rem && p[k] != rem)
+ {
+ int* e = &edges[nedges*3];
+ e[0] = p[k];
+ e[1] = p[j];
+ e[2] = mesh.regs[i];
+ nedges++;
+ }
+ }
+ // Remove the polygon.
+ unsigned short* p2 = &mesh.polys[(mesh.npolys-1)*nvp*2];
+ memcpy(p,p2,sizeof(unsigned short)*nvp);
+ mesh.regs[i] = mesh.regs[mesh.npolys-1];
+ mesh.npolys--;
+ --i;
+ }
+ }
+
+ // Remove vertex.
+ for (int i = (int)rem; i < mesh.nverts; ++i)
+ {
+ mesh.verts[i*3+0] = mesh.verts[(i+1)*3+0];
+ mesh.verts[i*3+1] = mesh.verts[(i+1)*3+1];
+ mesh.verts[i*3+2] = mesh.verts[(i+1)*3+2];
+ }
+ mesh.nverts--;
+
+ // Adjust indices to match the removed vertex layout.
+ for (int i = 0; i < mesh.npolys; ++i)
+ {
+ unsigned short* p = &mesh.polys[i*nvp*2];
+ const int nv = countPolyVerts(p, nvp);
+ for (int j = 0; j < nv; ++j)
+ if (p[j] > rem) p[j]--;
+ }
+ for (int i = 0; i < nedges; ++i)
+ {
+ if (edges[i*3+0] > rem) edges[i*3+0]--;
+ if (edges[i*3+1] > rem) edges[i*3+1]--;
+ }
+
+ if (nedges == 0)
+ return true;
+
+ hole[nhole] = edges[0];
+ hreg[nhole] = edges[2];
+ nhole++;
+
+ while (nedges)
+ {
+ bool match = false;
+
+ for (int i = 0; i < nedges; ++i)
+ {
+ const int ea = edges[i*3+0];
+ const int eb = edges[i*3+1];
+ const int r = edges[i*3+2];
+ bool add = false;
+ if (hole[0] == eb)
+ {
+ pushFront(ea, hole, nhole);
+ pushFront(r, hreg, nhreg);
+ add = true;
+ }
+ else if (hole[nhole-1] == ea)
+ {
+ pushBack(eb, hole, nhole);
+ pushBack(r, hreg, nhreg);
+ add = true;
+ }
+ if (add)
+ {
+ // Remove edge.
+ edges[i*3+0] = edges[(nedges-1)*3+0];
+ edges[i*3+1] = edges[(nedges-1)*3+1];
+ edges[i*3+2] = edges[(nedges-1)*3+2];
+ --nedges;
+ match = true;
+ --i;
+ }
+ }
+
+ if (!match)
+ break;
+ }
+
+ tris = new int[nhole*3];
+ if (!tris)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'tris' (%d).", nhole*3);
+ goto failure;
+ }
+
+ tverts = new int[nhole*4];
+ if (!tverts)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'tverts' (%d).", nhole*4);
+ goto failure;
+ }
+
+ thole = new int[nhole];
+ if (!tverts)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'thole' (%d).", nhole);
+ goto failure;
+ }
+
+ // Generate temp vertex array for triangulation.
+ for (int i = 0; i < nhole; ++i)
+ {
+ const int pi = hole[i];
+ tverts[i*4+0] = mesh.verts[pi*3+0];
+ tverts[i*4+1] = mesh.verts[pi*3+1];
+ tverts[i*4+2] = mesh.verts[pi*3+2];
+ tverts[i*4+3] = 0;
+ thole[i] = i;
+ }
+
+ // Triangulate the hole.
+ ntris = triangulate(nhole, &tverts[0], &thole[0], tris);
+
+ // Merge the hole triangles back to polygons.
+ polys = new unsigned short[(ntris+1)*nvp];
+ if (!polys)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'polys' (%d).", (ntris+1)*nvp);
+ goto failure;
+ }
+ pregs = new unsigned short[ntris];
+ if (!pregs)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'pregs' (%d).", ntris);
+ goto failure;
+ }
+
+ tmpPoly = &polys[ntris*nvp];
+
+ // Build initial polygons.
+ memset(polys, 0xff, ntris*nvp*sizeof(unsigned short));
+ for (int j = 0; j < ntris; ++j)
+ {
+ int* t = &tris[j*3];
+ if (t[0] != t[1] && t[0] != t[2] && t[1] != t[2])
+ {
+ polys[npolys*nvp+0] = (unsigned short)hole[t[0]];
+ polys[npolys*nvp+1] = (unsigned short)hole[t[1]];
+ polys[npolys*nvp+2] = (unsigned short)hole[t[2]];
+ pregs[npolys] = hreg[t[0]];
+ npolys++;
+ }
+ }
+ if (!npolys)
+ return true;
+
+ // Merge polygons.
+ if (nvp > 3)
+ {
+ while (true)
+ {
+ // Find best polygons to merge.
+ int bestMergeVal = 0;
+ int bestPa, bestPb, bestEa, bestEb;
+
+ for (int j = 0; j < npolys-1; ++j)
+ {
+ unsigned short* pj = &polys[j*nvp];
+ for (int k = j+1; k < npolys; ++k)
+ {
+ unsigned short* pk = &polys[k*nvp];
+ int ea, eb;
+ int v = getPolyMergeValue(pj, pk, mesh.verts, ea, eb, nvp);
+ if (v > bestMergeVal)
+ {
+ bestMergeVal = v;
+ bestPa = j;
+ bestPb = k;
+ bestEa = ea;
+ bestEb = eb;
+ }
+ }
+ }
+
+ if (bestMergeVal > 0)
+ {
+ // Found best, merge.
+ unsigned short* pa = &polys[bestPa*nvp];
+ unsigned short* pb = &polys[bestPb*nvp];
+ mergePolys(pa, pb, mesh.verts, bestEa, bestEb, tmpPoly, nvp);
+ memcpy(pb, &polys[(npolys-1)*nvp], sizeof(unsigned short)*nvp);
+ pregs[bestPb] = pregs[npolys-1];
+ npolys--;
+ }
+ else
+ {
+ // Could not merge any polygons, stop.
+ break;
+ }
+ }
+ }
+
+ // Store polygons.
+ for (int i = 0; i < npolys; ++i)
+ {
+ if (mesh.npolys >= maxTris) break;
+ unsigned short* p = &mesh.polys[mesh.npolys*nvp*2];
+ memset(p,0xff,sizeof(unsigned short)*nvp*2);
+ for (int j = 0; j < nvp; ++j)
+ p[j] = polys[i*nvp+j];
+ mesh.regs[mesh.npolys] = pregs[i];
+ mesh.npolys++;
+ }
+
+ delete [] edges;
+ delete [] hole;
+ delete [] hreg;
+ delete [] tris;
+ delete [] thole;
+ delete [] tverts;
+ delete [] polys;
+ delete [] pregs;
+
+ return true;
+
+failure:
+ delete [] edges;
+ delete [] hole;
+ delete [] hreg;
+ delete [] tris;
+ delete [] thole;
+ delete [] tverts;
+ delete [] polys;
+ delete [] pregs;
+
+ return false;
+}
+
+
+bool rcBuildPolyMesh(rcContourSet& cset, int nvp, rcPolyMesh& mesh)
+{
+ unsigned short* tmpPoly;
+ rcTimeVal startTime = rcGetPerformanceTimer();
+ rcTimeVal endTime;
+
+ vcopy(mesh.bmin, cset.bmin);
+ vcopy(mesh.bmax, cset.bmax);
+ mesh.cs = cset.cs;
+ mesh.ch = cset.ch;
+
+ int maxVertices = 0;
+ int maxTris = 0;
+ int maxVertsPerCont = 0;
+ for (int i = 0; i < cset.nconts; ++i)
+ {
+ maxVertices += cset.conts[i].nverts;
+ maxTris += cset.conts[i].nverts - 2;
+ maxVertsPerCont = rcMax(maxVertsPerCont, cset.conts[i].nverts);
+ }
+
+ if (maxVertices >= 0xfffe)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Too many vertices %d.", maxVertices);
+ return false;
+ }
+
+ unsigned char* vflags = 0;
+ int* nextVert = 0;
+ int* firstVert = 0;
+ int* indices = 0;
+ int* tris = 0;
+ unsigned short* polys = 0;
+
+ vflags = new unsigned char[maxVertices];
+ if (!vflags)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'mesh.verts' (%d).", maxVertices);
+ goto failure;
+ }
+ memset(vflags, 0, maxVertices);
+
+ mesh.verts = new unsigned short[maxVertices*3];
+ if (!mesh.verts)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'mesh.verts' (%d).", maxVertices);
+ goto failure;
+ }
+ mesh.polys = new unsigned short[maxTris*nvp*2];
+ if (!mesh.polys)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'mesh.polys' (%d).", maxTris*nvp*2);
+ goto failure;
+ }
+ mesh.regs = new unsigned short[maxTris];
+ if (!mesh.regs)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'mesh.regs' (%d).", maxTris);
+ goto failure;
+ }
+ mesh.nverts = 0;
+ mesh.npolys = 0;
+ mesh.nvp = nvp;
+
+ memset(mesh.verts, 0, sizeof(unsigned short)*maxVertices*3);
+ memset(mesh.polys, 0xff, sizeof(unsigned short)*maxTris*nvp*2);
+ memset(mesh.regs, 0, sizeof(unsigned short)*maxTris);
+
+ nextVert = new int[maxVertices];
+ if (!nextVert)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'nextVert' (%d).", maxVertices);
+ goto failure;
+ }
+ memset(nextVert, 0, sizeof(int)*maxVertices);
+
+ firstVert = new int[VERTEX_BUCKET_COUNT];
+ if (!firstVert)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'firstVert' (%d).", VERTEX_BUCKET_COUNT);
+ goto failure;
+ }
+ for (int i = 0; i < VERTEX_BUCKET_COUNT; ++i)
+ firstVert[i] = -1;
+
+ indices = new int[maxVertsPerCont];
+ if (!indices)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'indices' (%d).", maxVertsPerCont);
+ goto failure;
+ }
+ tris = new int[maxVertsPerCont*3];
+ if (!tris)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'tris' (%d).", maxVertsPerCont*3);
+ goto failure;
+ }
+ polys = new unsigned short[(maxVertsPerCont+1)*nvp];
+ if (!polys)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'polys' (%d).", maxVertsPerCont*nvp);
+ goto failure;
+ }
+ tmpPoly = &polys[maxVertsPerCont*nvp];
+
+ for (int i = 0; i < cset.nconts; ++i)
+ {
+ rcContour& cont = cset.conts[i];
+
+ // Skip empty contours.
+ if (cont.nverts < 3)
+ continue;
+
+ // Triangulate contour
+ for (int j = 0; j < cont.nverts; ++j)
+ indices[j] = j;
+
+ int ntris = triangulate(cont.nverts, cont.verts, &indices[0], &tris[0]);
+ if (ntris <= 0)
+ {
+ // Bad triangulation, should not happen.
+/* for (int k = 0; k < cont.nverts; ++k)
+ {
+ const int* v = &cont.verts[k*4];
+ printf("\t\t%d,%d,%d,%d,\n", v[0], v[1], v[2], v[3]);
+ if (nBadPos < 100)
+ {
+ badPos[nBadPos*3+0] = v[0];
+ badPos[nBadPos*3+1] = v[1];
+ badPos[nBadPos*3+2] = v[2];
+ nBadPos++;
+ }
+ }*/
+ ntris = -ntris;
+ }
+ // Add and merge vertices.
+ for (int j = 0; j < cont.nverts; ++j)
+ {
+ const int* v = &cont.verts[j*4];
+ indices[j] = addVertex((unsigned short)v[0], (unsigned short)v[1], (unsigned short)v[2],
+ mesh.verts, firstVert, nextVert, mesh.nverts);
+ if (v[3] & RC_BORDER_VERTEX)
+ {
+ // This vertex should be removed.
+ vflags[indices[j]] = 1;
+ }
+ }
+
+ // Build initial polygons.
+ int npolys = 0;
+ memset(polys, 0xff, maxVertsPerCont*nvp*sizeof(unsigned short));
+ for (int j = 0; j < ntris; ++j)
+ {
+ int* t = &tris[j*3];
+ if (t[0] != t[1] && t[0] != t[2] && t[1] != t[2])
+ {
+ polys[npolys*nvp+0] = (unsigned short)indices[t[0]];
+ polys[npolys*nvp+1] = (unsigned short)indices[t[1]];
+ polys[npolys*nvp+2] = (unsigned short)indices[t[2]];
+ npolys++;
+ }
+ }
+ if (!npolys)
+ continue;
+
+ // Merge polygons.
+ if (nvp > 3)
+ {
+ while (true)
+ {
+ // Find best polygons to merge.
+ int bestMergeVal = 0;
+ int bestPa, bestPb, bestEa, bestEb;
+
+ for (int j = 0; j < npolys-1; ++j)
+ {
+ unsigned short* pj = &polys[j*nvp];
+ for (int k = j+1; k < npolys; ++k)
+ {
+ unsigned short* pk = &polys[k*nvp];
+ int ea, eb;
+ int v = getPolyMergeValue(pj, pk, mesh.verts, ea, eb, nvp);
+ if (v > bestMergeVal)
+ {
+ bestMergeVal = v;
+ bestPa = j;
+ bestPb = k;
+ bestEa = ea;
+ bestEb = eb;
+ }
+ }
+ }
+
+ if (bestMergeVal > 0)
+ {
+ // Found best, merge.
+ unsigned short* pa = &polys[bestPa*nvp];
+ unsigned short* pb = &polys[bestPb*nvp];
+ mergePolys(pa, pb, mesh.verts, bestEa, bestEb, tmpPoly, nvp);
+ memcpy(pb, &polys[(npolys-1)*nvp], sizeof(unsigned short)*nvp);
+ npolys--;
+ }
+ else
+ {
+ // Could not merge any polygons, stop.
+ break;
+ }
+ }
+ }
+
+
+ // Store polygons.
+ for (int j = 0; j < npolys; ++j)
+ {
+ unsigned short* p = &mesh.polys[mesh.npolys*nvp*2];
+ unsigned short* q = &polys[j*nvp];
+ for (int k = 0; k < nvp; ++k)
+ p[k] = q[k];
+ mesh.regs[mesh.npolys] = cont.reg;
+ mesh.npolys++;
+ }
+ }
+
+
+ // Remove edge vertices.
+ for (int i = 0; i < mesh.nverts; ++i)
+ {
+ if (vflags[i])
+ {
+ if (!removeVertex(mesh, i, maxTris))
+ goto failure;
+ for (int j = i; j < mesh.nverts-1; ++j)
+ vflags[j] = vflags[j+1];
+ --i;
+ }
+ }
+
+ delete [] vflags;
+ delete [] firstVert;
+ delete [] nextVert;
+ delete [] indices;
+ delete [] tris;
+
+ // Calculate adjacency.
+ if (!buildMeshAdjacency(mesh.polys, mesh.npolys, mesh.nverts, nvp))
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Adjacency failed.");
+ return false;
+ }
+
+ endTime = rcGetPerformanceTimer();
+
+// if (rcGetLog())
+// rcGetLog()->log(RC_LOG_PROGRESS, "Build polymesh: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f);
+ if (rcGetBuildTimes())
+ rcGetBuildTimes()->buildPolymesh += rcGetDeltaTimeUsec(startTime, endTime);
+
+ return true;
+
+failure:
+ delete [] vflags;
+ delete [] tmpPoly;
+ delete [] firstVert;
+ delete [] nextVert;
+ delete [] indices;
+ delete [] tris;
+
+ return false;
+}
+
+bool rcMergePolyMeshes(rcPolyMesh** meshes, const int nmeshes, rcPolyMesh& mesh)
+{
+ if (!nmeshes || !meshes)
+ return true;
+
+ rcTimeVal startTime = rcGetPerformanceTimer();
+ rcTimeVal endTime;
+
+ int* nextVert = 0;
+ int* firstVert = 0;
+ unsigned short* vremap = 0;
+
+ mesh.nvp = meshes[0]->nvp;
+ mesh.cs = meshes[0]->cs;
+ mesh.ch = meshes[0]->ch;
+ vcopy(mesh.bmin, meshes[0]->bmin);
+ vcopy(mesh.bmax, meshes[0]->bmax);
+
+ int maxVerts = 0;
+ int maxPolys = 0;
+ int maxVertsPerMesh = 0;
+ for (int i = 0; i < nmeshes; ++i)
+ {
+ vmin(mesh.bmin, meshes[i]->bmin);
+ vmax(mesh.bmax, meshes[i]->bmax);
+ maxVertsPerMesh = rcMax(maxVertsPerMesh, meshes[i]->nverts);
+ maxVerts += meshes[i]->nverts;
+ maxPolys += meshes[i]->npolys;
+ }
+
+ mesh.nverts = 0;
+ mesh.verts = new unsigned short[maxVerts*3];
+ if (!mesh.verts)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Out of memory 'mesh.verts' (%d).", maxVerts*3);
+ return false;
+ }
+
+ mesh.npolys = 0;
+ mesh.polys = new unsigned short[maxPolys*2*mesh.nvp];
+ if (!mesh.polys)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Out of memory 'mesh.polys' (%d).", maxPolys*2*mesh.nvp);
+ return false;
+ }
+ memset(mesh.polys, 0xff, sizeof(unsigned short)*maxPolys*2*mesh.nvp);
+
+ mesh.regs = new unsigned short[maxPolys];
+ if (!mesh.regs)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Out of memory 'mesh.regs' (%d).", maxPolys);
+ return false;
+ }
+ memset(mesh.regs, 0, sizeof(unsigned short)*maxPolys);
+
+ nextVert = new int[maxVerts];
+ if (!nextVert)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Out of memory 'nextVert' (%d).", maxVerts);
+ goto failure;
+ }
+ memset(nextVert, 0, sizeof(int)*maxVerts);
+
+ firstVert = new int[VERTEX_BUCKET_COUNT];
+ if (!firstVert)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Out of memory 'firstVert' (%d).", VERTEX_BUCKET_COUNT);
+ goto failure;
+ }
+ for (int i = 0; i < VERTEX_BUCKET_COUNT; ++i)
+ firstVert[i] = -1;
+
+ vremap = new unsigned short[maxVertsPerMesh];
+ if (!vremap)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Out of memory 'vremap' (%d).", maxVertsPerMesh);
+ goto failure;
+ }
+ memset(nextVert, 0, sizeof(int)*maxVerts);
+
+ for (int i = 0; i < nmeshes; ++i)
+ {
+ const rcPolyMesh* pmesh = meshes[i];
+
+ const unsigned short ox = (unsigned short)floorf((pmesh->bmin[0]-mesh.bmin[0])/mesh.cs+0.5f);
+ const unsigned short oz = (unsigned short)floorf((pmesh->bmin[2]-mesh.bmin[2])/mesh.cs+0.5f);
+
+ for (int j = 0; j < pmesh->nverts; ++j)
+ {
+ unsigned short* v = &pmesh->verts[j*3];
+ vremap[j] = addVertex(v[0]+ox, v[1], v[2]+oz,
+ mesh.verts, firstVert, nextVert, mesh.nverts);
+ }
+
+ for (int j = 0; j < pmesh->npolys; ++j)
+ {
+ unsigned short* tgt = &mesh.polys[mesh.npolys*2*mesh.nvp];
+ unsigned short* src = &pmesh->polys[j*2*mesh.nvp];
+ mesh.regs[mesh.npolys] = pmesh->regs[j];
+ mesh.npolys++;
+ for (int k = 0; k < mesh.nvp; ++k)
+ {
+ if (src[k] == 0xffff) break;
+ tgt[k] = vremap[src[k]];
+ }
+ }
+ }
+
+ // Calculate adjacency.
+ if (!buildMeshAdjacency(mesh.polys, mesh.npolys, mesh.nverts, mesh.nvp))
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Adjacency failed.");
+ return false;
+ }
+
+
+ delete [] firstVert;
+ delete [] nextVert;
+ delete [] vremap;
+
+ endTime = rcGetPerformanceTimer();
+
+ if (rcGetBuildTimes())
+ rcGetBuildTimes()->mergePolyMesh += rcGetDeltaTimeUsec(startTime, endTime);
+
+ return true;
+
+failure:
+ delete [] firstVert;
+ delete [] nextVert;
+ delete [] vremap;
+
+ return false;
+}
diff --git a/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp b/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp
new file mode 100644
index 00000000000..f1d2113a8c7
--- /dev/null
+++ b/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp
@@ -0,0 +1,1010 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#include <float.h>
+#define _USE_MATH_DEFINES
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "Recast.h"
+#include "RecastLog.h"
+#include "RecastTimer.h"
+
+
+struct rcHeightPatch
+{
+ inline rcHeightPatch() : data(0) {}
+ inline ~rcHeightPatch() { delete [] data; }
+ unsigned short* data;
+ int xmin, ymin, width, height;
+};
+
+
+static int circumCircle(const float xp, const float yp,
+ const float x1, const float y1,
+ const float x2, const float y2,
+ const float x3, const float y3,
+ float& xc, float& yc, float& rsqr)
+{
+ static const float EPSILON = 1e-6f;
+
+ const float fabsy1y2 = rcAbs(y1-y2);
+ const float fabsy2y3 = rcAbs(y2-y3);
+
+ /* Check for coincident points */
+ if (fabsy1y2 < EPSILON && fabsy2y3 < EPSILON)
+ return 0;
+
+ if (fabsy1y2 < EPSILON)
+ {
+ const float m2 = - (x3-x2) / (y3-y2);
+ const float mx2 = (x2 + x3) / 2.0f;
+ const float my2 = (y2 + y3) / 2.0f;
+ xc = (x2 + x1) / 2.0f;
+ yc = m2 * (xc - mx2) + my2;
+ }
+ else if (fabsy2y3 < EPSILON)
+ {
+ const float m1 = - (x2-x1) / (y2-y1);
+ const float mx1 = (x1 + x2) / 2.0f;
+ const float my1 = (y1 + y2) / 2.0f;
+ xc = (x3 + x2) / 2.0f;
+ yc = m1 * (xc - mx1) + my1;
+ }
+ else
+ {
+ const float m1 = - (x2-x1) / (y2-y1);
+ const float m2 = - (x3-x2) / (y3-y2);
+ const float mx1 = (x1 + x2) / 2.0f;
+ const float mx2 = (x2 + x3) / 2.0f;
+ const float my1 = (y1 + y2) / 2.0f;
+ const float my2 = (y2 + y3) / 2.0f;
+ xc = (m1 * mx1 - m2 * mx2 + my2 - my1) / (m1 - m2);
+ if (fabsy1y2 > fabsy2y3)
+ yc = m1 * (xc - mx1) + my1;
+ else
+ yc = m2 * (xc - mx2) + my2;
+ }
+
+ float dx,dy;
+
+ dx = x2 - xc;
+ dy = y2 - yc;
+ rsqr = dx*dx + dy*dy;
+
+ dx = xp - xc;
+ dy = yp - yc;
+ const float drsqr = dx*dx + dy*dy;
+
+ return (drsqr <= rsqr) ? 1 : 0;
+}
+#ifdef FREE_WINDOWS
+static float *_mingw_verts;
+static int ptcmp(const void *v1, const void *v2)
+{
+ const float* p1 = &_mingw_verts[(*(const int*)v1)*3];
+ const float* p2 = &_mingw_verts[(*(const int*)v2)*3];
+ if (p1[0] < p2[0])
+ return -1;
+ else if (p1[0] > p2[0])
+ return 1;
+ else
+ return 0;
+}
+#else
+#if defined(_MSC_VER)
+static int ptcmp(void* up, const void *v1, const void *v2)
+#elif defined(__APPLE__) || defined(__FreeBSD__)
+static int ptcmp(void* up, const void *v1, const void *v2)
+#else
+static int ptcmp(const void *v1, const void *v2, void* up)
+#endif
+{
+ const float* verts = (const float*)up;
+ const float* p1 = &verts[(*(const int*)v1)*3];
+ const float* p2 = &verts[(*(const int*)v2)*3];
+ if (p1[0] < p2[0])
+ return -1;
+ else if (p1[0] > p2[0])
+ return 1;
+ else
+ return 0;
+}
+#endif
+
+// Based on Paul Bourke's triangulate.c
+// http://astronomy.swin.edu.au/~pbourke/terrain/triangulate/triangulate.c
+static void delaunay(const int nv, float *verts, rcIntArray& idx, rcIntArray& tris, rcIntArray& edges)
+{
+ // Sort vertices
+ idx.resize(nv);
+ for (int i = 0; i < nv; ++i)
+ idx[i] = i;
+#if defined(_MSC_VER)
+ qsort_s(&idx[0], idx.size(), sizeof(int), ptcmp, verts);
+#elif defined(__APPLE__) || defined(__FreeBSD__)
+ qsort_r(&idx[0], idx.size(), sizeof(int), verts, ptcmp);
+#elif defined(FREE_WINDOWS)
+ _mingw_verts = verts;
+ qsort(&idx[0], idx.size(), sizeof(int), ptcmp);
+#else
+ qsort_r(&idx[0], idx.size(), sizeof(int), ptcmp, verts);
+#endif
+
+ // Find the maximum and minimum vertex bounds.
+ // This is to allow calculation of the bounding triangle
+ float xmin = verts[0];
+ float ymin = verts[2];
+ float xmax = xmin;
+ float ymax = ymin;
+ for (int i = 1; i < nv; ++i)
+ {
+ xmin = rcMin(xmin, verts[i*3+0]);
+ xmax = rcMax(xmax, verts[i*3+0]);
+ ymin = rcMin(ymin, verts[i*3+2]);
+ ymax = rcMax(ymax, verts[i*3+2]);
+ }
+ float dx = xmax - xmin;
+ float dy = ymax - ymin;
+ float dmax = (dx > dy) ? dx : dy;
+ float xmid = (xmax + xmin) / 2.0f;
+ float ymid = (ymax + ymin) / 2.0f;
+
+ // Set up the supertriangle
+ // This is a triangle which encompasses all the sample points.
+ // The supertriangle coordinates are added to the end of the
+ // vertex list. The supertriangle is the first triangle in
+ // the triangle list.
+ float sv[3*3];
+
+ sv[0] = xmid - 20 * dmax;
+ sv[1] = 0;
+ sv[2] = ymid - dmax;
+
+ sv[3] = xmid;
+ sv[4] = 0;
+ sv[5] = ymid + 20 * dmax;
+
+ sv[6] = xmid + 20 * dmax;
+ sv[7] = 0;
+ sv[8] = ymid - dmax;
+
+ tris.push(-3);
+ tris.push(-2);
+ tris.push(-1);
+ tris.push(0); // not completed
+
+ for (int i = 0; i < nv; ++i)
+ {
+ const float xp = verts[idx[i]*3+0];
+ const float yp = verts[idx[i]*3+2];
+
+ edges.resize(0);
+
+ // Set up the edge buffer.
+ // If the point (xp,yp) lies inside the circumcircle then the
+ // three edges of that triangle are added to the edge buffer
+ // and that triangle is removed.
+ for (int j = 0; j < tris.size()/4; ++j)
+ {
+ int* t = &tris[j*4];
+ if (t[3]) // completed?
+ continue;
+ const float* v1 = t[0] < 0 ? &sv[(t[0]+3)*3] : &verts[idx[t[0]]*3];
+ const float* v2 = t[1] < 0 ? &sv[(t[1]+3)*3] : &verts[idx[t[1]]*3];
+ const float* v3 = t[2] < 0 ? &sv[(t[2]+3)*3] : &verts[idx[t[2]]*3];
+ float xc,yc,rsqr;
+ int inside = circumCircle(xp,yp, v1[0],v1[2], v2[0],v2[2], v3[0],v3[2], xc,yc,rsqr);
+ if (xc < xp && rcSqr(xp-xc) > rsqr)
+ t[3] = 1;
+ if (inside)
+ {
+ // Collect triangle edges.
+ edges.push(t[0]);
+ edges.push(t[1]);
+ edges.push(t[1]);
+ edges.push(t[2]);
+ edges.push(t[2]);
+ edges.push(t[0]);
+ // Remove triangle j.
+ t[0] = tris[tris.size()-4];
+ t[1] = tris[tris.size()-3];
+ t[2] = tris[tris.size()-2];
+ t[3] = tris[tris.size()-1];
+ tris.resize(tris.size()-4);
+ j--;
+ }
+ }
+
+ // Remove duplicate edges.
+ const int ne = edges.size()/2;
+ for (int j = 0; j < ne-1; ++j)
+ {
+ for (int k = j+1; k < ne; ++k)
+ {
+ // Dupe?, make null.
+ if ((edges[j*2+0] == edges[k*2+1]) && (edges[j*2+1] == edges[k*2+0]))
+ {
+ edges[j*2+0] = 0;
+ edges[j*2+1] = 0;
+ edges[k*2+0] = 0;
+ edges[k*2+1] = 0;
+ }
+ }
+ }
+
+ // Form new triangles for the current point
+ // Skipping over any null.
+ // All edges are arranged in clockwise order.
+ for (int j = 0; j < ne; ++j)
+ {
+ if (edges[j*2+0] == edges[j*2+1]) continue;
+ tris.push(edges[j*2+0]);
+ tris.push(edges[j*2+1]);
+ tris.push(i);
+ tris.push(0); // not completed
+ }
+ }
+
+ // Remove triangles with supertriangle vertices
+ // These are triangles which have a vertex number greater than nv
+ for (int i = 0; i < tris.size()/4; ++i)
+ {
+ int* t = &tris[i*4];
+ if (t[0] < 0 || t[1] < 0 || t[2] < 0)
+ {
+ t[0] = tris[tris.size()-4];
+ t[1] = tris[tris.size()-3];
+ t[2] = tris[tris.size()-2];
+ t[3] = tris[tris.size()-1];
+ tris.resize(tris.size()-4);
+ i--;
+ }
+ }
+ // Triangle vertices are pointing to sorted vertices, remap indices.
+ for (int i = 0; i < tris.size(); ++i)
+ tris[i] = idx[tris[i]];
+}
+
+inline float vdot2(const float* a, const float* b)
+{
+ return a[0]*b[0] + a[2]*b[2];
+}
+
+static float distPtTri(const float* p, const float* a, const float* b, const float* c)
+{
+ float v0[3], v1[3], v2[3];
+ vsub(v0, c,a);
+ vsub(v1, b,a);
+ vsub(v2, p,a);
+
+ const float dot00 = vdot2(v0, v0);
+ const float dot01 = vdot2(v0, v1);
+ const float dot02 = vdot2(v0, v2);
+ const float dot11 = vdot2(v1, v1);
+ const float dot12 = vdot2(v1, v2);
+
+ // Compute barycentric coordinates
+ float invDenom = 1.0f / (dot00 * dot11 - dot01 * dot01);
+ float u = (dot11 * dot02 - dot01 * dot12) * invDenom;
+ float v = (dot00 * dot12 - dot01 * dot02) * invDenom;
+
+ // If point lies inside the triangle, return interpolated y-coord.
+ static const float EPS = 1e-4f;
+ if (u >= -EPS && v >= -EPS && (u+v) <= 1+EPS)
+ {
+ float y = a[1] + v0[1]*u + v1[1]*v;
+ return fabsf(y-p[1]);
+ }
+ return FLT_MAX;
+}
+
+static float distancePtSeg(const float* pt, const float* p, const float* q)
+{
+ float pqx = q[0] - p[0];
+ float pqy = q[1] - p[1];
+ float pqz = q[2] - p[2];
+ float dx = pt[0] - p[0];
+ float dy = pt[1] - p[1];
+ float dz = pt[2] - p[2];
+ float d = pqx*pqx + pqy*pqy + pqz*pqz;
+ float t = pqx*dx + pqy*dy + pqz*dz;
+ if (d > 0)
+ t /= d;
+ if (t < 0)
+ t = 0;
+ else if (t > 1)
+ t = 1;
+
+ dx = p[0] + t*pqx - pt[0];
+ dy = p[1] + t*pqy - pt[1];
+ dz = p[2] + t*pqz - pt[2];
+
+ return dx*dx + dy*dy + dz*dz;
+}
+
+static float distancePtSeg2d(const float* pt, const float* p, const float* q)
+{
+ float pqx = q[0] - p[0];
+ float pqz = q[2] - p[2];
+ float dx = pt[0] - p[0];
+ float dz = pt[2] - p[2];
+ float d = pqx*pqx + pqz*pqz;
+ float t = pqx*dx + pqz*dz;
+ if (d > 0)
+ t /= d;
+ if (t < 0)
+ t = 0;
+ else if (t > 1)
+ t = 1;
+
+ dx = p[0] + t*pqx - pt[0];
+ dz = p[2] + t*pqz - pt[2];
+
+ return dx*dx + dz*dz;
+}
+
+static float distToTriMesh(const float* p, const float* verts, int nverts, const int* tris, int ntris)
+{
+ float dmin = FLT_MAX;
+ for (int i = 0; i < ntris; ++i)
+ {
+ const float* va = &verts[tris[i*4+0]*3];
+ const float* vb = &verts[tris[i*4+1]*3];
+ const float* vc = &verts[tris[i*4+2]*3];
+ float d = distPtTri(p, va,vb,vc);
+ if (d < dmin)
+ dmin = d;
+ }
+ if (dmin == FLT_MAX) return -1;
+ return dmin;
+}
+
+static float distToPoly(int nvert, const float* verts, const float* p)
+{
+
+ float dmin = FLT_MAX;
+ int i, j, c = 0;
+ for (i = 0, j = nvert-1; i < nvert; j = i++)
+ {
+ const float* vi = &verts[i*3];
+ const float* vj = &verts[j*3];
+ if (((vi[2] > p[2]) != (vj[2] > p[2])) &&
+ (p[0] < (vj[0]-vi[0]) * (p[2]-vi[2]) / (vj[2]-vi[2]) + vi[0]) )
+ c = !c;
+ dmin = rcMin(dmin, distancePtSeg2d(p, vj, vi));
+ }
+ return c ? -dmin : dmin;
+}
+
+
+static unsigned short getHeight(const float* pos, const float* bmin, const float ics, const rcHeightPatch& hp)
+{
+ int ix = (int)floorf((pos[0]-bmin[0])*ics + 0.01f);
+ int iz = (int)floorf((pos[2]-bmin[2])*ics + 0.01f);
+ ix = rcClamp(ix-hp.xmin, 0, hp.width);
+ iz = rcClamp(iz-hp.ymin, 0, hp.height);
+ unsigned short h = hp.data[ix+iz*hp.width];
+ return h;
+}
+
+static bool buildPolyDetail(const float* in, const int nin, unsigned short reg,
+ const float sampleDist, const float sampleMaxError,
+ const rcCompactHeightfield& chf, const rcHeightPatch& hp,
+ float* verts, int& nverts, rcIntArray& tris,
+ rcIntArray& edges, rcIntArray& idx, rcIntArray& samples)
+{
+ static const int MAX_VERTS = 256;
+ static const int MAX_EDGE = 64;
+ float edge[(MAX_EDGE+1)*3];
+
+ nverts = 0;
+
+ for (int i = 0; i < nin; ++i)
+ vcopy(&verts[i*3], &in[i*3]);
+ nverts = nin;
+
+ const float ics = 1.0f/chf.cs;
+
+ // Tesselate outlines.
+ // This is done in separate pass in order to ensure
+ // seamless height values across the ply boundaries.
+ if (sampleDist > 0)
+ {
+ for (int i = 0, j = nin-1; i < nin; j=i++)
+ {
+ const float* vj = &in[j*3];
+ const float* vi = &in[i*3];
+ // Make sure the segments are always handled in same order
+ // using lexological sort or else there will be seams.
+ if (fabsf(vj[0]-vi[0]) < 1e-6f)
+ {
+ if (vj[2] > vi[2])
+ rcSwap(vj,vi);
+ }
+ else
+ {
+ if (vj[0] > vi[0])
+ rcSwap(vj,vi);
+ }
+ // Create samples along the edge.
+ float dx = vi[0] - vj[0];
+ float dy = vi[1] - vj[1];
+ float dz = vi[2] - vj[2];
+ float d = sqrtf(dx*dx + dz*dz);
+ int nn = 1 + (int)floorf(d/sampleDist);
+ if (nn > MAX_EDGE) nn = MAX_EDGE;
+ if (nverts+nn >= MAX_VERTS)
+ nn = MAX_VERTS-1-nverts;
+ for (int k = 0; k <= nn; ++k)
+ {
+ float u = (float)k/(float)nn;
+ float* pos = &edge[k*3];
+ pos[0] = vj[0] + dx*u;
+ pos[1] = vj[1] + dy*u;
+ pos[2] = vj[2] + dz*u;
+ pos[1] = chf.bmin[1] + getHeight(pos, chf.bmin, ics, hp)*chf.ch;
+ }
+ // Simplify samples.
+ int idx[MAX_EDGE] = {0,nn};
+ int nidx = 2;
+ for (int k = 0; k < nidx-1; )
+ {
+ const int a = idx[k];
+ const int b = idx[k+1];
+ const float* va = &edge[a*3];
+ const float* vb = &edge[b*3];
+ // Find maximum deviation along the segment.
+ float maxd = 0;
+ int maxi = -1;
+ for (int m = a+1; m < b; ++m)
+ {
+ float d = distancePtSeg(&edge[m*3],va,vb);
+ if (d > maxd)
+ {
+ maxd = d;
+ maxi = m;
+ }
+ }
+ // If the max deviation is larger than accepted error,
+ // add new point, else continue to next segment.
+ if (maxi != -1 && maxd > rcSqr(sampleMaxError))
+ {
+ for (int m = nidx; m > k; --m)
+ idx[m] = idx[m-1];
+ idx[k+1] = maxi;
+ nidx++;
+ }
+ else
+ {
+ ++k;
+ }
+ }
+ // Add new vertices.
+ for (int k = 1; k < nidx-1; ++k)
+ {
+ vcopy(&verts[nverts*3], &edge[idx[k]*3]);
+ nverts++;
+ }
+ }
+ }
+
+ // Tesselate the base mesh.
+ edges.resize(0);
+ tris.resize(0);
+ idx.resize(0);
+ delaunay(nverts, verts, idx, tris, edges);
+
+ if (sampleDist > 0)
+ {
+ // Create sample locations in a grid.
+ float bmin[3], bmax[3];
+ vcopy(bmin, in);
+ vcopy(bmax, in);
+ for (int i = 1; i < nin; ++i)
+ {
+ vmin(bmin, &in[i*3]);
+ vmax(bmax, &in[i*3]);
+ }
+ int x0 = (int)floorf(bmin[0]/sampleDist);
+ int x1 = (int)ceilf(bmax[0]/sampleDist);
+ int z0 = (int)floorf(bmin[2]/sampleDist);
+ int z1 = (int)ceilf(bmax[2]/sampleDist);
+ samples.resize(0);
+ for (int z = z0; z < z1; ++z)
+ {
+ for (int x = x0; x < x1; ++x)
+ {
+ float pt[3];
+ pt[0] = x*sampleDist;
+ pt[2] = z*sampleDist;
+ // Make sure the samples are not too close to the edges.
+ if (distToPoly(nin,in,pt) > -sampleDist/2) continue;
+ samples.push(x);
+ samples.push(getHeight(pt, chf.bmin, ics, hp));
+ samples.push(z);
+ }
+ }
+
+ // Add the samples starting from the one that has the most
+ // error. The procedure stops when all samples are added
+ // or when the max error is within treshold.
+ const int nsamples = samples.size()/3;
+ for (int iter = 0; iter < nsamples; ++iter)
+ {
+ // Find sample with most error.
+ float bestpt[3];
+ float bestd = 0;
+ for (int i = 0; i < nsamples; ++i)
+ {
+ float pt[3];
+ pt[0] = samples[i*3+0]*sampleDist;
+ pt[1] = chf.bmin[1] + samples[i*3+1]*chf.ch;
+ pt[2] = samples[i*3+2]*sampleDist;
+ float d = distToTriMesh(pt, verts, nverts, &tris[0], tris.size()/4);
+ if (d < 0) continue; // did not hit the mesh.
+ if (d > bestd)
+ {
+ bestd = d;
+ vcopy(bestpt,pt);
+ }
+ }
+ // If the max error is within accepted threshold, stop tesselating.
+ if (bestd <= sampleMaxError)
+ break;
+
+ // Add the new sample point.
+ vcopy(&verts[nverts*3],bestpt);
+ nverts++;
+
+ // Create new triangulation.
+ // TODO: Incremental add instead of full rebuild.
+ edges.resize(0);
+ tris.resize(0);
+ idx.resize(0);
+ delaunay(nverts, verts, idx, tris, edges);
+
+ if (nverts >= MAX_VERTS)
+ break;
+ }
+ }
+
+ return true;
+}
+
+static void getHeightData(const rcCompactHeightfield& chf,
+ const unsigned short* poly, const int npoly,
+ const unsigned short* verts,
+ rcHeightPatch& hp, rcIntArray& stack)
+{
+ // Floodfill the heightfield to get 2D height data,
+ // starting at vertex locations as seeds.
+
+ memset(hp.data, 0xff, sizeof(unsigned short)*hp.width*hp.height);
+
+ stack.resize(0);
+
+ // Use poly vertices as seed points for the flood fill.
+ for (int j = 0; j < npoly; ++j)
+ {
+ const int ax = (int)verts[poly[j]*3+0];
+ const int ay = (int)verts[poly[j]*3+1];
+ const int az = (int)verts[poly[j]*3+2];
+ if (ax < hp.xmin || ax >= hp.xmin+hp.width ||
+ az < hp.ymin || az >= hp.ymin+hp.height)
+ continue;
+
+ const rcCompactCell& c = chf.cells[ax+az*chf.width];
+ int dmin = 0xffff;
+ int ai = -1;
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ const rcCompactSpan& s = chf.spans[i];
+ int d = rcAbs(ay - (int)s.y);
+ if (d < dmin)
+ {
+ ai = i;
+ dmin = d;
+ }
+ }
+ if (ai != -1)
+ {
+ stack.push(ax);
+ stack.push(az);
+ stack.push(ai);
+ }
+ }
+
+ while (stack.size() > 0)
+ {
+ int ci = stack.pop();
+ int cy = stack.pop();
+ int cx = stack.pop();
+
+ // Skip already visited locations.
+ int idx = cx-hp.xmin+(cy-hp.ymin)*hp.width;
+ if (hp.data[idx] != 0xffff)
+ continue;
+
+ const rcCompactSpan& cs = chf.spans[ci];
+ hp.data[idx] = cs.y;
+
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ if (rcGetCon(cs, dir) == 0xf) continue;
+
+ const int ax = cx + rcGetDirOffsetX(dir);
+ const int ay = cy + rcGetDirOffsetY(dir);
+
+ if (ax < hp.xmin || ax >= (hp.xmin+hp.width) ||
+ ay < hp.ymin || ay >= (hp.ymin+hp.height))
+ continue;
+
+ if (hp.data[ax-hp.xmin+(ay-hp.ymin)*hp.width] != 0xffff)
+ continue;
+
+ const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(cs, dir);
+
+ stack.push(ax);
+ stack.push(ay);
+ stack.push(ai);
+ }
+ }
+}
+
+static unsigned char getEdgeFlags(const float* va, const float* vb,
+ const float* vpoly, const int npoly)
+{
+ // Return true if edge (va,vb) is part of the polygon.
+ static const float thrSqr = rcSqr(0.001f);
+ for (int i = 0, j = npoly-1; i < npoly; j=i++)
+ {
+ if (distancePtSeg2d(va, &vpoly[j*3], &vpoly[i*3]) < thrSqr &&
+ distancePtSeg2d(vb, &vpoly[j*3], &vpoly[i*3]) < thrSqr)
+ return 1;
+ }
+ return 0;
+}
+
+static unsigned char getTriFlags(const float* va, const float* vb, const float* vc,
+ const float* vpoly, const int npoly)
+{
+ unsigned char flags = 0;
+ flags |= getEdgeFlags(va,vb,vpoly,npoly) << 0;
+ flags |= getEdgeFlags(vb,vc,vpoly,npoly) << 2;
+ flags |= getEdgeFlags(vc,va,vpoly,npoly) << 4;
+ return flags;
+}
+
+
+
+bool rcBuildPolyMeshDetail(const rcPolyMesh& mesh, const rcCompactHeightfield& chf,
+ const float sampleDist, const float sampleMaxError,
+ rcPolyMeshDetail& dmesh)
+{
+ if (mesh.nverts == 0 || mesh.npolys == 0)
+ return true;
+
+ rcTimeVal startTime = rcGetPerformanceTimer();
+ rcTimeVal endTime;
+
+ int vcap;
+ int tcap;
+
+ const int nvp = mesh.nvp;
+ const float cs = mesh.cs;
+ const float ch = mesh.ch;
+ const float* orig = mesh.bmin;
+
+ rcIntArray edges(64);
+ rcIntArray tris(512);
+ rcIntArray idx(512);
+ rcIntArray stack(512);
+ rcIntArray samples(512);
+ float verts[256*3];
+ float* poly = 0;
+ int* bounds = 0;
+ rcHeightPatch hp;
+ int nPolyVerts = 0;
+ int maxhw = 0, maxhh = 0;
+
+ bounds = new int[mesh.npolys*4];
+ if (!bounds)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'bounds' (%d).", mesh.npolys*4);
+ goto failure;
+ }
+ poly = new float[nvp*3];
+ if (!bounds)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'poly' (%d).", nvp*3);
+ goto failure;
+ }
+
+ // Find max size for a polygon area.
+ for (int i = 0; i < mesh.npolys; ++i)
+ {
+ const unsigned short* p = &mesh.polys[i*nvp*2];
+ int& xmin = bounds[i*4+0];
+ int& xmax = bounds[i*4+1];
+ int& ymin = bounds[i*4+2];
+ int& ymax = bounds[i*4+3];
+ xmin = chf.width;
+ xmax = 0;
+ ymin = chf.height;
+ ymax = 0;
+ for (int j = 0; j < nvp; ++j)
+ {
+ if(p[j] == 0xffff) break;
+ const unsigned short* v = &mesh.verts[p[j]*3];
+ xmin = rcMin(xmin, (int)v[0]);
+ xmax = rcMax(xmax, (int)v[0]);
+ ymin = rcMin(ymin, (int)v[2]);
+ ymax = rcMax(ymax, (int)v[2]);
+ nPolyVerts++;
+ }
+ xmin = rcMax(0,xmin-1);
+ xmax = rcMin(chf.width,xmax+1);
+ ymin = rcMax(0,ymin-1);
+ ymax = rcMin(chf.height,ymax+1);
+ if (xmin >= xmax || ymin >= ymax) continue;
+ maxhw = rcMax(maxhw, xmax-xmin);
+ maxhh = rcMax(maxhh, ymax-ymin);
+ }
+
+ hp.data = new unsigned short[maxhw*maxhh];
+ if (!hp.data)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'hp.data' (%d).", maxhw*maxhh);
+ goto failure;
+ }
+
+ dmesh.nmeshes = mesh.npolys;
+ dmesh.nverts = 0;
+ dmesh.ntris = 0;
+ dmesh.meshes = new unsigned short[dmesh.nmeshes*4];
+ if (!dmesh.meshes)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'dmesh.meshes' (%d).", dmesh.nmeshes*4);
+ goto failure;
+ }
+
+ vcap = nPolyVerts+nPolyVerts/2;
+ tcap = vcap*2;
+
+ dmesh.nverts = 0;
+ dmesh.verts = new float[vcap*3];
+ if (!dmesh.verts)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'dmesh.verts' (%d).", vcap*3);
+ goto failure;
+ }
+ dmesh.ntris = 0;
+ dmesh.tris = new unsigned char[tcap*4];
+ if (!dmesh.tris)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'dmesh.tris' (%d).", tcap*4);
+ goto failure;
+ }
+
+ for (int i = 0; i < mesh.npolys; ++i)
+ {
+ const unsigned short* p = &mesh.polys[i*nvp*2];
+
+ // Find polygon bounding box.
+ int npoly = 0;
+ for (int j = 0; j < nvp; ++j)
+ {
+ if(p[j] == 0xffff) break;
+ const unsigned short* v = &mesh.verts[p[j]*3];
+ poly[j*3+0] = orig[0] + v[0]*cs;
+ poly[j*3+1] = orig[1] + v[1]*ch;
+ poly[j*3+2] = orig[2] + v[2]*cs;
+ npoly++;
+ }
+
+ // Get the height data from the area of the polygon.
+ hp.xmin = bounds[i*4+0];
+ hp.ymin = bounds[i*4+2];
+ hp.width = bounds[i*4+1]-bounds[i*4+0];
+ hp.height = bounds[i*4+3]-bounds[i*4+2];
+ getHeightData(chf, p, npoly, mesh.verts, hp, stack);
+
+ // Build detail mesh.
+ int nverts = 0;
+ if (!buildPolyDetail(poly, npoly, mesh.regs[i],
+ sampleDist, sampleMaxError,
+ chf, hp, verts, nverts, tris,
+ edges, idx, samples))
+ {
+ goto failure;
+ }
+
+ // Offset detail vertices, unnecassary?
+ for (int j = 0; j < nverts; ++j)
+ verts[j*3+1] += chf.ch;
+
+ // Store detail submesh.
+ const int ntris = tris.size()/4;
+
+ dmesh.meshes[i*4+0] = dmesh.nverts;
+ dmesh.meshes[i*4+1] = (unsigned short)nverts;
+ dmesh.meshes[i*4+2] = dmesh.ntris;
+ dmesh.meshes[i*4+3] = (unsigned short)ntris;
+
+ // Store vertices, allocate more memory if necessary.
+ if (dmesh.nverts+nverts > vcap)
+ {
+ while (dmesh.nverts+nverts > vcap)
+ vcap += 256;
+
+ float* newv = new float[vcap*3];
+ if (!newv)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'newv' (%d).", vcap*3);
+ goto failure;
+ }
+ if (dmesh.nverts)
+ memcpy(newv, dmesh.verts, sizeof(float)*3*dmesh.nverts);
+ delete [] dmesh.verts;
+ dmesh.verts = newv;
+ }
+ for (int j = 0; j < nverts; ++j)
+ {
+ dmesh.verts[dmesh.nverts*3+0] = verts[j*3+0];
+ dmesh.verts[dmesh.nverts*3+1] = verts[j*3+1];
+ dmesh.verts[dmesh.nverts*3+2] = verts[j*3+2];
+ dmesh.nverts++;
+ }
+
+ // Store triangles, allocate more memory if necessary.
+ if (dmesh.ntris+ntris > tcap)
+ {
+ while (dmesh.ntris+ntris > tcap)
+ tcap += 256;
+ unsigned char* newt = new unsigned char[tcap*4];
+ if (!newt)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'newt' (%d).", tcap*4);
+ goto failure;
+ }
+ if (dmesh.ntris)
+ memcpy(newt, dmesh.tris, sizeof(unsigned char)*4*dmesh.ntris);
+ delete [] dmesh.tris;
+ dmesh.tris = newt;
+ }
+ for (int j = 0; j < ntris; ++j)
+ {
+ const int* t = &tris[j*4];
+ dmesh.tris[dmesh.ntris*4+0] = (unsigned char)t[0];
+ dmesh.tris[dmesh.ntris*4+1] = (unsigned char)t[1];
+ dmesh.tris[dmesh.ntris*4+2] = (unsigned char)t[2];
+ dmesh.tris[dmesh.ntris*4+3] = getTriFlags(&verts[t[0]*3], &verts[t[1]*3], &verts[t[2]*3], poly, npoly);
+ dmesh.ntris++;
+ }
+ }
+
+ delete [] bounds;
+ delete [] poly;
+
+ endTime = rcGetPerformanceTimer();
+
+ if (rcGetBuildTimes())
+ rcGetBuildTimes()->buildDetailMesh += rcGetDeltaTimeUsec(startTime, endTime);
+
+ return true;
+
+failure:
+
+ delete [] bounds;
+ delete [] poly;
+
+ return false;
+}
+
+bool rcMergePolyMeshDetails(rcPolyMeshDetail** meshes, const int nmeshes, rcPolyMeshDetail& mesh)
+{
+ rcTimeVal startTime = rcGetPerformanceTimer();
+
+ int maxVerts = 0;
+ int maxTris = 0;
+ int maxMeshes = 0;
+
+ for (int i = 0; i < nmeshes; ++i)
+ {
+ if (!meshes[i]) continue;
+ maxVerts += meshes[i]->nverts;
+ maxTris += meshes[i]->ntris;
+ maxMeshes += meshes[i]->nmeshes;
+ }
+
+ mesh.nmeshes = 0;
+ mesh.meshes = new unsigned short[maxMeshes*4];
+ if (!mesh.meshes)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'pmdtl.meshes' (%d).", maxMeshes*4);
+ return false;
+ }
+
+ mesh.ntris = 0;
+ mesh.tris = new unsigned char[maxTris*4];
+ if (!mesh.tris)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'dmesh.tris' (%d).", maxTris*4);
+ return false;
+ }
+
+ mesh.nverts = 0;
+ mesh.verts = new float[maxVerts*3];
+ if (!mesh.verts)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'dmesh.verts' (%d).", maxVerts*3);
+ return false;
+ }
+
+ // Merge datas.
+ for (int i = 0; i < nmeshes; ++i)
+ {
+ rcPolyMeshDetail* dm = meshes[i];
+ if (!dm) continue;
+ for (int j = 0; j < dm->nmeshes; ++j)
+ {
+ unsigned short* dst = &mesh.meshes[mesh.nmeshes*4];
+ unsigned short* src = &dm->meshes[j*4];
+ dst[0] = mesh.nverts+src[0];
+ dst[1] = src[1];
+ dst[2] = mesh.ntris+src[2];
+ dst[3] = src[3];
+ mesh.nmeshes++;
+ }
+
+ for (int k = 0; k < dm->nverts; ++k)
+ {
+ vcopy(&mesh.verts[mesh.nverts*3], &dm->verts[k*3]);
+ mesh.nverts++;
+ }
+ for (int k = 0; k < dm->ntris; ++k)
+ {
+ mesh.tris[mesh.ntris*4+0] = dm->tris[k*4+0];
+ mesh.tris[mesh.ntris*4+1] = dm->tris[k*4+1];
+ mesh.tris[mesh.ntris*4+2] = dm->tris[k*4+2];
+ mesh.tris[mesh.ntris*4+3] = dm->tris[k*4+3];
+ mesh.ntris++;
+ }
+ }
+
+ rcTimeVal endTime = rcGetPerformanceTimer();
+
+ if (rcGetBuildTimes())
+ rcGetBuildTimes()->mergePolyMeshDetail += rcGetDeltaTimeUsec(startTime, endTime);
+
+ return true;
+}
+
diff --git a/extern/recastnavigation/Recast/Source/RecastRasterization.cpp b/extern/recastnavigation/Recast/Source/RecastRasterization.cpp
new file mode 100644
index 00000000000..658b0e1fb51
--- /dev/null
+++ b/extern/recastnavigation/Recast/Source/RecastRasterization.cpp
@@ -0,0 +1,308 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#define _USE_MATH_DEFINES
+#include <math.h>
+#include <stdio.h>
+#include "Recast.h"
+#include "RecastTimer.h"
+#include "RecastLog.h"
+
+inline bool overlapBounds(const float* amin, const float* amax, const float* bmin, const float* bmax)
+{
+ bool overlap = true;
+ overlap = (amin[0] > bmax[0] || amax[0] < bmin[0]) ? false : overlap;
+ overlap = (amin[1] > bmax[1] || amax[1] < bmin[1]) ? false : overlap;
+ overlap = (amin[2] > bmax[2] || amax[2] < bmin[2]) ? false : overlap;
+ return overlap;
+}
+
+inline bool overlapInterval(unsigned short amin, unsigned short amax,
+ unsigned short bmin, unsigned short bmax)
+{
+ if (amax < bmin) return false;
+ if (amin > bmax) return false;
+ return true;
+}
+
+
+static rcSpan* allocSpan(rcHeightfield& hf)
+{
+ // If running out of memory, allocate new page and update the freelist.
+ if (!hf.freelist || !hf.freelist->next)
+ {
+ // Create new page.
+ // Allocate memory for the new pool.
+ const int size = (sizeof(rcSpanPool)-sizeof(rcSpan)) + sizeof(rcSpan)*RC_SPANS_PER_POOL;
+ rcSpanPool* pool = reinterpret_cast<rcSpanPool*>(new unsigned char[size]);
+ if (!pool) return 0;
+ pool->next = 0;
+ // Add the pool into the list of pools.
+ pool->next = hf.pools;
+ hf.pools = pool;
+ // Add new items to the free list.
+ rcSpan* freelist = hf.freelist;
+ rcSpan* head = &pool->items[0];
+ rcSpan* it = &pool->items[RC_SPANS_PER_POOL];
+ do
+ {
+ --it;
+ it->next = freelist;
+ freelist = it;
+ }
+ while (it != head);
+ hf.freelist = it;
+ }
+
+ // Pop item from in front of the free list.
+ rcSpan* it = hf.freelist;
+ hf.freelist = hf.freelist->next;
+ return it;
+}
+
+static void freeSpan(rcHeightfield& hf, rcSpan* ptr)
+{
+ if (!ptr) return;
+ // Add the node in front of the free list.
+ ptr->next = hf.freelist;
+ hf.freelist = ptr;
+}
+
+static void addSpan(rcHeightfield& hf, int x, int y,
+ unsigned short smin, unsigned short smax,
+ unsigned short flags)
+{
+ int idx = x + y*hf.width;
+
+ rcSpan* s = allocSpan(hf);
+ s->smin = smin;
+ s->smax = smax;
+ s->flags = flags;
+ s->next = 0;
+
+ // Empty cell, add he first span.
+ if (!hf.spans[idx])
+ {
+ hf.spans[idx] = s;
+ return;
+ }
+ rcSpan* prev = 0;
+ rcSpan* cur = hf.spans[idx];
+
+ // Insert and merge spans.
+ while (cur)
+ {
+ if (cur->smin > s->smax)
+ {
+ // Current span is further than the new span, break.
+ break;
+ }
+ else if (cur->smax < s->smin)
+ {
+ // Current span is before the new span advance.
+ prev = cur;
+ cur = cur->next;
+ }
+ else
+ {
+ // Merge spans.
+ if (cur->smin < s->smin)
+ s->smin = cur->smin;
+ if (cur->smax > s->smax)
+ s->smax = cur->smax;
+
+ // Merge flags.
+// if (s->smax == cur->smax)
+ if (rcAbs((int)s->smax - (int)cur->smax) <= 1)
+ s->flags |= cur->flags;
+
+ // Remove current span.
+ rcSpan* next = cur->next;
+ freeSpan(hf, cur);
+ if (prev)
+ prev->next = next;
+ else
+ hf.spans[idx] = next;
+ cur = next;
+ }
+ }
+
+ // Insert new span.
+ if (prev)
+ {
+ s->next = prev->next;
+ prev->next = s;
+ }
+ else
+ {
+ s->next = hf.spans[idx];
+ hf.spans[idx] = s;
+ }
+}
+
+static int clipPoly(const float* in, int n, float* out, float pnx, float pnz, float pd)
+{
+ float d[12];
+ for (int i = 0; i < n; ++i)
+ d[i] = pnx*in[i*3+0] + pnz*in[i*3+2] + pd;
+
+ int m = 0;
+ for (int i = 0, j = n-1; i < n; j=i, ++i)
+ {
+ bool ina = d[j] >= 0;
+ bool inb = d[i] >= 0;
+ if (ina != inb)
+ {
+ float s = d[j] / (d[j] - d[i]);
+ out[m*3+0] = in[j*3+0] + (in[i*3+0] - in[j*3+0])*s;
+ out[m*3+1] = in[j*3+1] + (in[i*3+1] - in[j*3+1])*s;
+ out[m*3+2] = in[j*3+2] + (in[i*3+2] - in[j*3+2])*s;
+ m++;
+ }
+ if (inb)
+ {
+ out[m*3+0] = in[i*3+0];
+ out[m*3+1] = in[i*3+1];
+ out[m*3+2] = in[i*3+2];
+ m++;
+ }
+ }
+ return m;
+}
+
+static void rasterizeTri(const float* v0, const float* v1, const float* v2,
+ unsigned char flags, rcHeightfield& hf,
+ const float* bmin, const float* bmax,
+ const float cs, const float ics, const float ich)
+{
+ const int w = hf.width;
+ const int h = hf.height;
+ float tmin[3], tmax[3];
+ const float by = bmax[1] - bmin[1];
+
+ // Calculate the bounding box of the triangle.
+ vcopy(tmin, v0);
+ vcopy(tmax, v0);
+ vmin(tmin, v1);
+ vmin(tmin, v2);
+ vmax(tmax, v1);
+ vmax(tmax, v2);
+
+ // If the triangle does not touch the bbox of the heightfield, skip the triagle.
+ if (!overlapBounds(bmin, bmax, tmin, tmax))
+ return;
+
+ // Calculate the footpring of the triangle on the grid.
+ int x0 = (int)((tmin[0] - bmin[0])*ics);
+ int y0 = (int)((tmin[2] - bmin[2])*ics);
+ int x1 = (int)((tmax[0] - bmin[0])*ics);
+ int y1 = (int)((tmax[2] - bmin[2])*ics);
+ x0 = rcClamp(x0, 0, w-1);
+ y0 = rcClamp(y0, 0, h-1);
+ x1 = rcClamp(x1, 0, w-1);
+ y1 = rcClamp(y1, 0, h-1);
+
+ // Clip the triangle into all grid cells it touches.
+ float in[7*3], out[7*3], inrow[7*3];
+
+ for (int y = y0; y <= y1; ++y)
+ {
+ // Clip polygon to row.
+ vcopy(&in[0], v0);
+ vcopy(&in[1*3], v1);
+ vcopy(&in[2*3], v2);
+ int nvrow = 3;
+ const float cz = bmin[2] + y*cs;
+ nvrow = clipPoly(in, nvrow, out, 0, 1, -cz);
+ if (nvrow < 3) continue;
+ nvrow = clipPoly(out, nvrow, inrow, 0, -1, cz+cs);
+ if (nvrow < 3) continue;
+
+ for (int x = x0; x <= x1; ++x)
+ {
+ // Clip polygon to column.
+ int nv = nvrow;
+ const float cx = bmin[0] + x*cs;
+ nv = clipPoly(inrow, nv, out, 1, 0, -cx);
+ if (nv < 3) continue;
+ nv = clipPoly(out, nv, in, -1, 0, cx+cs);
+ if (nv < 3) continue;
+
+ // Calculate min and max of the span.
+ float smin = in[1], smax = in[1];
+ for (int i = 1; i < nv; ++i)
+ {
+ smin = rcMin(smin, in[i*3+1]);
+ smax = rcMax(smax, in[i*3+1]);
+ }
+ smin -= bmin[1];
+ smax -= bmin[1];
+ // Skip the span if it is outside the heightfield bbox
+ if (smax < 0.0f) continue;
+ if (smin > by) continue;
+ // Clamp the span to the heightfield bbox.
+ if (smin < 0.0f) smin = bmin[1];
+ if (smax > by) smax = bmax[1];
+
+ // Snap the span to the heightfield height grid.
+ unsigned short ismin = (unsigned short)rcClamp((int)floorf(smin * ich), 0, 0x7fff);
+ unsigned short ismax = (unsigned short)rcClamp((int)ceilf(smax * ich), 0, 0x7fff);
+
+ addSpan(hf, x, y, ismin, ismax, flags);
+ }
+ }
+}
+
+void rcRasterizeTriangle(const float* v0, const float* v1, const float* v2,
+ unsigned char flags, rcHeightfield& solid)
+{
+ rcTimeVal startTime = rcGetPerformanceTimer();
+
+ const float ics = 1.0f/solid.cs;
+ const float ich = 1.0f/solid.ch;
+ rasterizeTri(v0, v1, v2, flags, solid, solid.bmin, solid.bmax, solid.cs, ics, ich);
+
+ rcTimeVal endTime = rcGetPerformanceTimer();
+
+ if (rcGetBuildTimes())
+ rcGetBuildTimes()->rasterizeTriangles += rcGetDeltaTimeUsec(startTime, endTime);
+}
+
+void rcRasterizeTriangles(const float* verts, int nv,
+ const int* tris, const unsigned char* flags, int nt,
+ rcHeightfield& solid)
+{
+ rcTimeVal startTime = rcGetPerformanceTimer();
+
+ const float ics = 1.0f/solid.cs;
+ const float ich = 1.0f/solid.ch;
+ // Rasterize triangles.
+ for (int i = 0; i < nt; ++i)
+ {
+ const float* v0 = &verts[tris[i*3+0]*3];
+ const float* v1 = &verts[tris[i*3+1]*3];
+ const float* v2 = &verts[tris[i*3+2]*3];
+ // Rasterize.
+ rasterizeTri(v0, v1, v2, flags[i], solid, solid.bmin, solid.bmax, solid.cs, ics, ich);
+ }
+
+ rcTimeVal endTime = rcGetPerformanceTimer();
+
+ if (rcGetBuildTimes())
+ rcGetBuildTimes()->rasterizeTriangles += rcGetDeltaTimeUsec(startTime, endTime);
+}
diff --git a/extern/recastnavigation/Recast/Source/RecastRegion.cpp b/extern/recastnavigation/Recast/Source/RecastRegion.cpp
new file mode 100644
index 00000000000..5c557cf0681
--- /dev/null
+++ b/extern/recastnavigation/Recast/Source/RecastRegion.cpp
@@ -0,0 +1,1081 @@
+//
+// Copyright (c) 2009 Mikko Mononen memon@inside.org
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source distribution.
+//
+
+#include <float.h>
+#define _USE_MATH_DEFINES
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "Recast.h"
+#include "RecastLog.h"
+#include "RecastTimer.h"
+
+
+static unsigned short* calculateDistanceField(rcCompactHeightfield& chf,
+ unsigned short* src, unsigned short* dst,
+ unsigned short& maxDist)
+{
+ const int w = chf.width;
+ const int h = chf.height;
+
+ // Init distance and points.
+ for (int i = 0; i < chf.spanCount; ++i)
+ src[i] = 0xffff;
+
+ // Mark boundary cells.
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ const rcCompactSpan& s = chf.spans[i];
+ int nc = 0;
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ if (rcGetCon(s, dir) != 0xf)
+ nc++;
+ }
+ if (nc != 4)
+ src[i] = 0;
+ }
+ }
+ }
+
+ // Pass 1
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ const rcCompactSpan& s = chf.spans[i];
+
+ if (rcGetCon(s, 0) != 0xf)
+ {
+ // (-1,0)
+ const int ax = x + rcGetDirOffsetX(0);
+ const int ay = y + rcGetDirOffsetY(0);
+ const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, 0);
+ const rcCompactSpan& as = chf.spans[ai];
+ if (src[ai]+2 < src[i])
+ src[i] = src[ai]+2;
+
+ // (-1,-1)
+ if (rcGetCon(as, 3) != 0xf)
+ {
+ const int aax = ax + rcGetDirOffsetX(3);
+ const int aay = ay + rcGetDirOffsetY(3);
+ const int aai = (int)chf.cells[aax+aay*w].index + rcGetCon(as, 3);
+ if (src[aai]+3 < src[i])
+ src[i] = src[aai]+3;
+ }
+ }
+ if (rcGetCon(s, 3) != 0xf)
+ {
+ // (0,-1)
+ const int ax = x + rcGetDirOffsetX(3);
+ const int ay = y + rcGetDirOffsetY(3);
+ const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, 3);
+ const rcCompactSpan& as = chf.spans[ai];
+ if (src[ai]+2 < src[i])
+ src[i] = src[ai]+2;
+
+ // (1,-1)
+ if (rcGetCon(as, 2) != 0xf)
+ {
+ const int aax = ax + rcGetDirOffsetX(2);
+ const int aay = ay + rcGetDirOffsetY(2);
+ const int aai = (int)chf.cells[aax+aay*w].index + rcGetCon(as, 2);
+ if (src[aai]+3 < src[i])
+ src[i] = src[aai]+3;
+ }
+ }
+ }
+ }
+ }
+
+ // Pass 2
+ for (int y = h-1; y >= 0; --y)
+ {
+ for (int x = w-1; x >= 0; --x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ const rcCompactSpan& s = chf.spans[i];
+
+ if (rcGetCon(s, 2) != 0xf)
+ {
+ // (1,0)
+ const int ax = x + rcGetDirOffsetX(2);
+ const int ay = y + rcGetDirOffsetY(2);
+ const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, 2);
+ const rcCompactSpan& as = chf.spans[ai];
+ if (src[ai]+2 < src[i])
+ src[i] = src[ai]+2;
+
+ // (1,1)
+ if (rcGetCon(as, 1) != 0xf)
+ {
+ const int aax = ax + rcGetDirOffsetX(1);
+ const int aay = ay + rcGetDirOffsetY(1);
+ const int aai = (int)chf.cells[aax+aay*w].index + rcGetCon(as, 1);
+ if (src[aai]+3 < src[i])
+ src[i] = src[aai]+3;
+ }
+ }
+ if (rcGetCon(s, 1) != 0xf)
+ {
+ // (0,1)
+ const int ax = x + rcGetDirOffsetX(1);
+ const int ay = y + rcGetDirOffsetY(1);
+ const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, 1);
+ const rcCompactSpan& as = chf.spans[ai];
+ if (src[ai]+2 < src[i])
+ src[i] = src[ai]+2;
+
+ // (-1,1)
+ if (rcGetCon(as, 0) != 0xf)
+ {
+ const int aax = ax + rcGetDirOffsetX(0);
+ const int aay = ay + rcGetDirOffsetY(0);
+ const int aai = (int)chf.cells[aax+aay*w].index + rcGetCon(as, 0);
+ if (src[aai]+3 < src[i])
+ src[i] = src[aai]+3;
+ }
+ }
+ }
+ }
+ }
+
+ maxDist = 0;
+ for (int i = 0; i < chf.spanCount; ++i)
+ maxDist = rcMax(src[i], maxDist);
+
+ return src;
+
+}
+
+static unsigned short* boxBlur(rcCompactHeightfield& chf, int thr,
+ unsigned short* src, unsigned short* dst)
+{
+ const int w = chf.width;
+ const int h = chf.height;
+
+ thr *= 2;
+
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ const rcCompactSpan& s = chf.spans[i];
+ int cd = (int)src[i];
+ if (cd <= thr)
+ {
+ dst[i] = cd;
+ continue;
+ }
+
+ int d = cd;
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ if (rcGetCon(s, dir) != 0xf)
+ {
+ const int ax = x + rcGetDirOffsetX(dir);
+ const int ay = y + rcGetDirOffsetY(dir);
+ const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, dir);
+ d += (int)src[ai];
+
+ const rcCompactSpan& as = chf.spans[ai];
+ const int dir2 = (dir+1) & 0x3;
+ if (rcGetCon(as, dir2) != 0xf)
+ {
+ const int ax2 = ax + rcGetDirOffsetX(dir2);
+ const int ay2 = ay + rcGetDirOffsetY(dir2);
+ const int ai2 = (int)chf.cells[ax2+ay2*w].index + rcGetCon(as, dir2);
+ d += (int)src[ai2];
+ }
+ else
+ {
+ d += cd;
+ }
+ }
+ else
+ {
+ d += cd*2;
+ }
+ }
+ dst[i] = (unsigned short)((d+5)/9);
+ }
+ }
+ }
+ return dst;
+}
+
+
+static bool floodRegion(int x, int y, int i,
+ unsigned short level, unsigned short minLevel, unsigned short r,
+ rcCompactHeightfield& chf,
+ unsigned short* src,
+ rcIntArray& stack)
+{
+ const int w = chf.width;
+
+ // Flood fill mark region.
+ stack.resize(0);
+ stack.push((int)x);
+ stack.push((int)y);
+ stack.push((int)i);
+ src[i*2] = r;
+ src[i*2+1] = 0;
+
+ unsigned short lev = level >= minLevel+2 ? level-2 : minLevel;
+ int count = 0;
+
+ while (stack.size() > 0)
+ {
+ int ci = stack.pop();
+ int cy = stack.pop();
+ int cx = stack.pop();
+
+ const rcCompactSpan& cs = chf.spans[ci];
+
+ // Check if any of the neighbours already have a valid region set.
+ unsigned short ar = 0;
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ // 8 connected
+ if (rcGetCon(cs, dir) != 0xf)
+ {
+ const int ax = cx + rcGetDirOffsetX(dir);
+ const int ay = cy + rcGetDirOffsetY(dir);
+ const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(cs, dir);
+ unsigned short nr = src[ai*2];
+ if (nr != 0 && nr != r)
+ ar = nr;
+
+ const rcCompactSpan& as = chf.spans[ai];
+
+ const int dir2 = (dir+1) & 0x3;
+ if (rcGetCon(as, dir2) != 0xf)
+ {
+ const int ax2 = ax + rcGetDirOffsetX(dir2);
+ const int ay2 = ay + rcGetDirOffsetY(dir2);
+ const int ai2 = (int)chf.cells[ax2+ay2*w].index + rcGetCon(as, dir2);
+
+ unsigned short nr = src[ai2*2];
+ if (nr != 0 && nr != r)
+ ar = nr;
+ }
+ }
+ }
+ if (ar != 0)
+ {
+ src[ci*2] = 0;
+ continue;
+ }
+ count++;
+
+ // Expand neighbours.
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ if (rcGetCon(cs, dir) != 0xf)
+ {
+ const int ax = cx + rcGetDirOffsetX(dir);
+ const int ay = cy + rcGetDirOffsetY(dir);
+ const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(cs, dir);
+ if (chf.spans[ai].dist >= lev)
+ {
+ if (src[ai*2] == 0)
+ {
+ src[ai*2] = r;
+ src[ai*2+1] = 0;
+ stack.push(ax);
+ stack.push(ay);
+ stack.push(ai);
+ }
+ }
+ }
+ }
+ }
+
+ return count > 0;
+}
+
+static unsigned short* expandRegions(int maxIter, unsigned short level,
+ rcCompactHeightfield& chf,
+ unsigned short* src,
+ unsigned short* dst,
+ rcIntArray& stack)
+{
+ const int w = chf.width;
+ const int h = chf.height;
+
+ // Find cells revealed by the raised level.
+ stack.resize(0);
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ if (chf.spans[i].dist >= level && src[i*2] == 0)
+ {
+ stack.push(x);
+ stack.push(y);
+ stack.push(i);
+ }
+ }
+ }
+ }
+
+ int iter = 0;
+ while (stack.size() > 0)
+ {
+ int failed = 0;
+
+ memcpy(dst, src, sizeof(unsigned short)*chf.spanCount*2);
+
+ for (int j = 0; j < stack.size(); j += 3)
+ {
+ int x = stack[j+0];
+ int y = stack[j+1];
+ int i = stack[j+2];
+ if (i < 0)
+ {
+ failed++;
+ continue;
+ }
+
+ unsigned short r = src[i*2];
+ unsigned short d2 = 0xffff;
+ const rcCompactSpan& s = chf.spans[i];
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ if (rcGetCon(s, dir) == 0xf) continue;
+ const int ax = x + rcGetDirOffsetX(dir);
+ const int ay = y + rcGetDirOffsetY(dir);
+ const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, dir);
+ if (src[ai*2] > 0 && (src[ai*2] & RC_BORDER_REG) == 0)
+ {
+ if ((int)src[ai*2+1]+2 < (int)d2)
+ {
+ r = src[ai*2];
+ d2 = src[ai*2+1]+2;
+ }
+ }
+ }
+ if (r)
+ {
+ stack[j+2] = -1; // mark as used
+ dst[i*2] = r;
+ dst[i*2+1] = d2;
+ }
+ else
+ {
+ failed++;
+ }
+ }
+
+ // rcSwap source and dest.
+ rcSwap(src, dst);
+
+ if (failed*3 == stack.size())
+ break;
+
+ if (level > 0)
+ {
+ ++iter;
+ if (iter >= maxIter)
+ break;
+ }
+ }
+
+ return src;
+}
+
+
+struct rcRegion
+{
+ inline rcRegion() : count(0), id(0), remap(false) {}
+
+ int count;
+ unsigned short id;
+ bool remap;
+ rcIntArray connections;
+ rcIntArray floors;
+};
+
+static void removeAdjacentNeighbours(rcRegion& reg)
+{
+ // Remove adjacent duplicates.
+ for (int i = 0; i < reg.connections.size() && reg.connections.size() > 1; )
+ {
+ int ni = (i+1) % reg.connections.size();
+ if (reg.connections[i] == reg.connections[ni])
+ {
+ // Remove duplicate
+ for (int j = i; j < reg.connections.size()-1; ++j)
+ reg.connections[j] = reg.connections[j+1];
+ reg.connections.pop();
+ }
+ else
+ ++i;
+ }
+}
+
+static void replaceNeighbour(rcRegion& reg, unsigned short oldId, unsigned short newId)
+{
+ bool neiChanged = false;
+ for (int i = 0; i < reg.connections.size(); ++i)
+ {
+ if (reg.connections[i] == oldId)
+ {
+ reg.connections[i] = newId;
+ neiChanged = true;
+ }
+ }
+ for (int i = 0; i < reg.floors.size(); ++i)
+ {
+ if (reg.floors[i] == oldId)
+ reg.floors[i] = newId;
+ }
+ if (neiChanged)
+ removeAdjacentNeighbours(reg);
+}
+
+static bool canMergeWithRegion(rcRegion& reg, unsigned short id)
+{
+ int n = 0;
+ for (int i = 0; i < reg.connections.size(); ++i)
+ {
+ if (reg.connections[i] == id)
+ n++;
+ }
+ if (n > 1)
+ return false;
+ for (int i = 0; i < reg.floors.size(); ++i)
+ {
+ if (reg.floors[i] == id)
+ return false;
+ }
+ return true;
+}
+
+static void addUniqueFloorRegion(rcRegion& reg, unsigned short n)
+{
+ for (int i = 0; i < reg.floors.size(); ++i)
+ if (reg.floors[i] == n)
+ return;
+ reg.floors.push(n);
+}
+
+static bool mergeRegions(rcRegion& rega, rcRegion& regb)
+{
+ unsigned short aid = rega.id;
+ unsigned short bid = regb.id;
+
+ // Duplicate current neighbourhood.
+ rcIntArray acon;
+ acon.resize(rega.connections.size());
+ for (int i = 0; i < rega.connections.size(); ++i)
+ acon[i] = rega.connections[i];
+ rcIntArray& bcon = regb.connections;
+
+ // Find insertion point on A.
+ int insa = -1;
+ for (int i = 0; i < acon.size(); ++i)
+ {
+ if (acon[i] == bid)
+ {
+ insa = i;
+ break;
+ }
+ }
+ if (insa == -1)
+ return false;
+
+ // Find insertion point on B.
+ int insb = -1;
+ for (int i = 0; i < bcon.size(); ++i)
+ {
+ if (bcon[i] == aid)
+ {
+ insb = i;
+ break;
+ }
+ }
+ if (insb == -1)
+ return false;
+
+ // Merge neighbours.
+ rega.connections.resize(0);
+ for (int i = 0, ni = acon.size(); i < ni-1; ++i)
+ rega.connections.push(acon[(insa+1+i) % ni]);
+
+ for (int i = 0, ni = bcon.size(); i < ni-1; ++i)
+ rega.connections.push(bcon[(insb+1+i) % ni]);
+
+ removeAdjacentNeighbours(rega);
+
+ for (int j = 0; j < regb.floors.size(); ++j)
+ addUniqueFloorRegion(rega, regb.floors[j]);
+ rega.count += regb.count;
+ regb.count = 0;
+ regb.connections.resize(0);
+
+ return true;
+}
+
+static bool isRegionConnectedToBorder(const rcRegion& reg)
+{
+ // Region is connected to border if
+ // one of the neighbours is null id.
+ for (int i = 0; i < reg.connections.size(); ++i)
+ {
+ if (reg.connections[i] == 0)
+ return true;
+ }
+ return false;
+}
+
+static bool isSolidEdge(rcCompactHeightfield& chf, unsigned short* src,
+ int x, int y, int i, int dir)
+{
+ const rcCompactSpan& s = chf.spans[i];
+ unsigned short r = 0;
+ if (rcGetCon(s, dir) != 0xf)
+ {
+ const int ax = x + rcGetDirOffsetX(dir);
+ const int ay = y + rcGetDirOffsetY(dir);
+ const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(s, dir);
+ r = src[ai*2];
+ }
+ if (r == src[i*2])
+ return false;
+ return true;
+}
+
+static void walkContour(int x, int y, int i, int dir,
+ rcCompactHeightfield& chf,
+ unsigned short* src,
+ rcIntArray& cont)
+{
+ int startDir = dir;
+ int starti = i;
+
+ const rcCompactSpan& ss = chf.spans[i];
+ unsigned short curReg = 0;
+ if (rcGetCon(ss, dir) != 0xf)
+ {
+ const int ax = x + rcGetDirOffsetX(dir);
+ const int ay = y + rcGetDirOffsetY(dir);
+ const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(ss, dir);
+ curReg = src[ai*2];
+ }
+ cont.push(curReg);
+
+ int iter = 0;
+ while (++iter < 40000)
+ {
+ const rcCompactSpan& s = chf.spans[i];
+
+ if (isSolidEdge(chf, src, x, y, i, dir))
+ {
+ // Choose the edge corner
+ unsigned short r = 0;
+ if (rcGetCon(s, dir) != 0xf)
+ {
+ const int ax = x + rcGetDirOffsetX(dir);
+ const int ay = y + rcGetDirOffsetY(dir);
+ const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(s, dir);
+ r = src[ai*2];
+ }
+ if (r != curReg)
+ {
+ curReg = r;
+ cont.push(curReg);
+ }
+
+ dir = (dir+1) & 0x3; // Rotate CW
+ }
+ else
+ {
+ int ni = -1;
+ const int nx = x + rcGetDirOffsetX(dir);
+ const int ny = y + rcGetDirOffsetY(dir);
+ if (rcGetCon(s, dir) != 0xf)
+ {
+ const rcCompactCell& nc = chf.cells[nx+ny*chf.width];
+ ni = (int)nc.index + rcGetCon(s, dir);
+ }
+ if (ni == -1)
+ {
+ // Should not happen.
+ return;
+ }
+ x = nx;
+ y = ny;
+ i = ni;
+ dir = (dir+3) & 0x3; // Rotate CCW
+ }
+
+ if (starti == i && startDir == dir)
+ {
+ break;
+ }
+ }
+
+ // Remove adjacent duplicates.
+ if (cont.size() > 1)
+ {
+ for (int i = 0; i < cont.size(); )
+ {
+ int ni = (i+1) % cont.size();
+ if (cont[i] == cont[ni])
+ {
+ for (int j = i; j < cont.size()-1; ++j)
+ cont[j] = cont[j+1];
+ cont.pop();
+ }
+ else
+ ++i;
+ }
+ }
+}
+
+static bool filterSmallRegions(int minRegionSize, int mergeRegionSize,
+ unsigned short& maxRegionId,
+ rcCompactHeightfield& chf,
+ unsigned short* src)
+{
+ const int w = chf.width;
+ const int h = chf.height;
+
+ int nreg = maxRegionId+1;
+ rcRegion* regions = new rcRegion[nreg];
+ if (!regions)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "filterSmallRegions: Out of memory 'regions' (%d).", nreg);
+ return false;
+ }
+
+ for (int i = 0; i < nreg; ++i)
+ regions[i].id = (unsigned short)i;
+
+ // Find edge of a region and find connections around the contour.
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ unsigned short r = src[i*2];
+ if (r == 0 || r >= nreg)
+ continue;
+
+ rcRegion& reg = regions[r];
+ reg.count++;
+
+
+ // Update floors.
+ for (int j = (int)c.index; j < ni; ++j)
+ {
+ if (i == j) continue;
+ unsigned short floorId = src[j*2];
+ if (floorId == 0 || floorId >= nreg)
+ continue;
+ addUniqueFloorRegion(reg, floorId);
+ }
+
+ // Have found contour
+ if (reg.connections.size() > 0)
+ continue;
+
+ // Check if this cell is next to a border.
+ int ndir = -1;
+ for (int dir = 0; dir < 4; ++dir)
+ {
+ if (isSolidEdge(chf, src, x, y, i, dir))
+ {
+ ndir = dir;
+ break;
+ }
+ }
+
+ if (ndir != -1)
+ {
+ // The cell is at border.
+ // Walk around the contour to find all the neighbours.
+ walkContour(x, y, i, ndir, chf, src, reg.connections);
+ }
+ }
+ }
+ }
+
+ // Remove too small unconnected regions.
+ for (int i = 0; i < nreg; ++i)
+ {
+ rcRegion& reg = regions[i];
+ if (reg.id == 0 || (reg.id & RC_BORDER_REG))
+ continue;
+ if (reg.count == 0)
+ continue;
+
+ if (reg.connections.size() == 1 && reg.connections[0] == 0)
+ {
+ if (reg.count < minRegionSize)
+ {
+ // Non-connected small region, remove.
+ reg.count = 0;
+ reg.id = 0;
+ }
+ }
+ }
+
+
+ // Merge too small regions to neighbour regions.
+ int mergeCount = 0 ;
+ do
+ {
+ mergeCount = 0;
+ for (int i = 0; i < nreg; ++i)
+ {
+ rcRegion& reg = regions[i];
+ if (reg.id == 0 || (reg.id & RC_BORDER_REG))
+ continue;
+ if (reg.count == 0)
+ continue;
+
+ // Check to see if the region should be merged.
+ if (reg.count > mergeRegionSize && isRegionConnectedToBorder(reg))
+ continue;
+
+ // Small region with more than 1 connection.
+ // Or region which is not connected to a border at all.
+ // Find smallest neighbour region that connects to this one.
+ int smallest = 0xfffffff;
+ unsigned short mergeId = reg.id;
+ for (int j = 0; j < reg.connections.size(); ++j)
+ {
+ if (reg.connections[j] & RC_BORDER_REG) continue;
+ rcRegion& mreg = regions[reg.connections[j]];
+ if (mreg.id == 0 || (mreg.id & RC_BORDER_REG)) continue;
+ if (mreg.count < smallest &&
+ canMergeWithRegion(reg, mreg.id) &&
+ canMergeWithRegion(mreg, reg.id))
+ {
+ smallest = mreg.count;
+ mergeId = mreg.id;
+ }
+ }
+ // Found new id.
+ if (mergeId != reg.id)
+ {
+ unsigned short oldId = reg.id;
+ rcRegion& target = regions[mergeId];
+
+ // Merge neighbours.
+ if (mergeRegions(target, reg))
+ {
+ // Fixup regions pointing to current region.
+ for (int j = 0; j < nreg; ++j)
+ {
+ if (regions[j].id == 0 || (regions[j].id & RC_BORDER_REG)) continue;
+ // If another region was already merged into current region
+ // change the nid of the previous region too.
+ if (regions[j].id == oldId)
+ regions[j].id = mergeId;
+ // Replace the current region with the new one if the
+ // current regions is neighbour.
+ replaceNeighbour(regions[j], oldId, mergeId);
+ }
+ mergeCount++;
+ }
+ }
+ }
+ }
+ while (mergeCount > 0);
+
+ // Compress region Ids.
+ for (int i = 0; i < nreg; ++i)
+ {
+ regions[i].remap = false;
+ if (regions[i].id == 0) continue; // Skip nil regions.
+ if (regions[i].id & RC_BORDER_REG) continue; // Skip external regions.
+ regions[i].remap = true;
+ }
+
+ unsigned short regIdGen = 0;
+ for (int i = 0; i < nreg; ++i)
+ {
+ if (!regions[i].remap)
+ continue;
+ unsigned short oldId = regions[i].id;
+ unsigned short newId = ++regIdGen;
+ for (int j = i; j < nreg; ++j)
+ {
+ if (regions[j].id == oldId)
+ {
+ regions[j].id = newId;
+ regions[j].remap = false;
+ }
+ }
+ }
+ maxRegionId = regIdGen;
+
+ // Remap regions.
+ for (int i = 0; i < chf.spanCount; ++i)
+ {
+ if ((src[i*2] & RC_BORDER_REG) == 0)
+ src[i*2] = regions[src[i*2]].id;
+ }
+
+ delete [] regions;
+
+ return true;
+}
+
+bool rcBuildDistanceField(rcCompactHeightfield& chf)
+{
+ rcTimeVal startTime = rcGetPerformanceTimer();
+
+ unsigned short* dist0 = new unsigned short[chf.spanCount];
+ if (!dist0)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildDistanceField: Out of memory 'dist0' (%d).", chf.spanCount);
+ return false;
+ }
+ unsigned short* dist1 = new unsigned short[chf.spanCount];
+ if (!dist1)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildDistanceField: Out of memory 'dist1' (%d).", chf.spanCount);
+ delete [] dist0;
+ return false;
+ }
+
+ unsigned short* src = dist0;
+ unsigned short* dst = dist1;
+
+ unsigned short maxDist = 0;
+
+ rcTimeVal distStartTime = rcGetPerformanceTimer();
+
+ if (calculateDistanceField(chf, src, dst, maxDist) != src)
+ rcSwap(src, dst);
+
+ chf.maxDistance = maxDist;
+
+ rcTimeVal distEndTime = rcGetPerformanceTimer();
+
+ rcTimeVal blurStartTime = rcGetPerformanceTimer();
+
+ // Blur
+ if (boxBlur(chf, 1, src, dst) != src)
+ rcSwap(src, dst);
+
+ // Store distance.
+ for (int i = 0; i < chf.spanCount; ++i)
+ chf.spans[i].dist = src[i];
+
+ rcTimeVal blurEndTime = rcGetPerformanceTimer();
+
+ delete [] dist0;
+ delete [] dist1;
+
+ rcTimeVal endTime = rcGetPerformanceTimer();
+
+/* if (rcGetLog())
+ {
+ rcGetLog()->log(RC_LOG_PROGRESS, "Build distance field: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f);
+ rcGetLog()->log(RC_LOG_PROGRESS, " - dist: %.3f ms", rcGetDeltaTimeUsec(distStartTime, distEndTime)/1000.0f);
+ rcGetLog()->log(RC_LOG_PROGRESS, " - blur: %.3f ms", rcGetDeltaTimeUsec(blurStartTime, blurEndTime)/1000.0f);
+ }*/
+ if (rcGetBuildTimes())
+ {
+ rcGetBuildTimes()->buildDistanceField += rcGetDeltaTimeUsec(startTime, endTime);
+ rcGetBuildTimes()->buildDistanceFieldDist += rcGetDeltaTimeUsec(distStartTime, distEndTime);
+ rcGetBuildTimes()->buildDistanceFieldBlur += rcGetDeltaTimeUsec(blurStartTime, blurEndTime);
+ }
+
+ return true;
+}
+
+static void paintRectRegion(int minx, int maxx, int miny, int maxy,
+ unsigned short regId, unsigned short minLevel,
+ rcCompactHeightfield& chf, unsigned short* src)
+{
+ const int w = chf.width;
+ for (int y = miny; y < maxy; ++y)
+ {
+ for (int x = minx; x < maxx; ++x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ if (chf.spans[i].dist >= minLevel)
+ src[i*2] = regId;
+ }
+ }
+ }
+}
+
+bool rcBuildRegions(rcCompactHeightfield& chf,
+ int walkableRadius, int borderSize,
+ int minRegionSize, int mergeRegionSize)
+{
+ rcTimeVal startTime = rcGetPerformanceTimer();
+
+ const int w = chf.width;
+ const int h = chf.height;
+
+ unsigned short* tmp1 = new unsigned short[chf.spanCount*2];
+ if (!tmp1)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildDistanceField: Out of memory 'tmp1' (%d).", chf.spanCount*2);
+ return false;
+ }
+ unsigned short* tmp2 = new unsigned short[chf.spanCount*2];
+ if (!tmp2)
+ {
+ if (rcGetLog())
+ rcGetLog()->log(RC_LOG_ERROR, "rcBuildDistanceField: Out of memory 'tmp2' (%d).", chf.spanCount*2);
+ delete [] tmp1;
+ return false;
+ }
+
+ rcTimeVal regStartTime = rcGetPerformanceTimer();
+
+ rcIntArray stack(1024);
+ rcIntArray visited(1024);
+
+ unsigned short* src = tmp1;
+ unsigned short* dst = tmp2;
+
+ memset(src, 0, sizeof(unsigned short) * chf.spanCount*2);
+
+ unsigned short regionId = 1;
+ unsigned short level = (chf.maxDistance+1) & ~1;
+
+ unsigned short minLevel = (unsigned short)(walkableRadius*2);
+
+ const int expandIters = 4 + walkableRadius * 2;
+
+ // Mark border regions.
+ paintRectRegion(0, borderSize, 0, h, regionId|RC_BORDER_REG, minLevel, chf, src); regionId++;
+ paintRectRegion(w-borderSize, w, 0, h, regionId|RC_BORDER_REG, minLevel, chf, src); regionId++;
+ paintRectRegion(0, w, 0, borderSize, regionId|RC_BORDER_REG, minLevel, chf, src); regionId++;
+ paintRectRegion(0, w, h-borderSize, h, regionId|RC_BORDER_REG, minLevel, chf, src); regionId++;
+
+ rcTimeVal expTime = 0;
+ rcTimeVal floodTime = 0;
+
+ while (level > minLevel)
+ {
+ level = level >= 2 ? level-2 : 0;
+
+ rcTimeVal expStartTime = rcGetPerformanceTimer();
+
+ // Expand current regions until no empty connected cells found.
+ if (expandRegions(expandIters, level, chf, src, dst, stack) != src)
+ rcSwap(src, dst);
+
+ expTime += rcGetPerformanceTimer() - expStartTime;
+
+ rcTimeVal floodStartTime = rcGetPerformanceTimer();
+
+ // Mark new regions with IDs.
+ for (int y = 0; y < h; ++y)
+ {
+ for (int x = 0; x < w; ++x)
+ {
+ const rcCompactCell& c = chf.cells[x+y*w];
+ for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i)
+ {
+ if (chf.spans[i].dist < level || src[i*2] != 0)
+ continue;
+
+ if (floodRegion(x, y, i, minLevel, level, regionId, chf, src, stack))
+ regionId++;
+ }
+ }
+ }
+
+ floodTime += rcGetPerformanceTimer() - floodStartTime;
+
+ }
+
+ // Expand current regions until no empty connected cells found.
+ if (expandRegions(expandIters*8, minLevel, chf, src, dst, stack) != src)
+ rcSwap(src, dst);
+
+ rcTimeVal regEndTime = rcGetPerformanceTimer();
+
+ rcTimeVal filterStartTime = rcGetPerformanceTimer();
+
+ // Filter out small regions.
+ chf.maxRegions = regionId;
+ if (!filterSmallRegions(minRegionSize, mergeRegionSize, chf.maxRegions, chf, src))
+ return false;
+
+ rcTimeVal filterEndTime = rcGetPerformanceTimer();
+
+ // Write the result out.
+ for (int i = 0; i < chf.spanCount; ++i)
+ chf.spans[i].reg = src[i*2];
+
+ delete [] tmp1;
+ delete [] tmp2;
+
+ rcTimeVal endTime = rcGetPerformanceTimer();
+
+/* if (rcGetLog())
+ {
+ rcGetLog()->log(RC_LOG_PROGRESS, "Build regions: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f);
+ rcGetLog()->log(RC_LOG_PROGRESS, " - reg: %.3f ms", rcGetDeltaTimeUsec(regStartTime, regEndTime)/1000.0f);
+ rcGetLog()->log(RC_LOG_PROGRESS, " - exp: %.3f ms", rcGetDeltaTimeUsec(0, expTime)/1000.0f);
+ rcGetLog()->log(RC_LOG_PROGRESS, " - flood: %.3f ms", rcGetDeltaTimeUsec(0, floodTime)/1000.0f);
+ rcGetLog()->log(RC_LOG_PROGRESS, " - filter: %.3f ms", rcGetDeltaTimeUsec(filterStartTime, filterEndTime)/1000.0f);
+ }
+*/
+ if (rcGetBuildTimes())
+ {
+ rcGetBuildTimes()->buildRegions += rcGetDeltaTimeUsec(startTime, endTime);
+ rcGetBuildTimes()->buildRegionsReg += rcGetDeltaTimeUsec(regStartTime, regEndTime);
+ rcGetBuildTimes()->buildRegionsExp += rcGetDeltaTimeUsec(0, expTime);
+ rcGetBuildTimes()->buildRegionsFlood += rcGetDeltaTimeUsec(0, floodTime);
+ rcGetBuildTimes()->buildRegionsFilter += rcGetDeltaTimeUsec(filterStartTime, filterEndTime);
+ }
+
+ return true;
+}
+
+
diff --git a/extern/recastnavigation/Recast/Source/RecastTimer.cpp b/extern/recastnavigation/Recast/Source/RecastTimer.cpp
new file mode 100644
index 00000000000..51ffb7d3160
--- /dev/null
+++ b/extern/recastnavigation/Recast/Source/RecastTimer.cpp
@@ -0,0 +1,58 @@
+#include "RecastTimer.h"
+
+#if defined(WIN32)
+
+// Win32
+#include <windows.h>
+
+rcTimeVal rcGetPerformanceTimer()
+{
+ __int64 count;
+ QueryPerformanceCounter((LARGE_INTEGER*)&count);
+ return count;
+}
+
+int rcGetDeltaTimeUsec(rcTimeVal start, rcTimeVal end)
+{
+ static __int64 freq = 0;
+ if (freq == 0)
+ QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
+ __int64 elapsed = end - start;
+ return (int)(elapsed*1000000 / freq);
+}
+
+#elif defined(__MACH__)
+
+// OSX
+#include <mach/mach_time.h>
+
+rcTimeVal rcGetPerformanceTimer()
+{
+ return mach_absolute_time();
+}
+
+int rcGetDeltaTimeUsec(rcTimeVal start, rcTimeVal end)
+{
+ static mach_timebase_info_data_t timebaseInfo;
+ if (timebaseInfo.denom == 0)
+ mach_timebase_info(&timebaseInfo);
+ uint64_t elapsed = end - start;
+ uint64_t nanosec = elapsed * timebaseInfo.numer / timebaseInfo.denom;
+ return (int)(nanosec / 1000);
+}
+
+#else
+
+// TODO: Linux, etc
+
+rcTimeVal rcGetPerformanceTimer()
+{
+ return 0;
+}
+
+int rcGetDeltaTimeUsec(rcTimeVal start, rcTimeVal end)
+{
+ return 0;
+}
+
+#endif \ No newline at end of file
diff --git a/extern/recastnavigation/SConscript b/extern/recastnavigation/SConscript
new file mode 100644
index 00000000000..be10c33c327
--- /dev/null
+++ b/extern/recastnavigation/SConscript
@@ -0,0 +1,11 @@
+#!/usr/bin/python
+
+Import('env')
+
+sources = env.Glob('Recast/Source/*.cpp') + env.Glob('Detour/Source/*.cpp')
+
+incs = 'Recast/Include Detour/Include'
+
+env.BlenderLib ( 'extern_recastnavigation', sources, Split(incs), [],
+ libtype=['extern','player'],
+ priority=[10,185])
diff --git a/intern/audaspace/intern/AUD_JOSResampleReader.cpp b/intern/audaspace/intern/AUD_JOSResampleReader.cpp
index bffc0ce156b..359ed9cecdd 100755
--- a/intern/audaspace/intern/AUD_JOSResampleReader.cpp
+++ b/intern/audaspace/intern/AUD_JOSResampleReader.cpp
@@ -118,7 +118,8 @@ void AUD_JOSResampleReader::updateBuffer(int size, double factor, int samplesize
{\
sample_t* buf = m_buffer.getBuffer();\
\
- int P, l, end, channel, i;\
+ unsigned int P, l;\
+ int end, channel, i;\
double eta, v, f_increment, factor;\
\
m_sums.assureSize(m_channels * sizeof(double));\
@@ -222,7 +223,7 @@ void AUD_JOSResampleReader::updateBuffer(int size, double factor, int samplesize
\
for(channel = 0; channel < m_channels; channel++)\
{\
- *buffer = f_increment / m_L * sums[channel];\
+ *buffer = factor * sums[channel];\
buffer++;\
}\
}\
@@ -230,7 +231,7 @@ void AUD_JOSResampleReader::updateBuffer(int size, double factor, int samplesize
m_P += fmod(1.0 / factor, 1.0);\
m_n += floor(1.0 / factor);\
\
- if(m_P >= 1.0)\
+ while(m_P >= 1.0)\
{\
m_P -= 1.0;\
m_n++;\
@@ -364,9 +365,9 @@ void AUD_JOSResampleReader::read(int& length, bool& eos, sample_t* buffer)
double factor = AUD_MIN(target_factor, m_last_factor);
if(factor >= 1)
- len = (m_n - m_cache_valid) + int(ceil(length / factor)) + ceil(num_samples);
+ len = (int(m_n) - m_cache_valid) + int(ceil(length / factor)) + ceil(num_samples);
else
- len = (m_n - m_cache_valid) + int(ceil(length / factor) + ceil(num_samples / factor));
+ len = (int(m_n) - m_cache_valid) + int(ceil(length / factor) + ceil(num_samples / factor));
if(len > 0)
{
diff --git a/intern/audaspace/intern/AUD_SequencerHandle.cpp b/intern/audaspace/intern/AUD_SequencerHandle.cpp
index 186cff834f7..c10697df67b 100755
--- a/intern/audaspace/intern/AUD_SequencerHandle.cpp
+++ b/intern/audaspace/intern/AUD_SequencerHandle.cpp
@@ -66,7 +66,7 @@ void AUD_SequencerHandle::stop()
m_handle->stop();
}
-void AUD_SequencerHandle::update(float position, float frame)
+void AUD_SequencerHandle::update(float position, float frame, float fps)
{
if(!m_handle.isNull())
{
@@ -132,7 +132,7 @@ void AUD_SequencerHandle::update(float position, float frame)
m_3dhandle->setSourceLocation(v);
m_entry->m_location.read(frame + 1, v2.get());
v2 -= v;
- m_3dhandle->setSourceVelocity(v2);
+ m_3dhandle->setSourceVelocity(v2 * fps);
if(m_entry->m_muted)
m_handle->setVolume(0);
diff --git a/intern/audaspace/intern/AUD_SequencerHandle.h b/intern/audaspace/intern/AUD_SequencerHandle.h
index 60f23608576..c73a9398d02 100755
--- a/intern/audaspace/intern/AUD_SequencerHandle.h
+++ b/intern/audaspace/intern/AUD_SequencerHandle.h
@@ -94,8 +94,9 @@ public:
* Updates the handle for playback.
* \param position The current time during playback.
* \param frame The current frame during playback.
+ * \param fps The animation frames per second.
*/
- void update(float position, float frame);
+ void update(float position, float frame, float fps);
/**
* Seeks the handle to a specific time position.
diff --git a/intern/audaspace/intern/AUD_SequencerReader.cpp b/intern/audaspace/intern/AUD_SequencerReader.cpp
index 0b8a400a97b..c468de19580 100644
--- a/intern/audaspace/intern/AUD_SequencerReader.cpp
+++ b/intern/audaspace/intern/AUD_SequencerReader.cpp
@@ -162,7 +162,7 @@ void AUD_SequencerReader::read(int& length, bool& eos, sample_t* buffer)
for(AUD_HandleIterator it = m_handles.begin(); it != m_handles.end(); it++)
{
- (*it)->update(time, frame);
+ (*it)->update(time, frame, m_factory->m_fps);
}
m_factory->m_volume.read(frame, &volume);
@@ -174,7 +174,7 @@ void AUD_SequencerReader::read(int& length, bool& eos, sample_t* buffer)
m_device.setListenerLocation(v);
m_factory->m_location.read(frame + 1, v2.get());
v2 -= v;
- m_device.setListenerVelocity(v2);
+ m_device.setListenerVelocity(v2 * m_factory->m_fps);
m_device.read(reinterpret_cast<data_t*>(buffer + specs.channels * pos), len);
diff --git a/intern/elbeem/CMakeLists.txt b/intern/elbeem/CMakeLists.txt
index 7a842a29b98..718c6ddd161 100644
--- a/intern/elbeem/CMakeLists.txt
+++ b/intern/elbeem/CMakeLists.txt
@@ -89,13 +89,28 @@ set(SRC
intern/utilities.h
)
-add_definitions(-DNOGUI -DELBEEM_BLENDER=1)
+add_definitions(
+ -DNOGUI
+ -DELBEEM_BLENDER=1
+)
+
+# not essential but quiet gcc's -Wundef
+add_definitions(
+ -DLBM_PRECISION=1
+ -DLBM_INCLUDE_TESTSOLVERS=0
+ -DFSGR_STRICT_DEBUG=0
+ -DELBEEM_MPI=0
+ -DNEWDIRVELMOTEST=0
+)
+
if(WINDOWS)
add_definitions(-DUSE_MSVC6FIXES)
endif()
if(WITH_OPENMP)
add_definitions(-DPARALLEL=1)
+else()
+ add_definitions(-DPARALLEL=0)
endif()
blender_add_lib_nolist(bf_intern_elbeem "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/intern/ghost/intern/GHOST_NDOFManager.cpp b/intern/ghost/intern/GHOST_NDOFManager.cpp
index a24ccc3ff6c..c2e6f278c6b 100644
--- a/intern/ghost/intern/GHOST_NDOFManager.cpp
+++ b/intern/ghost/intern/GHOST_NDOFManager.cpp
@@ -366,11 +366,11 @@ void GHOST_NDOFManager::setDeadZone(float dz)
}
else if (dz > 0.5f) {
// warn the rogue user/programmer, but allow it
- printf("ndof: dead zone of %.2f is rather high...\n", dz);
+ GHOST_PRINTF("ndof: dead zone of %.2f is rather high...\n", dz);
}
m_deadZone = dz;
- printf("ndof: dead zone set to %.2f\n", dz);
+ GHOST_PRINTF("ndof: dead zone set to %.2f\n", dz);
}
static bool atHomePosition(GHOST_TEventNDOFMotionData* ndof)
diff --git a/intern/guardedalloc/MEM_sys_types.h b/intern/guardedalloc/MEM_sys_types.h
index c5148e84ffe..4debb32b5c4 100644
--- a/intern/guardedalloc/MEM_sys_types.h
+++ b/intern/guardedalloc/MEM_sys_types.h
@@ -88,7 +88,7 @@ typedef unsigned long uintptr_t;
#define _UINTPTR_T_DEFINED
#endif
-#elif defined(__linux__) || defined(__NetBSD__)
+#elif defined(__linux__) || defined(__NetBSD__) || defined(__OpenBSD__)
/* Linux-i386, Linux-Alpha, Linux-ppc */
#include <stdint.h>
@@ -98,7 +98,8 @@ typedef unsigned long uintptr_t;
#include <inttypes.h>
#elif defined(FREE_WINDOWS)
-
+/* define htoln here, there must be a syntax error in winsock2.h in MinGW */
+unsigned long __attribute__((__stdcall__)) htonl(unsigned long);
#include <stdint.h>
#else
@@ -109,12 +110,14 @@ typedef unsigned long uintptr_t;
#endif /* ifdef platform for types */
#ifdef _WIN32
+#ifndef FREE_WINDOWS
#ifndef htonl
#define htonl(x) correctByteOrder(x)
#endif
#ifndef ntohl
#define ntohl(x) correctByteOrder(x)
#endif
+#endif
#elif defined (__FreeBSD__) || defined (__OpenBSD__)
#include <sys/param.h>
#elif defined (__APPLE__)
diff --git a/intern/iksolver/intern/IK_QSegment.cpp b/intern/iksolver/intern/IK_QSegment.cpp
index df4fbc8fadd..ba4fbb88542 100644
--- a/intern/iksolver/intern/IK_QSegment.cpp
+++ b/intern/iksolver/intern/IK_QSegment.cpp
@@ -319,7 +319,7 @@ void IK_QSegment::RemoveChild(IK_QSegment *child)
else {
IK_QSegment *seg = m_child;
- while (seg->m_sibling != child);
+ while (seg->m_sibling != child)
seg = seg->m_sibling;
if (child == seg->m_sibling)
diff --git a/intern/opennl/CMakeLists.txt b/intern/opennl/CMakeLists.txt
index 55b0bc5855f..7d6a579819e 100644
--- a/intern/opennl/CMakeLists.txt
+++ b/intern/opennl/CMakeLists.txt
@@ -31,6 +31,13 @@ remove_strict_flags()
# and debug gives a lot of prints on UV unwrapping. developers can enable if they need to.
remove_flag("-DDEBUG")
+
+# quiet compiler warnings about undefined defines
+add_definitions(
+ -DDEBUGlevel=0
+ -DPRNTlevel=0
+)
+
set(INC
extern
superlu
diff --git a/intern/opennl/superlu/superlu_sys_types.h b/intern/opennl/superlu/superlu_sys_types.h
index 2cd9cab453d..c154b4c50ac 100644
--- a/intern/opennl/superlu/superlu_sys_types.h
+++ b/intern/opennl/superlu/superlu_sys_types.h
@@ -89,7 +89,7 @@ typedef unsigned long uintptr_t;
#define _UINTPTR_T_DEFINED
#endif
-#elif defined(__linux__) || defined(__NetBSD__)
+#elif defined(__linux__) || defined(__NetBSD__) || defined(__OpenBSD__)
/* Linux-i386, Linux-Alpha, Linux-ppc */
#include <stdint.h>
diff --git a/intern/smoke/CMakeLists.txt b/intern/smoke/CMakeLists.txt
index 094d398a83c..228ff6ec389 100644
--- a/intern/smoke/CMakeLists.txt
+++ b/intern/smoke/CMakeLists.txt
@@ -88,7 +88,7 @@ if(WITH_OPENMP)
endif()
if(WITH_FFTW3)
- add_definitions(-DFFTW3=1)
+ add_definitions(-DWITH_FFTW3)
list(APPEND INC
${FFTW3_INCLUDE_DIRS}
)
diff --git a/intern/smoke/SConscript b/intern/smoke/SConscript
index fa32c5f36c3..0511257d319 100644
--- a/intern/smoke/SConscript
+++ b/intern/smoke/SConscript
@@ -16,7 +16,7 @@ incs += ' ' + env['BF_PNG_INC'] + ' ' + env['BF_ZLIB_INC']
incs += ' intern ../../extern/bullet2/src ../memutil ../guardealloc '
if env['WITH_BF_FFTW3']:
- defs += ' FFTW3=1'
+ defs += ' WITH_FFTW3'
incs += env['BF_FFTW3_INC']
env.BlenderLib ('bf_intern_smoke', sources, Split(incs), Split(defs), libtype=['intern'], priority=[40] )
diff --git a/intern/smoke/intern/FFT_NOISE.h b/intern/smoke/intern/FFT_NOISE.h
index b0597d7b20c..a087b4e1391 100644
--- a/intern/smoke/intern/FFT_NOISE.h
+++ b/intern/smoke/intern/FFT_NOISE.h
@@ -25,7 +25,7 @@
#ifndef FFT_NOISE_H_
#define FFT_NOISE_H_
-#if FFTW3==1
+#ifdef WITH_FFTW3
#include <iostream>
#include <fftw3.h>
#include <MERSENNETWISTER.h>
diff --git a/intern/smoke/intern/WTURBULENCE.cpp b/intern/smoke/intern/WTURBULENCE.cpp
index 9934e3017cf..cd18cf7b344 100644
--- a/intern/smoke/intern/WTURBULENCE.cpp
+++ b/intern/smoke/intern/WTURBULENCE.cpp
@@ -155,7 +155,7 @@ void WTURBULENCE::setNoise(int type)
if(type == (1<<1)) // FFT
{
// needs fft
- #if FFTW3==1
+ #ifdef WITH_FFTW3
std::string noiseTileFilename = std::string("noise.fft");
generatTile_FFT(_noiseTile, noiseTileFilename);
#endif
diff --git a/release/datafiles/blenderbuttons b/release/datafiles/blenderbuttons
index 4c064182a8c..a68a1f8394c 100644
--- a/release/datafiles/blenderbuttons
+++ b/release/datafiles/blenderbuttons
Binary files differ
diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py
index 101416f4943..b3127733c1e 100644
--- a/release/scripts/modules/bpy_types.py
+++ b/release/scripts/modules/bpy_types.py
@@ -356,7 +356,7 @@ class Mesh(bpy_types.ID):
@property
def edge_keys(self):
- return [edge_key for face in self.faces for edge_key in face.edge_keys]
+ return [ed.key for ed in self.edges]
class MeshEdge(StructRNA):
@@ -376,17 +376,31 @@ class MeshFace(StructRNA):
face_verts = self.vertices[:]
mesh_verts = self.id_data.vertices
if len(face_verts) == 3:
- return (mesh_verts[face_verts[0]].co + mesh_verts[face_verts[1]].co + mesh_verts[face_verts[2]].co) / 3.0
+ return (mesh_verts[face_verts[0]].co +
+ mesh_verts[face_verts[1]].co +
+ mesh_verts[face_verts[2]].co
+ ) / 3.0
else:
- return (mesh_verts[face_verts[0]].co + mesh_verts[face_verts[1]].co + mesh_verts[face_verts[2]].co + mesh_verts[face_verts[3]].co) / 4.0
+ return (mesh_verts[face_verts[0]].co +
+ mesh_verts[face_verts[1]].co +
+ mesh_verts[face_verts[2]].co +
+ mesh_verts[face_verts[3]].co
+ ) / 4.0
@property
def edge_keys(self):
verts = self.vertices[:]
if len(verts) == 3:
- return ord_ind(verts[0], verts[1]), ord_ind(verts[1], verts[2]), ord_ind(verts[2], verts[0])
-
- return ord_ind(verts[0], verts[1]), ord_ind(verts[1], verts[2]), ord_ind(verts[2], verts[3]), ord_ind(verts[3], verts[0])
+ return (ord_ind(verts[0], verts[1]),
+ ord_ind(verts[1], verts[2]),
+ ord_ind(verts[2], verts[0]),
+ )
+ else:
+ return (ord_ind(verts[0], verts[1]),
+ ord_ind(verts[1], verts[2]),
+ ord_ind(verts[2], verts[3]),
+ ord_ind(verts[3], verts[0]),
+ )
class Text(bpy_types.ID):
diff --git a/release/scripts/startup/bl_operators/animsys_update.py b/release/scripts/startup/bl_operators/animsys_update.py
index f1d0c3579ff..1c4176d96fa 100644
--- a/release/scripts/startup/bl_operators/animsys_update.py
+++ b/release/scripts/startup/bl_operators/animsys_update.py
@@ -686,7 +686,6 @@ data_path_update = [
]
-import bpy
from bpy.types import Operator
diff --git a/release/scripts/startup/bl_operators/nla.py b/release/scripts/startup/bl_operators/nla.py
index c764f7d62f1..feb0016b1c7 100644
--- a/release/scripts/startup/bl_operators/nla.py
+++ b/release/scripts/startup/bl_operators/nla.py
@@ -271,7 +271,8 @@ class BakeAction(Operator):
class ClearUselessActions(Operator):
- '''Mark actions with no F-Curves for deletion after save+reload of file preserving "action libraries"'''
+ '''Mark actions with no F-Curves for deletion after save+reload of ''' \
+ '''file preserving "action libraries"'''
bl_idname = "anim.clear_useless_actions"
bl_label = "Clear Useless Actions"
bl_options = {'REGISTER', 'UNDO'}
@@ -292,12 +293,14 @@ class ClearUselessActions(Operator):
if ((self.only_unused is False) or
(action.use_fake_user and action.users == 1)):
- # if it has F-Curves, then it's a "action library" (i.e. walk, wave, jump, etc.)
+ # if it has F-Curves, then it's a "action library"
+ # (i.e. walk, wave, jump, etc.)
# and should be left alone as that's what fake users are for!
if not action.fcurves:
# mark action for deletion
action.user_clear()
removed += 1
- self.report({'INFO'}, "Removed %d empty and/or fake-user only Actions" % (removed))
+ self.report({'INFO'}, "Removed %d empty and/or fake-user only Actions"
+ % removed)
return {'FINISHED'}
diff --git a/release/scripts/startup/bl_ui/properties_data_armature.py b/release/scripts/startup/bl_ui/properties_data_armature.py
index 96e10919806..708f485a0f8 100644
--- a/release/scripts/startup/bl_ui/properties_data_armature.py
+++ b/release/scripts/startup/bl_ui/properties_data_armature.py
@@ -74,6 +74,7 @@ class DATA_PT_skeleton(ArmatureButtonsPanel, Panel):
if context.scene.render.engine == "BLENDER_GAME":
layout.row().prop(arm, "vert_deformer", expand=True)
+
class DATA_PT_display(ArmatureButtonsPanel, Panel):
bl_label = _("Display")
@@ -185,9 +186,12 @@ class DATA_PT_pose_library(ArmatureButtonsPanel, Panel):
layout.template_ID(ob, "pose_library", new="poselib.new", unlink="poselib.unlink")
if poselib:
+ # list of poses in pose library
row = layout.row()
row.template_list(poselib, "pose_markers", poselib.pose_markers, "active_index", rows=5)
+ # column of operators for active pose
+ # - goes beside list
col = row.column(align=True)
col.active = (poselib.library is None)
@@ -203,7 +207,11 @@ class DATA_PT_pose_library(ArmatureButtonsPanel, Panel):
col.operator("poselib.pose_remove", icon='ZOOMOUT', text="").pose = pose_marker_active.name
col.operator("poselib.apply_pose", icon='ZOOM_SELECTED', text="").pose_index = poselib.pose_markers.active_index
- layout.operator("poselib.action_sanitise")
+ col.operator("poselib.action_sanitise", icon='HELP', text="") # XXX: put in menu?
+
+ # properties for active marker
+ if pose_marker_active is not None:
+ layout.prop(pose_marker_active, "name")
# TODO: this panel will soon be depreceated too
diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 40e455ef88e..8f1e1af4802 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -379,6 +379,10 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
col.label(text=_("Mirror Object:"))
col.prop(md, "mirror_object", text="")
+ def NAVMESH(self, layout, ob, md):
+ layout.operator("object.assign_navpolygon")
+ layout.operator("object.assign_new_navpolygon")
+
def MULTIRES(self, layout, ob, md):
layout.row().prop(md, "subdivision_type", expand=True)
@@ -608,32 +612,31 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
layout.label(text=_("Settings can be found inside the Physics context"))
def UV_PROJECT(self, layout, ob, md):
- if ob.type == 'MESH':
- split = layout.split()
+ split = layout.split()
- col = split.column()
- col.label(text=_("Image:"))
- col.prop(md, "image", text="")
+ col = split.column()
+ col.label(text=_("Image:"))
+ col.prop(md, "image", text="")
- col = split.column()
- col.label(text=_("UV Layer:"))
- col.prop_search(md, "uv_layer", ob.data, "uv_textures", text="")
+ col = split.column()
+ col.label(text=_("UV Layer:"))
+ col.prop_search(md, "uv_layer", ob.data, "uv_textures", text="")
- split = layout.split()
- col = split.column()
- col.prop(md, "use_image_override")
- col.prop(md, "projector_count", text=_("Projectors"))
- for proj in md.projectors:
- col.prop(proj, "object", text="")
+ split = layout.split()
+ col = split.column()
+ col.prop(md, "use_image_override")
+ col.prop(md, "projector_count", text=_("Projectors"))
+ for proj in md.projectors:
+ col.prop(proj, "object", text="")
- col = split.column()
- sub = col.column(align=True)
- sub.prop(md, "aspect_x", text=_("Aspect X"))
- sub.prop(md, "aspect_y", text=_("Aspect Y"))
+ col = split.column()
+ sub = col.column(align=True)
+ sub.prop(md, "aspect_x", text=_("Aspect X"))
+ sub.prop(md, "aspect_y", text=_("Aspect Y"))
- sub = col.column(align=True)
- sub.prop(md, "scale_x", text=_("Scale X"))
- sub.prop(md, "scale_y", text=_("Scale Y"))
+ sub = col.column(align=True)
+ sub.prop(md, "scale_x", text=_("Scale X"))
+ sub.prop(md, "scale_y", text=_("Scale Y"))
def WARP(self, layout, ob, md):
use_falloff = (md.falloff_type != 'NONE')
@@ -737,5 +740,119 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
col.prop(md, "width", slider=True)
col.prop(md, "narrowness", slider=True)
+ @staticmethod
+ def vertex_weight_mask(layout, ob, md):
+ layout.label(text="Influence/Mask Options:")
+
+ split = layout.split(percentage=0.4)
+ split.label(text="Global Influence:")
+ split.prop(md, "mask_constant", text="")
+
+ if not md.mask_texture:
+ split = layout.split(percentage=0.4)
+ split.label(text="Vertex Group Mask:")
+ split.prop_search(md, "mask_vertex_group", ob, "vertex_groups", text="")
+
+ if not md.mask_vertex_group:
+ split = layout.split(percentage=0.4)
+ split.label(text="Texture Mask:")
+ split.template_ID(md, "mask_texture", new="texture.new")
+ if md.mask_texture:
+ split = layout.split()
+
+ col = split.column()
+ col.label(text="Texture Coordinates:")
+ col.prop(md, "mask_tex_mapping", text="")
+
+ col = split.column()
+ col.label(text="Use Channel:")
+ col.prop(md, "mask_tex_use_channel", text="")
+
+ if md.mask_tex_mapping == 'OBJECT':
+ layout.prop(md, "mask_tex_map_object", text="Object")
+ elif md.mask_tex_mapping == 'UV' and ob.type == 'MESH':
+ layout.prop_search(md, "mask_tex_uv_layer", ob.data, "uv_textures")
+
+ def VERTEX_WEIGHT_EDIT(self, layout, ob, md):
+ split = layout.split()
+ col = split.column()
+ col.label(text="Vertex Group:")
+ col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+
+ col = split.column()
+ col.label(text="Default Weight:")
+ col.prop(md, "default_weight", text="")
+
+ layout.prop(md, "falloff_type")
+ if md.falloff_type == 'CURVE':
+ col = layout.column()
+ col.template_curve_mapping(md, "map_curve")
+
+ split = layout.split(percentage=0.4)
+ split.prop(md, "use_add")
+ row = split.row()
+ row.active = md.use_add
+ row.prop(md, "add_threshold")
+
+ split = layout.split(percentage=0.4)
+ split.prop(md, "use_remove")
+ row = split.row()
+ row.active = md.use_remove
+ row.prop(md, "remove_threshold")
+
+ # Common mask options
+ layout.separator()
+ self.vertex_weight_mask(layout, ob, md)
+
+ def VERTEX_WEIGHT_MIX(self, layout, ob, md):
+ split = layout.split()
+
+ col = split.column()
+ col.label(text="Vertex Group A:")
+ col.prop_search(md, "vertex_group_a", ob, "vertex_groups", text="")
+ col.label(text="Default Weight A:")
+ col.prop(md, "default_weight_a", text="")
+
+ col.label(text="Mix Mode:")
+ col.prop(md, "mix_mode", text="")
+
+ col = split.column()
+ col.label(text="Vertex Group B:")
+ col.prop_search(md, "vertex_group_b", ob, "vertex_groups", text="")
+ col.label(text="Default Weight B:")
+ col.prop(md, "default_weight_b", text="")
+
+ col.label(text="Mix Set:")
+ col.prop(md, "mix_set", text="")
+
+ # Common mask options
+ layout.separator()
+ self.vertex_weight_mask(layout, ob, md)
+
+ def VERTEX_WEIGHT_PROXIMITY(self, layout, ob, md):
+ split = layout.split()
+
+ col = split.column()
+ col.label(text="Vertex Group:")
+ col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+
+ col = split.column()
+ col.label(text="Target Object:")
+ col.prop(md, "target", text="")
+
+ layout.row().prop(md, "proximity_mode", expand=True)
+ if md.proximity_mode == 'GEOMETRY':
+ layout.row().prop(md, "proximity_geometry", expand=True)
+
+ row = layout.row()
+ row.prop(md, "min_dist")
+ row.prop(md, "max_dist")
+
+ layout.prop(md, "falloff_type")
+
+ # Common mask options
+ layout.separator()
+ self.vertex_weight_mask(layout, ob, md)
+
if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
diff --git a/release/scripts/startup/bl_ui/properties_data_speaker.py b/release/scripts/startup/bl_ui/properties_data_speaker.py
index 657c0fe652a..a1b86b51f5f 100644
--- a/release/scripts/startup/bl_ui/properties_data_speaker.py
+++ b/release/scripts/startup/bl_ui/properties_data_speaker.py
@@ -81,7 +81,7 @@ class DATA_PT_distance(DataButtonsPanel, bpy.types.Panel):
speaker = context.speaker
split = layout.split()
-
+
col = split.column()
col.label("Volume:")
col.prop(speaker, "volume_min", text="Minimum")
diff --git a/release/scripts/startup/bl_ui/properties_game.py b/release/scripts/startup/bl_ui/properties_game.py
index 123abdfe54a..52cdfc4ad00 100644
--- a/release/scripts/startup/bl_ui/properties_game.py
+++ b/release/scripts/startup/bl_ui/properties_game.py
@@ -196,6 +196,33 @@ class PHYSICS_PT_game_collision_bounds(PhysicsButtonsPanel, Panel):
row.prop(game, "use_collision_compound", text=_("Compound"))
+class PHYSICS_PT_game_obstacles(PhysicsButtonsPanel, Panel):
+ bl_label = "Create Obstacle"
+ COMPAT_ENGINES = {'BLENDER_GAME'}
+
+ @classmethod
+ def poll(cls, context):
+ game = context.object.game
+ rd = context.scene.render
+ return (game.physics_type in ('DYNAMIC', 'RIGID_BODY', 'SENSOR', 'SOFT_BODY', 'STATIC')) and (rd.engine in cls.COMPAT_ENGINES)
+
+ def draw_header(self, context):
+ game = context.active_object.game
+
+ self.layout.prop(game, "create_obstacle", text="")
+
+ def draw(self, context):
+ layout = self.layout
+
+ game = context.active_object.game
+
+ layout.active = game.create_obstacle
+
+ row = layout.row()
+ row.prop(game, "obstacle_radius", text="Radius")
+ row.label()
+
+
class RenderButtonsPanel():
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
@@ -344,7 +371,7 @@ class RENDER_PT_game_performance(RenderButtonsPanel, Panel):
row = col.row()
row.prop(gs, "use_frame_rate")
row.prop(gs, "use_display_lists")
-
+
col.prop(gs, "restrict_animation_updates")
@@ -364,6 +391,69 @@ class RENDER_PT_game_display(RenderButtonsPanel, Panel):
flow.prop(gs, "show_mouse", text=_("Mouse Cursor"))
+class SceneButtonsPanel():
+ bl_space_type = 'PROPERTIES'
+ bl_region_type = 'WINDOW'
+ bl_context = "scene"
+
+
+class SCENE_PT_game_navmesh(SceneButtonsPanel, bpy.types.Panel):
+ bl_label = "Navigation mesh"
+ bl_default_closed = True
+ COMPAT_ENGINES = {'BLENDER_GAME'}
+
+ @classmethod
+ def poll(cls, context):
+ scene = context.scene
+ return (scene and scene.render.engine in cls.COMPAT_ENGINES)
+
+ def draw(self, context):
+ layout = self.layout
+
+ rd = context.scene.game_settings.recast_data
+
+ layout.operator("object.create_navmesh", text='Build navigation mesh')
+
+ col = layout.column()
+ col.label(text="Rasterization:")
+ row = col.row()
+ row.prop(rd, "cell_size")
+ row.prop(rd, "cell_height")
+
+ col = layout.column()
+ col.label(text="Agent:")
+ split = col.split()
+
+ col = split.column()
+ col.prop(rd, "agent_height", text="Height")
+ col.prop(rd, "agent_radius", text="Radius")
+
+ col = split.column()
+ col.prop(rd, "max_slope")
+ col.prop(rd, "max_climb")
+
+ col = layout.column()
+ col.label(text="Region:")
+ row = col.row()
+ row.prop(rd, "region_min_size")
+ row.prop(rd, "region_merge_size")
+
+ col = layout.column()
+ col.label(text="Polygonization:")
+ split = col.split()
+
+ col = split.column()
+ col.prop(rd, "edge_max_len")
+ col.prop(rd, "edge_max_error")
+
+ split.prop(rd, "verts_per_poly")
+
+ col = layout.column()
+ col.label(text="Detail Mesh:")
+ row = col.row()
+ row.prop(rd, "sample_dist")
+ row.prop(rd, "sample_max_error")
+
class WorldButtonsPanel():
bl_space_type = 'PROPERTIES'
@@ -488,5 +578,25 @@ class WORLD_PT_game_physics(WorldButtonsPanel, Panel):
col.label(text=_("Logic Steps:"))
col.prop(gs, "logic_step_max", text=_("Max"))
+
+class WORLD_PT_game_physics_obstacles(WorldButtonsPanel, Panel):
+ bl_label = "Obstacle simulation"
+ COMPAT_ENGINES = {'BLENDER_GAME'}
+
+ @classmethod
+ def poll(cls, context):
+ scene = context.scene
+ return (scene.world and scene.render.engine in cls.COMPAT_ENGINES)
+
+ def draw(self, context):
+ layout = self.layout
+
+ gs = context.scene.game_settings
+
+ layout.prop(gs, "obstacle_simulation", text="Type")
+ if gs.obstacle_simulation != 'NONE':
+ layout.prop(gs, "level_height")
+ layout.prop(gs, "show_obstacle_simulation")
+
if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
diff --git a/release/scripts/startup/bl_ui/properties_physics_fluid.py b/release/scripts/startup/bl_ui/properties_physics_fluid.py
index cd808c2cf45..775ad116846 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fluid.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fluid.py
@@ -46,7 +46,7 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel, Panel):
row = layout.row()
if fluid is None:
- row.label(_("built without fluids"))
+ row.label(_("Built without fluids"))
return
row.prop(fluid, "type")
diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index 12f992903c7..c90497de29c 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -773,7 +773,18 @@ class USERPREF_MT_ndof_settings(Menu):
layout.separator()
layout.label(text="orbit options")
- layout.prop(input_prefs, "ndof_orbit_invert_axes")
+ if input_prefs.view_rotate_method == 'TRACKBALL':
+ layout.prop(input_prefs, "ndof_roll_invert_axis")
+ layout.prop(input_prefs, "ndof_tilt_invert_axis")
+ layout.prop(input_prefs, "ndof_rotate_invert_axis")
+ else:
+ layout.prop(input_prefs, "ndof_orbit_invert_axes")
+
+ layout.separator()
+ layout.label(text="pan options")
+ layout.prop(input_prefs, "ndof_panx_invert_axis")
+ layout.prop(input_prefs, "ndof_pany_invert_axis")
+ layout.prop(input_prefs, "ndof_panz_invert_axis")
layout.separator()
layout.label(text="fly options")
diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index 62836a20381..16d4b9b7fe6 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -55,6 +55,9 @@ def draw_gpencil_tools(context, layout):
row = col.row()
row.operator("gpencil.draw", text=_("Draw")).mode = 'DRAW'
row.operator("gpencil.draw", text=_("Line")).mode = 'DRAW_STRAIGHT'
+
+ row = col.row()
+ row.operator("gpencil.draw", text=_("Poly")).mode = 'DRAW_POLY'
row.operator("gpencil.draw", text=_("Erase")).mode = 'ERASER'
row = col.row()
@@ -766,9 +769,9 @@ class VIEW3D_PT_tools_brush_texture(PaintPanel, Panel):
col = row.column()
if brush.use_texture_overlay:
- col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='MUTE_IPO_OFF')
+ col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='RESTRICT_VIEW_OFF')
else:
- col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='MUTE_IPO_ON')
+ col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='RESTRICT_VIEW_ON')
col.active = tex_slot.map_mode in {'FIXED', 'TILED'}
diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c
index fb6505fe935..3bec7dd2626 100644
--- a/source/blender/blenfont/intern/blf_font.c
+++ b/source/blender/blenfont/intern/blf_font.c
@@ -97,17 +97,59 @@ void blf_font_size(FontBLF *font, int size, int dpi)
}
}
+static void blf_font_ensure_ascii_table(FontBLF *font)
+{
+ GlyphBLF **glyph_ascii_table= font->glyph_cache->glyph_ascii_table;
+
+ /* build ascii on demand */
+ if(glyph_ascii_table['0']==NULL) {
+ GlyphBLF *g;
+ unsigned int i;
+ for(i=0; i<256; i++) {
+ g= blf_glyph_search(font->glyph_cache, i);
+ if (!g) {
+ FT_UInt glyph_index= FT_Get_Char_Index(font->face, i);
+ g= blf_glyph_add(font, glyph_index, i);
+ }
+ glyph_ascii_table[i]= g;
+ }
+ }
+}
+
+/* Fast path for runs of ASCII characters. Given that common UTF-8
+ * input will consist of an overwhelming majority of ASCII
+ * characters.
+ */
+
+/* Note,
+ * blf_font_ensure_ascii_table(font); must be called before this macro */
+
+#define BLF_UTF8_NEXT_FAST(font, g, str, i, c, glyph_ascii_table) \
+ if(((c)= (str)[i]) < 0x80) { \
+ g= (glyph_ascii_table)[c]; \
+ i++; \
+ } \
+ else if ((c= blf_utf8_next((unsigned char *)(str), &(i)))) { \
+ if ((g= blf_glyph_search((font)->glyph_cache, c)) == NULL) { \
+ g= blf_glyph_add(font, FT_Get_Char_Index((font)->face, c), c); \
+ } \
+ } \
+
+
+
void blf_font_draw(FontBLF *font, const char *str, unsigned int len)
{
unsigned int c;
GlyphBLF *g, *g_prev;
FT_Vector delta;
- FT_UInt glyph_index;
int pen_x, pen_y;
- int i, has_kerning, st;
+ int has_kerning, st;
+ unsigned int i;
+ GlyphBLF **glyph_ascii_table;
if (!font->glyph_cache)
return;
+ glyph_ascii_table= font->glyph_cache->glyph_ascii_table;
i= 0;
pen_x= 0;
@@ -115,17 +157,15 @@ void blf_font_draw(FontBLF *font, const char *str, unsigned int len)
has_kerning= FT_HAS_KERNING(font->face);
g_prev= NULL;
+ blf_font_ensure_ascii_table(font);
+
while (str[i] && i < len) {
- c= blf_utf8_next((unsigned char *)str, &i);
+
+ BLF_UTF8_NEXT_FAST(font, g, str, i, c, glyph_ascii_table);
+
if (c == 0)
break;
- g= blf_glyph_search(font->glyph_cache, c);
- if (!g) {
- glyph_index= FT_Get_Char_Index(font->face, c);
- g= blf_glyph_add(font, glyph_index, c);
- }
-
/* if we don't found a glyph, skip it. */
if (!g)
continue;
@@ -157,32 +197,23 @@ void blf_font_draw_ascii(FontBLF *font, const char *str, unsigned int len)
char c;
GlyphBLF *g, *g_prev;
FT_Vector delta;
- FT_UInt glyph_index;
int pen_x, pen_y;
- int i, has_kerning, st;
+ int has_kerning, st;
+ GlyphBLF **glyph_ascii_table;
if (!font->glyph_cache)
return;
+ glyph_ascii_table= font->glyph_cache->glyph_ascii_table;
pen_x= 0;
pen_y= 0;
has_kerning= FT_HAS_KERNING(font->face);
g_prev= NULL;
- /* build ascii on demand */
- if(font->glyph_ascii_table['0']==NULL) {
- for(i=0; i<256; i++) {
- g= blf_glyph_search(font->glyph_cache, i);
- if (!g) {
- glyph_index= FT_Get_Char_Index(font->face, i);
- g= blf_glyph_add(font, glyph_index, i);
- }
- font->glyph_ascii_table[i]= g;
- }
- }
-
+ blf_font_ensure_ascii_table(font);
+
while ((c= *(str++)) && len--) {
- g= font->glyph_ascii_table[c];
+ g= glyph_ascii_table[c];
/* if we don't found a glyph, skip it. */
if (!g)
@@ -216,13 +247,15 @@ void blf_font_buffer(FontBLF *font, const char *str)
unsigned char b_col_char[4];
GlyphBLF *g, *g_prev;
FT_Vector delta;
- FT_UInt glyph_index;
float a, *fbuf;
int pen_x, y, x;
- int i, has_kerning, st, chx, chy;
+ int has_kerning, st, chx, chy;
+ unsigned int i;
+ GlyphBLF **glyph_ascii_table;
if (!font->glyph_cache || (!font->b_fbuf && !font->b_cbuf))
return;
+ glyph_ascii_table= font->glyph_cache->glyph_ascii_table;
i= 0;
pen_x= (int)font->pos[0];
@@ -234,18 +267,16 @@ void blf_font_buffer(FontBLF *font, const char *str)
b_col_char[2]= font->b_col[2] * 255;
b_col_char[3]= font->b_col[3] * 255;
+ blf_font_ensure_ascii_table(font);
+
while (str[i]) {
int pen_y;
- c= blf_utf8_next((unsigned char *)str, &i);
+
+ BLF_UTF8_NEXT_FAST(font, g, str, i, c, glyph_ascii_table);
+
if (c == 0)
break;
- g= blf_glyph_search(font->glyph_cache, c);
- if (!g) {
- glyph_index= FT_Get_Char_Index(font->face, c);
- g= blf_glyph_add(font, glyph_index, c);
- }
-
/* if we don't found a glyph, skip it. */
if (!g)
continue;
@@ -363,10 +394,11 @@ void blf_font_boundbox(FontBLF *font, const char *str, rctf *box)
unsigned int c;
GlyphBLF *g, *g_prev;
FT_Vector delta;
- FT_UInt glyph_index;
rctf gbox;
int pen_x, pen_y;
- int i, has_kerning, st;
+ int has_kerning, st;
+ unsigned int i;
+ GlyphBLF **glyph_ascii_table;
if (!font->glyph_cache)
return;
@@ -382,17 +414,16 @@ void blf_font_boundbox(FontBLF *font, const char *str, rctf *box)
has_kerning= FT_HAS_KERNING(font->face);
g_prev= NULL;
+ blf_font_ensure_ascii_table(font);
+ glyph_ascii_table= font->glyph_cache->glyph_ascii_table;
+
while (str[i]) {
- c= blf_utf8_next((unsigned char *)str, &i);
+
+ BLF_UTF8_NEXT_FAST(font, g, str, i, c, glyph_ascii_table);
+
if (c == 0)
break;
- g= blf_glyph_search(font->glyph_cache, c);
- if (!g) {
- glyph_index= FT_Get_Char_Index(font->face, c);
- g= blf_glyph_add(font, glyph_index, c);
- }
-
/* if we don't found a glyph, skip it. */
if (!g)
continue;
@@ -534,7 +565,7 @@ void blf_font_free(FontBLF *font)
static void blf_font_fill(FontBLF *font)
{
- int i;
+ unsigned int i;
font->aspect[0]= 1.0f;
font->aspect[1]= 1.0f;
@@ -568,8 +599,6 @@ static void blf_font_fill(FontBLF *font)
font->b_col[2]= 0;
font->b_col[3]= 0;
font->ft_lib= ft_lib;
-
- memset(font->glyph_ascii_table, 0, sizeof(font->glyph_ascii_table));
}
FontBLF *blf_font_new(const char *name, const char *filename)
diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c
index e165012f43e..9b39cb65cba 100644
--- a/source/blender/blenfont/intern/blf_glyph.c
+++ b/source/blender/blenfont/intern/blf_glyph.c
@@ -74,7 +74,6 @@ GlyphCacheBLF *blf_glyph_cache_find(FontBLF *font, int size, int dpi)
GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font)
{
GlyphCacheBLF *gc;
- int i;
gc= (GlyphCacheBLF *)MEM_mallocN(sizeof(GlyphCacheBLF), "blf_glyph_cache_new");
gc->next= NULL;
@@ -82,10 +81,8 @@ GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font)
gc->size= font->size;
gc->dpi= font->dpi;
- for (i= 0; i < 257; i++) {
- gc->bucket[i].first= NULL;
- gc->bucket[i].last= NULL;
- }
+ memset(gc->glyph_ascii_table, 0, sizeof(gc->glyph_ascii_table));
+ memset(gc->bucket, 0, sizeof(gc->bucket));
gc->textures= (GLuint *)malloc(sizeof(GLuint)*256);
gc->ntex= 256;
@@ -136,7 +133,9 @@ void blf_glyph_cache_clear(FontBLF *font)
}
}
- memset(font->glyph_ascii_table, 0, sizeof(font->glyph_ascii_table));
+ if(font->glyph_cache) {
+ memset(font->glyph_cache->glyph_ascii_table, 0, sizeof(font->glyph_cache->glyph_ascii_table));
+ }
}
void blf_glyph_cache_free(GlyphCacheBLF *gc)
diff --git a/source/blender/blenfont/intern/blf_internal.h b/source/blender/blenfont/intern/blf_internal.h
index 9271d8d5a9e..ba0b9985dd4 100644
--- a/source/blender/blenfont/intern/blf_internal.h
+++ b/source/blender/blenfont/intern/blf_internal.h
@@ -40,7 +40,7 @@ struct rctf;
unsigned int blf_next_p2(unsigned int x);
unsigned int blf_hash(unsigned int val);
-int blf_utf8_next(unsigned char *buf, int *iindex);
+int blf_utf8_next(unsigned char *buf, unsigned int *iindex);
char *blf_dir_search(const char *file);
char *blf_dir_metrics_search(const char *filename);
diff --git a/source/blender/blenfont/intern/blf_internal_types.h b/source/blender/blenfont/intern/blf_internal_types.h
index c4e192626e8..9840e6446ef 100644
--- a/source/blender/blenfont/intern/blf_internal_types.h
+++ b/source/blender/blenfont/intern/blf_internal_types.h
@@ -46,6 +46,9 @@ typedef struct GlyphCacheBLF {
/* and the glyphs. */
ListBase bucket[257];
+ /* fast ascii lookup */
+ struct GlyphBLF *glyph_ascii_table[256];
+
/* texture array, to draw the glyphs. */
GLuint *textures;
@@ -184,9 +187,6 @@ typedef struct FontBLF {
/* current glyph cache, size and dpi. */
GlyphCacheBLF *glyph_cache;
-
- /* fast ascii lookip */
- GlyphBLF *glyph_ascii_table[256];
/* freetype2 lib handle. */
FT_Library ft_lib;
diff --git a/source/blender/blenfont/intern/blf_lang.c b/source/blender/blenfont/intern/blf_lang.c
index ed03a329ffb..cfa7514f9af 100644
--- a/source/blender/blenfont/intern/blf_lang.c
+++ b/source/blender/blenfont/intern/blf_lang.c
@@ -67,7 +67,7 @@ static char global_language[32];
static char global_encoding_name[32];
/* map from the rna_userdef.c:rna_def_userdef_system(BlenderRNA *brna):language_items */
-static char *locales[] = {
+static const char *locales[] = {
"", "",
"english", "en_US",
"japanese", "ja_JP",
@@ -112,7 +112,7 @@ void BLF_lang_init(void)
void BLF_lang_set(const char *str)
{
char *locreturn;
- char *short_locale;
+ const char *short_locale;
#if defined (_WIN32)
char *long_locale = locales[ 2 * U.language];
#endif
diff --git a/source/blender/blenfont/intern/blf_util.c b/source/blender/blenfont/intern/blf_util.c
index ab6b516787e..edd23ac1ba6 100644
--- a/source/blender/blenfont/intern/blf_util.c
+++ b/source/blender/blenfont/intern/blf_util.c
@@ -72,7 +72,7 @@ unsigned int blf_hash(unsigned int val)
* The original name: imlib_font_utf8_get_next
* more info here: http://docs.enlightenment.org/api/imlib2/html/
*/
-int blf_utf8_next(unsigned char *buf, int *iindex)
+int blf_utf8_next(unsigned char *buf, unsigned int *iindex)
{
/* Reads UTF8 bytes from 'buf', starting at 'index' and
* returns the code point of the next valid code point.
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index 0f19cfbc481..742240d53b5 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -44,7 +44,7 @@ extern "C" {
* and keep comment above the defines.
* Use STRINGIFY() rather than defining with quotes */
#define BLENDER_VERSION 259
-#define BLENDER_SUBVERSION 1
+#define BLENDER_SUBVERSION 2
#define BLENDER_MINVERSION 250
#define BLENDER_MINSUBVERSION 0
diff --git a/source/blender/blenkernel/BKE_colortools.h b/source/blender/blenkernel/BKE_colortools.h
index 744ed9dba9c..5b40fa5d758 100644
--- a/source/blender/blenkernel/BKE_colortools.h
+++ b/source/blender/blenkernel/BKE_colortools.h
@@ -55,7 +55,7 @@ void floatbuf_to_byte(float *rectf, unsigned char *rectc, int x1, int x2, int
struct CurveMapping *curvemapping_add(int tot, float minx, float miny, float maxx, float maxy);
void curvemapping_free(struct CurveMapping *cumap);
struct CurveMapping *curvemapping_copy(struct CurveMapping *cumap);
-void curvemapping_set_black_white(struct CurveMapping *cumap, float *black, float *white);
+void curvemapping_set_black_white(struct CurveMapping *cumap, const float black[3], const float white[3]);
#define CURVEMAP_SLOPE_NEGATIVE 0
#define CURVEMAP_SLOPE_POSITIVE 1
@@ -70,9 +70,9 @@ void curvemapping_changed(struct CurveMapping *cumap, int rem_doubles);
float curvemap_evaluateF(struct CurveMap *cuma, float value);
/* single curve, with table check */
float curvemapping_evaluateF(struct CurveMapping *cumap, int cur, float value);
-void curvemapping_evaluate3F(struct CurveMapping *cumap, float *vecout, const float *vecin);
-void curvemapping_evaluateRGBF(struct CurveMapping *cumap, float *vecout, const float *vecin);
-void curvemapping_evaluate_premulRGBF(struct CurveMapping *cumap, float *vecout, const float *vecin);
+void curvemapping_evaluate3F(struct CurveMapping *cumap, float vecout[3], const float vecin[3]);
+void curvemapping_evaluateRGBF(struct CurveMapping *cumap, float vecout[3], const float vecin[3]);
+void curvemapping_evaluate_premulRGBF(struct CurveMapping *cumap, float vecout[3], const float vecin[3]);
void curvemapping_do_ibuf(struct CurveMapping *cumap, struct ImBuf *ibuf);
void curvemapping_premultiply(struct CurveMapping *cumap, int restore);
int curvemapping_RGBA_does_something(struct CurveMapping *cumap);
diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index 557ce417b14..02fc70e41e8 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -34,14 +34,16 @@
* \since March 2001
* \author nzc
*/
+
+struct BevList;
+struct BezTriple;
struct Curve;
+struct EditNurb;
struct ListBase;
+struct ListBase;
+struct Nurb;
struct Object;
struct Scene;
-struct Nurb;
-struct ListBase;
-struct BezTriple;
-struct BevList;
#define KNOTSU(nu) ( (nu)->orderu+ (nu)->pntsu+ (((nu)->flagu & CU_NURB_CYCLIC) ? ((nu)->orderu-1) : 0) )
#define KNOTSV(nu) ( (nu)->orderv+ (nu)->pntsv+ (((nu)->flagv & CU_NURB_CYCLIC) ? ((nu)->orderv-1) : 0) )
@@ -55,11 +57,14 @@ struct BevList;
void unlink_curve( struct Curve *cu);
+void free_curve_editNurb_keyIndex(struct EditNurb *editnurb);
+void free_curve_editNurb(struct Curve *cu);
void free_curve( struct Curve *cu);
void BKE_free_editfont(struct Curve *cu);
struct Curve *add_curve(const char *name, int type);
struct Curve *copy_curve( struct Curve *cu);
void make_local_curve( struct Curve *cu);
+struct ListBase *curve_editnurbs(struct Curve *cu);
short curve_type( struct Curve *cu);
void test_curve_type( struct Object *ob);
void tex_space_curve( struct Curve *cu);
diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h
index 17876c6ec9d..0e48673f1b1 100644
--- a/source/blender/blenkernel/BKE_global.h
+++ b/source/blender/blenkernel/BKE_global.h
@@ -111,7 +111,7 @@ typedef struct Global {
#define G_SCRIPT_OVERRIDE_PREF (1 << 14) /* when this flag is set ignore the userprefs */
/* #define G_NOFROZEN (1 << 17) also removed */
-#define G_GREASEPENCIL (1 << 17)
+/* #define G_GREASEPENCIL (1 << 17) also removed */
/* #define G_AUTOMATKEYS (1 << 30) also removed */
diff --git a/source/blender/blenkernel/BKE_material.h b/source/blender/blenkernel/BKE_material.h
index 88965d12e4a..85b6f8f78fb 100644
--- a/source/blender/blenkernel/BKE_material.h
+++ b/source/blender/blenkernel/BKE_material.h
@@ -89,7 +89,7 @@ void end_render_materials(struct Main *);
int material_in_material(struct Material *parmat, struct Material *mat);
-void ramp_blend(int type, float *r, float *g, float *b, float fac, float *col);
+void ramp_blend(int type, float *r, float *g, float *b, float fac, const float col[3]);
/* copy/paste */
void clear_matcopybuf(void);
diff --git a/source/blender/blenkernel/BKE_navmesh_conversion.h b/source/blender/blenkernel/BKE_navmesh_conversion.h
new file mode 100644
index 00000000000..acb3c2963a9
--- /dev/null
+++ b/source/blender/blenkernel/BKE_navmesh_conversion.h
@@ -0,0 +1,64 @@
+/**
+* $Id$
+*
+* ***** BEGIN GPL LICENSE BLOCK *****
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+* 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 LICENSE BLOCK *****
+*/
+
+#ifndef BKE_NAVMESH_CONVERSION_H
+#define BKE_NAVMESH_CONVERSION_H
+
+struct DerivedMesh;
+
+/* navmesh_conversion.cpp */
+bool buildNavMeshDataByDerivedMesh(DerivedMesh *dm, int& vertsPerPoly,
+ int &nverts, float *&verts,
+ int &ndtris, unsigned short *&dtris,
+ int& npolys, unsigned short *&dmeshes,
+ unsigned short*& polys, int *&dtrisToPolysMap,
+ int *&dtrisToTrisMap, int *&trisToFacesMap);
+
+bool buildRawVertIndicesData(DerivedMesh* dm, int &nverts, float *&verts,
+ int &ntris, unsigned short *&tris, int *&trisToFacesMap,
+ int *&recastData);
+
+bool buildNavMeshData(const int nverts, const float* verts,
+ const int ntris, const unsigned short *tris,
+ const int* recastData, const int* trisToFacesMap,
+ int &ndtris, unsigned short *&dtris,
+ int &npolys, unsigned short *&dmeshes, unsigned short *&polys,
+ int &vertsPerPoly, int *&dtrisToPolysMap, int *&dtrisToTrisMap);
+
+bool buildPolygonsByDetailedMeshes(const int vertsPerPoly, const int npolys,
+ unsigned short* polys, const unsigned short* dmeshes,
+ const float* verts, const unsigned short* dtris,
+ const int* dtrisToPolysMap);
+
+int polyNumVerts(const unsigned short* p, const int vertsPerPoly);
+bool polyIsConvex(const unsigned short* p, const int vertsPerPoly, const float* verts);
+int polyFindVertex(const unsigned short* p, const int vertsPerPoly, unsigned short vertexIdx);
+float distPointToSegmentSq(const float* point, const float* a, const float* b);
+
+#endif //NAVMESH_CONVERSION_H
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index e44b5d96852..1de3c295f4d 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -37,6 +37,10 @@
* \ingroup bke
*/
+#include "DNA_listBase.h"
+
+#include "RNA_types.h"
+
/* not very important, but the stack solver likes to know a maximum */
#define MAX_SOCKET 64
@@ -46,63 +50,151 @@ struct bNodeLink;
struct bNodeSocket;
struct bNodeStack;
struct bNodeTree;
+struct bNodeTreeExec;
struct GPUMaterial;
struct GPUNode;
struct GPUNodeStack;
struct ID;
struct ListBase;
struct Main;
+struct uiBlock;
+struct uiLayout;
struct MTex;
struct PointerRNA;
struct rctf;
struct RenderData;
struct Scene;
struct Tex;
-struct uiLayout;
-
+struct SpaceNode;
+struct ARegion;
+struct Object;
/* ************** NODE TYPE DEFINITIONS ***** */
-typedef struct bNodeSocketType {
+/** Compact definition of a node socket.
+ * Can be used to quickly define a list of static sockets for a node,
+ * which are added to each new node of that type.
+ *
+ * \deprecated New nodes should add default sockets in the initialization
+ * function instead. This struct is mostly kept for old nodes and should
+ * be removed some time.
+ */
+typedef struct bNodeSocketTemplate {
int type, limit;
- const char *name;
- float val1, val2, val3, val4; /* default alloc value for inputs */
- float min, max; /* default range for inputs */
+ char name[32];
+ float val1, val2, val3, val4; /* default alloc value for inputs */
+ float min, max;
+ PropertySubType subtype;
/* after this line is used internal only */
- struct bNodeSocket *sock; /* used during verify_types */
+ struct bNodeSocket *sock; /* used to hold verified socket */
+} bNodeSocketTemplate;
+
+typedef void (*NodeSocketButtonFunction)(const struct bContext *C, struct uiBlock *block,
+ struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock,
+ const char *name, int x, int y, int width);
+
+/** Defines a socket type.
+ * Defines the appearance and behavior of a socket in the UI.
+ */
+typedef struct bNodeSocketType {
+ int type;
+ char ui_name[32];
+ char ui_description[128];
+ int ui_icon;
+ char ui_color[4];
+
+ const char *value_structname;
+ int value_structsize;
+
+ NodeSocketButtonFunction buttonfunc;
} bNodeSocketType;
+/** Template for creating a node.
+ * Stored required parameters to make a new node of a specific type.
+ */
+typedef struct bNodeTemplate {
+ int type;
+
+ /* group tree */
+ struct bNodeTree *ngroup;
+} bNodeTemplate;
+
+/** Defines a node type.
+ * Initial attributes and constants for a node as well as callback functions
+ * implementing the node behavior.
+ */
typedef struct bNodeType {
void *next,*prev;
+ short needs_free; /* set for allocated types that need to be freed */
+
int type;
- const char *name; /* can be allocated too */
+ char name[32];
float width, minwidth, maxwidth;
+ float height, minheight, maxheight;
short nclass, flag;
- bNodeSocketType *inputs, *outputs;
+ /* templates for static sockets */
+ bNodeSocketTemplate *inputs, *outputs;
char storagename[64]; /* struct name for DNA */
- void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **);
-
- /* this line is set on startup of blender */
+ /// Main draw function for the node.
+ void (*drawfunc)(const struct bContext *C, struct ARegion *ar, struct SpaceNode *snode, struct bNodeTree *ntree, struct bNode *node);
+ /// Updates the node geometry attributes according to internal state before actual drawing.
+ void (*drawupdatefunc)(const struct bContext *C, struct bNodeTree *ntree, struct bNode *node);
+ /// Draw the option buttons on the node.
void (*uifunc)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr);
+ /// Additional parameters in the side panel.
void (*uifuncbut)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr);
+ /// Optional custom label function for the node header.
const char *(*labelfunc)(struct bNode *);
-
- void (*initfunc)(struct bNode *);
- void (*freestoragefunc)(struct bNode *);
- void (*copystoragefunc)(struct bNode *, struct bNode *);
+ /// Optional custom resize handle polling.
+ int (*resize_area_func)(struct bNode *node, int x, int y);
- /* for use with dynamic typedefs */
- ID *id;
- void *pynode; /* holds pointer to python script */
- void *pydict; /* holds pointer to python script dictionary (scope)*/
-
+ /// Called when the node is updated in the editor.
+ void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node);
+ /// Check and update if internal ID data has changed.
+ void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id);
+
+ /// Initialize a new node instance of this type after creation.
+ void (*initfunc)(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp);
+ /// Free the custom storage data.
+ void (*freestoragefunc)(struct bNode *node);
+ /// Make a copy of the custom storage data.
+ void (*copystoragefunc)(struct bNode *node, struct bNode *target);
+
+ /// Create a template from an existing node.
+ struct bNodeTemplate (*templatefunc)(struct bNode *);
+ /** If a node can be made from the template in the given node tree.
+ * \example Node groups can not be created inside their own node tree.
+ */
+ int (*validfunc)(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
+
+ /// Initialize a node tree associated to this node type.
+ void (*inittreefunc)(struct bNodeTree *ntree);
+ /// Update a node tree associated to this node type.
+ void (*updatetreefunc)(struct bNodeTree *ntree);
+
+ /* group edit callbacks for operators */
+ /* XXX this is going to be changed as required by the UI */
+ struct bNodeTree *(*group_edit_get)(struct bNode *node);
+ struct bNodeTree *(*group_edit_set)(struct bNode *node, int edit);
+ void (*group_edit_clear)(struct bNode *node);
+
+
+ /* **** execution callbacks **** */
+ void *(*initexecfunc)(struct bNode *node);
+ void (*freeexecfunc)(struct bNode *node, void *nodedata);
+ void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **);
+ /* XXX this alternative exec function has been added to avoid changing all node types.
+ * when a final generic version of execution code is defined, this will be changed anyway
+ */
+ void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **);
/* gpu */
int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out);
-
+ /* extended gpu function */
+ int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node, void *nodedata, struct GPUNodeStack *in, struct GPUNodeStack *out);
} bNodeType;
/* node->exec, now in use for composites (#define for break is same as ready yes) */
@@ -113,72 +205,124 @@ typedef struct bNodeType {
#define NODE_FREEBUFS 8
#define NODE_SKIPPED 16
+/* sim_exec return value */
+#define NODE_EXEC_FINISHED 0
+#define NODE_EXEC_SUSPEND 1
+
/* nodetype->nclass, for add-menu and themes */
-#define NODE_CLASS_INPUT 0
-#define NODE_CLASS_OUTPUT 1
-#define NODE_CLASS_OP_COLOR 3
-#define NODE_CLASS_OP_VECTOR 4
-#define NODE_CLASS_OP_FILTER 5
-#define NODE_CLASS_GROUP 6
-#define NODE_CLASS_FILE 7
-#define NODE_CLASS_CONVERTOR 8
-#define NODE_CLASS_MATTE 9
-#define NODE_CLASS_DISTORT 10
-#define NODE_CLASS_OP_DYNAMIC 11
-#define NODE_CLASS_PATTERN 12
-#define NODE_CLASS_TEXTURE 13
+#define NODE_CLASS_INPUT 0
+#define NODE_CLASS_OUTPUT 1
+#define NODE_CLASS_OP_COLOR 3
+#define NODE_CLASS_OP_VECTOR 4
+#define NODE_CLASS_OP_FILTER 5
+#define NODE_CLASS_GROUP 6
+#define NODE_CLASS_FILE 7
+#define NODE_CLASS_CONVERTOR 8
+#define NODE_CLASS_MATTE 9
+#define NODE_CLASS_DISTORT 10
+#define NODE_CLASS_OP_DYNAMIC 11
+#define NODE_CLASS_PATTERN 12
+#define NODE_CLASS_TEXTURE 13
+#define NODE_CLASS_EXECUTION 14
+#define NODE_CLASS_GETDATA 15
+#define NODE_CLASS_SETDATA 16
+#define NODE_CLASS_MATH 17
+#define NODE_CLASS_MATH_VECTOR 18
+#define NODE_CLASS_MATH_ROTATION 19
+#define NODE_CLASS_PARTICLES 25
+#define NODE_CLASS_TRANSFORM 30
+#define NODE_CLASS_COMBINE 31
+#define NODE_CLASS_LAYOUT 100
/* enum values for input/output */
#define SOCK_IN 1
#define SOCK_OUT 2
+struct bNodeTreeExec;
+
+typedef void (*bNodeTreeCallback)(void *calldata, struct ID *owner_id, struct bNodeTree *ntree);
+typedef struct bNodeTreeType
+{
+ int type; /* type identifier */
+ char idname[64]; /* id name for RNA identification */
+
+ ListBase node_types; /* type definitions */
+
+ /* callbacks */
+ void (*free_cache)(struct bNodeTree *ntree);
+ void (*free_node_cache)(struct bNodeTree *ntree, struct bNode *node);
+ void (*foreach_nodetree)(struct Main *main, void *calldata, bNodeTreeCallback func); /* iteration over all node trees */
+
+ /* calls allowing threaded composite */
+ void (*localize)(struct bNodeTree *localtree, struct bNodeTree *ntree);
+ void (*local_sync)(struct bNodeTree *localtree, struct bNodeTree *ntree);
+ void (*local_merge)(struct bNodeTree *localtree, struct bNodeTree *ntree);
+
+ /* Tree update. Overrides nodetype->updatetreefunc! */
+ void (*update)(struct bNodeTree *ntree);
+ /* Node update. Overrides nodetype->updatefunc! */
+ void (*update_node)(struct bNodeTree *ntree, struct bNode *node);
+
+ int (*validate_link)(struct bNodeTree *ntree, struct bNodeLink *link);
+} bNodeTreeType;
+
/* ************** GENERIC API, TREES *************** */
-void ntreeVerifyTypes(struct bNodeTree *ntree);
+struct bNodeTreeType *ntreeGetType(int type);
+struct bNodeType *ntreeGetNodeType(struct bNodeTree *ntree);
+struct bNodeSocketType *ntreeGetSocketType(int type);
-struct bNodeTree *ntreeAddTree(const char *name, int type, const short is_group);
+struct bNodeTree *ntreeAddTree(const char *name, int type, int nodetype);
void ntreeInitTypes(struct bNodeTree *ntree);
-//void ntreeMakeGroupSockets(struct bNodeTree *ntree);
-void ntreeUpdateType(struct bNodeTree *ntree, struct bNodeType *ntype);
void ntreeFreeTree(struct bNodeTree *ntree);
struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree);
void ntreeSwitchID(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sce_to);
void ntreeMakeLocal(struct bNodeTree *ntree);
+int ntreeHasType(struct bNodeTree *ntree, int type);
void ntreeSocketUseFlags(struct bNodeTree *ntree);
-void ntreeSolveOrder(struct bNodeTree *ntree);
+void ntreeUpdateTree(struct bNodeTree *ntree);
+/* XXX Currently each tree update call does call to ntreeVerifyNodes too.
+ * Some day this should be replaced by a decent depsgraph automatism!
+ */
+void ntreeVerifyNodes(struct Main *main, struct ID *id);
-void ntreeBeginExecTree(struct bNodeTree *ntree);
-void ntreeExecTree(struct bNodeTree *ntree, void *callerdata, int thread);
-void ntreeCompositExecTree(struct bNodeTree *ntree, struct RenderData *rd, int do_previews);
-void ntreeEndExecTree(struct bNodeTree *ntree);
+void ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, int *totnodes);
+/* XXX old trees handle output flags automatically based on special output node types and last active selection.
+ * new tree types have a per-output socket flag to indicate the final output to use explicitly.
+ */
+void ntreeSetOutput(struct bNodeTree *ntree);
void ntreeInitPreview(struct bNodeTree *, int xsize, int ysize);
void ntreeClearPreview(struct bNodeTree *ntree);
void ntreeFreeCache(struct bNodeTree *ntree);
-
- /* calls allowing threaded composite */
+
+int ntreeNodeExists(struct bNodeTree *ntree, struct bNode *testnode);
+int ntreeOutputExists(struct bNode *node, struct bNodeSocket *testsock);
struct bNodeTree *ntreeLocalize(struct bNodeTree *ntree);
void ntreeLocalSync(struct bNodeTree *localtree, struct bNodeTree *ntree);
void ntreeLocalMerge(struct bNodeTree *localtree, struct bNodeTree *ntree);
/* ************** GENERIC API, NODES *************** */
-void nodeVerifyType(struct bNodeTree *ntree, struct bNode *node);
+struct bNodeSocket *nodeAddSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, const char *name, int type);
+struct bNodeSocket *nodeInsertSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, struct bNodeSocket *next_sock, const char *name, int type);
+void nodeRemoveSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock);
+void nodeRemoveAllSockets(struct bNodeTree *ntree, struct bNode *node);
void nodeAddToPreview(struct bNode *, float *, int, int, int);
+struct bNode *nodeAddNode(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
void nodeUnlinkNode(struct bNodeTree *ntree, struct bNode *node);
void nodeUniqueName(struct bNodeTree *ntree, struct bNode *node);
-void nodeAddSockets(struct bNode *node, struct bNodeType *ntype);
-struct bNode *nodeAddNodeType(struct bNodeTree *ntree, int type, struct bNodeTree *ngroup, struct ID *id);
-void nodeRegisterType(struct ListBase *typelist, const struct bNodeType *ntype) ;
-void nodeUpdateType(struct bNodeTree *ntree, struct bNode* node, struct bNodeType *ntype);
+
+void nodeRegisterType(struct ListBase *typelist, struct bNodeType *ntype) ;
void nodeMakeDynamicType(struct bNode *node);
int nodeDynamicUnlinkText(struct ID *txtid);
+
void nodeFreeNode(struct bNodeTree *ntree, struct bNode *node);
struct bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node);
@@ -186,6 +330,10 @@ struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, s
void nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
void nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
+void nodeSpaceCoords(struct bNode *node, float *locx, float *locy);
+void nodeAttachNode(struct bNode *node, struct bNode *parent);
+void nodeDetachNode(struct bNode *node);
+
struct bNode *nodeFindNodebyName(struct bNodeTree *ntree, const char *name);
int nodeFindNode(struct bNodeTree *ntree, struct bNodeSocket *sock, struct bNode **nodep, int *sockindex, int *in_out);
@@ -202,41 +350,71 @@ void NodeTagChanged(struct bNodeTree *ntree, struct bNode *node);
int NodeTagIDChanged(struct bNodeTree *ntree, struct ID *id);
void ntreeClearTags(struct bNodeTree *ntree);
-/* ************** Groups ****************** */
-
-struct bNode *nodeMakeGroupFromSelected(struct bNodeTree *ntree);
-int nodeGroupUnGroup(struct bNodeTree *ntree, struct bNode *gnode);
-
-void nodeGroupVerify(struct bNodeTree *ngroup);
-void nodeGroupSocketUseFlags(struct bNodeTree *ngroup);
-
-void nodeGroupCopy(struct bNode *gnode);
+void nodeFreePreview(struct bNode *node);
-struct bNodeSocket *nodeGroupAddSocket(struct bNodeTree *ngroup, const char *name, int type, int in_out);
-struct bNodeSocket *nodeGroupExposeSocket(struct bNodeTree *ngroup, struct bNodeSocket *sock, int in_out);
-void nodeGroupExposeAllSockets(struct bNodeTree *ngroup);
-void nodeGroupRemoveSocket(struct bNodeTree *ngroup, struct bNodeSocket *gsock, int in_out);
+/* ************** NODE TYPE ACCESS *************** */
-/* ************** COMMON NODES *************** */
+struct bNodeTemplate nodeMakeTemplate(struct bNode *node);
+int nodeValid(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
+const char* nodeLabel(struct bNode *node);
+struct bNodeTree *nodeGroupEditGet(struct bNode *node);
+struct bNodeTree *nodeGroupEditSet(struct bNode *node, int edit);
+void nodeGroupEditClear(struct bNode *node);
/* Init a new node type struct with default values and callbacks */
-void node_type_base(struct bNodeType *ntype, int type, const char *name, short nclass, short flag,
- struct bNodeSocketType *inputs, struct bNodeSocketType *outputs);
+void node_type_base(struct bNodeType *ntype, int type, const char *name, short nclass, short flag);
+void node_type_socket_templates(struct bNodeType *ntype, struct bNodeSocketTemplate *inputs, struct bNodeSocketTemplate *outputs);
void node_type_size(struct bNodeType *ntype, int width, int minwidth, int maxwidth);
-void node_type_init(struct bNodeType *ntype, void (*initfunc)(struct bNode *));
+void node_type_init(struct bNodeType *ntype, void (*initfunc)(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp));
+void node_type_valid(struct bNodeType *ntype, int (*validfunc)(struct bNodeTree *ntree, struct bNodeTemplate *ntemp));
void node_type_storage(struct bNodeType *ntype,
const char *storagename,
void (*freestoragefunc)(struct bNode *),
void (*copystoragefunc)(struct bNode *, struct bNode *));
+void node_type_label(struct bNodeType *ntype, const char *(*labelfunc)(struct bNode *));
+void node_type_template(struct bNodeType *ntype, struct bNodeTemplate (*templatefunc)(struct bNode *));
+void node_type_update(struct bNodeType *ntype,
+ void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node),
+ void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id));
+void node_type_tree(struct bNodeType *ntype,
+ void (*inittreefunc)(struct bNodeTree *),
+ void (*updatetreefunc)(struct bNodeTree *));
+void node_type_group_edit(struct bNodeType *ntype,
+ struct bNodeTree *(*group_edit_get)(struct bNode *node),
+ struct bNodeTree *(*group_edit_set)(struct bNode *node, int edit),
+ void (*group_edit_clear)(struct bNode *node));
+
void node_type_exec(struct bNodeType *ntype, void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **));
+void node_type_exec_new(struct bNodeType *ntype,
+ void *(*initexecfunc)(struct bNode *node),
+ void (*freeexecfunc)(struct bNode *node, void *nodedata),
+ void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **));
void node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out));
-void node_type_label(struct bNodeType *ntype, const char *(*labelfunc)(struct bNode *));
+void node_type_gpu_ext(struct bNodeType *ntype, int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node, void *nodedata, struct GPUNodeStack *in, struct GPUNodeStack *out));
+
+/* ************** COMMON NODES *************** */
#define NODE_GROUP 2
-#define NODE_GROUP_MENU 1000
-#define NODE_DYNAMIC_MENU 4000
+#define NODE_FORLOOP 3
+#define NODE_WHILELOOP 4
+#define NODE_FRAME 5
+#define NODE_GROUP_MENU 10000
+#define NODE_DYNAMIC_MENU 20000
+
+/* look up a socket on a group node by the internal group socket */
+struct bNodeSocket *node_group_find_input(struct bNode *gnode, struct bNodeSocket *gsock);
+struct bNodeSocket *node_group_find_output(struct bNode *gnode, struct bNodeSocket *gsock);
+
+struct bNodeSocket *node_group_add_socket(struct bNodeTree *ngroup, const char *name, int type, int in_out);
+struct bNodeSocket *node_group_expose_socket(struct bNodeTree *ngroup, struct bNodeSocket *sock, int in_out);
+void node_group_expose_all_sockets(struct bNodeTree *ngroup);
+void node_group_remove_socket(struct bNodeTree *ngroup, struct bNodeSocket *gsock, int in_out);
-void register_node_type_group(ListBase *lb);
+struct bNode *node_group_make_from_selected(struct bNodeTree *ntree);
+int node_group_ungroup(struct bNodeTree *ntree, struct bNode *gnode);
+
+/* in node_common.c */
+void register_node_type_frame(ListBase *lb);
/* ************** SHADER NODES *************** */
@@ -286,11 +464,10 @@ struct ShadeResult;
#define NODE_DYNAMIC_REPARSE 6 /* 64 */
#define NODE_DYNAMIC_SET 15 /* sign */
-/* the type definitions array */
-extern struct ListBase node_all_shaders;
-
/* API */
+struct bNodeTreeExec *ntreeShaderBeginExecTree(struct bNodeTree *ntree, int use_tree_data);
+void ntreeShaderEndExecTree(struct bNodeTreeExec *exec, int use_tree_data);
void ntreeShaderExecTree(struct bNodeTree *ntree, struct ShadeInput *shi, struct ShadeResult *shr);
void ntreeShaderGetTexcoMode(struct bNodeTree *ntree, int osa, short *texco, int *mode);
void nodeShaderSynchronizeID(struct bNode *node, int copyto);
@@ -415,11 +592,11 @@ void ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat);
#define CMP_SCALE_RENDERPERCENT 3
-/* the type definitions array */
-extern struct ListBase node_all_composit;
-
/* API */
struct CompBuf;
+struct bNodeTreeExec *ntreeCompositBeginExecTree(struct bNodeTree *ntree, int use_tree_data);
+void ntreeCompositEndExecTree(struct bNodeTreeExec *exec, int use_tree_data);
+void ntreeCompositExecTree(struct bNodeTree *ntree, struct RenderData *rd, int do_previews);
void ntreeCompositTagRender(struct Scene *sce);
int ntreeCompositTagAnimated(struct bNodeTree *ntree);
void ntreeCompositTagGenerators(struct bNodeTree *ntree);
@@ -459,23 +636,22 @@ struct TexResult;
#define TEX_NODE_PROC 500
#define TEX_NODE_PROC_MAX 600
-extern struct ListBase node_all_textures;
-
/* API */
int ntreeTexTagAnimated(struct bNodeTree *ntree);
void ntreeTexSetPreviewFlag(int);
-int ntreeTexExecTree(struct bNodeTree *ntree, struct TexResult *target, float *coord, float *dxt, float *dyt, int osatex, short thread, struct Tex *tex, short which_output, int cfra, int preview, struct ShadeInput *shi, struct MTex *mtex);
void ntreeTexCheckCyclics(struct bNodeTree *ntree);
char* ntreeTexOutputMenu(struct bNodeTree *ntree);
+struct bNodeTreeExec *ntreeTexBeginExecTree(struct bNodeTree *ntree, int use_tree_data);
+void ntreeTexEndExecTree(struct bNodeTreeExec *exec, int use_tree_data);
+int ntreeTexExecTree(struct bNodeTree *ntree, struct TexResult *target, float *coord, float *dxt, float *dyt, int osatex, short thread, struct Tex *tex, short which_output, int cfra, int preview, struct ShadeInput *shi, struct MTex *mtex);
+
-/**/
+/*************************************************/
void init_nodesystem(void);
void free_nodesystem(void);
-/**/
-
void clear_scene_in_nodes(struct Main *bmain, struct Scene *sce);
#endif
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index a6b5c04b5c3..7e39461a032 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -108,6 +108,7 @@ void object_to_mat4(struct Object *ob, float mat[][4]);
void object_apply_mat4(struct Object *ob, float mat[][4], const short use_compat, const short use_parent);
void set_no_parent_ipo(int val);
+struct Object *object_pose_armature_get(struct Object *ob);
void where_is_object_time(struct Scene *scene, struct Object *ob, float ctime);
void where_is_object(struct Scene *scene, struct Object *ob);
@@ -128,6 +129,7 @@ void *object_tfm_backup(struct Object *ob);
void object_tfm_restore(struct Object *ob, void *obtfm_pt);
void object_handle_update(struct Scene *scene, struct Object *ob);
+void object_sculpt_modifiers_changed(struct Object *ob);
float give_timeoffset(struct Object *ob);
int give_obdata_texspace(struct Object *ob, short **texflag, float **loc, float **size, float **rot);
diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index ef16129e1e7..0400f229083 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -97,5 +97,6 @@ typedef struct SculptSession {
} SculptSession;
void free_sculptsession(struct Object *ob);
+void free_sculptsession_deformMats(struct SculptSession *ss);
#endif
diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h
index cf68e5795b4..9cb4dfae534 100644
--- a/source/blender/blenkernel/BKE_sequencer.h
+++ b/source/blender/blenkernel/BKE_sequencer.h
@@ -45,8 +45,6 @@ struct Strip;
struct StripElem;
struct bSound;
-#define MAXSEQ 32
-
#define BUILD_SEQAR_COUNT_NOTHING 0
#define BUILD_SEQAR_COUNT_CURRENT 1
#define BUILD_SEQAR_COUNT_CHILDREN 2
diff --git a/source/blender/blenkernel/BKE_sound.h b/source/blender/blenkernel/BKE_sound.h
index fac5bf1cfd2..3728dd41089 100644
--- a/source/blender/blenkernel/BKE_sound.h
+++ b/source/blender/blenkernel/BKE_sound.h
@@ -39,7 +39,6 @@
struct PackedFile;
struct bSound;
-struct bContext;
struct ListBase;
struct Main;
struct Sequence;
@@ -65,12 +64,12 @@ struct bSound* sound_new_file(struct Main *main, const char *filename);
// XXX unused currently
#if 0
-struct bSound* sound_new_buffer(struct bContext *C, struct bSound *source);
+struct bSound* sound_new_buffer(struct Main *bmain, struct bSound *source);
-struct bSound* sound_new_limiter(struct bContext *C, struct bSound *source, float start, float end);
+struct bSound* sound_new_limiter(struct Main *bmain, struct bSound *source, float start, float end);
#endif
-void sound_delete(struct bContext *C, struct bSound* sound);
+void sound_delete(struct Main *bmain, struct bSound* sound);
void sound_cache(struct bSound* sound);
@@ -124,7 +123,7 @@ void sound_play_scene(struct Scene *scene);
void sound_stop_scene(struct Scene *scene);
-void sound_seek_scene(struct bContext *C);
+void sound_seek_scene(struct Main *bmain, struct Scene *scene);
float sound_sync_scene(struct Scene *scene);
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index c1797427cc2..9cf0a92742f 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -35,7 +35,6 @@ set(INC
../blenfont
../blenlib
../blenloader
- ../editors/include
../gpu
../ikplugin
../imbuf
@@ -353,6 +352,16 @@ if(WITH_LZMA)
add_definitions(-DWITH_LZMA)
endif()
+if(WITH_GAMEENGINE)
+ list(APPEND INC_SYS
+ ../../../extern/recastnavigation/Recast/Include
+ )
+ list(APPEND SRC
+ intern/navmesh_conversion.cpp
+ BKE_navmesh_conversion.h
+ )
+endif()
+
if(MSVC)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /WX")
endif()
diff --git a/source/blender/blenkernel/SConscript b/source/blender/blenkernel/SConscript
index 5ea42ee65ae..56de8afc0da 100644
--- a/source/blender/blenkernel/SConscript
+++ b/source/blender/blenkernel/SConscript
@@ -1,9 +1,10 @@
#!/usr/bin/python
Import ('env')
+import os
-sources = env.Glob('intern/*.c')
+sources = env.Glob('intern/*.c') + env.Glob('intern/*.cpp')
-incs = '. #/intern/guardedalloc #/intern/memutil ../editors/include'
+incs = '. #/intern/guardedalloc #/intern/memutil'
incs += ' ../blenlib ../blenfont ../makesdna ../windowmanager'
incs += ' ../render/extern/include #/intern/decimation/extern ../makesrna'
incs += ' ../imbuf ../ikplugin ../avi #/intern/elbeem/extern ../nodes ../modifiers'
@@ -90,6 +91,12 @@ if env['WITH_BF_LZMA']:
incs += ' #/extern/lzma'
defs.append('WITH_LZMA')
+if env['WITH_BF_GAMEENGINE']:
+ incs += ' #/extern/recastnavigation/Recast/Include'
+ defs.append('WITH_GAMEENGINE')
+else:
+ sources.remove('intern' + os.sep + 'navmesh_conversion.cpp')
+
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
incs += ' ' + env['BF_PTHREADS_INC']
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index ff7f2586767..7a02da57350 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -60,18 +60,16 @@
#include "BKE_texture.h"
#include "BKE_multires.h"
-
#include "BLO_sys_types.h" // for intptr_t support
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
+#include "GL/glew.h"
#include "GPU_buffers.h"
#include "GPU_draw.h"
#include "GPU_extensions.h"
#include "GPU_material.h"
-#include "ED_sculpt.h" /* for ED_sculpt_modifiers_changed */
+extern GLubyte stipple_quarttone[128]; /* glutil.c, bad level data */
///////////////////////////////////
///////////////////////////////////
@@ -643,13 +641,22 @@ static void emDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us
EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
EditFace *efa;
int i, draw;
-
+ const int skip_normals= !glIsEnabled(GL_LIGHTING); /* could be passed as an arg */
+
+ /* GL_ZERO is used to detect if drawing has started or not */
+ GLenum poly_prev= GL_ZERO;
+ GLenum shade_prev= GL_ZERO;
+
(void)setMaterial; /* unused */
/* currently unused -- each original face is handled separately */
(void)compareDrawOptions;
if (emdm->vertexCos) {
+ /* add direct access */
+ float (*vertexCos)[3]= emdm->vertexCos;
+ float (*vertexNos)[3]= emdm->vertexNos;
+ float (*faceNos)[3]= emdm->faceNos;
EditVert *eve;
for (i=0,eve=emdm->em->verts.first; eve; eve= eve->next)
@@ -659,75 +666,134 @@ static void emDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us
int drawSmooth = (efa->flag & ME_SMOOTH);
draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, i, &drawSmooth);
if(draw) {
+ const GLenum poly_type= efa->v4 ? GL_QUADS:GL_TRIANGLES;
if (draw==2) { /* enabled with stipple */
- glEnable(GL_POLYGON_STIPPLE);
- glPolygonStipple(stipple_quarttone);
+
+ if(poly_prev != GL_ZERO) glEnd();
+ poly_prev= GL_ZERO; /* force glBegin */
+
+ glEnable(GL_POLYGON_STIPPLE);
+ glPolygonStipple(stipple_quarttone);
}
- glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
+ if(skip_normals) {
+ if(poly_type != poly_prev) {
+ if(poly_prev != GL_ZERO) glEnd();
+ glBegin((poly_prev= poly_type));
+ }
+ glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
+ if(poly_type == GL_QUADS) glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
+ }
+ else {
+ const GLenum shade_type= drawSmooth ? GL_SMOOTH : GL_FLAT;
+ if (shade_type != shade_prev) {
+ glShadeModel((shade_prev= shade_type));
+ }
+ if(poly_type != poly_prev) {
+ if(poly_prev != GL_ZERO) glEnd();
+ glBegin((poly_prev= poly_type));
+ }
- glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
- if (!drawSmooth) {
- glNormal3fv(emdm->faceNos[i]);
- glVertex3fv(emdm->vertexCos[(int) efa->v1->tmp.l]);
- glVertex3fv(emdm->vertexCos[(int) efa->v2->tmp.l]);
- glVertex3fv(emdm->vertexCos[(int) efa->v3->tmp.l]);
- if(efa->v4) glVertex3fv(emdm->vertexCos[(int) efa->v4->tmp.l]);
- } else {
- glNormal3fv(emdm->vertexNos[(int) efa->v1->tmp.l]);
- glVertex3fv(emdm->vertexCos[(int) efa->v1->tmp.l]);
- glNormal3fv(emdm->vertexNos[(int) efa->v2->tmp.l]);
- glVertex3fv(emdm->vertexCos[(int) efa->v2->tmp.l]);
- glNormal3fv(emdm->vertexNos[(int) efa->v3->tmp.l]);
- glVertex3fv(emdm->vertexCos[(int) efa->v3->tmp.l]);
- if(efa->v4) {
- glNormal3fv(emdm->vertexNos[(int) efa->v4->tmp.l]);
- glVertex3fv(emdm->vertexCos[(int) efa->v4->tmp.l]);
+ if (!drawSmooth) {
+ glNormal3fv(faceNos[i]);
+ glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
+ if(poly_type == GL_QUADS) glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
+ } else {
+ glNormal3fv(vertexNos[(int) efa->v1->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
+ glNormal3fv(vertexNos[(int) efa->v2->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
+ glNormal3fv(vertexNos[(int) efa->v3->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
+ if(poly_type == GL_QUADS) {
+ glNormal3fv(vertexNos[(int) efa->v4->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
+ }
}
}
- glEnd();
+
- if (draw==2)
+ if (draw==2) {
+ glEnd();
+ poly_prev= GL_ZERO; /* force glBegin */
+
glDisable(GL_POLYGON_STIPPLE);
+ }
}
}
- } else {
+ }
+ else {
for (i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
int drawSmooth = (efa->flag & ME_SMOOTH);
draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, i, &drawSmooth);
if(draw) {
+ const GLenum poly_type= efa->v4 ? GL_QUADS:GL_TRIANGLES;
if (draw==2) { /* enabled with stipple */
+
+ if(poly_prev != GL_ZERO) glEnd();
+ poly_prev= GL_ZERO; /* force glBegin */
+
glEnable(GL_POLYGON_STIPPLE);
glPolygonStipple(stipple_quarttone);
}
- glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
- glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
- if (!drawSmooth) {
- glNormal3fv(efa->n);
- glVertex3fv(efa->v1->co);
- glVertex3fv(efa->v2->co);
- glVertex3fv(efa->v3->co);
- if(efa->v4) glVertex3fv(efa->v4->co);
- } else {
- glNormal3fv(efa->v1->no);
+ if(skip_normals) {
+ if(poly_type != poly_prev) {
+ if(poly_prev != GL_ZERO) glEnd();
+ glBegin((poly_prev= poly_type));
+ }
glVertex3fv(efa->v1->co);
- glNormal3fv(efa->v2->no);
glVertex3fv(efa->v2->co);
- glNormal3fv(efa->v3->no);
glVertex3fv(efa->v3->co);
- if(efa->v4) {
- glNormal3fv(efa->v4->no);
- glVertex3fv(efa->v4->co);
+ if(poly_type == GL_QUADS) glVertex3fv(efa->v4->co);
+ }
+ else {
+ const GLenum shade_type= drawSmooth ? GL_SMOOTH : GL_FLAT;
+ if (shade_type != shade_prev) {
+ glShadeModel((shade_prev= shade_type));
+ }
+ if(poly_type != poly_prev) {
+ if(poly_prev != GL_ZERO) glEnd();
+ glBegin((poly_prev= poly_type));
+ }
+
+ if (!drawSmooth) {
+ glNormal3fv(efa->n);
+ glVertex3fv(efa->v1->co);
+ glVertex3fv(efa->v2->co);
+ glVertex3fv(efa->v3->co);
+ if(poly_type == GL_QUADS) glVertex3fv(efa->v4->co);
+ } else {
+ glNormal3fv(efa->v1->no);
+ glVertex3fv(efa->v1->co);
+ glNormal3fv(efa->v2->no);
+ glVertex3fv(efa->v2->co);
+ glNormal3fv(efa->v3->no);
+ glVertex3fv(efa->v3->co);
+ if(poly_type == GL_QUADS) {
+ glNormal3fv(efa->v4->no);
+ glVertex3fv(efa->v4->co);
+ }
}
}
- glEnd();
+
- if (draw==2)
+ if (draw==2) {
+ glEnd();
+ poly_prev= GL_ZERO;
+
glDisable(GL_POLYGON_STIPPLE);
+ }
}
}
}
+
+ /* if non zero we know a face was rendered */
+ if(poly_prev != GL_ZERO) glEnd();
}
static void emDM_drawFacesTex_common(DerivedMesh *dm,
@@ -2254,7 +2320,7 @@ static void clear_mesh_caches(Object *ob)
}
if(ob->sculpt) {
- ED_sculpt_modifiers_changed(ob);
+ object_sculpt_modifiers_changed(ob);
}
}
@@ -2449,13 +2515,13 @@ static void make_vertexcosnos__mapFunc(void *userData, int index, float *co, flo
/* check if we've been here before (normal should not be 0) */
if(vec[3] || vec[4] || vec[5]) return;
- VECCOPY(vec, co);
+ copy_v3_v3(vec, co);
vec+= 3;
if(no_f) {
- VECCOPY(vec, no_f);
+ copy_v3_v3(vec, no_f);
}
else {
- VECCOPY(vec, no_s);
+ normal_short_to_float_v3(vec, no_s);
}
}
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index 5f33059e117..2d4354bdd9f 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -324,17 +324,14 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, const char *filepath
MEM_freeN(bfd);
}
-static int handle_subversion_warning(Main *main)
+static int handle_subversion_warning(Main *main, ReportList *reports)
{
if(main->minversionfile > BLENDER_VERSION ||
(main->minversionfile == BLENDER_VERSION &&
main->minsubversionfile > BLENDER_SUBVERSION)) {
-
- char str[128];
-
- BLI_snprintf(str, sizeof(str), "File written by newer Blender binary: %d.%d , expect loss of data!", main->minversionfile, main->minsubversionfile);
-// XXX error(str);
+ BKE_reportf(reports, RPT_ERROR, "File written by newer Blender binary: %d.%d , expect loss of data!", main->minversionfile, main->minsubversionfile);
}
+
return 1;
}
@@ -392,7 +389,7 @@ int BKE_read_file(bContext *C, const char *filepath, ReportList *reports)
if (bfd) {
if(bfd->user) retval= BKE_READ_FILE_OK_USERPREFS;
- if(0==handle_subversion_warning(bfd->main)) {
+ if(0==handle_subversion_warning(bfd->main, reports)) {
free_main(bfd->main);
MEM_freeN(bfd);
bfd= NULL;
diff --git a/source/blender/blenkernel/intern/boids.c b/source/blender/blenkernel/intern/boids.c
index a0f38e675f9..3966caa1fa9 100644
--- a/source/blender/blenkernel/intern/boids.c
+++ b/source/blender/blenkernel/intern/boids.c
@@ -156,8 +156,8 @@ static int rule_goal_avoid(BoidRule *rule, BoidBrainData *bbd, BoidValues *val,
if(rule->type == eBoidRuleType_Goal && boids->options & BOID_ALLOW_CLIMB && surface!=0.0f) {
if(!bbd->goal_ob || bbd->goal_priority < priority) {
bbd->goal_ob = eob;
- VECCOPY(bbd->goal_co, efd.loc);
- VECCOPY(bbd->goal_nor, efd.nor);
+ copy_v3_v3(bbd->goal_co, efd.loc);
+ copy_v3_v3(bbd->goal_nor, efd.nor);
}
}
else if(rule->type == eBoidRuleType_Avoid && bpa->data.mode == eBoidMode_Climbing &&
@@ -869,7 +869,7 @@ static void boid_climb(BoidSettings *boids, ParticleData *pa, float *surface_co,
{
BoidParticle *bpa = pa->boid;
float nor[3], vel[3];
- VECCOPY(nor, surface_nor);
+ copy_v3_v3(nor, surface_nor);
/* gather apparent gravity */
VECADDFAC(bpa->gravity, bpa->gravity, surface_nor, -1.0f);
@@ -1345,7 +1345,7 @@ void boid_body(BoidBrainData *bbd, ParticleData *pa)
{
boid_climb(boids, pa, ground_co, ground_nor);
//float nor[3];
- //VECCOPY(nor, ground_nor);
+ //copy_v3_v3(nor, ground_nor);
///* gather apparent gravity to r_ve */
//VECADDFAC(pa->r_ve, pa->r_ve, ground_nor, -1.0);
diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c
index c497cd2813a..c84a3cfc730 100644
--- a/source/blender/blenkernel/intern/brush.c
+++ b/source/blender/blenkernel/intern/brush.c
@@ -555,7 +555,7 @@ void brush_imbuf_new(Brush *brush, short flt, short texfall, int bufsize, ImBuf
if (texfall == 0) {
dist = sqrt(xy[0]*xy[0] + xy[1]*xy[1]);
- VECCOPY(dstf, brush_rgb);
+ copy_v3_v3(dstf, brush_rgb);
dstf[3]= alpha*brush_curve_strength_clamp(brush, dist, radius);
}
else if (texfall == 1) {
@@ -754,7 +754,7 @@ static void brush_painter_do_partial(BrushPainter *painter, ImBuf *oldtexibuf, i
for (x=origx; x < w; x++, bf+=4, mf+=4, tf+=4) {
if (dotexold) {
- VECCOPY(tf, otf);
+ copy_v3_v3(tf, otf);
tf[3] = otf[3];
otf += 4;
}
@@ -926,7 +926,7 @@ static void brush_apply_pressure(BrushPainter *painter, Brush *brush, float pres
brush->spacing = MAX2(1.0f, painter->startspacing*(1.5f-pressure));
}
-void brush_jitter_pos(Brush *brush, float *pos, float *jitterpos)
+void brush_jitter_pos(Brush *brush, float pos[2], float jitterpos[2])
{
int use_jitter= brush->jitter != 0;
@@ -949,7 +949,7 @@ void brush_jitter_pos(Brush *brush, float *pos, float *jitterpos)
jitterpos[1] = pos[1] + 2*rand_pos[1]*diameter*brush->jitter;
}
else {
- VECCOPY2D(jitterpos, pos);
+ copy_v2_v2(jitterpos, pos);
}
}
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 5eb97630e83..44359a142c9 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -36,10 +36,7 @@
* \ingroup bke
*/
-
-/* TODO maybe BIF_gl.h should include string.h? */
-#include <string.h>
-#include "BIF_gl.h"
+#include "GL/glew.h"
#include "BLI_blenlib.h"
#include "BLI_edgehash.h"
@@ -1853,7 +1850,7 @@ void CDDM_apply_vert_normals(DerivedMesh *dm, short (*vertNormals)[3])
cddm->mvert = vert;
for(i = 0; i < dm->numVertData; ++i, ++vert)
- VECCOPY(vert->no, vertNormals[i]);
+ copy_v3_v3_short(vert->no, vertNormals[i]);
}
void CDDM_calc_normals(DerivedMesh *dm)
diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c
index ed073f03270..e0b7ebe1f44 100644
--- a/source/blender/blenkernel/intern/collision.c
+++ b/source/blender/blenkernel/intern/collision.c
@@ -104,11 +104,11 @@ BVHTree *bvhtree_build_from_mvert ( MFace *mfaces, unsigned int numfaces, MVert
// fill tree
for ( i = 0; i < numfaces; i++, tface++ )
{
- VECCOPY ( &co[0*3], x[tface->v1].co );
- VECCOPY ( &co[1*3], x[tface->v2].co );
- VECCOPY ( &co[2*3], x[tface->v3].co );
+ copy_v3_v3 ( &co[0*3], x[tface->v1].co );
+ copy_v3_v3 ( &co[1*3], x[tface->v2].co );
+ copy_v3_v3 ( &co[2*3], x[tface->v3].co );
if ( tface->v4 )
- VECCOPY ( &co[3*3], x[tface->v4].co );
+ copy_v3_v3 ( &co[3*3], x[tface->v4].co );
BLI_bvhtree_insert ( tree, i, co, ( mfaces->v4 ? 4 : 3 ) );
}
@@ -133,21 +133,21 @@ void bvhtree_update_from_mvert ( BVHTree * bvhtree, MFace *faces, int numfaces,
{
for ( i = 0; i < numfaces; i++, mfaces++ )
{
- VECCOPY ( &co[0*3], x[mfaces->v1].co );
- VECCOPY ( &co[1*3], x[mfaces->v2].co );
- VECCOPY ( &co[2*3], x[mfaces->v3].co );
+ copy_v3_v3 ( &co[0*3], x[mfaces->v1].co );
+ copy_v3_v3 ( &co[1*3], x[mfaces->v2].co );
+ copy_v3_v3 ( &co[2*3], x[mfaces->v3].co );
if ( mfaces->v4 )
- VECCOPY ( &co[3*3], x[mfaces->v4].co );
+ copy_v3_v3 ( &co[3*3], x[mfaces->v4].co );
// copy new locations into array
if ( moving && xnew )
{
// update moving positions
- VECCOPY ( &co_moving[0*3], xnew[mfaces->v1].co );
- VECCOPY ( &co_moving[1*3], xnew[mfaces->v2].co );
- VECCOPY ( &co_moving[2*3], xnew[mfaces->v3].co );
+ copy_v3_v3 ( &co_moving[0*3], xnew[mfaces->v1].co );
+ copy_v3_v3 ( &co_moving[1*3], xnew[mfaces->v2].co );
+ copy_v3_v3 ( &co_moving[2*3], xnew[mfaces->v3].co );
if ( mfaces->v4 )
- VECCOPY ( &co_moving[3*3], xnew[mfaces->v4].co );
+ copy_v3_v3 ( &co_moving[3*3], xnew[mfaces->v4].co );
ret = BLI_bvhtree_update_node ( bvhtree, i, co, co_moving, ( mfaces->v4 ? 4 : 3 ) );
}
@@ -550,7 +550,7 @@ static int cloth_collision_response_static ( ClothModifierData *clmd, CollisionM
float temp[3], spf;
// calculate tangential velocity
- VECCOPY ( temp, collpair->normal );
+ copy_v3_v3 ( temp, collpair->normal );
mul_v3_fl( temp, magrelVel );
VECSUB ( vrel_t_pre, relativeVelocity, temp );
@@ -2346,7 +2346,7 @@ static int cloth_bvh_objcollisions_resolve ( ClothModifierData * clmd, Collision
if ( verts[i].impulse_count )
{
VECADDMUL ( verts[i].tv, verts[i].impulse, 1.0f / verts[i].impulse_count );
- VECCOPY ( verts[i].impulse, tnull );
+ copy_v3_v3 ( verts[i].impulse, tnull );
verts[i].impulse_count = 0;
ret++;
diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c
index 9a6c2cc7e31..61e9daf4138 100644
--- a/source/blender/blenkernel/intern/colortools.c
+++ b/source/blender/blenkernel/intern/colortools.c
@@ -167,14 +167,14 @@ CurveMapping *curvemapping_copy(CurveMapping *cumap)
return NULL;
}
-void curvemapping_set_black_white(CurveMapping *cumap, float *black, float *white)
+void curvemapping_set_black_white(CurveMapping *cumap, const float black[3], const float white[3])
{
int a;
if(white)
- VECCOPY(cumap->white, white);
+ copy_v3_v3(cumap->white, white);
if(black)
- VECCOPY(cumap->black, black);
+ copy_v3_v3(cumap->black, black);
for(a=0; a<3; a++) {
if(cumap->white[a]==cumap->black[a])
@@ -432,7 +432,7 @@ static void calchandle_curvemap(BezTriple *bezt, BezTriple *prev, BezTriple *nex
/* in X, out Y.
X is presumed to be outside first or last */
-static float curvemap_calc_extend(CurveMap *cuma, float x, float *first, float *last)
+static float curvemap_calc_extend(CurveMap *cuma, float x, const float first[2], const float last[2])
{
if(x <= first[0]) {
if((cuma->flag & CUMA_EXTEND_EXTRAPOLATE)==0) {
@@ -753,7 +753,7 @@ float curvemapping_evaluateF(CurveMapping *cumap, int cur, float value)
}
/* vector case */
-void curvemapping_evaluate3F(CurveMapping *cumap, float *vecout, const float *vecin)
+void curvemapping_evaluate3F(CurveMapping *cumap, float vecout[3], const float vecin[3])
{
vecout[0]= curvemapping_evaluateF(cumap, 0, vecin[0]);
vecout[1]= curvemapping_evaluateF(cumap, 1, vecin[1]);
@@ -761,7 +761,7 @@ void curvemapping_evaluate3F(CurveMapping *cumap, float *vecout, const float *ve
}
/* RGB case, no black/white points, no premult */
-void curvemapping_evaluateRGBF(CurveMapping *cumap, float *vecout, const float *vecin)
+void curvemapping_evaluateRGBF(CurveMapping *cumap, float vecout[3], const float vecin[3])
{
vecout[0]= curvemapping_evaluateF(cumap, 0, curvemapping_evaluateF(cumap, 3, vecin[0]));
vecout[1]= curvemapping_evaluateF(cumap, 1, curvemapping_evaluateF(cumap, 3, vecin[1]));
@@ -770,7 +770,7 @@ void curvemapping_evaluateRGBF(CurveMapping *cumap, float *vecout, const float *
/* RGB with black/white points and premult. tables are checked */
-void curvemapping_evaluate_premulRGBF(CurveMapping *cumap, float *vecout, const float *vecin)
+void curvemapping_evaluate_premulRGBF(CurveMapping *cumap, float vecout[3], const float vecin[3])
{
float fac;
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index b1beb6c449a..bd70e365f51 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -41,9 +41,10 @@
#include "MEM_guardedalloc.h"
-#include "BLI_blenlib.h"
-#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_math.h"
#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
#include "DNA_curve_types.h"
#include "DNA_material_types.h"
@@ -66,9 +67,6 @@
#include "BKE_object.h"
#include "BKE_material.h"
-
-#include "ED_curve.h"
-
/* globals */
/* local */
@@ -118,6 +116,25 @@ void BKE_free_editfont(Curve *cu)
}
}
+void free_curve_editNurb_keyIndex(EditNurb *editnurb)
+{
+ if (!editnurb->keyindex) {
+ return;
+ }
+ BLI_ghash_free(editnurb->keyindex, NULL, (GHashValFreeFP)MEM_freeN);
+ editnurb->keyindex= NULL;
+}
+
+void free_curve_editNurb (Curve *cu)
+{
+ if(cu->editnurb) {
+ freeNurblist(&cu->editnurb->nurbs);
+ free_curve_editNurb_keyIndex(cu->editnurb);
+ MEM_freeN(cu->editnurb);
+ cu->editnurb= NULL;
+ }
+}
+
/* don't free curve itself */
void free_curve(Curve *cu)
{
@@ -281,6 +298,16 @@ void make_local_curve(Curve *cu)
}
}
+/* Get list of nurbs from editnurbs structure */
+ListBase *curve_editnurbs(Curve *cu)
+{
+ if (cu->editnurb) {
+ return &cu->editnurb->nurbs;
+ }
+
+ return NULL;
+}
+
short curve_type(Curve *cu)
{
Nurb *nu;
@@ -358,7 +385,6 @@ void tex_space_curve(Curve *cu)
}
}
-
int count_curveverts(ListBase *nurb)
{
Nurb *nu;
@@ -2049,7 +2075,7 @@ void makeBevelList(Object *ob)
BLI_freelistN(&(cu->bev));
if(cu->editnurb && ob->type!=OB_FONT) {
- ListBase *nurbs= ED_curve_editnurbs(cu);
+ ListBase *nurbs= curve_editnurbs(cu);
nu= nurbs->first;
} else nu= cu->nurb.first;
@@ -2547,9 +2573,9 @@ void calchandleNurb(BezTriple *bezt, BezTriple *prev, BezTriple *next, int mode)
sub_v3_v3v3(h2, p2, p2+3);
len1= normalize_v3(h1);
len2= normalize_v3(h2);
-
- vz= INPR(h1, h2);
-
+
+ vz= dot_v3v3(h1, h2);
+
if(leftviolate) {
*(p2+3)= *(p2) - vz*len2*h1[0];
*(p2+4)= *(p2+1) - vz*len2*h1[1];
@@ -3157,7 +3183,7 @@ int clamp_nurb_order_v( struct Nurb *nu)
ListBase *BKE_curve_nurbs(Curve *cu)
{
if (cu->editnurb) {
- return ED_curve_editnurbs(cu);
+ return curve_editnurbs(cu);
}
return &cu->nurb;
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 8d19322c0db..883f67c3061 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -808,42 +808,68 @@ static void layerDefault_mcol(void *data, int count)
static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
+ /* 0: CD_MVERT */
{sizeof(MVert), "MVert", 1, NULL, NULL, NULL, NULL, NULL, NULL},
+ /* 1: CD_MSTICKY */
{sizeof(MSticky), "MSticky", 1, NULL, NULL, NULL, layerInterp_msticky, NULL,
NULL},
+ /* 2: CD_MDEFORMVERT */
{sizeof(MDeformVert), "MDeformVert", 1, NULL, layerCopy_mdeformvert,
layerFree_mdeformvert, layerInterp_mdeformvert, NULL, NULL},
+ /* 3: CD_MEDGE */
{sizeof(MEdge), "MEdge", 1, NULL, NULL, NULL, NULL, NULL, NULL},
+ /* 4: CD_MFACE */
{sizeof(MFace), "MFace", 1, NULL, NULL, NULL, NULL, NULL, NULL},
+ /* 5: CD_MTFACE */
{sizeof(MTFace), "MTFace", 1, "UVTex", layerCopy_tface, NULL,
layerInterp_tface, layerSwap_tface, layerDefault_tface},
+ /* 6: CD_MCOL */
/* 4 MCol structs per face */
{sizeof(MCol)*4, "MCol", 4, "Col", NULL, NULL, layerInterp_mcol,
layerSwap_mcol, layerDefault_mcol},
+ /* 7: CD_ORIGINDEX */
{sizeof(int), "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
+ /* 8: CD_NORMAL */
/* 3 floats per normal vector */
{sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
+ /* 9: CD_FLAGS */
{sizeof(int), "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
+ /* 10: CD_PROP_FLT */
{sizeof(MFloatProperty), "MFloatProperty",1,"Float",NULL,NULL,NULL,NULL},
+ /* 11: CD_PROP_INT */
{sizeof(MIntProperty), "MIntProperty",1,"Int",NULL,NULL,NULL,NULL},
+ /* 12: CD_PROP_STR */
{sizeof(MStringProperty), "MStringProperty",1,"String",NULL,NULL,NULL,NULL},
+ /* 13: CD_ORIGSPACE */
{sizeof(OrigSpaceFace), "OrigSpaceFace", 1, "UVTex", layerCopy_origspace_face, NULL,
layerInterp_origspace_face, layerSwap_origspace_face, layerDefault_origspace_face},
+ /* 14: CD_ORCO */
{sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
+ /* 15: CD_MTEXPOLY */
{sizeof(MTexPoly), "MTexPoly", 1, "Face Texture", NULL, NULL, NULL, NULL, NULL},
+ /* 16: CD_MLOOPUV */
{sizeof(MLoopUV), "MLoopUV", 1, "UV coord", NULL, NULL, layerInterp_mloopuv, NULL, NULL},
+ /* 17: CD_MLOOPCOL */
{sizeof(MLoopCol), "MLoopCol", 1, "Col", NULL, NULL, layerInterp_mloopcol, NULL, layerDefault_mloopcol},
+ /* 18: CD_TANGENT */
{sizeof(float)*4*4, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
+ /* 19: CD_MDISPS */
{sizeof(MDisps), "MDisps", 1, NULL, layerCopy_mdisps,
layerFree_mdisps, layerInterp_mdisps, layerSwap_mdisps, NULL, layerRead_mdisps, layerWrite_mdisps,
layerFilesize_mdisps, layerValidate_mdisps},
+ /* 20: CD_WEIGHT_MCOL */
{sizeof(MCol)*4, "MCol", 4, "WeightCol", NULL, NULL, layerInterp_mcol,
layerSwap_mcol, layerDefault_mcol},
- {sizeof(MCol)*4, "MCol", 4, "IDCol", NULL, NULL, layerInterp_mcol,
+ /* 21: CD_ID_MCOL */
+ {sizeof(MCol)*4, "MCol", 4, "IDCol", NULL, NULL, layerInterp_mcol,
layerSwap_mcol, layerDefault_mcol},
- {sizeof(MCol)*4, "MCol", 4, "TexturedCol", NULL, NULL, layerInterp_mcol,
+ /* 22: CD_TEXTURE_MCOL */
+ {sizeof(MCol)*4, "MCol", 4, "TexturedCol", NULL, NULL, layerInterp_mcol,
layerSwap_mcol, layerDefault_mcol},
- {sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL}
+ /* 23: CD_CLOTH_ORCO */
+ {sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
+ /* 24: CD_RECAST */
+ {sizeof(MRecast), "MRecast", 1,"Recast",NULL,NULL,NULL,NULL}
};
static const char *LAYERTYPENAMES[CD_NUMTYPES] = {
@@ -851,7 +877,7 @@ static const char *LAYERTYPENAMES[CD_NUMTYPES] = {
/* 5-9 */ "CDMTFace", "CDMCol", "CDOrigIndex", "CDNormal", "CDFlags",
/* 10-14 */ "CDMFloatProperty", "CDMIntProperty","CDMStringProperty", "CDOrigSpace", "CDOrco",
/* 15-19 */ "CDMTexPoly", "CDMLoopUV", "CDMloopCol", "CDTangent", "CDMDisps",
- /* 20-23 */"CDWeightMCol", "CDIDMCol", "CDTextureMCol", "CDClothOrco"
+ /* 20-24 */"CDWeightMCol", "CDIDMCol", "CDTextureMCol", "CDClothOrco", "CDMRecast"
};
const CustomDataMask CD_MASK_BAREMESH =
@@ -859,14 +885,14 @@ const CustomDataMask CD_MASK_BAREMESH =
const CustomDataMask CD_MASK_MESH =
CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE |
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MCOL |
- CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS;
+ CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS | CD_MASK_RECAST;
const CustomDataMask CD_MASK_EDITMESH =
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
- CD_MASK_MCOL|CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS;
+ CD_MASK_MCOL|CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS | CD_MASK_RECAST;
const CustomDataMask CD_MASK_DERIVEDMESH =
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
CD_MASK_MCOL | CD_MASK_ORIGINDEX | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_CLOTH_ORCO |
- CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO | CD_MASK_TANGENT | CD_MASK_WEIGHT_MCOL;
+ CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO | CD_MASK_TANGENT | CD_MASK_WEIGHT_MCOL | CD_MASK_RECAST;
const CustomDataMask CD_MASK_BMESH =
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR;
const CustomDataMask CD_MASK_FACECORNERS =
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index c2ed6468643..b19ea93a1b8 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -67,8 +67,6 @@
#include "BLO_sys_types.h" // for intptr_t support
-#include "ED_curve.h" /* for BKE_curve_nurbs */
-
extern Material defmaterial; /* material.c */
static void boundbox_displist(Object *ob);
@@ -1102,7 +1100,7 @@ void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase,
float (*deformedVerts)[3];
if(!forRender && cu->editnurb)
- nubase= ED_curve_editnurbs(cu);
+ nubase= curve_editnurbs(cu);
else
nubase= &cu->nurb;
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index 4b95c44f55f..468f39bf731 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -590,16 +590,16 @@ int closest_point_on_surface(SurfaceModifierData *surmd, float *co, float *surfa
BLI_bvhtree_find_nearest(surmd->bvhtree->tree, co, &nearest, surmd->bvhtree->nearest_callback, surmd->bvhtree);
if(nearest.index != -1) {
- VECCOPY(surface_co, nearest.co);
+ copy_v3_v3(surface_co, nearest.co);
if(surface_nor) {
- VECCOPY(surface_nor, nearest.no);
+ copy_v3_v3(surface_nor, nearest.no);
}
if(surface_vel) {
MFace *mface = CDDM_get_face(surmd->dm, nearest.index);
- VECCOPY(surface_vel, surmd->v[mface->v1].co);
+ copy_v3_v3(surface_vel, surmd->v[mface->v1].co);
add_v3_v3(surface_vel, surmd->v[mface->v2].co);
add_v3_v3(surface_vel, surmd->v[mface->v3].co);
if(mface->v4)
@@ -705,7 +705,7 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
sub_v3_v3v3(efd->loc, point->loc, translate);
}
else {
- VECCOPY(efd->loc, ob->obmat[3]);
+ copy_v3_v3(efd->loc, ob->obmat[3]);
}
if(real_velocity)
@@ -727,8 +727,8 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
mul_v3_fl(efd->vec_to_point, (efd->distance-eff->pd->f_size)/efd->distance);
if(eff->flag & PE_USE_NORMAL_DATA) {
- VECCOPY(efd->vec_to_point2, efd->vec_to_point);
- VECCOPY(efd->nor2, efd->nor);
+ copy_v3_v3(efd->vec_to_point2, efd->vec_to_point);
+ copy_v3_v3(efd->nor2, efd->nor);
}
else {
/* for some effectors we need the object center every time */
@@ -800,7 +800,7 @@ static void do_texture_effector(EffectorCache *eff, EffectorData *efd, EffectedP
strength= eff->pd->f_strength * efd->falloff;
- VECCOPY(tex_co,point->loc);
+ copy_v3_v3(tex_co,point->loc);
if(eff->pd->flag & PFIELD_TEX_2D) {
float fac=-dot_v3v3(tex_co, efd->nor);
@@ -878,11 +878,11 @@ static void do_physical_effector(EffectorCache *eff, EffectorData *efd, Effected
damp += wind_func(rng, noise_factor);
}
- VECCOPY(force, efd->vec_to_point);
+ copy_v3_v3(force, efd->vec_to_point);
switch(pd->forcefield){
case PFIELD_WIND:
- VECCOPY(force, efd->nor);
+ copy_v3_v3(force, efd->nor);
mul_v3_fl(force, strength * efd->falloff);
break;
case PFIELD_FORCE:
@@ -944,7 +944,7 @@ static void do_physical_effector(EffectorCache *eff, EffectorData *efd, Effected
return;
case PFIELD_TURBULENCE:
if(pd->flag & PFIELD_GLOBAL_CO) {
- VECCOPY(temp, point->loc);
+ copy_v3_v3(temp, point->loc);
}
else {
VECADD(temp, efd->vec_to_point2, efd->nor2);
@@ -955,7 +955,7 @@ static void do_physical_effector(EffectorCache *eff, EffectorData *efd, Effected
mul_v3_fl(force, strength * efd->falloff);
break;
case PFIELD_DRAG:
- VECCOPY(force, point->vel);
+ copy_v3_v3(force, point->vel);
fac = normalize_v3(force) * point->vel_to_sec;
strength = MIN2(strength, 2.0f);
@@ -1039,7 +1039,7 @@ void pdDoEffectors(ListBase *effectors, ListBase *colliders, EffectorWeights *we
do_texture_effector(eff, &efd, point, force);
else {
float temp1[3]={0,0,0}, temp2[3];
- VECCOPY(temp1, force);
+ copy_v3_v3(temp1, force);
do_physical_effector(eff, &efd, point, force);
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 29615986191..2a9e786d139 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -925,7 +925,8 @@ void init_render_material(Material *mat, int r_mode, float *amb)
if(mat->nodetree && mat->use_nodes) {
init_render_nodetree(mat->nodetree, mat, r_mode, amb);
- ntreeBeginExecTree(mat->nodetree); /* has internal flag to detect it only does it once */
+ if (!mat->nodetree->execdata)
+ mat->nodetree->execdata = ntreeShaderBeginExecTree(mat->nodetree, 1);
}
}
@@ -957,8 +958,10 @@ void init_render_materials(Main *bmain, int r_mode, float *amb)
/* only needed for nodes now */
void end_render_material(Material *mat)
{
- if(mat && mat->nodetree && mat->use_nodes)
- ntreeEndExecTree(mat->nodetree); /* has internal flag to detect it only does it once */
+ if(mat && mat->nodetree && mat->use_nodes) {
+ if (mat->nodetree->execdata)
+ ntreeShaderEndExecTree(mat->nodetree->execdata, 1);
+ }
}
void end_render_materials(Main *bmain)
@@ -1119,7 +1122,7 @@ int object_remove_material_slot(Object *ob)
/* r g b = current value, col = new value, fac==0 is no change */
/* if g==NULL, it only does r channel */
-void ramp_blend(int type, float *r, float *g, float *b, float fac, float *col)
+void ramp_blend(int type, float *r, float *g, float *b, float fac, const float col[3])
{
float tmp, facm= 1.0f-fac;
diff --git a/source/blender/blenkernel/intern/mesh_validate.c b/source/blender/blenkernel/intern/mesh_validate.c
index 9c916d517c5..4d735f1d54b 100644
--- a/source/blender/blenkernel/intern/mesh_validate.c
+++ b/source/blender/blenkernel/intern/mesh_validate.c
@@ -143,7 +143,7 @@ int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), unsigned int totve
BLI_assert(!(do_fixes && me == NULL));
- PRINT("ED_mesh_validate: verts(%u), edges(%u), faces(%u)\n", totvert, totedge, totface);
+ PRINT("%s: verts(%u), edges(%u), faces(%u)\n", __func__, totvert, totedge, totface);
if(totedge == 0 && totface != 0) {
PRINT(" locical error, %u faces and 0 edges\n", totface);
@@ -166,7 +166,7 @@ int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), unsigned int totve
}
if(BLI_edgehash_haskey(edge_hash, med->v1, med->v2)) {
- PRINT(" edge %u: is a duplicate of, %u\n", i, GET_INT_FROM_POINTER(BLI_edgehash_lookup(edge_hash, med->v1, med->v2)));
+ PRINT(" edge %u: is a duplicate of, %d\n", i, GET_INT_FROM_POINTER(BLI_edgehash_lookup(edge_hash, med->v1, med->v2)));
remove= do_fixes;
}
diff --git a/source/blender/blenkernel/intern/navmesh_conversion.cpp b/source/blender/blenkernel/intern/navmesh_conversion.cpp
new file mode 100644
index 00000000000..9b373db59ff
--- /dev/null
+++ b/source/blender/blenkernel/intern/navmesh_conversion.cpp
@@ -0,0 +1,478 @@
+/**
+* $Id$
+*
+* ***** BEGIN GPL LICENSE BLOCK *****
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+* 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 LICENSE BLOCK *****
+*/
+
+#include <math.h>
+#include <stdlib.h>
+#include "Recast.h"
+
+extern "C"{
+#include "BKE_navmesh_conversion.h"
+
+#include "DNA_meshdata_types.h"
+#include "BKE_cdderivedmesh.h"
+#include "BLI_math.h"
+}
+
+inline float area2(const float* a, const float* b, const float* c)
+{
+ return (b[0] - a[0]) * (c[2] - a[2]) - (c[0] - a[0]) * (b[2] - a[2]);
+}
+
+inline bool left(const float* a, const float* b, const float* c)
+{
+ return area2(a, b, c) < 0;
+}
+
+int polyNumVerts(const unsigned short* p, const int vertsPerPoly)
+{
+ int nv = 0;
+ for (int i=0; i<vertsPerPoly; i++)
+ {
+ if (p[i]==0xffff)
+ break;
+ nv++;
+ }
+ return nv;
+}
+
+bool polyIsConvex(const unsigned short* p, const int vertsPerPoly, const float* verts)
+{
+ int nv = polyNumVerts(p, vertsPerPoly);
+ if (nv<3)
+ return false;
+ for (int j=0; j<nv; j++)
+ {
+ const float* v = &verts[3*p[j]];
+ const float* v_next = &verts[3*p[(j+1)%nv]];
+ const float* v_prev = &verts[3*p[(nv+j-1)%nv]];
+ if (!left(v_prev, v, v_next))
+ return false;
+
+ }
+ return true;
+}
+
+float distPointToSegmentSq(const float* point, const float* a, const float* b)
+{
+ float abx[3], dx[3];
+ vsub(abx, b,a);
+ vsub(dx, point,a);
+ float d = abx[0]*abx[0]+abx[2]*abx[2];
+ float t = abx[0]*dx[0]+abx[2]*dx[2];
+ if (d > 0)
+ t /= d;
+ if (t < 0)
+ t = 0;
+ else if (t > 1)
+ t = 1;
+ dx[0] = a[0] + t*abx[0] - point[0];
+ dx[2] = a[2] + t*abx[2] - point[2];
+ return dx[0]*dx[0] + dx[2]*dx[2];
+}
+
+bool buildRawVertIndicesData(DerivedMesh* dm, int &nverts, float *&verts,
+ int &ntris, unsigned short *&tris, int *&trisToFacesMap,
+ int *&recastData)
+{
+ nverts = dm->getNumVerts(dm);
+ if (nverts>=0xffff)
+ {
+ printf("Converting navmesh: Error! Too many vertices. Max number of vertices %d\n", 0xffff);
+ return false;
+ }
+ verts = new float[3*nverts];
+ dm->getVertCos(dm, (float(*)[3])verts);
+
+ //flip coordinates
+ for (int vi=0; vi<nverts; vi++)
+ {
+ SWAP(float, verts[3*vi+1], verts[3*vi+2]);
+ }
+
+ //calculate number of tris
+ int nfaces = dm->getNumFaces(dm);
+ MFace *faces = dm->getFaceArray(dm);
+ ntris = nfaces;
+ for (int fi=0; fi<nfaces; fi++)
+ {
+ MFace* face = &faces[fi];
+ if (face->v4)
+ ntris++;
+ }
+
+ //copy and transform to triangles (reorder on the run)
+ trisToFacesMap = new int[ntris];
+ tris = new unsigned short[3*ntris];
+ unsigned short* tri = tris;
+ int triIdx = 0;
+ for (int fi=0; fi<nfaces; fi++)
+ {
+ MFace* face = &faces[fi];
+ tri[3*triIdx+0] = (unsigned short) face->v1;
+ tri[3*triIdx+1] = (unsigned short) face->v3;
+ tri[3*triIdx+2] = (unsigned short) face->v2;
+ trisToFacesMap[triIdx++]=fi;
+ if (face->v4)
+ {
+ tri[3*triIdx+0] = (unsigned short) face->v1;
+ tri[3*triIdx+1] = (unsigned short) face->v4;
+ tri[3*triIdx+2] = (unsigned short) face->v3;
+ trisToFacesMap[triIdx++]=fi;
+ }
+ }
+
+ //carefully, recast data is just reference to data in derived mesh
+ recastData = (int*)CustomData_get_layer(&dm->faceData, CD_RECAST);
+ return true;
+}
+
+bool buildPolygonsByDetailedMeshes(const int vertsPerPoly, const int npolys,
+ unsigned short* polys, const unsigned short* dmeshes,
+ const float* verts, const unsigned short* dtris,
+ const int* dtrisToPolysMap)
+{
+ int capacity = vertsPerPoly;
+ unsigned short* newPoly = new unsigned short[capacity];
+ memset(newPoly, 0xff, sizeof(unsigned short)*capacity);
+ for (int polyidx=0; polyidx<npolys; polyidx++)
+ {
+ int nv = 0;
+ //search border
+ int btri = -1;
+ int bedge = -1;
+ int dtrisNum = dmeshes[polyidx*4+3];
+ int dtrisBase = dmeshes[polyidx*4+2];
+ unsigned char *traversedTris = new unsigned char[dtrisNum];
+ memset(traversedTris, 0, dtrisNum*sizeof(unsigned char));
+ for (int j=0; j<dtrisNum && btri==-1;j++)
+ {
+ int curpolytri = dtrisBase+j;
+ for (int k=0; k<3; k++)
+ {
+ unsigned short neighbortri = dtris[curpolytri*3*2+3+k];
+ if ( neighbortri==0xffff || dtrisToPolysMap[neighbortri]!=polyidx+1)
+ {
+ btri = curpolytri;
+ bedge = k;
+ break;
+ }
+ }
+ }
+ if (btri==-1 || bedge==-1)
+ {
+ //can't find triangle with border edge
+ return false;
+ }
+
+ newPoly[nv++] = dtris[btri*3*2+bedge];
+ int tri = btri;
+ int edge = (bedge+1)%3;
+ traversedTris[tri-dtrisBase] = 1;
+ while (tri!=btri || edge!=bedge)
+ {
+ int neighbortri = dtris[tri*3*2+3+edge];
+ if (neighbortri==0xffff || dtrisToPolysMap[neighbortri]!=polyidx+1)
+ {
+ if (nv==capacity)
+ {
+ capacity += vertsPerPoly;
+ unsigned short* newPolyBig = new unsigned short[capacity];
+ memset(newPolyBig, 0xff, sizeof(unsigned short)*capacity);
+ memcpy(newPolyBig, newPoly, sizeof(unsigned short)*nv);
+ delete newPoly;
+ newPoly = newPolyBig;
+ }
+ newPoly[nv++] = dtris[tri*3*2+edge];
+ //move to next edge
+ edge = (edge+1)%3;
+ }
+ else
+ {
+ //move to next tri
+ int twinedge = -1;
+ for (int k=0; k<3; k++)
+ {
+ if (dtris[neighbortri*3*2+3+k] == tri)
+ {
+ twinedge = k;
+ break;
+ }
+ }
+ if (twinedge==-1)
+ {
+ printf("Converting navmesh: Error! Can't find neighbor edge - invalid adjacency info\n");
+ goto returnLabel;
+ }
+ tri = neighbortri;
+ edge = (twinedge+1)%3;
+ traversedTris[tri-dtrisBase] = 1;
+ }
+ }
+
+ unsigned short* adjustedPoly = new unsigned short[nv];
+ int adjustedNv = 0;
+ for (size_t i=0; i<(size_t)nv; i++)
+ {
+ unsigned short prev = newPoly[(nv+i-1)%nv];
+ unsigned short cur = newPoly[i];
+ unsigned short next = newPoly[(i+1)%nv];
+ float distSq = distPointToSegmentSq(&verts[3*cur], &verts[3*prev], &verts[3*next]);
+ static const float tolerance = 0.001f;
+ if (distSq>tolerance)
+ adjustedPoly[adjustedNv++] = cur;
+ }
+ memcpy(newPoly, adjustedPoly, adjustedNv*sizeof(unsigned short));
+ delete adjustedPoly;
+ nv = adjustedNv;
+
+ bool allBorderTraversed = true;
+ for (size_t i=0; i<(size_t)dtrisNum; i++)
+ {
+ if (traversedTris[i]==0)
+ {
+ //check whether it has border edges
+ int curpolytri = dtrisBase+i;
+ for (int k=0; k<3; k++)
+ {
+ unsigned short neighbortri = dtris[curpolytri*3*2+3+k];
+ if ( neighbortri==0xffff || dtrisToPolysMap[neighbortri]!=polyidx+1)
+ {
+ allBorderTraversed = false;
+ break;
+ }
+ }
+ }
+ }
+
+ if (nv<=vertsPerPoly && allBorderTraversed)
+ {
+ for (int i=0; i<nv; i++)
+ {
+ polys[polyidx*vertsPerPoly*2+i] = newPoly[i];
+ }
+ }
+ }
+
+returnLabel:
+ delete newPoly;
+ return true;
+}
+
+struct SortContext
+{
+ const int* recastData;
+ const int* trisToFacesMap;
+};
+
+#ifdef FREE_WINDOWS
+static SortContext *_mingw_context;
+static int compareByData(const void * a, const void * b)
+{
+ return ( _mingw_context->recastData[_mingw_context->trisToFacesMap[*(int*)a]] -
+ _mingw_context->recastData[_mingw_context->trisToFacesMap[*(int*)b]] );
+}
+#else
+#if defined(_MSC_VER)
+static int compareByData(void* data, const void * a, const void * b)
+#elif defined(__APPLE__) || defined(__FreeBSD__)
+static int compareByData(void* data, const void * a, const void * b)
+#else
+static int compareByData(const void * a, const void * b, void* data)
+#endif
+{
+ const SortContext* context = (const SortContext*)data;
+ return ( context->recastData[context->trisToFacesMap[*(int*)a]] -
+ context->recastData[context->trisToFacesMap[*(int*)b]] );
+}
+#endif
+
+bool buildNavMeshData(const int nverts, const float* verts,
+ const int ntris, const unsigned short *tris,
+ const int* recastData, const int* trisToFacesMap,
+ int &ndtris, unsigned short *&dtris,
+ int &npolys, unsigned short *&dmeshes, unsigned short *&polys,
+ int &vertsPerPoly, int *&dtrisToPolysMap, int *&dtrisToTrisMap)
+
+{
+ if (!recastData)
+ {
+ printf("Converting navmesh: Error! Can't find recast custom data\n");
+ return false;
+ }
+
+ //sort the triangles by polygon idx
+ int* trisMapping = new int[ntris];
+ for (int i=0; i<ntris; i++)
+ trisMapping[i]=i;
+ SortContext context;
+ context.recastData = recastData;
+ context.trisToFacesMap = trisToFacesMap;
+#if defined(_MSC_VER)
+ qsort_s(trisMapping, ntris, sizeof(int), compareByData, &context);
+#elif defined(__APPLE__) || defined(__FreeBSD__)
+ qsort_r(trisMapping, ntris, sizeof(int), &context, compareByData);
+#elif defined(FREE_WINDOWS)
+ _mingw_context = &context;
+ qsort(trisMapping, ntris, sizeof(int), compareByData);
+#else
+ qsort_r(trisMapping, ntris, sizeof(int), compareByData, &context);
+#endif
+ //search first valid triangle - triangle of convex polygon
+ int validTriStart = -1;
+ for (int i=0; i< ntris; i++)
+ {
+ if (recastData[trisToFacesMap[trisMapping[i]]]>0)
+ {
+ validTriStart = i;
+ break;
+ }
+ }
+
+ if (validTriStart<0)
+ {
+ printf("Converting navmesh: Error! No valid polygons in mesh\n");
+ delete trisMapping;
+ return false;
+ }
+
+ ndtris = ntris-validTriStart;
+ //fill dtris to faces mapping
+ dtrisToTrisMap = new int[ndtris];
+ memcpy(dtrisToTrisMap, &trisMapping[validTriStart], ndtris*sizeof(int));
+ delete trisMapping; trisMapping=NULL;
+
+ //create detailed mesh triangles - copy only valid triangles
+ //and reserve memory for adjacency info
+ dtris = new unsigned short[3*2*ndtris];
+ memset(dtris, 0xffff, sizeof(unsigned short)*3*2*ndtris);
+ for (int i=0; i<ndtris; i++)
+ {
+ memcpy(dtris+3*2*i, tris+3*dtrisToTrisMap[i], sizeof(unsigned short)*3);
+ }
+ //create new recast data corresponded to dtris and renumber for continuous indices
+ int prevPolyIdx=-1, curPolyIdx, newPolyIdx=0;
+ dtrisToPolysMap = new int[ndtris];
+ for (int i=0; i<ndtris; i++)
+ {
+ curPolyIdx = recastData[trisToFacesMap[dtrisToTrisMap[i]]];
+ if (curPolyIdx!=prevPolyIdx)
+ {
+ newPolyIdx++;
+ prevPolyIdx=curPolyIdx;
+ }
+ dtrisToPolysMap[i] = newPolyIdx;
+ }
+
+
+ //build adjacency info for detailed mesh triangles
+ buildMeshAdjacency(dtris, ndtris, nverts, 3);
+
+ //create detailed mesh description for each navigation polygon
+ npolys = dtrisToPolysMap[ndtris-1];
+ dmeshes = new unsigned short[npolys*4];
+ memset(dmeshes, 0, npolys*4*sizeof(unsigned short));
+ unsigned short *dmesh = NULL;
+ int prevpolyidx = 0;
+ for (int i=0; i<ndtris; i++)
+ {
+ int curpolyidx = dtrisToPolysMap[i];
+ if (curpolyidx!=prevpolyidx)
+ {
+ if (curpolyidx!=prevpolyidx+1)
+ {
+ printf("Converting navmesh: Error! Wrong order of detailed mesh faces\n");
+ return false;
+ }
+ dmesh = dmesh==NULL ? dmeshes : dmesh+4;
+ dmesh[2] = (unsigned short)i; //tbase
+ dmesh[3] = 0; //tnum
+ prevpolyidx = curpolyidx;
+ }
+ dmesh[3]++;
+ }
+
+ //create navigation polygons
+ vertsPerPoly = 6;
+ polys = new unsigned short[npolys*vertsPerPoly*2];
+ memset(polys, 0xff, sizeof(unsigned short)*vertsPerPoly*2*npolys);
+
+ buildPolygonsByDetailedMeshes(vertsPerPoly, npolys, polys, dmeshes, verts, dtris, dtrisToPolysMap);
+
+ return true;
+}
+
+
+bool buildNavMeshDataByDerivedMesh(DerivedMesh *dm, int& vertsPerPoly,
+ int &nverts, float *&verts,
+ int &ndtris, unsigned short *&dtris,
+ int& npolys, unsigned short *&dmeshes,
+ unsigned short*& polys, int *&dtrisToPolysMap,
+ int *&dtrisToTrisMap, int *&trisToFacesMap)
+{
+ bool res = true;
+ int ntris =0, *recastData=NULL;
+ unsigned short *tris=NULL;
+ res = buildRawVertIndicesData(dm, nverts, verts, ntris, tris, trisToFacesMap, recastData);
+ if (!res)
+ {
+ printf("Converting navmesh: Error! Can't get vertices and indices from mesh\n");
+ goto exit;
+ }
+
+ res = buildNavMeshData(nverts, verts, ntris, tris, recastData, trisToFacesMap,
+ ndtris, dtris, npolys, dmeshes,polys, vertsPerPoly,
+ dtrisToPolysMap, dtrisToTrisMap);
+ if (!res)
+ {
+ printf("Converting navmesh: Error! Can't get vertices and indices from mesh\n");
+ goto exit;
+ }
+
+exit:
+ if (tris)
+ delete tris;
+
+ return res;
+}
+
+int polyFindVertex(const unsigned short* p, const int vertsPerPoly, unsigned short vertexIdx)
+{
+ int res = -1;
+ for(int i=0; i<vertsPerPoly; i++)
+ {
+ if (p[i]==0xffff)
+ break;
+ if (p[i]==vertexIdx)
+ {
+ res = i;
+ break;
+ }
+ }
+ return res;
+}
diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c
index 25f824bba19..6ce80342dd6 100644
--- a/source/blender/blenkernel/intern/nla.c
+++ b/source/blender/blenkernel/intern/nla.c
@@ -359,6 +359,9 @@ NlaStrip *add_nla_soundstrip (Scene *scene, Speaker *speaker)
#endif
{
strip->end = 10.0f;
+ /* quiet compiler warnings */
+ (void)scene;
+ (void)speaker;
}
/* general settings */
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 5f1a6c911bc..d40b030c470 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -46,84 +46,107 @@
#include <limits.h>
#include "DNA_anim_types.h"
-#include "DNA_action_types.h"
#include "DNA_node_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_action_types.h"
+#include "BLI_string.h"
+#include "BLI_math.h"
#include "BLI_listbase.h"
-
-#include "RNA_access.h"
+#include "BLI_path_util.h"
+#include "BLI_utildefines.h"
#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_fcurve.h"
+#include "BKE_global.h"
+#include "BKE_image.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_utildefines.h"
+#include "BKE_utildefines.h"
-#include "PIL_time.h"
-
-#include "CMP_node.h"
-#include "intern/CMP_util.h" /* stupid include path... */
+#include "BLI_listbase.h"
-#include "SHD_node.h"
-#include "TEX_node.h"
-#include "intern/TEX_util.h"
+#include "RNA_access.h"
-#include "GPU_material.h"
+#include "NOD_socket.h"
+#include "NOD_composite.h"
+#include "NOD_shader.h"
+#include "NOD_texture.h"
-static ListBase empty_list = {NULL, NULL};
-ListBase node_all_composit = {NULL, NULL};
-ListBase node_all_shaders = {NULL, NULL};
-ListBase node_all_textures = {NULL, NULL};
-/* ************** Type stuff ********** */
+bNodeTreeType *ntreeGetType(int type)
+{
+ static bNodeTreeType *types[NUM_NTREE_TYPES];
+ static int types_init = 1;
+ if (types_init) {
+ types[NTREE_SHADER] = &ntreeType_Shader;
+ types[NTREE_COMPOSIT] = &ntreeType_Composite;
+ types[NTREE_TEXTURE] = &ntreeType_Texture;
+ types_init = 0;
+ }
+
+ if(type >= 0 && type < NUM_NTREE_TYPES) {
+ return types[type];
+ }
+ else {
+ return NULL;
+ }
+}
-static bNodeType *node_get_type(bNodeTree *ntree, int type, ID *id)
+static bNodeType *node_get_type(bNodeTree *ntree, int type)
{
- bNodeType *ntype = ntree->alltypes.first;
+ bNodeType *ntype = ntreeGetType(ntree->type)->node_types.first;
for(; ntype; ntype= ntype->next)
- if(ntype->type==type && id==ntype->id )
+ if(ntype->type==type)
return ntype;
return NULL;
}
-void ntreeInitTypes(bNodeTree *ntree)
+bNodeType *ntreeGetNodeType(bNodeTree *ntree)
{
- bNode *node, *next;
-
- if(ntree->type==NTREE_SHADER)
- ntree->alltypes= node_all_shaders;
- else if(ntree->type==NTREE_COMPOSIT)
- ntree->alltypes= node_all_composit;
- else if(ntree->type==NTREE_TEXTURE)
- ntree->alltypes= node_all_textures;
+ return node_get_type(ntree, ntree->nodetype);
+}
+
+bNodeSocketType *ntreeGetSocketType(int type)
+{
+ static bNodeSocketType *types[NUM_SOCKET_TYPES]= {NULL};
+ static int types_init = 1;
+
+ if (types_init) {
+ node_socket_type_init(types);
+ types_init= 0;
+ }
+
+ if(type < NUM_SOCKET_TYPES) {
+ return types[type];
+ }
else {
- ntree->alltypes= empty_list;
- printf("Error: no type definitions for nodes\n");
+ return NULL;
}
+}
+
+void ntreeInitTypes(bNodeTree *ntree)
+{
+ bNode *node, *next;
for(node= ntree->nodes.first; node; node= next) {
next= node->next;
+
+ node->typeinfo= node_get_type(ntree, node->type);
+
if(node->type==NODE_DYNAMIC) {
- bNodeType *stype= NULL;
- if(node->id==NULL) { /* empty script node */
- stype= node_get_type(ntree, node->type, NULL);
- } else { /* not an empty script node */
- stype= node_get_type(ntree, node->type, node->id);
- if(!stype) {
- stype= node_get_type(ntree, node->type, NULL);
- /* needed info if the pynode script fails now: */
- if (node->id) node->storage= ntree;
- } else {
- node->custom1= 0;
- node->custom1= BSET(node->custom1,NODE_DYNAMIC_ADDEXIST);
- }
+ /* needed info if the pynode script fails now: */
+ node->storage= ntree;
+ if(node->id!=NULL) { /* not an empty script node */
+ node->custom1= 0;
+ node->custom1= BSET(node->custom1,NODE_DYNAMIC_ADDEXIST);
}
- node->typeinfo= stype;
- if(node->typeinfo)
- node->typeinfo->initfunc(node);
- } else {
- node->typeinfo= node_get_type(ntree, node->type, NULL);
+// if(node->typeinfo)
+// node->typeinfo->initfunc(node);
}
if(node->typeinfo==NULL) {
@@ -135,66 +158,51 @@ void ntreeInitTypes(bNodeTree *ntree)
ntree->init |= NTREE_TYPE_INIT;
}
-/* updates node with (modified) bNodeType.. this should be done for all trees */
-void ntreeUpdateType(bNodeTree *ntree, bNodeType *ntype)
+static bNodeSocket *make_socket(bNodeTree *UNUSED(ntree), int in_out, const char *name, int type)
{
- bNode *node;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->typeinfo== ntype) {
- nodeUpdateType(ntree, node, ntype);
- }
- }
+ bNodeSocketType *stype= ntreeGetSocketType(type);
+ bNodeSocket *sock;
+
+ sock= MEM_callocN(sizeof(bNodeSocket), "sock");
+
+ BLI_strncpy(sock->name, name, NODE_MAXSTR);
+ sock->limit = (in_out==SOCK_IN ? 1 : 0xFFF);
+ sock->type= type;
+ sock->storage = NULL;
+
+ if (stype->value_structsize > 0)
+ sock->default_value = MEM_callocN(stype->value_structsize, "default socket value");
+
+ return sock;
}
-/* only used internal... we depend on type definitions! */
-static bNodeSocket *node_add_socket_type(ListBase *lb, bNodeSocketType *stype)
+bNodeSocket *nodeAddSocket(bNodeTree *ntree, bNode *node, int in_out, const char *name, int type)
{
- bNodeSocket *sock= MEM_callocN(sizeof(bNodeSocket), "sock");
+ bNodeSocket *sock = make_socket(ntree, in_out, name, type);
+ if (in_out==SOCK_IN)
+ BLI_addtail(&node->inputs, sock);
+ else if (in_out==SOCK_OUT)
+ BLI_addtail(&node->outputs, sock);
- BLI_strncpy(sock->name, stype->name, NODE_MAXSTR);
- if(stype->limit==0) sock->limit= 0xFFF;
- else sock->limit= stype->limit;
- sock->type= stype->type;
+ ntree->update |= NTREE_UPDATE_NODES;
- sock->ns.vec[0]= stype->val1;
- sock->ns.vec[1]= stype->val2;
- sock->ns.vec[2]= stype->val3;
- sock->ns.vec[3]= stype->val4;
- sock->ns.min= stype->min;
- sock->ns.max= stype->max;
-
- if(lb)
- BLI_addtail(lb, sock);
-
return sock;
}
-static bNodeSocket *node_add_group_socket(ListBase *lb, bNodeSocket *gsock)
+bNodeSocket *nodeInsertSocket(bNodeTree *ntree, bNode *node, int in_out, bNodeSocket *next_sock, const char *name, int type)
{
- bNodeSocket *sock= MEM_callocN(sizeof(bNodeSocket), "sock");
+ bNodeSocket *sock = make_socket(ntree, in_out, name, type);
+ if (in_out==SOCK_IN)
+ BLI_insertlinkbefore(&node->inputs, next_sock, sock);
+ else if (in_out==SOCK_OUT)
+ BLI_insertlinkbefore(&node->outputs, next_sock, sock);
- /* make a copy of the group socket */
- *sock = *gsock;
- sock->link = NULL;
- sock->next = sock->prev = NULL;
- sock->new_sock = NULL;
- sock->ns.data = NULL;
+ ntree->update |= NTREE_UPDATE_NODES;
- sock->own_index = gsock->own_index;
- sock->groupsock = gsock;
- /* XXX hack: group socket input/output roles are inverted internally,
- * need to change the limit value when making actual node sockets from them.
- */
- sock->limit = (gsock->limit==1 ? 0xFFF : 1);
-
- if(lb)
- BLI_addtail(lb, sock);
-
return sock;
}
-static void node_rem_socket(bNodeTree *ntree, ListBase *lb, bNodeSocket *sock)
+void nodeRemoveSocket(bNodeTree *ntree, bNode *node, bNodeSocket *sock)
{
bNodeLink *link, *next;
@@ -205,428 +213,42 @@ static void node_rem_socket(bNodeTree *ntree, ListBase *lb, bNodeSocket *sock)
}
}
- BLI_remlink(lb, sock);
- MEM_freeN(sock);
-}
-
-static bNodeSocket *verify_socket(ListBase *lb, bNodeSocketType *stype)
-{
- bNodeSocket *sock;
-
- for(sock= lb->first; sock; sock= sock->next) {
- if(strncmp(sock->name, stype->name, NODE_MAXSTR)==0)
- break;
- }
- if(sock) {
- sock->type= stype->type; /* in future, read this from tydefs! */
- if(stype->limit==0) sock->limit= 0xFFF;
- else sock->limit= stype->limit;
-
- sock->ns.min= stype->min;
- sock->ns.max= stype->max;
-
- BLI_remlink(lb, sock);
-
- return sock;
- }
- else {
- return node_add_socket_type(NULL, stype);
- }
-}
-
-static bNodeSocket *verify_group_socket(ListBase *lb, bNodeSocket *gsock)
-{
- bNodeSocket *sock;
-
- for(sock= lb->first; sock; sock= sock->next) {
- if(sock->own_index==gsock->own_index)
- break;
- }
- if(sock) {
- sock->groupsock = gsock;
-
- strcpy(sock->name, gsock->name);
- sock->type= gsock->type;
-
- /* XXX hack: group socket input/output roles are inverted internally,
- * need to change the limit value when making actual node sockets from them.
- */
- sock->limit = (gsock->limit==1 ? 0xFFF : 1);
-
- sock->ns.min= gsock->ns.min;
- sock->ns.max= gsock->ns.max;
-
- BLI_remlink(lb, sock);
-
- return sock;
- }
- else {
- return node_add_group_socket(NULL, gsock);
- }
-}
-
-static void verify_socket_list(bNodeTree *ntree, ListBase *lb, bNodeSocketType *stype_first)
-{
- bNodeSocketType *stype;
-
- /* no inputs anymore? */
- if(stype_first==NULL) {
- while(lb->first)
- node_rem_socket(ntree, lb, lb->first);
- }
- else {
- /* step by step compare */
- stype= stype_first;
- while(stype->type != -1) {
- stype->sock= verify_socket(lb, stype);
- stype++;
- }
- /* leftovers are removed */
- while(lb->first)
- node_rem_socket(ntree, lb, lb->first);
- /* and we put back the verified sockets */
- stype= stype_first;
- while(stype->type != -1) {
- BLI_addtail(lb, stype->sock);
- stype++;
- }
- }
-}
-
-static void verify_group_socket_list(bNodeTree *ntree, ListBase *lb, ListBase *glb)
-{
- bNodeSocket *gsock;
-
- /* step by step compare */
- for (gsock= glb->first; gsock; gsock=gsock->next) {
- /* abusing new_sock pointer for verification here! only used inside this function */
- gsock->new_sock= verify_group_socket(lb, gsock);
- }
- /* leftovers are removed */
- while(lb->first)
- node_rem_socket(ntree, lb, lb->first);
- /* and we put back the verified sockets */
- for (gsock= glb->first; gsock; gsock=gsock->next) {
- BLI_addtail(lb, gsock->new_sock);
- gsock->new_sock = NULL;
- }
-}
-
-void nodeVerifyType(bNodeTree *ntree, bNode *node)
-{
- /* node groups don't have static sock lists, but use external sockets from the tree instead */
- if (node->type==NODE_GROUP) {
- bNodeTree *ngroup= (bNodeTree*)node->id;
- if (ngroup) {
- verify_group_socket_list(ntree, &node->inputs, &ngroup->inputs);
- verify_group_socket_list(ntree, &node->outputs, &ngroup->outputs);
- }
- }
- else {
- bNodeType *ntype= node->typeinfo;
- if(ntype) {
- verify_socket_list(ntree, &node->inputs, ntype->inputs);
- verify_socket_list(ntree, &node->outputs, ntype->outputs);
- }
- }
-}
-
-void ntreeVerifyTypes(bNodeTree *ntree)
-{
- bNode *node;
-
- /* if((ntree->init & NTREE_TYPE_INIT)==0) */
- ntreeInitTypes(ntree);
-
- /* check inputs and outputs, and remove or insert them */
- for(node= ntree->nodes.first; node; node= node->next)
- nodeVerifyType(ntree, node);
+ /* this is fast, this way we don't need an in_out argument */
+ BLI_remlink(&node->inputs, sock);
+ BLI_remlink(&node->outputs, sock);
-}
-
-/* ************** Group stuff ********** */
-
-/* XXX group typeinfo struct is used directly in ntreeMakeOwnType, needs cleanup */
-static bNodeType ntype_group;
-
-/* groups display their internal tree name as label */
-static const char *group_label(bNode *node)
-{
- return (node->id)? node->id->name+2: "Missing Datablock";
-}
-
-void register_node_type_group(ListBase *lb)
-{
- node_type_base(&ntype_group, NODE_GROUP, "Group", NODE_CLASS_GROUP, NODE_OPTIONS, NULL, NULL);
- node_type_size(&ntype_group, 120, 60, 200);
- node_type_label(&ntype_group, group_label);
+ if (sock->default_value)
+ MEM_freeN(sock->default_value);
+ MEM_freeN(sock);
- nodeRegisterType(lb, &ntype_group);
-}
-
-static bNodeSocket *find_group_node_input(bNode *gnode, bNodeSocket *gsock)
-{
- bNodeSocket *sock;
- for (sock=gnode->inputs.first; sock; sock=sock->next)
- if (sock->groupsock == gsock)
- return sock;
- return NULL;
+ ntree->update |= NTREE_UPDATE_NODES;
}
-static bNodeSocket *find_group_node_output(bNode *gnode, bNodeSocket *gsock)
+void nodeRemoveAllSockets(bNodeTree *ntree, bNode *node)
{
bNodeSocket *sock;
- for (sock=gnode->outputs.first; sock; sock=sock->next)
- if (sock->groupsock == gsock)
- return sock;
- return NULL;
-}
-
-bNode *nodeMakeGroupFromSelected(bNodeTree *ntree)
-{
- bNodeLink *link, *linkn;
- bNode *node, *gnode, *nextn;
- bNodeTree *ngroup;
- bNodeSocket *gsock;
- ListBase anim_basepaths = {NULL, NULL};
- float min[2], max[2];
- int totnode=0;
-
- INIT_MINMAX2(min, max);
-
- /* is there something to group? also do some clearing */
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->flag & NODE_SELECT) {
- /* no groups in groups */
- if(node->type==NODE_GROUP)
- return NULL;
- DO_MINMAX2( (&node->locx), min, max);
- totnode++;
- }
- node->done= 0;
- }
- if(totnode==0) return NULL;
-
- /* check if all connections are OK, no unselected node has both
- inputs and outputs to a selection */
- for(link= ntree->links.first; link; link= link->next) {
- if(link->fromnode && link->tonode && link->fromnode->flag & NODE_SELECT)
- link->tonode->done |= 1;
- if(link->fromnode && link->tonode && link->tonode->flag & NODE_SELECT)
- link->fromnode->done |= 2;
- }
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if((node->flag & NODE_SELECT)==0)
- if(node->done==3)
- break;
- }
- if(node)
- return NULL;
+ bNodeLink *link, *next;
- /* OK! new nodetree */
- ngroup= ntreeAddTree("NodeGroup", ntree->type, TRUE);
-
- /* move nodes over */
- for(node= ntree->nodes.first; node; node= nextn) {
- nextn= node->next;
- if(node->flag & NODE_SELECT) {
- /* keep track of this node's RNA "base" path (the part of the pat identifying the node)
- * if the old nodetree has animation data which potentially covers this node
- */
- if (ntree->adt) {
- PointerRNA ptr;
- char *path;
-
- RNA_pointer_create(&ntree->id, &RNA_Node, node, &ptr);
- path = RNA_path_from_ID_to_struct(&ptr);
-
- if (path)
- BLI_addtail(&anim_basepaths, BLI_genericNodeN(path));
- }
-
- /* change node-collection membership */
- BLI_remlink(&ntree->nodes, node);
- BLI_addtail(&ngroup->nodes, node);
-
- node->locx-= 0.5f*(min[0]+max[0]);
- node->locy-= 0.5f*(min[1]+max[1]);
- }
- }
-
- /* move animation data over */
- if (ntree->adt) {
- LinkData *ld, *ldn=NULL;
-
- BKE_animdata_separate_by_basepath(&ntree->id, &ngroup->id, &anim_basepaths);
-
- /* paths + their wrappers need to be freed */
- for (ld = anim_basepaths.first; ld; ld = ldn) {
- ldn = ld->next;
-
- MEM_freeN(ld->data);
- BLI_freelinkN(&anim_basepaths, ld);
+ for(link= ntree->links.first; link; link= next) {
+ next= link->next;
+ if(link->fromnode==node || link->tonode==node) {
+ nodeRemLink(ntree, link);
}
}
- /* make group node */
- gnode= nodeAddNodeType(ntree, NODE_GROUP, ngroup, NULL);
- gnode->locx= 0.5f*(min[0]+max[0]);
- gnode->locy= 0.5f*(min[1]+max[1]);
+ for (sock=node->inputs.first; sock; sock=sock->next)
+ if (sock->default_value)
+ MEM_freeN(sock->default_value);
+ BLI_freelistN(&node->inputs);
+ for (sock=node->outputs.first; sock; sock=sock->next)
+ if (sock->default_value)
+ MEM_freeN(sock->default_value);
- /* relink external sockets */
- for(link= ntree->links.first; link; link= linkn) {
- linkn= link->next;
-
- if(link->fromnode && link->tonode && (link->fromnode->flag & link->tonode->flag & NODE_SELECT)) {
- BLI_remlink(&ntree->links, link);
- BLI_addtail(&ngroup->links, link);
- }
- else if(link->tonode && (link->tonode->flag & NODE_SELECT)) {
- gsock = nodeGroupExposeSocket(ngroup, link->tosock, SOCK_IN);
- link->tosock->link = nodeAddLink(ngroup, NULL, gsock, link->tonode, link->tosock);
- link->tosock = node_add_group_socket(&gnode->inputs, gsock);
- link->tonode = gnode;
- }
- else if(link->fromnode && (link->fromnode->flag & NODE_SELECT)) {
- /* search for existing group node socket */
- for (gsock=ngroup->outputs.first; gsock; gsock=gsock->next)
- if (gsock->link && gsock->link->fromsock==link->fromsock)
- break;
- if (!gsock) {
- gsock = nodeGroupExposeSocket(ngroup, link->fromsock, SOCK_OUT);
- gsock->link = nodeAddLink(ngroup, link->fromnode, link->fromsock, NULL, gsock);
- link->fromsock = node_add_group_socket(&gnode->outputs, gsock);
- }
- else
- link->fromsock = find_group_node_output(gnode, gsock);
- link->fromnode = gnode;
- }
- }
-
- /* update node levels */
- ntreeSolveOrder(ntree);
-
- return gnode;
-}
-
-/* here's a nasty little one, need to check users... */
-/* should become callbackable... */
-void nodeGroupVerify(bNodeTree *ngroup)
-{
- /* group changed, so we rebuild the type definition */
-// ntreeMakeGroupSockets(ngroup);
+ BLI_freelistN(&node->outputs);
- if(ngroup->type==NTREE_SHADER) {
- Material *ma;
- for(ma= G.main->mat.first; ma; ma= ma->id.next) {
- if(ma->nodetree) {
- bNode *node;
- for(node= ma->nodetree->nodes.first; node; node= node->next)
- if(node->id == (ID *)ngroup)
- nodeVerifyType(ma->nodetree, node);
- }
- }
- }
- else if(ngroup->type==NTREE_COMPOSIT) {
- Scene *sce;
- for(sce= G.main->scene.first; sce; sce= sce->id.next) {
- if(sce->nodetree) {
- bNode *node;
- for(node= sce->nodetree->nodes.first; node; node= node->next)
- if(node->id == (ID *)ngroup)
- nodeVerifyType(sce->nodetree, node);
- }
- }
- }
- else if(ngroup->type==NTREE_TEXTURE) {
- Tex *tx;
- for(tx= G.main->tex.first; tx; tx= tx->id.next) {
- if(tx->nodetree) {
- bNode *node;
- for(node= tx->nodetree->nodes.first; node; node= node->next)
- if(node->id == (ID *)ngroup)
- nodeVerifyType(tx->nodetree, node);
- }
- }
- }
+ ntree->update |= NTREE_UPDATE_NODES;
}
-/* also to check all users of groups. Now only used in editor for hide/unhide */
-/* should become callbackable? */
-void nodeGroupSocketUseFlags(bNodeTree *ngroup)
-{
- bNode *node;
- bNodeSocket *sock;
-
- /* clear flags */
- for(node= ngroup->nodes.first; node; node= node->next) {
- for(sock= node->inputs.first; sock; sock= sock->next)
- sock->flag &= ~SOCK_IN_USE;
- for(sock= node->outputs.first; sock; sock= sock->next)
- sock->flag &= ~SOCK_IN_USE;
- }
-
- /* tag all thats in use */
- if(ngroup->type==NTREE_SHADER) {
- Material *ma;
- for(ma= G.main->mat.first; ma; ma= ma->id.next) {
- if(ma->nodetree) {
- for(node= ma->nodetree->nodes.first; node; node= node->next) {
- if(node->id==&ngroup->id) {
- for(sock= node->inputs.first; sock; sock= sock->next)
- if(sock->link)
- if(sock->groupsock)
- sock->groupsock->flag |= SOCK_IN_USE;
- for(sock= node->outputs.first; sock; sock= sock->next)
- if(nodeCountSocketLinks(ma->nodetree, sock))
- if(sock->groupsock)
- sock->groupsock->flag |= SOCK_IN_USE;
- }
- }
- }
- }
- }
- else if(ngroup->type==NTREE_COMPOSIT) {
- Scene *sce;
- for(sce= G.main->scene.first; sce; sce= sce->id.next) {
- if(sce->nodetree) {
- for(node= sce->nodetree->nodes.first; node; node= node->next) {
- if(node->id==(ID *)ngroup) {
- for(sock= node->inputs.first; sock; sock= sock->next)
- if(sock->link)
- if(sock->groupsock)
- sock->groupsock->flag |= SOCK_IN_USE;
- for(sock= node->outputs.first; sock; sock= sock->next)
- if(nodeCountSocketLinks(sce->nodetree, sock))
- if(sock->groupsock)
- sock->groupsock->flag |= SOCK_IN_USE;
- }
- }
- }
- }
- }
- else if(ngroup->type==NTREE_TEXTURE) {
- Tex *tx;
- for(tx= G.main->tex.first; tx; tx= tx->id.next) {
- if(tx->nodetree) {
- for(node= tx->nodetree->nodes.first; node; node= node->next) {
- if(node->id==(ID *)ngroup) {
- for(sock= node->inputs.first; sock; sock= sock->next)
- if(sock->link)
- if(sock->groupsock)
- sock->groupsock->flag |= SOCK_IN_USE;
- for(sock= node->outputs.first; sock; sock= sock->next)
- if(nodeCountSocketLinks(tx->nodetree, sock))
- if(sock->groupsock)
- sock->groupsock->flag |= SOCK_IN_USE;
- }
- }
- }
- }
- }
-
-}
/* finds a node based on its name */
bNode *nodeFindNodebyName(bNodeTree *ntree, const char *name)
{
@@ -669,272 +291,26 @@ int nodeFindNode(bNodeTree *ntree, bNodeSocket *sock, bNode **nodep, int *sockin
return 0;
}
-/* returns 1 if its OK */
-int nodeGroupUnGroup(bNodeTree *ntree, bNode *gnode)
-{
- bNodeLink *link, *linkn;
- bNode *node, *nextn;
- bNodeTree *ngroup, *wgroup;
- ListBase anim_basepaths = {NULL, NULL};
-
- ngroup= (bNodeTree *)gnode->id;
- if(ngroup==NULL) return 0;
-
- /* clear new pointers, set in copytree */
- for(node= ntree->nodes.first; node; node= node->next)
- node->new_node= NULL;
-
- /* wgroup is a temporary copy of the NodeTree we're merging in
- * - all of wgroup's nodes are transferred across to their new home
- * - ngroup (i.e. the source NodeTree) is left unscathed
- */
- wgroup= ntreeCopyTree(ngroup);
-
- /* add the nodes into the ntree */
- for(node= wgroup->nodes.first; node; node= nextn) {
- nextn= node->next;
-
- /* keep track of this node's RNA "base" path (the part of the pat identifying the node)
- * if the old nodetree has animation data which potentially covers this node
- */
- if (wgroup->adt) {
- PointerRNA ptr;
- char *path;
-
- RNA_pointer_create(&wgroup->id, &RNA_Node, node, &ptr);
- path = RNA_path_from_ID_to_struct(&ptr);
-
- if (path)
- BLI_addtail(&anim_basepaths, BLI_genericNodeN(path));
- }
-
- /* migrate node */
- BLI_remlink(&wgroup->nodes, node);
- BLI_addtail(&ntree->nodes, node);
-
- node->locx+= gnode->locx;
- node->locy+= gnode->locy;
-
- node->flag |= NODE_SELECT;
- }
-
- /* restore external links to and from the gnode */
- for(link= ntree->links.first; link; link= link->next) {
- if (link->fromnode==gnode) {
- if (link->fromsock->groupsock) {
- bNodeSocket *gsock= link->fromsock->groupsock;
- if (gsock->link) {
- if (gsock->link->fromnode) {
- /* NB: using the new internal copies here! the groupsock pointer still maps to the old tree */
- link->fromnode = (gsock->link->fromnode ? gsock->link->fromnode->new_node : NULL);
- link->fromsock = gsock->link->fromsock->new_sock;
- }
- else {
- /* group output directly maps to group input */
- bNodeSocket *insock= find_group_node_input(gnode, gsock->link->fromsock);
- if (insock->link) {
- link->fromnode = insock->link->fromnode;
- link->fromsock = insock->link->fromsock;
- }
- }
- }
- else {
- /* constant group output: copy the stack value to the external socket.
- * the link is kept here until all possible external users have been fixed.
- */
- QUATCOPY(link->tosock->ns.vec, gsock->ns.vec);
- }
- }
- }
- }
- /* remove internal output links, these are not used anymore */
- for(link=wgroup->links.first; link; link= linkn) {
- linkn = link->next;
- if (!link->tonode)
- nodeRemLink(wgroup, link);
- }
- /* restore links from internal nodes */
- for(link= wgroup->links.first; link; link= link->next) {
- /* indicates link to group input */
- if (!link->fromnode) {
- /* NB: can't use find_group_node_input here,
- * because gnode sockets still point to the old tree!
- */
- bNodeSocket *insock;
- for (insock= gnode->inputs.first; insock; insock= insock->next)
- if (insock->groupsock->new_sock == link->fromsock)
- break;
- if (insock->link) {
- link->fromnode = insock->link->fromnode;
- link->fromsock = insock->link->fromsock;
- }
- else {
- /* uses group constant input. copy the input value and remove the dead link. */
- QUATCOPY(link->tosock->ns.vec, insock->ns.vec);
- nodeRemLink(wgroup, link);
- }
- }
- }
-
- /* add internal links to the ntree */
- for(link= wgroup->links.first; link; link= linkn) {
- linkn= link->next;
- BLI_remlink(&wgroup->links, link);
- BLI_addtail(&ntree->links, link);
- }
-
- /* and copy across the animation */
- if (wgroup->adt) {
- LinkData *ld, *ldn=NULL;
- bAction *waction;
-
- /* firstly, wgroup needs to temporary dummy action that can be destroyed, as it shares copies */
- waction = wgroup->adt->action = copy_action(wgroup->adt->action);
-
- /* now perform the moving */
- BKE_animdata_separate_by_basepath(&wgroup->id, &ntree->id, &anim_basepaths);
-
- /* paths + their wrappers need to be freed */
- for (ld = anim_basepaths.first; ld; ld = ldn) {
- ldn = ld->next;
-
- MEM_freeN(ld->data);
- BLI_freelinkN(&anim_basepaths, ld);
- }
-
- /* free temp action too */
- free_libblock(&G.main->action, waction);
- }
-
- /* delete the group instance. this also removes old input links! */
- nodeFreeNode(ntree, gnode);
-
- /* free the group tree (takes care of user count) */
- free_libblock(&G.main->nodetree, wgroup);
-
- /* solve order goes fine, but the level tags not... doing it twice works for now. solve this once */
- /* XXX is this still necessary with new groups? it may have been caused by non-updated sock->link pointers. lukas */
- ntreeSolveOrder(ntree);
- ntreeSolveOrder(ntree);
-
- return 1;
-}
-
-void nodeGroupCopy(bNode *gnode)
+/* ************** Add stuff ********** */
+static void node_add_sockets_from_type(bNodeTree *ntree, bNode *node, bNodeType *ntype)
{
+ bNodeSocketTemplate *sockdef;
bNodeSocket *sock;
- gnode->id->us--;
- gnode->id= (ID *)ntreeCopyTree((bNodeTree *)gnode->id);
-
- /* new_sock was set in nodeCopyNode */
- for(sock=gnode->inputs.first; sock; sock=sock->next)
- if(sock->groupsock)
- sock->groupsock= sock->groupsock->new_sock;
-
- for(sock=gnode->outputs.first; sock; sock=sock->next)
- if(sock->groupsock)
- sock->groupsock= sock->groupsock->new_sock;
-}
-
-bNodeSocket *nodeGroupAddSocket(bNodeTree *ngroup, const char *name, int type, int in_out)
-{
- bNodeSocket *gsock = MEM_callocN(sizeof(bNodeSocket), "bNodeSocket");
-
- strncpy(gsock->name, name, sizeof(gsock->name));
- gsock->type = type;
- gsock->ns.sockettype = type;
- gsock->ns.min = INT_MIN;
- gsock->ns.max = INT_MAX;
- zero_v4(gsock->ns.vec);
- gsock->ns.data = NULL;
- gsock->flag = 0;
-
- gsock->next = gsock->prev = NULL;
- gsock->new_sock = NULL;
- gsock->link = NULL;
- gsock->ns.data = NULL;
- /* assign new unique index */
- gsock->own_index = ngroup->cur_index++;
- gsock->limit = (in_out==SOCK_IN ? 0xFFF : 1);
-
- BLI_addtail(in_out==SOCK_IN ? &ngroup->inputs : &ngroup->outputs, gsock);
-
- return gsock;
-}
-
-bNodeSocket *nodeGroupExposeSocket(bNodeTree *ngroup, bNodeSocket *sock, int in_out)
-{
- bNodeSocket *gsock= nodeGroupAddSocket(ngroup, sock->name, sock->type, in_out);
- /* initialize the default socket value */
- QUATCOPY(gsock->ns.vec, sock->ns.vec);
- return gsock;
-}
-
-void nodeGroupExposeAllSockets(bNodeTree *ngroup)
-{
- bNode *node;
- bNodeSocket *sock, *gsock;
-
- for (node=ngroup->nodes.first; node; node=node->next) {
- for (sock=node->inputs.first; sock; sock=sock->next) {
- if (!sock->link && !(sock->flag & SOCK_HIDDEN)) {
- gsock = nodeGroupAddSocket(ngroup, sock->name, sock->type, SOCK_IN);
- /* initialize the default socket value */
- QUATCOPY(gsock->ns.vec, sock->ns.vec);
- sock->link = nodeAddLink(ngroup, NULL, gsock, node, sock);
- }
- }
- for (sock=node->outputs.first; sock; sock=sock->next) {
- if (nodeCountSocketLinks(ngroup, sock)==0 && !(sock->flag & SOCK_HIDDEN)) {
- gsock = nodeGroupAddSocket(ngroup, sock->name, sock->type, SOCK_OUT);
- /* initialize the default socket value */
- QUATCOPY(gsock->ns.vec, sock->ns.vec);
- gsock->link = nodeAddLink(ngroup, node, sock, NULL, gsock);
- }
- }
- }
-}
-
-void nodeGroupRemoveSocket(bNodeTree *ngroup, bNodeSocket *gsock, int in_out)
-{
- nodeRemSocketLinks(ngroup, gsock);
- switch (in_out) {
- case SOCK_IN: BLI_remlink(&ngroup->inputs, gsock); break;
- case SOCK_OUT: BLI_remlink(&ngroup->outputs, gsock); break;
- }
- MEM_freeN(gsock);
-}
-
-/* ************** Add stuff ********** */
-void nodeAddSockets(bNode *node, bNodeType *ntype)
-{
- if (node->type==NODE_GROUP) {
- bNodeTree *ntree= (bNodeTree*)node->id;
- if (ntree) {
- bNodeSocket *gsock;
- for (gsock=ntree->inputs.first; gsock; gsock=gsock->next)
- node_add_group_socket(&node->inputs, gsock);
- for (gsock=ntree->outputs.first; gsock; gsock=gsock->next)
- node_add_group_socket(&node->outputs, gsock);
+ if(ntype->inputs) {
+ sockdef= ntype->inputs;
+ while(sockdef->type != -1) {
+ sock = node_add_input_from_template(ntree, node, sockdef);
+
+ sockdef++;
}
}
- else {
- bNodeSocketType *stype;
-
- if(ntype->inputs) {
- stype= ntype->inputs;
- while(stype->type != -1) {
- node_add_socket_type(&node->inputs, stype);
- stype++;
- }
- }
- if(ntype->outputs) {
- stype= ntype->outputs;
- while(stype->type != -1) {
- node_add_socket_type(&node->outputs, stype);
- stype++;
- }
+ if(ntype->outputs) {
+ sockdef= ntype->outputs;
+ while(sockdef->type != -1) {
+ sock = node_add_output_from_template(ntree, node, sockdef);
+
+ sockdef++;
}
}
}
@@ -945,65 +321,40 @@ void nodeUniqueName(bNodeTree *ntree, bNode *node)
BLI_uniquename(&ntree->nodes, node, "Node", '.', offsetof(bNode, name), sizeof(node->name));
}
-bNode *nodeAddNodeType(bNodeTree *ntree, int type, bNodeTree *ngroup, ID *id)
+bNode *nodeAddNode(bNodeTree *ntree, struct bNodeTemplate *ntemp)
{
- bNode *node= NULL;
- bNodeType *ntype= NULL;
-
- if (ngroup && BLI_findindex(&G.main->nodetree, ngroup)==-1) {
- printf("nodeAddNodeType() error: '%s' not in main->nodetree\n", ngroup->id.name);
- return NULL;
- }
-
- if(type>=NODE_DYNAMIC_MENU) {
- int a=0, idx= type-NODE_DYNAMIC_MENU;
- ntype= ntree->alltypes.first;
- while(ntype) {
- if(ntype->type==NODE_DYNAMIC) {
- if(a==idx)
- break;
- a++;
- }
- ntype= ntype->next;
- }
- } else
- ntype= node_get_type(ntree, type, id);
-
+ bNode *node;
+ bNodeType *ntype;
+
+ ntype= node_get_type(ntree, ntemp->type);
if(ntype == NULL) {
- printf("nodeAddNodeType() error: '%d' type invalid\n", type);
+ printf("nodeAddNodeType() error: '%d' type invalid\n", ntemp->type);
return NULL;
}
-
- node= MEM_callocN(sizeof(bNode), "new node");
- BLI_addtail(&ntree->nodes, node);
- node->typeinfo= ntype;
- if(type>=NODE_DYNAMIC_MENU)
- node->custom2= type; /* for node_dynamic_init */
-
- if(ngroup)
- BLI_strncpy(node->name, ngroup->id.name+2, NODE_MAXSTR);
- else if(type>NODE_DYNAMIC_MENU) {
- BLI_strncpy(node->name, ntype->id->name+2, NODE_MAXSTR);
- }
- else
- BLI_strncpy(node->name, ntype->name, NODE_MAXSTR);
-
- nodeUniqueName(ntree, node);
+ /* validity check */
+ if (!nodeValid(ntree, ntemp))
+ return NULL;
+ node= MEM_callocN(sizeof(bNode), "new node");
node->type= ntype->type;
+ node->typeinfo= ntype;
node->flag= NODE_SELECT|ntype->flag;
node->width= ntype->width;
- node->miniwidth= 42.0f; /* small value only, allows print of first chars */
-
- if(type==NODE_GROUP)
- node->id= (ID *)ngroup;
-
- /* need init handler later? */
- /* got it-bob*/
+ node->miniwidth= 42.0f;
+ node->height= ntype->height;
+
+ node_add_sockets_from_type(ntree, node, ntype);
+
if(ntype->initfunc!=NULL)
- ntype->initfunc(node);
+ ntype->initfunc(ntree, node, ntemp);
+
+ /* initialize the node name with the node label */
+ BLI_strncpy(node->name, nodeLabel(node), NODE_MAXSTR);
+ nodeUniqueName(ntree, node);
+
+ BLI_addtail(&ntree->nodes, node);
- nodeAddSockets(node, ntype);
+ ntree->update |= NTREE_UPDATE_NODES;
return node;
}
@@ -1011,9 +362,9 @@ bNode *nodeAddNodeType(bNodeTree *ntree, int type, bNodeTree *ngroup, ID *id)
void nodeMakeDynamicType(bNode *node)
{
/* find SH_DYNAMIC_NODE ntype */
- bNodeType *ntype= node_all_shaders.first;
+ bNodeType *ntype= ntreeGetType(NTREE_SHADER)->node_types.first;
while(ntype) {
- if(ntype->type==NODE_DYNAMIC && ntype->id==NULL)
+ if(ntype->type==NODE_DYNAMIC)
break;
ntype= ntype->next;
}
@@ -1023,17 +374,11 @@ void nodeMakeDynamicType(bNode *node)
/*node->typeinfo= MEM_dupallocN(ntype);*/
bNodeType *newtype= MEM_callocN(sizeof(bNodeType), "dynamic bNodeType");
*newtype= *ntype;
- newtype->name= BLI_strdup(ntype->name);
+ strcpy(newtype->name, ntype->name);
node->typeinfo= newtype;
}
}
-void nodeUpdateType(bNodeTree *ntree, bNode* node, bNodeType *ntype)
-{
- verify_socket_list(ntree, &node->inputs, ntype->inputs);
- verify_socket_list(ntree, &node->outputs, ntype->outputs);
-}
-
/* keep socket listorder identical, for copying links */
/* ntree is the target tree */
bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node)
@@ -1045,19 +390,33 @@ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node)
nodeUniqueName(ntree, nnode);
BLI_addtail(&ntree->nodes, nnode);
-
+
BLI_duplicatelist(&nnode->inputs, &node->inputs);
oldsock= node->inputs.first;
for(sock= nnode->inputs.first; sock; sock= sock->next, oldsock= oldsock->next) {
oldsock->new_sock= sock;
+ sock->stack_index= 0;
+
+ sock->default_value = (oldsock->default_value ? MEM_dupallocN(oldsock->default_value) : NULL);
+
+ /* XXX some compositor node (e.g. image, render layers) still store
+ * some persistent buffer data here, need to clear this to avoid dangling pointers.
+ */
+ sock->cache = NULL;
}
BLI_duplicatelist(&nnode->outputs, &node->outputs);
oldsock= node->outputs.first;
for(sock= nnode->outputs.first; sock; sock= sock->next, oldsock= oldsock->next) {
- sock->stack_index= 0;
- sock->ns.data= NULL;
oldsock->new_sock= sock;
+ sock->stack_index= 0;
+
+ sock->default_value = (oldsock->default_value ? MEM_dupallocN(oldsock->default_value) : NULL);
+
+ /* XXX some compositor node (e.g. image, render layers) still store
+ * some persistent buffer data here, need to clear this to avoid dangling pointers.
+ */
+ sock->cache = NULL;
}
/* don't increase node->id users, freenode doesn't decrement either */
@@ -1069,10 +428,11 @@ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node)
nnode->new_node= NULL;
nnode->preview= NULL;
+ ntree->update |= NTREE_UPDATE_NODES;
+
return nnode;
}
-/* fromsock and tosock can be NULL */
/* also used via rna api, so we check for proper input output direction */
bNodeLink *nodeAddLink(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock, bNode *tonode, bNodeSocket *tosock)
{
@@ -1095,6 +455,21 @@ bNodeLink *nodeAddLink(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock,
from= -1; /* OK but flip */
}
}
+ else {
+ /* check tree sockets */
+ for(sock= ntree->inputs.first; sock; sock= sock->next)
+ if(sock==fromsock)
+ break;
+ if(sock)
+ from= 1; /* OK */
+ else {
+ for(sock= ntree->outputs.first; sock; sock= sock->next)
+ if(sock==fromsock)
+ break;
+ if(sock)
+ from= -1; /* OK but flip */
+ }
+ }
if(tonode) {
for(sock= tonode->inputs.first; sock; sock= sock->next)
if(sock==tosock)
@@ -1109,8 +484,22 @@ bNodeLink *nodeAddLink(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock,
to= -1; /* OK but flip */
}
}
+ else {
+ /* check tree sockets */
+ for(sock= ntree->outputs.first; sock; sock= sock->next)
+ if(sock==tosock)
+ break;
+ if(sock)
+ to= 1; /* OK */
+ else {
+ for(sock= ntree->inputs.first; sock; sock= sock->next)
+ if(sock==tosock)
+ break;
+ if(sock)
+ to= -1; /* OK but flip */
+ }
+ }
- /* this allows NULL sockets to work */
if(from >= 0 && to >= 0) {
link= MEM_callocN(sizeof(bNodeLink), "link");
BLI_addtail(&ntree->links, link);
@@ -1128,6 +517,8 @@ bNodeLink *nodeAddLink(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock,
link->tosock= fromsock;
}
+ ntree->update |= NTREE_UPDATE_LINKS;
+
return link;
}
@@ -1137,6 +528,8 @@ void nodeRemLink(bNodeTree *ntree, bNodeLink *link)
if(link->tosock)
link->tosock->link= NULL;
MEM_freeN(link);
+
+ ntree->update |= NTREE_UPDATE_LINKS;
}
void nodeRemSocketLinks(bNodeTree *ntree, bNodeSocket *sock)
@@ -1149,26 +542,73 @@ void nodeRemSocketLinks(bNodeTree *ntree, bNodeSocket *sock)
nodeRemLink(ntree, link);
}
}
+
+ ntree->update |= NTREE_UPDATE_LINKS;
}
+/* transforms node location to area coords */
+void nodeSpaceCoords(bNode *node, float *locx, float *locy)
+{
+ if (node->parent) {
+ nodeSpaceCoords(node->parent, locx, locy);
+ *locx += node->locx;
+ *locy += node->locy;
+ }
+ else {
+ *locx = node->locx;
+ *locy = node->locy;
+ }
+}
-bNodeTree *ntreeAddTree(const char *name, int type, const short is_group)
+void nodeAttachNode(bNode *node, bNode *parent)
{
- bNodeTree *ntree;
+ float parentx, parenty;
+
+ node->parent = parent;
+ /* transform to parent space */
+ nodeSpaceCoords(parent, &parentx, &parenty);
+ node->locx -= parentx;
+ node->locy -= parenty;
+}
- if (is_group)
- ntree= alloc_libblock(&G.main->nodetree, ID_NT, name);
- else {
+void nodeDetachNode(struct bNode *node)
+{
+ float parentx, parenty;
+
+ if (node->parent) {
+ /* transform to "global" (area) space */
+ nodeSpaceCoords(node->parent, &parentx, &parenty);
+ node->locx += parentx;
+ node->locy += parenty;
+ node->parent = NULL;
+ }
+}
+
+bNodeTree *ntreeAddTree(const char *name, int type, int nodetype)
+{
+ bNodeTree *ntree;
+ bNodeType *ntype;
+
+ /* trees are created as local trees if they of compositor, material or texture type,
+ * node groups and other tree types are created as library data.
+ */
+ if (ELEM3(type, NTREE_COMPOSIT, NTREE_SHADER, NTREE_TEXTURE) && nodetype==0) {
ntree= MEM_callocN(sizeof(bNodeTree), "new node tree");
*( (short *)ntree->id.name )= ID_NT; /* not "type", as that is ntree->type */
BLI_strncpy(ntree->id.name+2, name, sizeof(ntree->id.name));
}
-
+ else
+ ntree= alloc_libblock(&G.main->nodetree, ID_NT, name);
+
ntree->type= type;
- ntree->alltypes.first = NULL;
- ntree->alltypes.last = NULL;
-
+ ntree->nodetype = nodetype;
+
ntreeInitTypes(ntree);
+
+ ntype = node_get_type(ntree, ntree->nodetype);
+ if (ntype && ntype->inittreefunc)
+ ntype->inittreefunc(ntree);
+
return ntree;
}
@@ -1199,9 +639,7 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree)
id_us_plus((ID *)newtree->gpd);
/* in case a running nodetree is copied */
- newtree->init &= ~(NTREE_EXEC_INIT);
- newtree->threadstack= NULL;
- newtree->stack= NULL;
+ newtree->execdata= NULL;
newtree->nodes.first= newtree->nodes.last= NULL;
newtree->links.first= newtree->links.last= NULL;
@@ -1210,7 +648,10 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree)
for(node= ntree->nodes.first; node; node= node->next) {
node->new_node= NULL;
nnode= nodeCopyNode(newtree, node); /* sets node->new */
- if(node==last) break;
+
+ /* make sure we don't copy new nodes again! */
+ if (node==last)
+ break;
}
/* socket definition for group usage */
@@ -1218,14 +659,15 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree)
for(gsock= newtree->inputs.first, oldgsock= ntree->inputs.first; gsock; gsock=gsock->next, oldgsock=oldgsock->next) {
oldgsock->new_sock= gsock;
gsock->groupsock = (oldgsock->groupsock ? oldgsock->groupsock->new_sock : NULL);
+ gsock->default_value = (oldgsock->default_value ? MEM_dupallocN(oldgsock->default_value) : NULL);
}
-
BLI_duplicatelist(&newtree->outputs, &ntree->outputs);
for(gsock= newtree->outputs.first, oldgsock= ntree->outputs.first; gsock; gsock=gsock->next, oldgsock=oldgsock->next) {
oldgsock->new_sock= gsock;
gsock->groupsock = (oldgsock->groupsock ? oldgsock->groupsock->new_sock : NULL);
+ gsock->default_value = (oldgsock->default_value ? MEM_dupallocN(oldgsock->default_value) : NULL);
}
-
+
/* copy links */
BLI_duplicatelist(&newtree->links, &ntree->links);
for(link= newtree->links.first; link; link= link->next) {
@@ -1237,7 +679,13 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree)
if (link->tosock)
link->tosock->link = link;
}
-
+
+ /* update node->parent pointers */
+ for (node=newtree->nodes.first; node; node=node->next) {
+ if (node->parent)
+ node->parent = node->parent->new_node;
+ }
+
return newtree;
}
@@ -1256,7 +704,7 @@ void ntreeSwitchID(bNodeTree *ntree, ID *id_from, ID *id_to)
/* *************** preview *********** */
/* if node->preview, then we assume the rect to exist */
-static void node_free_preview(bNode *node)
+void nodeFreePreview(bNode *node)
{
if(node->preview) {
if(node->preview->rect)
@@ -1360,7 +808,6 @@ void nodeAddToPreview(bNode *node, float *col, int x, int y, int do_manage)
}
}
-
/* ************** Free stuff ********** */
/* goes over entire tree */
@@ -1395,50 +842,84 @@ void nodeUnlinkNode(bNodeTree *ntree, bNode *node)
}
}
-static void composit_free_node_cache(bNode *node)
+static void node_unlink_attached(bNodeTree *ntree, bNode *parent)
{
- bNodeSocket *sock;
-
- for(sock= node->outputs.first; sock; sock= sock->next) {
- if(sock->ns.data) {
- free_compbuf(sock->ns.data);
- sock->ns.data= NULL;
- }
+ bNode *node;
+ for (node=ntree->nodes.first; node; node=node->next) {
+ if (node->parent == parent)
+ nodeDetachNode(node);
}
}
void nodeFreeNode(bNodeTree *ntree, bNode *node)
{
+ bNodeTreeType *treetype= ntreeGetType(ntree->type);
+ bNodeSocket *sock, *nextsock;
+
+ /* remove all references to this node */
nodeUnlinkNode(ntree, node);
+ node_unlink_attached(ntree, node);
+
BLI_remlink(&ntree->nodes, node);
/* since it is called while free database, node->id is undefined */
- if(ntree->type==NTREE_COMPOSIT)
- composit_free_node_cache(node);
- BLI_freelistN(&node->inputs);
- BLI_freelistN(&node->outputs);
+ if (treetype->free_node_cache)
+ treetype->free_node_cache(ntree, node);
- node_free_preview(node);
+ for (sock=node->inputs.first; sock; sock = nextsock) {
+ nextsock = sock->next;
+ if (sock->default_value)
+ MEM_freeN(sock->default_value);
+ MEM_freeN(sock);
+ }
+ for (sock=node->outputs.first; sock; sock = nextsock) {
+ nextsock = sock->next;
+ if (sock->default_value)
+ MEM_freeN(sock->default_value);
+ MEM_freeN(sock);
+ }
+
+ nodeFreePreview(node);
if(node->typeinfo && node->typeinfo->freestoragefunc) {
node->typeinfo->freestoragefunc(node);
}
MEM_freeN(node);
+
+ ntree->update |= NTREE_UPDATE_NODES;
}
/* do not free ntree itself here, free_libblock calls this function too */
void ntreeFreeTree(bNodeTree *ntree)
{
bNode *node, *next;
+ bNodeSocket *sock;
if(ntree==NULL) return;
- ntreeEndExecTree(ntree); /* checks for if it is still initialized */
+ /* XXX hack! node trees should not store execution graphs at all.
+ * This should be removed when old tree types no longer require it.
+ * Currently the execution data for texture nodes remains in the tree
+ * after execution, until the node tree is updated or freed.
+ */
+ if (ntree->execdata) {
+ switch (ntree->type) {
+ case NTREE_COMPOSIT:
+ ntreeCompositEndExecTree(ntree->execdata, 1);
+ break;
+ case NTREE_SHADER:
+ ntreeShaderEndExecTree(ntree->execdata, 1);
+ break;
+ case NTREE_TEXTURE:
+ ntreeTexEndExecTree(ntree->execdata, 1);
+ break;
+ }
+ }
BKE_free_animdata((ID *)ntree);
-
+
id_us_min((ID *)ntree->gpd);
BLI_freelistN(&ntree->links); /* do first, then unlink_node goes fast */
@@ -1448,25 +929,120 @@ void ntreeFreeTree(bNodeTree *ntree)
nodeFreeNode(ntree, node);
}
+ for (sock=ntree->inputs.first; sock; sock=sock->next)
+ if (sock->default_value)
+ MEM_freeN(sock->default_value);
BLI_freelistN(&ntree->inputs);
+ for (sock=ntree->outputs.first; sock; sock=sock->next)
+ if (sock->default_value)
+ MEM_freeN(sock->default_value);
BLI_freelistN(&ntree->outputs);
}
void ntreeFreeCache(bNodeTree *ntree)
{
- bNode *node;
+ bNodeTreeType *treetype;
if(ntree==NULL) return;
+
+ treetype= ntreeGetType(ntree->type);
+ if (treetype->free_cache)
+ treetype->free_cache(ntree);
+}
- if(ntree->type==NTREE_COMPOSIT)
- for(node= ntree->nodes.first; node; node= node->next)
- composit_free_node_cache(node);
+void ntreeSetOutput(bNodeTree *ntree)
+{
+ bNode *node;
+ /* find the active outputs, might become tree type dependant handler */
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
+ bNode *tnode;
+ int output= 0;
+
+ /* we need a check for which output node should be tagged like this, below an exception */
+ if(node->type==CMP_NODE_OUTPUT_FILE)
+ continue;
+
+ /* there is more types having output class, each one is checked */
+ for(tnode= ntree->nodes.first; tnode; tnode= tnode->next) {
+ if(tnode->typeinfo->nclass==NODE_CLASS_OUTPUT) {
+
+ if(ntree->type==NTREE_COMPOSIT) {
+
+ /* same type, exception for viewer */
+ if(tnode->type==node->type ||
+ (ELEM(tnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) &&
+ ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))) {
+ if(tnode->flag & NODE_DO_OUTPUT) {
+ output++;
+ if(output>1)
+ tnode->flag &= ~NODE_DO_OUTPUT;
+ }
+ }
+ }
+ else {
+ /* same type */
+ if(tnode->type==node->type) {
+ if(tnode->flag & NODE_DO_OUTPUT) {
+ output++;
+ if(output>1)
+ tnode->flag &= ~NODE_DO_OUTPUT;
+ }
+ }
+ }
+ }
+ }
+ if(output==0)
+ node->flag |= NODE_DO_OUTPUT;
+ }
+ }
+
+ /* here we could recursively set which nodes have to be done,
+ might be different for editor or for "real" use... */
+}
+
+typedef struct MakeLocalCallData {
+ ID *group_id;
+ ID *new_id;
+ int lib, local;
+} MakeLocalCallData;
+
+static void ntreeMakeLocal_CheckLocal(void *calldata, ID *owner_id, bNodeTree *ntree)
+{
+ MakeLocalCallData *cd= (MakeLocalCallData*)calldata;
+ bNode *node;
+
+ /* find if group is in tree */
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->id == cd->group_id) {
+ if(owner_id->lib) cd->lib= 1;
+ else cd->local= 1;
+ }
+ }
+}
+
+static void ntreeMakeLocal_LinkNew(void *calldata, ID *owner_id, bNodeTree *ntree)
+{
+ MakeLocalCallData *cd= (MakeLocalCallData*)calldata;
+ bNode *node;
+
+ /* find if group is in tree */
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->id == cd->group_id) {
+ if(owner_id->lib==NULL) {
+ node->id= cd->new_id;
+ cd->new_id->us++;
+ cd->group_id->us--;
+ }
+ }
+ }
}
void ntreeMakeLocal(bNodeTree *ntree)
{
- int local=0, lib=0;
+ bNodeTreeType *treetype= ntreeGetType(ntree->type);
+ MakeLocalCallData cd;
/* - only lib users: do nothing
* - only local users: set flag
@@ -1475,138 +1051,146 @@ void ntreeMakeLocal(bNodeTree *ntree)
if(ntree->id.lib==NULL) return;
if(ntree->id.us==1) {
- ntree->id.lib= NULL;
+ ntree->id.lib= 0;
ntree->id.flag= LIB_LOCAL;
- new_id(NULL, (ID *)ntree, NULL);
+ new_id(0, (ID *)ntree, 0);
return;
}
/* now check users of groups... again typedepending, callback... */
- if(ntree->type==NTREE_SHADER) {
- Material *ma;
- for(ma= G.main->mat.first; ma; ma= ma->id.next) {
- if(ma->nodetree) {
- bNode *node;
-
- /* find if group is in tree */
- for(node= ma->nodetree->nodes.first; node; node= node->next) {
- if(node->id == (ID *)ntree) {
- if(ma->id.lib) lib= 1;
- else local= 1;
- }
- }
- }
- }
- }
- else if(ntree->type==NTREE_COMPOSIT) {
- Scene *sce;
- for(sce= G.main->scene.first; sce; sce= sce->id.next) {
- if(sce->nodetree) {
- bNode *node;
-
- /* find if group is in tree */
- for(node= sce->nodetree->nodes.first; node; node= node->next) {
- if(node->id == (ID *)ntree) {
- if(sce->id.lib) lib= 1;
- else local= 1;
- }
- }
- }
- }
- }
- else if(ntree->type==NTREE_TEXTURE) {
- Tex *tx;
- for(tx= G.main->tex.first; tx; tx= tx->id.next) {
- if(tx->nodetree) {
- bNode *node;
-
- /* find if group is in tree */
- for(node= tx->nodetree->nodes.first; node; node= node->next) {
- if(node->id == (ID *)ntree) {
- if(tx->id.lib) lib= 1;
- else local= 1;
- }
- }
- }
- }
- }
+ cd.group_id = &ntree->id;
+ cd.new_id = NULL;
+ cd.local = 0;
+ cd.lib = 0;
+
+ treetype->foreach_nodetree(G.main, &cd, &ntreeMakeLocal_CheckLocal);
/* if all users are local, we simply make tree local */
- if(local && lib==0) {
+ if(cd.local && cd.lib==0) {
ntree->id.lib= NULL;
ntree->id.flag= LIB_LOCAL;
- new_id(NULL, (ID *)ntree, NULL);
+ new_id(0, (ID *)ntree, 0);
}
- else if(local && lib) {
+ else if(cd.local && cd.lib) {
/* this is the mixed case, we copy the tree and assign it to local users */
bNodeTree *newtree= ntreeCopyTree(ntree);
newtree->id.us= 0;
- if(ntree->type==NTREE_SHADER) {
- Material *ma;
- for(ma= G.main->mat.first; ma; ma= ma->id.next) {
- if(ma->nodetree) {
- bNode *node;
-
- /* find if group is in tree */
- for(node= ma->nodetree->nodes.first; node; node= node->next) {
- if(node->id == (ID *)ntree) {
- if(ma->id.lib==NULL) {
- node->id= &newtree->id;
- newtree->id.us++;
- ntree->id.us--;
- }
- }
- }
- }
- }
- }
- else if(ntree->type==NTREE_COMPOSIT) {
- Scene *sce;
- for(sce= G.main->scene.first; sce; sce= sce->id.next) {
- if(sce->nodetree) {
- bNode *node;
-
- /* find if group is in tree */
- for(node= sce->nodetree->nodes.first; node; node= node->next) {
- if(node->id == (ID *)ntree) {
- if(sce->id.lib==NULL) {
- node->id= &newtree->id;
- newtree->id.us++;
- ntree->id.us--;
- }
- }
- }
- }
- }
- }
- else if(ntree->type==NTREE_TEXTURE) {
- Tex *tx;
- for(tx= G.main->tex.first; tx; tx= tx->id.next) {
- if(tx->nodetree) {
- bNode *node;
-
- /* find if group is in tree */
- for(node= tx->nodetree->nodes.first; node; node= node->next) {
- if(node->id == (ID *)ntree) {
- if(tx->id.lib==NULL) {
- node->id= &newtree->id;
- newtree->id.us++;
- ntree->id.us--;
- }
- }
- }
- }
+
+ cd.new_id = &newtree->id;
+ treetype->foreach_nodetree(G.main, &cd, &ntreeMakeLocal_LinkNew);
+ }
+}
+
+int ntreeNodeExists(bNodeTree *ntree, bNode *testnode)
+{
+ bNode *node= ntree->nodes.first;
+ for(; node; node= node->next)
+ if(node==testnode)
+ return 1;
+ return 0;
+}
+
+int ntreeOutputExists(bNode *node, bNodeSocket *testsock)
+{
+ bNodeSocket *sock= node->outputs.first;
+ for(; sock; sock= sock->next)
+ if(sock==testsock)
+ return 1;
+ return 0;
+}
+
+/* returns localized tree for execution in threads */
+bNodeTree *ntreeLocalize(bNodeTree *ntree)
+{
+ bNodeTreeType *ntreetype= ntreeGetType(ntree->type);
+
+ bNodeTree *ltree;
+ bNode *node;
+
+ bAction *action_backup= NULL, *tmpact_backup= NULL;
+
+ /* Workaround for copying an action on each render!
+ * set action to NULL so animdata actions dont get copied */
+ AnimData *adt= BKE_animdata_from_id(&ntree->id);
+
+ if(adt) {
+ action_backup= adt->action;
+ tmpact_backup= adt->tmpact;
+
+ adt->action= NULL;
+ adt->tmpact= NULL;
+ }
+
+ /* node copy func */
+ ltree= ntreeCopyTree(ntree);
+
+ if(adt) {
+ AnimData *ladt= BKE_animdata_from_id(&ltree->id);
+
+ adt->action= ladt->action= action_backup;
+ adt->tmpact= ladt->tmpact= tmpact_backup;
+
+ if(action_backup) action_backup->id.us++;
+ if(tmpact_backup) tmpact_backup->id.us++;
+
+ }
+ /* end animdata uglyness */
+
+ /* ensures only a single output node is enabled */
+ ntreeSetOutput(ntree);
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ /* store new_node pointer to original */
+ node->new_node->new_node= node;
+ }
+
+ if (ntreetype->localize)
+ ntreetype->localize(ltree, ntree);
+
+ return ltree;
+}
+
+/* sync local composite with real tree */
+/* local tree is supposed to be running, be careful moving previews! */
+/* is called by jobs manager, outside threads, so it doesnt happen during draw */
+void ntreeLocalSync(bNodeTree *localtree, bNodeTree *ntree)
+{
+ bNodeTreeType *ntreetype= ntreeGetType(ntree->type);
+
+ if (ntreetype->local_sync)
+ ntreetype->local_sync(localtree, ntree);
+}
+
+/* merge local tree results back, and free local tree */
+/* we have to assume the editor already changed completely */
+void ntreeLocalMerge(bNodeTree *localtree, bNodeTree *ntree)
+{
+ bNodeTreeType *ntreetype= ntreeGetType(ntree->type);
+ bNode *lnode;
+
+ /* move over the compbufs and previews */
+ for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
+ if(ntreeNodeExists(ntree, lnode->new_node)) {
+ if(lnode->preview && lnode->preview->rect) {
+ nodeFreePreview(lnode->new_node);
+ lnode->new_node->preview= lnode->preview;
+ lnode->preview= NULL;
}
}
}
-}
+ if (ntreetype->local_merge)
+ ntreetype->local_merge(localtree, ntree);
+
+ ntreeFreeTree(localtree);
+ MEM_freeN(localtree);
+}
/* ************ find stuff *************** */
-static int ntreeHasType(bNodeTree *ntree, int type)
+int ntreeHasType(bNodeTree *ntree, int type)
{
bNode *node;
@@ -1770,7 +1354,7 @@ void ntreeSocketUseFlags(bNodeTree *ntree)
/* ************** dependency stuff *********** */
/* node is guaranteed to be not checked before */
-static int node_recurs_check(bNode *node, bNode ***nsort)
+static int node_get_deplist_recurs(bNode *node, bNode ***nsort)
{
bNode *fromnode;
bNodeSocket *sock;
@@ -1778,646 +1362,146 @@ static int node_recurs_check(bNode *node, bNode ***nsort)
node->done= 1;
+ /* check linked nodes */
for(sock= node->inputs.first; sock; sock= sock->next) {
if(sock->link) {
fromnode= sock->link->fromnode;
if(fromnode) {
if (fromnode->done==0)
- fromnode->level= node_recurs_check(fromnode, nsort);
+ fromnode->level= node_get_deplist_recurs(fromnode, nsort);
if (fromnode->level <= level)
level = fromnode->level - 1;
}
}
}
- **nsort= node;
- (*nsort)++;
- return level;
-}
-
-
-static void ntreeSetOutput(bNodeTree *ntree)
-{
- bNode *node;
-
- /* find the active outputs, might become tree type dependant handler */
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
- bNode *tnode;
- int output= 0;
-
- /* we need a check for which output node should be tagged like this, below an exception */
- if(node->type==CMP_NODE_OUTPUT_FILE)
- continue;
-
- /* there is more types having output class, each one is checked */
- for(tnode= ntree->nodes.first; tnode; tnode= tnode->next) {
- if(tnode->typeinfo->nclass==NODE_CLASS_OUTPUT) {
-
- if(ntree->type==NTREE_COMPOSIT) {
-
- /* same type, exception for viewer */
- if(tnode->type==node->type ||
- (ELEM(tnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) &&
- ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))) {
- if(tnode->flag & NODE_DO_OUTPUT) {
- output++;
- if(output>1)
- tnode->flag &= ~NODE_DO_OUTPUT;
- }
- }
- }
- else {
- /* same type */
- if(tnode->type==node->type) {
- if(tnode->flag & NODE_DO_OUTPUT) {
- output++;
- if(output>1)
- tnode->flag &= ~NODE_DO_OUTPUT;
- }
- }
- }
- }
- }
- if(output==0)
- node->flag |= NODE_DO_OUTPUT;
- }
+ /* check parent node */
+ if (node->parent) {
+ if (node->parent->done==0)
+ node->parent->level= node_get_deplist_recurs(node->parent, nsort);
+ if (node->parent->level <= level)
+ level = node->parent->level - 1;
}
- /* here we could recursively set which nodes have to be done,
- might be different for editor or for "real" use... */
+ if (nsort) {
+ **nsort= node;
+ (*nsort)++;
+ }
+
+ return level;
}
-void ntreeSolveOrder(bNodeTree *ntree)
+void ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, int *totnodes)
{
- bNode *node, **nodesort, **nsort;
- bNodeSocket *sock;
- bNodeLink *link;
- int a, totnode=0;
+ bNode *node, **nsort;
+
+ *totnodes=0;
- /* the solve-order is called on each tree change, so we should be sure no exec can be running */
- ntreeEndExecTree(ntree);
-
- /* set links pointers the input sockets, to find dependencies */
/* first clear data */
for(node= ntree->nodes.first; node; node= node->next) {
node->done= 0;
- totnode++;
- for(sock= node->inputs.first; sock; sock= sock->next)
- sock->link= NULL;
+ (*totnodes)++;
}
- /* clear group socket links */
- for(sock= ntree->outputs.first; sock; sock= sock->next)
- sock->link= NULL;
- if(totnode==0)
+ if(*totnodes==0) {
+ *deplist = NULL;
return;
-
- for(link= ntree->links.first; link; link= link->next) {
- link->tosock->link= link;
}
- nsort= nodesort= MEM_callocN(totnode*sizeof(void *), "sorted node array");
+ nsort= *deplist= MEM_callocN((*totnodes)*sizeof(bNode*), "sorted node array");
/* recursive check */
for(node= ntree->nodes.first; node; node= node->next) {
if(node->done==0) {
- node->level= node_recurs_check(node, &nsort);
+ node->level= node_get_deplist_recurs(node, &nsort);
}
}
-
- /* re-insert nodes in order, first a paranoia check */
- for(a=0; a<totnode; a++) {
- if(nodesort[a]==NULL)
- break;
- }
- if(a<totnode)
- printf("sort error in node tree");
- else {
- ntree->nodes.first= ntree->nodes.last= NULL;
- for(a=0; a<totnode; a++)
- BLI_addtail(&ntree->nodes, nodesort[a]);
- }
-
- MEM_freeN(nodesort);
-
- ntreeSetOutput(ntree);
}
-
-/* Should be callback! */
-/* Do not call execs here */
-void NodeTagChanged(bNodeTree *ntree, bNode *node)
-{
- if(ntree->type==NTREE_COMPOSIT) {
- bNodeSocket *sock;
-
- for(sock= node->outputs.first; sock; sock= sock->next) {
- if(sock->ns.data) {
- //free_compbuf(sock->ns.data);
- //sock->ns.data= NULL;
- }
- }
- node->need_exec= 1;
- }
-}
-
-int NodeTagIDChanged(bNodeTree *ntree, ID *id)
-{
- int change = FALSE;
-
- if(ELEM(NULL, id, ntree))
- return change;
-
- if(ntree->type==NTREE_COMPOSIT) {
- bNode *node;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->id==id) {
- change= TRUE;
- NodeTagChanged(ntree, node);
- }
- }
- }
-
- return change;
-}
-
-
-
-/* ******************* executing ************* */
-
-/* for a given socket, find the actual stack entry */
-static bNodeStack *get_socket_stack(bNodeStack *stack, bNodeSocket *sock, bNodeStack **gin)
-{
- switch (sock->stack_type) {
- case SOCK_STACK_LOCAL:
- return stack + sock->stack_index;
- case SOCK_STACK_EXTERN:
- return (gin ? gin[sock->stack_index] : NULL);
- case SOCK_STACK_CONST:
- return sock->stack_ptr;
- }
- return NULL;
-}
-
-/* see notes at ntreeBeginExecTree */
-static void node_get_stack(bNode *node, bNodeStack *stack, bNodeStack **in, bNodeStack **out, bNodeStack **gin)
-{
- bNodeSocket *sock;
-
- /* build pointer stack */
- if (in) {
- for(sock= node->inputs.first; sock; sock= sock->next) {
- *(in++) = get_socket_stack(stack, sock, gin);
- }
- }
-
- if (out) {
- for(sock= node->outputs.first; sock; sock= sock->next) {
- *(out++) = get_socket_stack(stack, sock, gin);
- }
- }
-}
-
-static void node_group_execute(bNodeStack *stack, void *data, bNode *gnode, bNodeStack **in)
+static void ntree_update_link_pointers(bNodeTree *ntree)
{
bNode *node;
- bNodeTree *ntree= (bNodeTree *)gnode->id;
- bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
- bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
-
- if(ntree==NULL) return;
+ bNodeSocket *sock;
+ bNodeLink *link;
- stack+= gnode->stack_index;
-
+ /* first clear data */
for(node= ntree->nodes.first; node; node= node->next) {
- if(node->typeinfo->execfunc) {
- node_get_stack(node, stack, nsin, nsout, in);
-
- /* for groups, only execute outputs for edited group */
- if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
- if(node->type==CMP_NODE_OUTPUT_FILE || (gnode->flag & NODE_GROUP_EDIT))
- node->typeinfo->execfunc(data, node, nsin, nsout);
- }
- else
- node->typeinfo->execfunc(data, node, nsin, nsout);
- }
- }
-
- /* free internal buffers */
- if (ntree->type==NTREE_COMPOSIT) {
- bNodeSocket *sock;
- bNodeStack *ns;
-
- /* clear hasoutput on all local stack data,
- * only the group output will be used from now on
- */
- for (node=ntree->nodes.first; node; node=node->next) {
- for (sock=node->outputs.first; sock; sock=sock->next) {
- if (sock->stack_type==SOCK_STACK_LOCAL) {
- ns= get_socket_stack(stack, sock, in);
- ns->hasoutput = 0;
- }
- }
- }
- /* use the hasoutput flag to tag external sockets */
- for (sock=ntree->outputs.first; sock; sock=sock->next) {
- if (sock->stack_type==SOCK_STACK_LOCAL) {
- ns= get_socket_stack(stack, sock, in);
- ns->hasoutput = 1;
- }
- }
- /* now free all stacks that are not used from outside */
- for (node=ntree->nodes.first; node; node=node->next) {
- for (sock=node->outputs.first; sock; sock=sock->next) {
- if (sock->stack_type==SOCK_STACK_LOCAL ) {
- ns= get_socket_stack(stack, sock, in);
- if (ns->hasoutput==0 && ns->data) {
- free_compbuf(ns->data);
- ns->data = NULL;
- }
- }
- }
- }
+ for(sock= node->inputs.first; sock; sock= sock->next)
+ sock->link= NULL;
}
-}
+ /* clear socket links */
+ for(sock= ntree->outputs.first; sock; sock= sock->next)
+ sock->link= NULL;
-static int set_stack_indexes_default(bNode *node, int index)
-{
- bNodeSocket *sock;
-
- for (sock=node->inputs.first; sock; sock=sock->next) {
- if (sock->link && sock->link->fromsock) {
- sock->stack_type = sock->link->fromsock->stack_type;
- sock->stack_index = sock->link->fromsock->stack_index;
- sock->stack_ptr = sock->link->fromsock->stack_ptr;
- }
- else {
- sock->stack_type = SOCK_STACK_CONST;
- sock->stack_index = -1;
- sock->stack_ptr = &sock->ns;
- }
- }
-
- for (sock=node->outputs.first; sock; sock=sock->next) {
- sock->stack_type = SOCK_STACK_LOCAL;
- sock->stack_index = index++;
- sock->stack_ptr = NULL;
+ for(link= ntree->links.first; link; link= link->next) {
+ if (link->tosock)
+ link->tosock->link= link;
}
-
- return index;
}
-static int ntree_begin_exec_tree(bNodeTree *ntree);
-static int set_stack_indexes_group(bNode *node, int index)
+void ntree_validate_links(bNodeTree *ntree)
{
- bNodeTree *ngroup= (bNodeTree*)node->id;
- bNodeSocket *sock;
-
- if(ngroup && (ngroup->init & NTREE_TYPE_INIT)==0)
- ntreeInitTypes(ngroup);
-
- node->stack_index = index;
- if(ngroup)
- index += ntree_begin_exec_tree(ngroup);
+ bNodeTreeType *ntreetype = ntreeGetType(ntree->type);
+ bNodeLink *link;
- for (sock=node->inputs.first; sock; sock=sock->next) {
- if (sock->link && sock->link->fromsock) {
- sock->stack_type = sock->link->fromsock->stack_type;
- sock->stack_index = sock->link->fromsock->stack_index;
- sock->stack_ptr = sock->link->fromsock->stack_ptr;
- }
- else {
- sock->stack_type = SOCK_STACK_CONST;
- sock->stack_index = -1;
- sock->stack_ptr = &sock->ns;
+ for (link = ntree->links.first; link; link = link->next) {
+ link->flag |= NODE_LINK_VALID;
+ if (link->fromnode && link->tonode && link->fromnode->level <= link->tonode->level)
+ link->flag &= ~NODE_LINK_VALID;
+ else if (ntreetype->validate_link) {
+ if (!ntreetype->validate_link(ntree, link))
+ link->flag &= ~NODE_LINK_VALID;
}
}
-
- /* identify group node outputs from internal group sockets */
- for(sock= node->outputs.first; sock; sock= sock->next) {
- if (sock->groupsock) {
- bNodeSocket *insock, *gsock = sock->groupsock;
- switch (gsock->stack_type) {
- case SOCK_STACK_EXTERN:
- /* extern stack is resolved for this group node instance */
- insock= find_group_node_input(node, gsock->link->fromsock);
- sock->stack_type = insock->stack_type;
- sock->stack_index = insock->stack_index;
- sock->stack_ptr = insock->stack_ptr;
- break;
- case SOCK_STACK_LOCAL:
- sock->stack_type = SOCK_STACK_LOCAL;
- /* local stack index must be offset by group node instance */
- sock->stack_index = gsock->stack_index + node->stack_index;
- sock->stack_ptr = NULL;
- break;
- case SOCK_STACK_CONST:
- sock->stack_type = SOCK_STACK_CONST;
- sock->stack_index = -1;
- sock->stack_ptr = gsock->stack_ptr;
- break;
- }
- }
- else {
- sock->stack_type = SOCK_STACK_LOCAL;
- sock->stack_index = index++;
- sock->stack_ptr = NULL;
- }
- }
-
- return index;
}
-/* recursively called for groups */
-/* we set all trees on own local indices, but put a total counter
- in the groups, so each instance of a group has own stack */
-static int ntree_begin_exec_tree(bNodeTree *ntree)
+static void ntree_verify_nodes_cb(void *calldata, struct ID *UNUSED(owner_id), struct bNodeTree *ntree)
{
+ ID *id= (ID*)calldata;
bNode *node;
- bNodeSocket *gsock;
- int index= 0, i;
-
- if((ntree->init & NTREE_TYPE_INIT)==0)
- ntreeInitTypes(ntree);
-
- /* group inputs are numbered 0..totinputs, so external stack can easily be addressed */
- i = 0;
- for(gsock=ntree->inputs.first; gsock; gsock = gsock->next) {
- gsock->stack_type = SOCK_STACK_EXTERN;
- gsock->stack_index = i++;
- gsock->stack_ptr = NULL;
- }
- /* create indices for stack, check preview */
- for(node= ntree->nodes.first; node; node= node->next) {
- /* XXX can this be done by a generic one-for-all function?
- * otherwise should use node-type callback.
- */
- if(node->type==NODE_GROUP)
- index = set_stack_indexes_group(node, index);
- else
- index = set_stack_indexes_default(node, index);
- }
-
- /* group outputs */
- for(gsock=ntree->outputs.first; gsock; gsock = gsock->next) {
- if (gsock->link && gsock->link->fromsock) {
- gsock->stack_type = gsock->link->fromsock->stack_type;
- gsock->stack_index = gsock->link->fromsock->stack_index;
- gsock->stack_ptr = gsock->link->fromsock->stack_ptr;
- }
- else {
- gsock->stack_type = SOCK_STACK_CONST;
- gsock->stack_index = -1;
- gsock->stack_ptr = &gsock->ns;
- }
- }
-
- return index;
+ for (node=ntree->nodes.first; node; node=node->next)
+ if (node->typeinfo->verifyfunc)
+ node->typeinfo->verifyfunc(ntree, node, id);
}
-/* copy socket compbufs to stack, initialize usage of curve nodes */
-static void composit_begin_exec(bNodeTree *ntree, bNodeStack *stack)
+void ntreeVerifyNodes(struct Main *main, struct ID *id)
{
- bNode *node;
- bNodeSocket *sock;
+ bNodeTreeType *ntreetype;
+ bNodeTree *ntree;
+ int n;
- for(node= ntree->nodes.first; node; node= node->next) {
-
- /* initialize needed for groups */
- node->exec= 0;
-
- for(sock= node->outputs.first; sock; sock= sock->next) {
- bNodeStack *ns= get_socket_stack(stack, sock, NULL);
- if(ns && sock->ns.data) {
- ns->data= sock->ns.data;
- sock->ns.data= NULL;
- }
- }
-
- /* cannot initialize them while using in threads */
- if(ELEM4(node->type, CMP_NODE_TIME, CMP_NODE_CURVE_VEC, CMP_NODE_CURVE_RGB, CMP_NODE_HUECORRECT)) {
- curvemapping_initialize(node->storage);
- if(node->type==CMP_NODE_CURVE_RGB)
- curvemapping_premultiply(node->storage, 0);
- }
- if(node->type==NODE_GROUP && node->id)
- composit_begin_exec((bNodeTree *)node->id, stack + node->stack_index);
-
- }
-}
-
-/* copy stack compbufs to sockets */
-static void composit_end_exec(bNodeTree *ntree, bNodeStack *stack)
-{
- bNode *node;
- bNodeStack *ns;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- bNodeSocket *sock;
-
- for(sock= node->outputs.first; sock; sock= sock->next) {
- ns = get_socket_stack(stack, sock, NULL);
- if(ns && ns->data) {
- sock->ns.data= ns->data;
- ns->data= NULL;
- }
- }
-
- if(node->type==CMP_NODE_CURVE_RGB)
- curvemapping_premultiply(node->storage, 1);
-
- if(node->type==NODE_GROUP && node->id)
- composit_end_exec((bNodeTree *)node->id, stack + node->stack_index);
-
- node->need_exec= 0;
+ for (n=0; n < NUM_NTREE_TYPES; ++n) {
+ ntreetype= ntreeGetType(n);
+ if (ntreetype && ntreetype->foreach_nodetree)
+ ntreetype->foreach_nodetree(main, id, ntree_verify_nodes_cb);
}
+ for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next)
+ ntree_verify_nodes_cb(id, NULL, ntree);
}
-static void group_tag_used_outputs(bNode *gnode, bNodeStack *stack, bNodeStack **gin)
+void ntreeUpdateTree(bNodeTree *ntree)
{
- bNodeTree *ntree= (bNodeTree *)gnode->id;
+ bNodeTreeType *ntreetype= ntreeGetType(ntree->type);
bNode *node;
- bNodeSocket *sock;
-
- stack+= gnode->stack_index;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->typeinfo->execfunc) {
- for(sock= node->inputs.first; sock; sock= sock->next) {
- bNodeStack *ns = get_socket_stack(stack, sock, gin);
- ns->hasoutput= 1;
- }
- }
-
- /* non-composite trees do all nodes by default */
- if (ntree->type!=NTREE_COMPOSIT)
- node->need_exec = 1;
-
- for(sock= node->inputs.first; sock; sock= sock->next) {
- bNodeStack *ns = get_socket_stack(stack, sock, gin);
- if (ns) {
- ns->hasoutput = 1;
-
- /* sock type is needed to detect rgba or value or vector types */
- if(sock->link && sock->link->fromsock)
- ns->sockettype= sock->link->fromsock->type;
- else
- sock->ns.sockettype= sock->type;
- }
-
- if(sock->link) {
- bNodeLink *link= sock->link;
- /* this is the test for a cyclic case */
- if(link->fromnode && link->tonode) {
- if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF);
- else {
- node->need_exec= 0;
- }
- }
- }
- }
-
- /* set stack types (for local stack entries) */
- for(sock= node->outputs.first; sock; sock= sock->next) {
- bNodeStack *ns = get_socket_stack(stack, sock, gin);
- if (ns)
- ns->sockettype = sock->type;
- }
- }
-}
-
-/* notes below are ancient! (ton) */
-/* stack indices make sure all nodes only write in allocated data, for making it thread safe */
-/* only root tree gets the stack, to enable instances to have own stack entries */
-/* per tree (and per group) unique indices are created */
-/* the index_ext we need to be able to map from groups to the group-node own stack */
-
-typedef struct bNodeThreadStack {
- struct bNodeThreadStack *next, *prev;
- bNodeStack *stack;
- int used;
-} bNodeThreadStack;
-
-static bNodeThreadStack *ntreeGetThreadStack(bNodeTree *ntree, int thread)
-{
- ListBase *lb= &ntree->threadstack[thread];
- bNodeThreadStack *nts;
+ bNode **deplist;
+ int totnodes, n;
- for(nts=lb->first; nts; nts=nts->next) {
- if(!nts->used) {
- nts->used= 1;
- return nts;
- }
- }
- nts= MEM_callocN(sizeof(bNodeThreadStack), "bNodeThreadStack");
- nts->stack= MEM_dupallocN(ntree->stack);
- nts->used= 1;
- BLI_addtail(lb, nts);
-
- return nts;
-}
-
-static void ntreeReleaseThreadStack(bNodeThreadStack *nts)
-{
- nts->used= 0;
-}
-
-/* free texture delegates */
-static void tex_end_exec(bNodeTree *ntree)
-{
- bNodeThreadStack *nts;
- bNodeStack *ns;
- int th, a;
+ ntree_update_link_pointers(ntree);
- if(ntree->threadstack) {
- for(th=0; th<BLENDER_MAX_THREADS; th++) {
- for(nts=ntree->threadstack[th].first; nts; nts=nts->next) {
- for(ns= nts->stack, a=0; a<ntree->stacksize; a++, ns++) {
- if(ns->data) {
- MEM_freeN(ns->data);
- ns->data= NULL;
- }
- }
- }
- }
- }
-}
-
-void ntreeBeginExecTree(bNodeTree *ntree)
-{
- bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
-
- /* let's make it sure */
- if(ntree->init & NTREE_EXEC_INIT)
- return;
+ /* also updates the node level! */
+ ntreeGetDependencyList(ntree, &deplist, &totnodes);
- /* allocate the thread stack listbase array */
- if(ntree->type!=NTREE_COMPOSIT)
- ntree->threadstack= MEM_callocN(BLENDER_MAX_THREADS*sizeof(ListBase), "thread stack array");
-
- /* goes recursive over all groups */
- ntree->stacksize= ntree_begin_exec_tree(ntree);
-
- if(ntree->stacksize) {
- bNode *node;
- bNodeStack *ns;
- int a;
-
- /* allocate the base stack */
- ns=ntree->stack= MEM_callocN(ntree->stacksize*sizeof(bNodeStack), "node stack");
-
- /* tag inputs, the get_stack() gives own socket stackdata if not in use */
- for(a=0; a<ntree->stacksize; a++, ns++) ns->hasinput= 1;
-
- /* tag used outputs, so we know when we can skip operations */
- for(node= ntree->nodes.first; node; node= node->next) {
- bNodeSocket *sock;
-
- /* non-composite trees do all nodes by default */
- if(ntree->type!=NTREE_COMPOSIT)
- node->need_exec= 1;
-
- for(sock= node->inputs.first; sock; sock= sock->next) {
- ns = get_socket_stack(ntree->stack, sock, NULL);
- if (ns) {
- ns->hasoutput = 1;
-
- /* sock type is needed to detect rgba or value or vector types */
- if(sock->link && sock->link->fromsock)
- ns->sockettype= sock->link->fromsock->type;
- else
- sock->ns.sockettype= sock->type;
- }
-
- if(sock->link) {
- bNodeLink *link= sock->link;
- /* this is the test for a cyclic case */
- if(link->fromnode && link->tonode) {
- if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF);
- else {
- node->need_exec= 0;
- }
- }
- }
- }
-
- /* set stack types (for local stack entries) */
- for(sock= node->outputs.first; sock; sock= sock->next) {
- ns = get_socket_stack(ntree->stack, sock, NULL);
- if (ns)
- ns->sockettype = sock->type;
- }
-
- if(node->type==NODE_GROUP && node->id) {
- node_get_stack(node, ntree->stack, nsin, NULL, NULL);
- group_tag_used_outputs(node, ntree->stack, nsin);
- }
+ if (deplist) {
+ /* update individual nodes */
+ for (n=0; n < totnodes; ++n) {
+ node = deplist[n];
+ if (ntreetype->update_node)
+ ntreetype->update_node(ntree, node);
+ else if (node->typeinfo->updatefunc)
+ node->typeinfo->updatefunc(ntree, node);
}
- if(ntree->type==NTREE_COMPOSIT)
- composit_begin_exec(ntree, ntree->stack);
+ MEM_freeN(deplist);
/* ensures only a single output node is enabled, texnode allows multiple though */
if(ntree->type!=NTREE_TEXTURE)
@@ -2425,982 +1509,218 @@ void ntreeBeginExecTree(bNodeTree *ntree)
}
- ntree->init |= NTREE_EXEC_INIT;
-}
-
-void ntreeEndExecTree(bNodeTree *ntree)
-{
- bNodeStack *ns;
-
- if(ntree->init & NTREE_EXEC_INIT) {
- bNodeThreadStack *nts;
- int a;
-
- /* another callback candidate! */
- if(ntree->type==NTREE_COMPOSIT) {
- composit_end_exec(ntree, ntree->stack);
-
- for(ns= ntree->stack, a=0; a<ntree->stacksize; a++, ns++) {
- if(ns->data) {
- printf("freed leftover buffer from stack\n");
- free_compbuf(ns->data);
- ns->data= NULL;
- }
- }
- }
- else if(ntree->type==NTREE_TEXTURE)
- tex_end_exec(ntree);
-
- if(ntree->stack) {
- MEM_freeN(ntree->stack);
- ntree->stack= NULL;
- }
-
- if(ntree->threadstack) {
- for(a=0; a<BLENDER_MAX_THREADS; a++) {
- for(nts=ntree->threadstack[a].first; nts; nts=nts->next)
- if (nts->stack) MEM_freeN(nts->stack);
- BLI_freelistN(&ntree->threadstack[a]);
- }
-
- MEM_freeN(ntree->threadstack);
- ntree->threadstack= NULL;
- }
-
- ntree->init &= ~NTREE_EXEC_INIT;
+ /* general tree updates */
+ if (ntree->update & (NTREE_UPDATE_LINKS|NTREE_UPDATE_NODES)) {
+ ntree_validate_links(ntree);
}
-}
-
-/* nodes are presorted, so exec is in order of list */
-void ntreeExecTree(bNodeTree *ntree, void *callerdata, int thread)
-{
- bNode *node;
- bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
- bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
- bNodeStack *stack;
- bNodeThreadStack *nts = NULL;
-
- /* only when initialized */
- if((ntree->init & NTREE_EXEC_INIT)==0)
- ntreeBeginExecTree(ntree);
- /* composite does 1 node per thread, so no multiple stacks needed */
- if(ntree->type==NTREE_COMPOSIT) {
- stack= ntree->stack;
- }
+ /* update tree */
+ if (ntreetype->update)
+ ntreetype->update(ntree);
else {
- nts= ntreeGetThreadStack(ntree, thread);
- stack= nts->stack;
- }
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->need_exec) {
- if(node->typeinfo->execfunc) {
- node_get_stack(node, stack, nsin, nsout, NULL);
- node->typeinfo->execfunc(callerdata, node, nsin, nsout);
- }
- else if(node->type==NODE_GROUP && node->id) {
- node_get_stack(node, stack, nsin, NULL, NULL);
- node_group_execute(stack, callerdata, node, nsin);
- }
- }
- }
-
- if(nts)
- ntreeReleaseThreadStack(nts);
-}
-
-
-/* ***************************** threaded version for execute composite nodes ************* */
-/* these are nodes without input, only giving values */
-/* or nodes with only value inputs */
-static int node_only_value(bNode *node)
-{
- bNodeSocket *sock;
-
- if(ELEM3(node->type, CMP_NODE_TIME, CMP_NODE_VALUE, CMP_NODE_RGB))
- return 1;
-
- /* doing this for all node types goes wrong. memory free errors */
- if(node->inputs.first && node->type==CMP_NODE_MAP_VALUE) {
- int retval= 1;
- for(sock= node->inputs.first; sock; sock= sock->next) {
- if(sock->link && sock->link->fromnode)
- retval &= node_only_value(sock->link->fromnode);
- }
- return retval;
+ bNodeType *ntype= node_get_type(ntree, ntree->nodetype);
+ if (ntype && ntype->updatetreefunc)
+ ntype->updatetreefunc(ntree);
}
- return 0;
-}
-
-
-/* not changing info, for thread callback */
-typedef struct ThreadData {
- bNodeStack *stack;
- RenderData *rd;
-} ThreadData;
-
-static void *exec_composite_node(void *node_v)
-{
- bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
- bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
- bNode *node= node_v;
- ThreadData *thd= (ThreadData *)node->threaddata;
- node_get_stack(node, thd->stack, nsin, nsout, NULL);
-
- if((node->flag & NODE_MUTED) && (!node_only_value(node))) {
- /* viewers we execute, for feedback to user */
- if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))
- node->typeinfo->execfunc(thd->rd, node, nsin, nsout);
- else
- node_compo_pass_on(node, nsin, nsout);
- }
- else if(node->typeinfo->execfunc) {
- node->typeinfo->execfunc(thd->rd, node, nsin, nsout);
- }
- else if(node->type==NODE_GROUP && node->id) {
- node_group_execute(thd->stack, thd->rd, node, nsin);
- }
+ /* XXX hack, should be done by depsgraph!! */
+ ntreeVerifyNodes(G.main, &ntree->id);
- node->exec |= NODE_READY;
- return NULL;
+ /* clear the update flag */
+ ntree->update = 0;
}
-/* return total of executable nodes, for timecursor */
-/* only compositor uses it */
-static int setExecutableNodes(bNodeTree *ntree, ThreadData *thd)
+void NodeTagChanged(bNodeTree *ntree, bNode *node)
{
- bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
- bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
- bNode *node;
- bNodeSocket *sock;
- int totnode= 0, group_edit= 0;
-
- /* note; do not add a dependency sort here, the stack was created already */
-
- /* if we are in group edit, viewer nodes get skipped when group has viewer */
- for(node= ntree->nodes.first; node; node= node->next)
- if(node->type==NODE_GROUP && (node->flag & NODE_GROUP_EDIT))
- if(ntreeHasType((bNodeTree *)node->id, CMP_NODE_VIEWER))
- group_edit= 1;
+ bNodeTreeType *ntreetype = ntreeGetType(ntree->type);
- for(node= ntree->nodes.first; node; node= node->next) {
- int a;
-
- node_get_stack(node, thd->stack, nsin, nsout, NULL);
-
- /* test the outputs */
- /* skip value-only nodes (should be in type!) */
- if(!node_only_value(node)) {
- for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) {
- if(nsout[a]->data==NULL && nsout[a]->hasoutput) {
- node->need_exec= 1;
- break;
- }
- }
- }
-
- /* test the inputs */
- for(a=0, sock= node->inputs.first; sock; sock= sock->next, a++) {
- /* skip viewer nodes in bg render or group edit */
- if( ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) && (G.background || group_edit))
- node->need_exec= 0;
- /* is sock in use? */
- else if(sock->link) {
- bNodeLink *link= sock->link;
-
- /* this is the test for a cyclic case */
- if(link->fromnode==NULL || link->tonode==NULL);
- else if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF) {
- if(link->fromnode->need_exec) {
- node->need_exec= 1;
- break;
- }
- }
- else {
- node->need_exec= 0;
- printf("Node %s skipped, cyclic dependency\n", node->name);
- }
- }
- }
-
- if(node->need_exec) {
-
- /* free output buffers */
- for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) {
- if(nsout[a]->data) {
- free_compbuf(nsout[a]->data);
- nsout[a]->data= NULL;
- }
- }
- totnode++;
- /* printf("node needs exec %s\n", node->name); */
-
- /* tag for getExecutableNode() */
- node->exec= 0;
- }
- else {
- /* tag for getExecutableNode() */
- node->exec= NODE_READY|NODE_FINISHED|NODE_SKIPPED;
-
- }
- }
-
- /* last step: set the stack values for only-value nodes */
- /* just does all now, compared to a full buffer exec this is nothing */
- if(totnode) {
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->need_exec==0 && node_only_value(node)) {
- if(node->typeinfo->execfunc) {
- node_get_stack(node, thd->stack, nsin, nsout, NULL);
- node->typeinfo->execfunc(thd->rd, node, nsin, nsout);
- }
- }
- }
- }
-
- return totnode;
+ /* extra null pointer checks here because this is called when unlinking
+ unknown nodes on file load, so typeinfo pointers may not be set */
+ if (ntreetype && ntreetype->update_node)
+ ntreetype->update_node(ntree, node);
+ else if (node->typeinfo && node->typeinfo->updatefunc)
+ node->typeinfo->updatefunc(ntree, node);
}
-/* while executing tree, free buffers from nodes that are not needed anymore */
-static void freeExecutableNode(bNodeTree *ntree)
+int NodeTagIDChanged(bNodeTree *ntree, ID *id)
{
- /* node outputs can be freed when:
- - not a render result or image node
- - when node outputs go to nodes all being set NODE_FINISHED
- */
+ bNodeTreeType *ntreetype;
bNode *node;
- bNodeSocket *sock;
-
- /* set exec flag for finished nodes that might need freed */
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->type!=CMP_NODE_R_LAYERS)
- if(node->exec & NODE_FINISHED)
- node->exec |= NODE_FREEBUFS;
- }
- /* clear this flag for input links that are not done yet */
- for(node= ntree->nodes.first; node; node= node->next) {
- if((node->exec & NODE_FINISHED)==0) {
- for(sock= node->inputs.first; sock; sock= sock->next)
- if(sock->link && sock->link->fromnode)
- sock->link->fromnode->exec &= ~NODE_FREEBUFS;
- }
- }
- /* now we can free buffers */
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->exec & NODE_FREEBUFS) {
- for(sock= node->outputs.first; sock; sock= sock->next) {
- bNodeStack *ns= get_socket_stack(ntree->stack, sock, NULL);
- if(ns && ns->data) {
- free_compbuf(ns->data);
- ns->data= NULL;
- // printf("freed buf node %s \n", node->name);
- }
- }
- }
- }
-}
+ int change = FALSE;
-static bNode *getExecutableNode(bNodeTree *ntree)
-{
- bNode *node;
- bNodeSocket *sock;
+ if(ELEM(NULL, id, ntree))
+ return change;
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->exec==0) {
-
- /* input sockets should be ready */
- for(sock= node->inputs.first; sock; sock= sock->next) {
- if(sock->link && sock->link->fromnode)
- if((sock->link->fromnode->exec & NODE_READY)==0)
- break;
- }
- if(sock==NULL)
- return node;
- }
- }
- return NULL;
-}
-
-/* check if texture nodes need exec or end */
-static void ntree_composite_texnode(bNodeTree *ntree, int init)
-{
- bNode *node;
+ ntreetype = ntreeGetType(ntree->type);
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->type==CMP_NODE_TEXTURE && node->id) {
- Tex *tex= (Tex *)node->id;
- if(tex->nodetree && tex->use_nodes) {
- /* has internal flag to detect it only does it once */
- if(init)
- ntreeBeginExecTree(tex->nodetree);
- else
- ntreeEndExecTree(tex->nodetree);
+ if (ntreetype->update_node) {
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->id==id) {
+ change = TRUE;
+ ntreetype->update_node(ntree, node);
}
}
}
-
-}
-
-/* optimized tree execute test for compositing */
-void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview)
-{
- bNode *node;
- ListBase threads;
- ThreadData thdata;
- int totnode, curnode, rendering= 1;
-
- if(ntree==NULL) return;
-
- if(do_preview)
- ntreeInitPreview(ntree, 0, 0);
-
- ntreeBeginExecTree(ntree);
- ntree_composite_texnode(ntree, 1);
-
- /* prevent unlucky accidents */
- if(G.background)
- rd->scemode &= ~R_COMP_CROP;
-
- /* setup callerdata for thread callback */
- thdata.rd= rd;
- thdata.stack= ntree->stack;
-
- /* fixed seed, for example noise texture */
- BLI_srandom(rd->cfra);
-
- /* sets need_exec tags in nodes */
- curnode = totnode= setExecutableNodes(ntree, &thdata);
-
- BLI_init_threads(&threads, exec_composite_node, rd->threads);
-
- while(rendering) {
-
- if(BLI_available_threads(&threads)) {
- node= getExecutableNode(ntree);
- if(node) {
- if(ntree->progress && totnode)
- ntree->progress(ntree->prh, (1.0f - curnode/(float)totnode));
- if(ntree->stats_draw) {
- char str[64];
- sprintf(str, "Compositing %d %s", curnode, node->name);
- ntree->stats_draw(ntree->sdh, str);
- }
- curnode--;
-
- node->threaddata = &thdata;
- node->exec= NODE_PROCESSING;
- BLI_insert_thread(&threads, node);
- }
- else
- PIL_sleep_ms(50);
- }
- else
- PIL_sleep_ms(50);
-
- rendering= 0;
- /* test for ESC */
- if(ntree->test_break && ntree->test_break(ntree->tbh)) {
- for(node= ntree->nodes.first; node; node= node->next)
- node->exec |= NODE_READY;
- }
-
- /* check for ready ones, and if we need to continue */
+ else {
for(node= ntree->nodes.first; node; node= node->next) {
- if(node->exec & NODE_READY) {
- if((node->exec & NODE_FINISHED)==0) {
- BLI_remove_thread(&threads, node); /* this waits for running thread to finish btw */
- node->exec |= NODE_FINISHED;
-
- /* freeing unused buffers */
- if(rd->scemode & R_COMP_FREE)
- freeExecutableNode(ntree);
- }
+ if(node->id==id) {
+ change = TRUE;
+ if (node->typeinfo->updatefunc)
+ node->typeinfo->updatefunc(ntree, node);
}
- else rendering= 1;
}
}
- BLI_end_threads(&threads);
-
- ntreeEndExecTree(ntree);
+ return change;
}
-/* ********** copy composite tree entirely, to allow threaded exec ******************* */
-/* ***************** do NOT execute this in a thread! ****************** */
-
-/* returns localized tree for execution in threads */
-/* local tree then owns all compbufs (for composite) */
-bNodeTree *ntreeLocalize(bNodeTree *ntree)
-{
- bNodeTree *ltree;
- bNode *node;
- bNodeSocket *sock;
-
- bAction *action_backup= NULL, *tmpact_backup= NULL;
-
- /* Workaround for copying an action on each render!
- * set action to NULL so animdata actions dont get copied */
- AnimData *adt= BKE_animdata_from_id(&ntree->id);
-
- if(adt) {
- action_backup= adt->action;
- tmpact_backup= adt->tmpact;
-
- adt->action= NULL;
- adt->tmpact= NULL;
- }
-
- /* node copy func */
- ltree= ntreeCopyTree(ntree);
-
- if(adt) {
- AnimData *ladt= BKE_animdata_from_id(&ltree->id);
-
- adt->action= ladt->action= action_backup;
- adt->tmpact= ladt->tmpact= tmpact_backup;
-
- if(action_backup) action_backup->id.us++;
- if(tmpact_backup) tmpact_backup->id.us++;
-
- }
- /* end animdata uglyness */
-
- /* ensures only a single output node is enabled */
- ntreeSetOutput(ltree);
-
- for(node= ntree->nodes.first; node; node= node->next) {
-
- /* store new_node pointer to original */
- node->new_node->new_node= node;
-
- if(ntree->type==NTREE_COMPOSIT) {
- /* ensure new user input gets handled ok, only composites (texture nodes will break, for painting since it uses no tags) */
- node->need_exec= 0;
-
- /* move over the compbufs */
- /* right after ntreeCopyTree() oldsock pointers are valid */
-
- if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
- if(node->id) {
- if(node->flag & NODE_DO_OUTPUT)
- node->new_node->id= (ID *)copy_image((Image *)node->id);
- else
- node->new_node->id= NULL;
- }
- }
-
- for(sock= node->outputs.first; sock; sock= sock->next) {
-
- sock->new_sock->ns.data= sock->ns.data;
- compbuf_set_node(sock->new_sock->ns.data, node->new_node);
-
- sock->ns.data= NULL;
- sock->new_sock->new_sock= sock;
- }
- }
- }
-
- return ltree;
-}
-
-static int node_exists(bNodeTree *ntree, bNode *testnode)
-{
- bNode *node= ntree->nodes.first;
- for(; node; node= node->next)
- if(node==testnode)
- return 1;
- return 0;
-}
+/* ************* node type access ********** */
-static int outsocket_exists(bNode *node, bNodeSocket *testsock)
+int nodeValid(bNodeTree *ntree, bNodeTemplate *ntemp)
{
- bNodeSocket *sock= node->outputs.first;
- for(; sock; sock= sock->next)
- if(sock==testsock)
+ bNodeType *ntype= node_get_type(ntree, ntemp->type);
+ if (ntype) {
+ if (ntype->validfunc)
+ return ntype->validfunc(ntree, ntemp);
+ else
return 1;
- return 0;
-}
-
-
-/* sync local composite with real tree */
-/* local composite is supposed to be running, be careful moving previews! */
-/* is called by jobs manager, outside threads, so it doesnt happen during draw */
-void ntreeLocalSync(bNodeTree *localtree, bNodeTree *ntree)
-{
- bNode *lnode;
-
- if(ntree->type==NTREE_COMPOSIT) {
- /* move over the compbufs and previews */
- for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
- if( (lnode->exec & NODE_READY) && !(lnode->exec & NODE_SKIPPED) ) {
- if(node_exists(ntree, lnode->new_node)) {
-
- if(lnode->preview && lnode->preview->rect) {
- node_free_preview(lnode->new_node);
- lnode->new_node->preview= lnode->preview;
- lnode->preview= NULL;
- }
- }
- }
- }
- }
- else if(ELEM(ntree->type, NTREE_SHADER, NTREE_TEXTURE)) {
- /* copy over contents of previews */
- for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
- if(node_exists(ntree, lnode->new_node)) {
- bNode *node= lnode->new_node;
-
- if(node->preview && node->preview->rect) {
- if(lnode->preview && lnode->preview->rect) {
- int xsize= node->preview->xsize;
- int ysize= node->preview->ysize;
- memcpy(node->preview->rect, lnode->preview->rect, 4*xsize + xsize*ysize*sizeof(char)*4);
- }
- }
- }
- }
}
+ else
+ return 0;
}
-/* merge local tree results back, and free local tree */
-/* we have to assume the editor already changed completely */
-void ntreeLocalMerge(bNodeTree *localtree, bNodeTree *ntree)
+const char* nodeLabel(bNode *node)
{
- bNode *lnode;
- bNodeSocket *lsock;
-
- /* move over the compbufs and previews */
- for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
- if(node_exists(ntree, lnode->new_node)) {
-
- if(lnode->preview && lnode->preview->rect) {
- node_free_preview(lnode->new_node);
- lnode->new_node->preview= lnode->preview;
- lnode->preview= NULL;
- }
-
- if(ELEM(lnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
- if(lnode->id && (lnode->flag & NODE_DO_OUTPUT)) {
- /* image_merge does sanity check for pointers */
- BKE_image_merge((Image *)lnode->new_node->id, (Image *)lnode->id);
- }
- }
-
- for(lsock= lnode->outputs.first; lsock; lsock= lsock->next) {
- if(outsocket_exists(lnode->new_node, lsock->new_sock)) {
- lsock->new_sock->ns.data= lsock->ns.data;
- compbuf_set_node(lsock->new_sock->ns.data, lnode->new_node);
- lsock->ns.data= NULL;
- lsock->new_sock= NULL;
- }
- }
- }
- }
- ntreeFreeTree(localtree);
- MEM_freeN(localtree);
+ if (node->label[0]!='\0')
+ return node->label;
+ else if (node->typeinfo->labelfunc)
+ return node->typeinfo->labelfunc(node);
+ else
+ return node->typeinfo->name;
}
-/* *********************************************** */
-
-/* GPU material from shader nodes */
-
-static void gpu_from_node_stack(ListBase *sockets, bNodeStack **ns, GPUNodeStack *gs)
+struct bNodeTree *nodeGroupEditGet(struct bNode *node)
{
- bNodeSocket *sock;
- int i;
-
- for (sock=sockets->first, i=0; sock; sock=sock->next, i++) {
- memset(&gs[i], 0, sizeof(gs[i]));
-
- QUATCOPY(gs[i].vec, ns[i]->vec);
- gs[i].link= ns[i]->data;
-
- if (sock->type == SOCK_VALUE)
- gs[i].type= GPU_FLOAT;
- else if (sock->type == SOCK_VECTOR)
- gs[i].type= GPU_VEC3;
- else if (sock->type == SOCK_RGBA)
- gs[i].type= GPU_VEC4;
- else
- gs[i].type= GPU_NONE;
-
- gs[i].name = "";
- gs[i].hasinput= ns[i]->hasinput && ns[i]->data;
- gs[i].hasoutput= ns[i]->hasoutput && ns[i]->data;
- gs[i].sockettype= ns[i]->sockettype;
- }
-
- gs[i].type= GPU_NONE;
+ if (node->typeinfo->group_edit_get)
+ return node->typeinfo->group_edit_get(node);
+ else
+ return NULL;
}
-static void data_from_gpu_stack(ListBase *sockets, bNodeStack **ns, GPUNodeStack *gs)
+struct bNodeTree *nodeGroupEditSet(struct bNode *node, int edit)
{
- bNodeSocket *sock;
- int i;
-
- for (sock=sockets->first, i=0; sock; sock=sock->next, i++) {
- ns[i]->data= gs[i].link;
- ns[i]->sockettype= gs[i].sockettype;
- }
+ if (node->typeinfo->group_edit_set)
+ return node->typeinfo->group_edit_set(node, edit);
+ else if (node->typeinfo->group_edit_get)
+ return node->typeinfo->group_edit_get(node);
+ else
+ return NULL;
}
-static void gpu_node_group_execute(bNodeStack *stack, GPUMaterial *mat, bNode *gnode, bNodeStack **in)
+void nodeGroupEditClear(struct bNode *node)
{
- bNode *node;
- bNodeTree *ntree= (bNodeTree *)gnode->id;
- bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
- bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
- GPUNodeStack gpuin[MAX_SOCKET+1], gpuout[MAX_SOCKET+1];
- int doit = 0;
-
- if(ntree==NULL) return;
-
- stack+= gnode->stack_index;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->typeinfo->gpufunc) {
- node_get_stack(node, stack, nsin, nsout, in);
-
- doit = 0;
-
- /* for groups, only execute outputs for edited group */
- if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
- if(gnode->flag & NODE_GROUP_EDIT)
- if(node->flag & NODE_DO_OUTPUT)
- doit = 1;
- }
- else
- doit = 1;
-
- if(doit) {
- gpu_from_node_stack(&node->inputs, nsin, gpuin);
- gpu_from_node_stack(&node->outputs, nsout, gpuout);
- if(node->typeinfo->gpufunc(mat, node, gpuin, gpuout))
- data_from_gpu_stack(&node->outputs, nsout, gpuout);
- }
- }
- }
+ if (node->typeinfo->group_edit_clear)
+ node->typeinfo->group_edit_clear(node);
}
-void ntreeGPUMaterialNodes(bNodeTree *ntree, GPUMaterial *mat)
+struct bNodeTemplate nodeMakeTemplate(struct bNode *node)
{
- bNode *node;
- bNodeStack *stack;
- bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
- bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
- GPUNodeStack gpuin[MAX_SOCKET+1], gpuout[MAX_SOCKET+1];
-
- if((ntree->init & NTREE_EXEC_INIT)==0)
- ntreeBeginExecTree(ntree);
-
- stack= ntree->stack;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->typeinfo->gpufunc) {
- node_get_stack(node, stack, nsin, nsout, NULL);
- gpu_from_node_stack(&node->inputs, nsin, gpuin);
- gpu_from_node_stack(&node->outputs, nsout, gpuout);
- if(node->typeinfo->gpufunc(mat, node, gpuin, gpuout))
- data_from_gpu_stack(&node->outputs, nsout, gpuout);
- }
- else if(node->type==NODE_GROUP && node->id) {
- node_get_stack(node, stack, nsin, nsout, NULL);
- gpu_node_group_execute(stack, mat, node, nsin);
- }
+ bNodeTemplate ntemp;
+ if (node->typeinfo->templatefunc)
+ return node->typeinfo->templatefunc(node);
+ else {
+ ntemp.type = node->type;
+ return ntemp;
}
-
- ntreeEndExecTree(ntree);
}
-/* **************** call to switch lamploop for material node ************ */
-
-void (*node_shader_lamp_loop)(struct ShadeInput *, struct ShadeResult *);
-
-void set_node_shader_lamp_loop(void (*lamp_loop_func)(ShadeInput *, ShadeResult *))
-{
- node_shader_lamp_loop= lamp_loop_func;
-}
-
-/* clumsy checking... should do dynamic outputs once */
-static void force_hidden_passes(bNode *node, int passflag)
-{
- bNodeSocket *sock;
-
- for(sock= node->outputs.first; sock; sock= sock->next)
- sock->flag &= ~SOCK_UNAVAIL;
-
- sock= BLI_findlink(&node->outputs, RRES_OUT_Z);
- if(!(passflag & SCE_PASS_Z)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_NORMAL);
- if(!(passflag & SCE_PASS_NORMAL)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_VEC);
- if(!(passflag & SCE_PASS_VECTOR)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_UV);
- if(!(passflag & SCE_PASS_UV)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_RGBA);
- if(!(passflag & SCE_PASS_RGBA)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_DIFF);
- if(!(passflag & SCE_PASS_DIFFUSE)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_SPEC);
- if(!(passflag & SCE_PASS_SPEC)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_SHADOW);
- if(!(passflag & SCE_PASS_SHADOW)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_AO);
- if(!(passflag & SCE_PASS_AO)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_REFLECT);
- if(!(passflag & SCE_PASS_REFLECT)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_REFRACT);
- if(!(passflag & SCE_PASS_REFRACT)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_INDIRECT);
- if(!(passflag & SCE_PASS_INDIRECT)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXOB);
- if(!(passflag & SCE_PASS_INDEXOB)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXMA);
- if(!(passflag & SCE_PASS_INDEXMA)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_MIST);
- if(!(passflag & SCE_PASS_MIST)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_EMIT);
- if(!(passflag & SCE_PASS_EMIT)) sock->flag |= SOCK_UNAVAIL;
- sock= BLI_findlink(&node->outputs, RRES_OUT_ENV);
- if(!(passflag & SCE_PASS_ENVIRONMENT)) sock->flag |= SOCK_UNAVAIL;
-
-}
-
-/* based on rules, force sockets hidden always */
-void ntreeCompositForceHidden(bNodeTree *ntree, Scene *curscene)
+void node_type_base(bNodeType *ntype, int type, const char *name, short nclass, short flag)
{
- bNode *node;
+ memset(ntype, 0, sizeof(bNodeType));
- if(ntree==NULL) return;
+ ntype->type = type;
+ BLI_strncpy(ntype->name, name, sizeof(ntype->name));
+ ntype->nclass = nclass;
+ ntype->flag = flag;
- for(node= ntree->nodes.first; node; node= node->next) {
- if( node->type==CMP_NODE_R_LAYERS) {
- Scene *sce= node->id?(Scene *)node->id:curscene;
- SceneRenderLayer *srl= BLI_findlink(&sce->r.layers, node->custom1);
- if(srl)
- force_hidden_passes(node, srl->passflag);
- }
- else if( node->type==CMP_NODE_IMAGE) {
- Image *ima= (Image *)node->id;
- if(ima) {
- if(ima->rr) {
- ImageUser *iuser= node->storage;
- RenderLayer *rl= BLI_findlink(&ima->rr->layers, iuser->layer);
- if(rl)
- force_hidden_passes(node, rl->passflag);
- else
- force_hidden_passes(node, 0);
- }
- else if(ima->type!=IMA_TYPE_MULTILAYER) { /* if ->rr not yet read we keep inputs */
- force_hidden_passes(node, RRES_OUT_Z);
- }
- else
- force_hidden_passes(node, 0);
- }
- else
- force_hidden_passes(node, 0);
- }
- }
-
+ /* default size values */
+ ntype->width = 140;
+ ntype->minwidth = 100;
+ ntype->maxwidth = 320;
+ ntype->height = 100;
+ ntype->minheight = 30;
+ ntype->maxheight = FLT_MAX;
}
-/* called from render pipeline, to tag render input and output */
-/* need to do all scenes, to prevent errors when you re-render 1 scene */
-void ntreeCompositTagRender(Scene *curscene)
+void node_type_socket_templates(struct bNodeType *ntype, struct bNodeSocketTemplate *inputs, struct bNodeSocketTemplate *outputs)
{
- Scene *sce;
-
- for(sce= G.main->scene.first; sce; sce= sce->id.next) {
- if(sce->nodetree) {
- bNode *node;
-
- for(node= sce->nodetree->nodes.first; node; node= node->next) {
- if(node->id==(ID *)curscene || node->type==CMP_NODE_COMPOSITE)
- NodeTagChanged(sce->nodetree, node);
- else if(node->type==CMP_NODE_TEXTURE) /* uses scene sizex/sizey */
- NodeTagChanged(sce->nodetree, node);
- }
- }
- }
+ ntype->inputs = inputs;
+ ntype->outputs = outputs;
}
-static int node_animation_properties(bNodeTree *ntree, bNode *node)
+void node_type_init(struct bNodeType *ntype, void (*initfunc)(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp))
{
- bNodeSocket *sock;
- const ListBase *lb;
- Link *link;
- PointerRNA ptr;
- PropertyRNA *prop;
-
- /* check to see if any of the node's properties have fcurves */
- RNA_pointer_create((ID *)ntree, &RNA_Node, node, &ptr);
- lb = RNA_struct_type_properties(ptr.type);
-
- for (link=lb->first; link; link=link->next) {
- int driven, len=1, index;
- prop = (PropertyRNA *)link;
-
- if (RNA_property_array_check(prop))
- len = RNA_property_array_length(&ptr, prop);
-
- for (index=0; index<len; index++) {
- if (rna_get_fcurve(&ptr, prop, index, NULL, &driven)) {
- NodeTagChanged(ntree, node);
- return 1;
- }
- }
- }
-
- /* now check node sockets */
- for (sock = node->inputs.first; sock; sock=sock->next) {
- int driven, len=1, index;
-
- RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &ptr);
- prop = RNA_struct_find_property(&ptr, "default_value");
-
- if (RNA_property_array_check(prop))
- len = RNA_property_array_length(&ptr, prop);
-
- for (index=0; index<len; index++) {
- if (rna_get_fcurve(&ptr, prop, index, NULL, &driven)) {
- NodeTagChanged(ntree, node);
- return 1;
- }
- }
- }
-
- return 0;
+ ntype->initfunc = initfunc;
}
-/* tags nodes that have animation capabilities */
-int ntreeCompositTagAnimated(bNodeTree *ntree)
+void node_type_valid(struct bNodeType *ntype, int (*validfunc)(struct bNodeTree *ntree, struct bNodeTemplate *ntemp))
{
- bNode *node;
- int tagged= 0;
-
- if(ntree==NULL) return 0;
-
- for(node= ntree->nodes.first; node; node= node->next) {
-
- tagged = node_animation_properties(ntree, node);
-
- /* otherwise always tag these node types */
- if(node->type==CMP_NODE_IMAGE) {
- Image *ima= (Image *)node->id;
- if(ima && ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
- NodeTagChanged(ntree, node);
- tagged= 1;
- }
- }
- else if(node->type==CMP_NODE_TIME) {
- NodeTagChanged(ntree, node);
- tagged= 1;
- }
- /* here was tag render layer, but this is called after a render, so re-composites fail */
- else if(node->type==NODE_GROUP) {
- if( ntreeCompositTagAnimated((bNodeTree *)node->id) ) {
- NodeTagChanged(ntree, node);
- }
- }
- }
-
- return tagged;
+ ntype->validfunc = validfunc;
}
-
-/* called from image window preview */
-void ntreeCompositTagGenerators(bNodeTree *ntree)
+void node_type_size(struct bNodeType *ntype, int width, int minwidth, int maxwidth)
{
- bNode *node;
-
- if(ntree==NULL) return;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if( ELEM(node->type, CMP_NODE_R_LAYERS, CMP_NODE_IMAGE))
- NodeTagChanged(ntree, node);
- }
+ ntype->width = width;
+ ntype->minwidth = minwidth;
+ if (maxwidth <= minwidth)
+ ntype->maxwidth = FLT_MAX;
+ else
+ ntype->maxwidth = maxwidth;
}
-/* XXX after render animation system gets a refresh, this call allows composite to end clean */
-void ntreeClearTags(bNodeTree *ntree)
+void node_type_storage(bNodeType *ntype, const char *storagename, void (*freestoragefunc)(struct bNode *), void (*copystoragefunc)(struct bNode *, struct bNode *))
{
- bNode *node;
-
- if(ntree==NULL) return;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- node->need_exec= 0;
- if(node->type==NODE_GROUP)
- ntreeClearTags((bNodeTree *)node->id);
- }
+ if (storagename)
+ strncpy(ntype->storagename, storagename, sizeof(ntype->storagename));
+ else
+ ntype->storagename[0] = '\0';
+ ntype->copystoragefunc = copystoragefunc;
+ ntype->freestoragefunc = freestoragefunc;
}
-
-int ntreeTexTagAnimated(bNodeTree *ntree)
+void node_type_label(struct bNodeType *ntype, const char *(*labelfunc)(struct bNode *))
{
- bNode *node;
-
- if(ntree==NULL) return 0;
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->type==TEX_NODE_CURVE_TIME) {
- NodeTagChanged(ntree, node);
- return 1;
- }
- else if(node->type==NODE_GROUP) {
- if( ntreeTexTagAnimated((bNodeTree *)node->id) ) {
- return 1;
- }
- }
- }
-
- return 0;
+ ntype->labelfunc = labelfunc;
}
-/* ************* node definition init ********** */
-
-void node_type_base(bNodeType *ntype, int type, const char *name, short nclass, short flag,
- struct bNodeSocketType *inputs, struct bNodeSocketType *outputs)
+void node_type_template(struct bNodeType *ntype, struct bNodeTemplate (*templatefunc)(struct bNode *))
{
- memset(ntype, 0, sizeof(bNodeType));
-
- ntype->type = type;
- ntype->name = name;
- ntype->nclass = nclass;
- ntype->flag = flag;
-
- ntype->inputs = inputs;
- ntype->outputs = outputs;
-
- /* default size values */
- ntype->width = 140;
- ntype->minwidth = 100;
- ntype->maxwidth = 320;
+ ntype->templatefunc = templatefunc;
}
-void node_type_init(bNodeType *ntype, void (*initfunc)(struct bNode *))
+void node_type_update(struct bNodeType *ntype,
+ void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node),
+ void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id))
{
- ntype->initfunc = initfunc;
+ ntype->updatefunc = updatefunc;
+ ntype->verifyfunc = verifyfunc;
}
-void node_type_size(struct bNodeType *ntype, int width, int minwidth, int maxwidth)
+void node_type_tree(struct bNodeType *ntype, void (*inittreefunc)(struct bNodeTree *), void (*updatetreefunc)(struct bNodeTree *))
{
- ntype->width = width;
- ntype->minwidth = minwidth;
- ntype->maxwidth = maxwidth;
+ ntype->inittreefunc = inittreefunc;
+ ntype->updatetreefunc = updatetreefunc;
}
-void node_type_storage(bNodeType *ntype, const char *storagename, void (*freestoragefunc)(struct bNode *), void (*copystoragefunc)(struct bNode *, struct bNode *))
+void node_type_group_edit(struct bNodeType *ntype,
+ struct bNodeTree *(*group_edit_get)(struct bNode *node),
+ struct bNodeTree *(*group_edit_set)(struct bNode *node, int edit),
+ void (*group_edit_clear)(struct bNode *node))
{
- if (storagename)
- strncpy(ntype->storagename, storagename, sizeof(ntype->storagename));
- else
- ntype->storagename[0] = '\0';
- ntype->copystoragefunc = copystoragefunc;
- ntype->freestoragefunc = freestoragefunc;
+ ntype->group_edit_get = group_edit_get;
+ ntype->group_edit_set = group_edit_set;
+ ntype->group_edit_clear = group_edit_clear;
}
void node_type_exec(struct bNodeType *ntype, void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **))
@@ -3408,42 +1728,53 @@ void node_type_exec(struct bNodeType *ntype, void (*execfunc)(void *data, struct
ntype->execfunc = execfunc;
}
+void node_type_exec_new(struct bNodeType *ntype,
+ void *(*initexecfunc)(struct bNode *node),
+ void (*freeexecfunc)(struct bNode *node, void *nodedata),
+ void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **))
+{
+ ntype->initexecfunc = initexecfunc;
+ ntype->freeexecfunc = freeexecfunc;
+ ntype->newexecfunc = newexecfunc;
+}
+
void node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out))
{
ntype->gpufunc = gpufunc;
}
-void node_type_label(struct bNodeType *ntype, const char *(*labelfunc)(struct bNode *))
+void node_type_gpu_ext(struct bNodeType *ntype, int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node, void *nodedata, struct GPUNodeStack *in, struct GPUNodeStack *out))
{
- ntype->labelfunc = labelfunc;
+ ntype->gpuextfunc = gpuextfunc;
}
-static bNodeType *is_nodetype_registered(ListBase *typelist, int type, ID *id)
+
+static bNodeType *is_nodetype_registered(ListBase *typelist, int type)
{
bNodeType *ntype= typelist->first;
for(;ntype; ntype= ntype->next )
- if(ntype->type==type && ntype->id==id)
+ if(ntype->type==type)
return ntype;
return NULL;
}
-/* type can be from a static array, we make copy for duplicate types (like group) */
-void nodeRegisterType(ListBase *typelist, const bNodeType *ntype)
+void nodeRegisterType(ListBase *typelist, bNodeType *ntype)
{
- bNodeType *found= is_nodetype_registered(typelist, ntype->type, ntype->id);
+ bNodeType *found= is_nodetype_registered(typelist, ntype->type);
- if(found==NULL) {
- bNodeType *ntypen= MEM_callocN(sizeof(bNodeType), "node type");
- *ntypen= *ntype;
- BLI_addtail(typelist, ntypen);
- }
+ if(found==NULL)
+ BLI_addtail(typelist, ntype);
}
static void registerCompositNodes(ListBase *ntypelist)
{
- register_node_type_group(ntypelist);
+ register_node_type_frame(ntypelist);
+
+ register_node_type_cmp_group(ntypelist);
+// register_node_type_cmp_forloop(ntypelist);
+// register_node_type_cmp_whileloop(ntypelist);
register_node_type_cmp_rlayers(ntypelist);
register_node_type_cmp_image(ntypelist);
@@ -3519,7 +1850,11 @@ static void registerCompositNodes(ListBase *ntypelist)
static void registerShaderNodes(ListBase *ntypelist)
{
- register_node_type_group(ntypelist);
+ register_node_type_frame(ntypelist);
+
+ register_node_type_sh_group(ntypelist);
+// register_node_type_sh_forloop(ntypelist);
+// register_node_type_sh_whileloop(ntypelist);
register_node_type_sh_output(ntypelist);
register_node_type_sh_mix_rgb(ntypelist);
@@ -3548,7 +1883,11 @@ static void registerShaderNodes(ListBase *ntypelist)
static void registerTextureNodes(ListBase *ntypelist)
{
- register_node_type_group(ntypelist);
+ register_node_type_frame(ntypelist);
+
+ register_node_type_tex_group(ntypelist);
+// register_node_type_tex_forloop(ntypelist);
+// register_node_type_tex_whileloop(ntypelist);
register_node_type_tex_math(ntypelist);
register_node_type_tex_mix_rgb(ntypelist);
@@ -3589,53 +1928,47 @@ static void registerTextureNodes(ListBase *ntypelist)
register_node_type_tex_proc_distnoise(ntypelist);
}
-static void remove_dynamic_typeinfos(ListBase *list)
+static void free_dynamic_typeinfo(bNodeType *ntype)
{
- bNodeType *ntype= list->first;
- bNodeType *next= NULL;
- while(ntype) {
- next= ntype->next;
- if(ntype->type==NODE_DYNAMIC && ntype->id!=NULL) {
- BLI_remlink(list, ntype);
- if(ntype->inputs) {
- bNodeSocketType *sock= ntype->inputs;
- while(sock->type!=-1) {
- MEM_freeN((void *)sock->name);
- sock++;
- }
- MEM_freeN(ntype->inputs);
- }
- if(ntype->outputs) {
- bNodeSocketType *sock= ntype->outputs;
- while(sock->type!=-1) {
- MEM_freeN((void *)sock->name);
- sock++;
- }
- MEM_freeN(ntype->outputs);
- }
- if(ntype->name) {
- MEM_freeN((void *)ntype->name);
- }
- MEM_freeN(ntype);
+ if(ntype->type==NODE_DYNAMIC) {
+ if(ntype->inputs) {
+ MEM_freeN(ntype->inputs);
}
- ntype= next;
+ if(ntype->outputs) {
+ MEM_freeN(ntype->outputs);
+ }
+ if(ntype->name) {
+ MEM_freeN((void *)ntype->name);
+ }
+ }
+}
+
+static void free_typeinfos(ListBase *list)
+{
+ bNodeType *ntype, *next;
+ for(ntype=list->first; ntype; ntype=next) {
+ next = ntype->next;
+
+ if(ntype->type==NODE_DYNAMIC)
+ free_dynamic_typeinfo(ntype);
+
+ if(ntype->needs_free)
+ MEM_freeN(ntype);
}
}
void init_nodesystem(void)
{
- registerCompositNodes(&node_all_composit);
- registerShaderNodes(&node_all_shaders);
- registerTextureNodes(&node_all_textures);
+ registerCompositNodes(&ntreeGetType(NTREE_COMPOSIT)->node_types);
+ registerShaderNodes(&ntreeGetType(NTREE_SHADER)->node_types);
+ registerTextureNodes(&ntreeGetType(NTREE_TEXTURE)->node_types);
}
void free_nodesystem(void)
{
- /*remove_dynamic_typeinfos(&node_all_composit);*/ /* unused for now */
- BLI_freelistN(&node_all_composit);
- remove_dynamic_typeinfos(&node_all_shaders);
- BLI_freelistN(&node_all_shaders);
- BLI_freelistN(&node_all_textures);
+ free_typeinfos(&ntreeGetType(NTREE_COMPOSIT)->node_types);
+ free_typeinfos(&ntreeGetType(NTREE_SHADER)->node_types);
+ free_typeinfos(&ntreeGetType(NTREE_TEXTURE)->node_types);
}
/* called from unlink_scene, when deleting a scene goes over all scenes
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 0dc83084c90..c2b561b122a 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -235,6 +235,17 @@ void object_free_display(Object *ob)
freedisplist(&ob->disp);
}
+void free_sculptsession_deformMats(SculptSession *ss)
+{
+ if(ss->orig_cos) MEM_freeN(ss->orig_cos);
+ if(ss->deform_cos) MEM_freeN(ss->deform_cos);
+ if(ss->deform_imats) MEM_freeN(ss->deform_imats);
+
+ ss->orig_cos = NULL;
+ ss->deform_cos = NULL;
+ ss->deform_imats = NULL;
+}
+
void free_sculptsession(Object *ob)
{
if(ob && ob->sculpt) {
@@ -265,6 +276,7 @@ void free_sculptsession(Object *ob)
}
}
+
/* do not free object itself */
void free_object(Object *ob)
{
@@ -1082,6 +1094,7 @@ Object *add_only_object(int type, const char *name)
ob->state=1;
/* ob->pad3 == Contact Processing Threshold */
ob->m_contactProcessingThreshold = 1.;
+ ob->obstacleRad = 1.;
/* NT fluid sim defaults */
ob->fluidsimFlag = 0;
@@ -1297,6 +1310,37 @@ static void copy_object_pose(Object *obn, Object *ob)
}
}
+static int object_pose_context(Object *ob)
+{
+ if( (ob) &&
+ (ob->type == OB_ARMATURE) &&
+ (ob->pose) &&
+ (ob->mode & OB_MODE_POSE)
+ ) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+}
+
+//Object *object_pose_armature_get(Object *ob)
+Object *object_pose_armature_get(struct Object *ob)
+{
+ if(ob==NULL)
+ return NULL;
+
+ if(object_pose_context(ob))
+ return ob;
+
+ ob= modifiers_isDeformedByArmature(ob);
+
+ if(object_pose_context(ob))
+ return ob;
+
+ return NULL;
+}
+
static void copy_object_transform(Object *ob_tar, Object *ob_src)
{
copy_v3_v3(ob_tar->loc, ob_src->loc);
@@ -2758,6 +2802,33 @@ void object_handle_update(Scene *scene, Object *ob)
}
}
+void object_sculpt_modifiers_changed(Object *ob)
+{
+ SculptSession *ss= ob->sculpt;
+
+ if(!ss->cache) {
+ /* we free pbvh on changes, except during sculpt since it can't deal with
+ changing PVBH node organization, we hope topology does not change in
+ the meantime .. weak */
+ if(ss->pbvh) {
+ BLI_pbvh_free(ss->pbvh);
+ ss->pbvh= NULL;
+ }
+
+ free_sculptsession_deformMats(ob->sculpt);
+ } else {
+ PBVHNode **nodes;
+ int n, totnode;
+
+ BLI_pbvh_search_gather(ss->pbvh, NULL, NULL, &nodes, &totnode);
+
+ for(n = 0; n < totnode; n++)
+ BLI_pbvh_node_mark_update(nodes[n]);
+
+ MEM_freeN(nodes);
+ }
+}
+
float give_timeoffset(Object *ob) {
if ((ob->ipoflag & OB_OFFS_PARENTADD) && ob->parent) {
return ob->sf + give_timeoffset(ob->parent);
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 86c646fa257..60432631492 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -2090,10 +2090,10 @@ void precalc_guides(ParticleSimulationData *sim, ListBase *effectors)
data = eff->guide_data + p;
VECSUB(efd.vec_to_point, state.co, eff->guide_loc);
- VECCOPY(efd.nor, eff->guide_dir);
+ copy_v3_v3(efd.nor, eff->guide_dir);
efd.distance = len_v3(efd.vec_to_point);
- VECCOPY(data->vec_to_point, efd.vec_to_point);
+ copy_v3_v3(data->vec_to_point, efd.vec_to_point);
data->strength = effector_falloff(eff, &efd, &point, weights);
}
}
diff --git a/source/blender/blenkernel/intern/sca.c b/source/blender/blenkernel/intern/sca.c
index 0d523599598..d529a6d94c9 100644
--- a/source/blender/blenkernel/intern/sca.c
+++ b/source/blender/blenkernel/intern/sca.c
@@ -396,6 +396,7 @@ void init_actuator(bActuator *act)
bObjectActuator *oa;
bRandomActuator *ra;
bSoundActuator *sa;
+ bSteeringActuator *sta;
if(act->data) MEM_freeN(act->data);
act->data= NULL;
@@ -470,6 +471,16 @@ void init_actuator(bActuator *act)
case ACT_ARMATURE:
act->data = MEM_callocN(sizeof( bArmatureActuator ), "armature act");
break;
+ case ACT_STEERING:
+ act->data = MEM_callocN(sizeof( bSteeringActuator), "steering act");
+ sta = act->data;
+ sta->acceleration = 3.f;
+ sta->turnspeed = 120.f;
+ sta->dist = 1.f;
+ sta->velocity= 3.f;
+ sta->flag = ACT_STEERING_AUTOMATICFACING;
+ sta->facingaxis = 1;
+ break;
default:
; /* this is very severe... I cannot make any memory for this */
/* logic brick... */
@@ -595,6 +606,11 @@ void set_sca_new_poins_ob(Object *ob)
bPropertyActuator *pa= act->data;
ID_NEW(pa->ob);
}
+ else if(act->type==ACT_STEERING) {
+ bSteeringActuator *sta = act->data;
+ ID_NEW(sta->navmesh);
+ ID_NEW(sta->target);
+ }
}
act= act->next;
}
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index d6003a44a7d..1454b3f0ce3 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -514,6 +514,23 @@ Scene *add_scene(const char *name)
sce->gm.flag = GAME_DISPLAY_LISTS;
sce->gm.matmode = GAME_MAT_MULTITEX;
+ sce->gm.obstacleSimulation= OBSTSIMULATION_NONE;
+ sce->gm.levelHeight = 2.f;
+
+ sce->gm.recastData.cellsize = 0.3f;
+ sce->gm.recastData.cellheight = 0.2f;
+ sce->gm.recastData.agentmaxslope = M_PI/2;
+ sce->gm.recastData.agentmaxclimb = 0.9f;
+ sce->gm.recastData.agentheight = 2.0f;
+ sce->gm.recastData.agentradius = 0.6f;
+ sce->gm.recastData.edgemaxlen = 12.0f;
+ sce->gm.recastData.edgemaxerror = 1.3f;
+ sce->gm.recastData.regionminsize = 50.f;
+ sce->gm.recastData.regionmergesize = 20.f;
+ sce->gm.recastData.vertsperpoly = 6;
+ sce->gm.recastData.detailsampledist = 6.0f;
+ sce->gm.recastData.detailsamplemaxerror = 1.0f;
+
sound_create_scene(sce);
return sce;
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index 9ef30bdd49b..a3237da6234 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -1260,7 +1260,7 @@ static struct ImBuf * seq_proxy_fetch(SeqRenderData context, Sequence * seq, int
size_flags = seq->strip->proxy->build_size_flags;
/* only use proxies, if they are enabled (even if present!) */
- if (psize != IMB_PROXY_NONE && ((size_flags & psize) != psize)) {
+ if (psize == IMB_PROXY_NONE || ((size_flags & psize) != psize)) {
return NULL;
}
@@ -3603,6 +3603,7 @@ Sequence *sequencer_add_image_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo
#ifdef WITH_AUDASPACE
Sequence *sequencer_add_sound_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo *seq_load)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C); /* only for sound */
Editing *ed= seq_give_editing(scene, TRUE);
bSound *sound;
@@ -3624,7 +3625,7 @@ Sequence *sequencer_add_sound_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo
info = AUD_getInfo(sound->playback_handle);
if (info.specs.channels == AUD_CHANNELS_INVALID) {
- sound_delete(C, sound);
+ sound_delete(bmain, sound);
//if(op)
// BKE_report(op->reports, RPT_ERROR, "Unsupported audio format");
return NULL;
diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c
index 7b04a72666d..d2d22aa213a 100644
--- a/source/blender/blenkernel/intern/shrinkwrap.c
+++ b/source/blender/blenkernel/intern/shrinkwrap.c
@@ -134,16 +134,6 @@ static void space_transform_invert_normal(const SpaceTransform *data, float *no)
}
/*
- * Returns the squared distance between two given points
- */
-static float squared_dist(const float *a, const float *b)
-{
- float tmp[3];
- VECSUB(tmp, a, b);
- return INPR(tmp, tmp);
-}
-
-/*
* Shrinkwrap to the nearest vertex
*
* it builds a kdtree of vertexs we can attach to and then
@@ -195,7 +185,7 @@ static void shrinkwrap_calc_nearest_vertex(ShrinkwrapCalcData *calc)
//so we can initiate the "nearest.dist" with the expected value to that last hit.
//This will lead in prunning of the search tree.
if(nearest.index != -1)
- nearest.dist = squared_dist(tmp_co, nearest.co);
+ nearest.dist = len_squared_v3v3(tmp_co, nearest.co);
else
nearest.dist = FLT_MAX;
@@ -328,7 +318,7 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc)
normalize_v3(proj_axis);
//Invalid projection direction
- if(INPR(proj_axis, proj_axis) < FLT_EPSILON)
+ if(dot_v3v3(proj_axis, proj_axis) < FLT_EPSILON)
return;
}
@@ -469,7 +459,7 @@ static void shrinkwrap_calc_nearest_surface_point(ShrinkwrapCalcData *calc)
//so we can initiate the "nearest.dist" with the expected value to that last hit.
//This will lead in prunning of the search tree.
if(nearest.index != -1)
- nearest.dist = squared_dist(tmp_co, nearest.co);
+ nearest.dist = len_squared_v3v3(tmp_co, nearest.co);
else
nearest.dist = FLT_MAX;
diff --git a/source/blender/blenkernel/intern/sketch.c b/source/blender/blenkernel/intern/sketch.c
index 4cc5a880625..432dc9ec609 100644
--- a/source/blender/blenkernel/intern/sketch.c
+++ b/source/blender/blenkernel/intern/sketch.c
@@ -245,13 +245,13 @@ void sk_straightenStroke(SK_Stroke *stk, int start, int end, float p_start[3], f
prev = stk->points + start;
next = stk->points + end;
- VECCOPY(pt1.p, p_start);
- VECCOPY(pt1.no, prev->no);
+ copy_v3_v3(pt1.p, p_start);
+ copy_v3_v3(pt1.no, prev->no);
pt1.mode = prev->mode;
pt1.type = prev->type;
- VECCOPY(pt2.p, p_end);
- VECCOPY(pt2.no, next->no);
+ copy_v3_v3(pt2.p, p_end);
+ copy_v3_v3(pt2.no, next->no);
pt2.mode = next->mode;
pt2.type = next->type;
@@ -323,7 +323,7 @@ void sk_flattenStroke(SK_Stroke *stk, int start, int end)
total = end - start + 1;
- VECCOPY(normal, stk->points[start].no);
+ copy_v3_v3(normal, stk->points[start].no);
sub_v3_v3v3(distance, stk->points[end].p, stk->points[start].p);
project_v3_v3v3(normal, distance, normal);
diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c
index cdb509ab8e1..ff518d69e21 100644
--- a/source/blender/blenkernel/intern/sound.c
+++ b/source/blender/blenkernel/intern/sound.c
@@ -39,8 +39,10 @@
#include "BKE_sequencer.h"
#include "BKE_scene.h"
+#ifdef WITH_AUDASPACE
// evil global ;-)
static int sound_cfra;
+#endif
struct bSound* sound_new_file(struct Main *bmain, const char *filename)
{
@@ -201,7 +203,7 @@ void sound_exit(void)
// XXX unused currently
#if 0
-struct bSound* sound_new_buffer(struct bContext *C, struct bSound *source)
+struct bSound* sound_new_buffer(struct Main *bmain, struct bSound *source)
{
bSound* sound = NULL;
@@ -209,23 +211,23 @@ struct bSound* sound_new_buffer(struct bContext *C, struct bSound *source)
strcpy(name, "buf_");
strcpy(name + 4, source->id.name);
- sound = alloc_libblock(&CTX_data_main(C)->sound, ID_SO, name);
+ sound = alloc_libblock(&bmain->sound, ID_SO, name);
sound->child_sound = source;
sound->type = SOUND_TYPE_BUFFER;
- sound_load(CTX_data_main(C), sound);
+ sound_load(bmain, sound);
if(!sound->playback_handle)
{
- free_libblock(&CTX_data_main(C)->sound, sound);
+ free_libblock(&bmain->sound, sound);
sound = NULL;
}
return sound;
}
-struct bSound* sound_new_limiter(struct bContext *C, struct bSound *source, float start, float end)
+struct bSound* sound_new_limiter(struct Main *bmain, struct bSound *source, float start, float end)
{
bSound* sound = NULL;
@@ -233,18 +235,18 @@ struct bSound* sound_new_limiter(struct bContext *C, struct bSound *source, floa
strcpy(name, "lim_");
strcpy(name + 4, source->id.name);
- sound = alloc_libblock(&CTX_data_main(C)->sound, ID_SO, name);
+ sound = alloc_libblock(&bmain->sound, ID_SO, name);
sound->child_sound = source;
sound->start = start;
sound->end = end;
sound->type = SOUND_TYPE_LIMITER;
- sound_load(CTX_data_main(C), sound);
+ sound_load(bmain, sound);
if(!sound->playback_handle)
{
- free_libblock(&CTX_data_main(C)->sound, sound);
+ free_libblock(&bmain->sound, sound);
sound = NULL;
}
@@ -252,13 +254,13 @@ struct bSound* sound_new_limiter(struct bContext *C, struct bSound *source, floa
}
#endif
-void sound_delete(struct bContext *C, struct bSound* sound)
+void sound_delete(struct Main *bmain, struct bSound* sound)
{
if(sound)
{
sound_free(sound);
- free_libblock(&CTX_data_main(C)->sound, sound);
+ free_libblock(&bmain->sound, sound);
}
}
@@ -536,10 +538,11 @@ void sound_stop_scene(struct Scene *scene)
}
}
-void sound_seek_scene(struct bContext *C)
+void sound_seek_scene(struct Main *bmain, struct Scene *scene)
{
- struct Scene *scene = CTX_data_scene(C);
AUD_Status status;
+ bScreen *screen;
+ int animation_playing;
AUD_lock();
@@ -558,7 +561,12 @@ void sound_seek_scene(struct bContext *C)
AUD_pause(scene->sound_scene_handle);
}
- if(scene->audio.flag & AUDIO_SCRUB && !CTX_wm_screen(C)->animtimer)
+ animation_playing = 0;
+ for(screen=bmain->screen.first; screen; screen=screen->id.next)
+ if(screen->animtimer)
+ animation_playing = 1;
+
+ if(scene->audio.flag & AUDIO_SCRUB && !animation_playing)
{
if(scene->audio.flag & AUDIO_SYNC)
{
@@ -756,9 +764,21 @@ void sound_move_scene_sound(struct Scene *UNUSED(scene), void* UNUSED(handle), i
static void sound_start_play_scene(struct Scene *UNUSED(scene)) {}
void sound_play_scene(struct Scene *UNUSED(scene)) {}
void sound_stop_scene(struct Scene *UNUSED(scene)) {}
-void sound_seek_scene(struct bContext *UNUSED(C)) {}
+void sound_seek_scene(struct Main *UNUSED(bmain), struct Scene *UNUSED(scene)) {}
float sound_sync_scene(struct Scene *UNUSED(scene)) { return 0.0f; }
int sound_scene_playing(struct Scene *UNUSED(scene)) { return -1; }
int sound_read_sound_buffer(struct bSound* UNUSED(sound), float* UNUSED(buffer), int UNUSED(length), float UNUSED(start), float UNUSED(end)) { return 0; }
+void sound_read_waveform(struct bSound* sound) { (void)sound; }
+void sound_init_main(struct Main *bmain) { (void)bmain; }
+void sound_set_cfra(int cfra) { (void)cfra; }
+void sound_update_sequencer(struct Main* main, struct bSound* sound) { (void)main; (void)sound; }
+void sound_update_scene(struct Scene* scene) { (void)scene; }
+void sound_update_scene_sound(void* handle, struct bSound* sound) { (void)handle; (void)sound; }
+void sound_update_scene_listener(struct Scene *scene) { (void)scene; }
+void sound_update_fps(struct Scene *scene) { (void)scene; }
+void sound_set_scene_sound_volume(void* handle, float volume, char animated) { (void)handle; (void)volume; (void)animated; }
+void sound_set_scene_sound_pan(void* handle, float pan, char animated) { (void)handle; (void)pan; (void)animated; }
+void sound_set_scene_volume(struct Scene *scene, float volume) { (void)scene; (void)volume; }
+void sound_set_scene_sound_pitch(void* handle, float pitch, char animated) { (void)handle; (void)pitch; (void)animated; }
#endif // WITH_AUDASPACE
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 186a5ea1852..2ff555b5b22 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -61,9 +61,7 @@
#include "BKE_scene.h"
#include "BKE_subsurf.h"
-
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
+#include "GL/glew.h"
#include "GPU_draw.h"
#include "GPU_extensions.h"
@@ -71,6 +69,8 @@
#include "CCGSubSurf.h"
+extern GLubyte stipple_quarttone[128]; /* glutil.c, bad level data */
+
static int ccgDM_getVertMapIndex(CCGSubSurf *ss, CCGVert *v);
static int ccgDM_getEdgeMapIndex(CCGSubSurf *ss, CCGEdge *e);
static int ccgDM_getFaceMapIndex(CCGSubSurf *ss, CCGFace *f);
diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c
index 493baebd197..38165182d83 100644
--- a/source/blender/blenkernel/intern/texture.c
+++ b/source/blender/blenkernel/intern/texture.c
@@ -766,7 +766,9 @@ Tex *copy_texture(Tex *tex)
if(tex->preview) texn->preview = BKE_previewimg_copy(tex->preview);
if(tex->nodetree) {
- ntreeEndExecTree(tex->nodetree);
+ if (tex->nodetree->execdata) {
+ ntreeTexEndExecTree(tex->nodetree->execdata, 1);
+ }
texn->nodetree= ntreeCopyTree(tex->nodetree);
}
diff --git a/source/blender/blenlib/BLI_math_inline.h b/source/blender/blenlib/BLI_math_inline.h
index 0f8493e25a6..4309e6122df 100644
--- a/source/blender/blenlib/BLI_math_inline.h
+++ b/source/blender/blenlib/BLI_math_inline.h
@@ -45,7 +45,12 @@ extern "C" {
#define MALWAYS_INLINE MINLINE
#else
#define MINLINE static inline
+#if (defined(__APPLE__) && defined(__ppc__))
+/* static inline __attribute__ here breaks osx ppc gcc42 build */
#define MALWAYS_INLINE static __attribute__((always_inline))
+#else
+#define MALWAYS_INLINE static inline __attribute__((always_inline))
+#endif
#endif
#else
#define MINLINE
diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h
index d8719f399ae..d6a8f0fb925 100644
--- a/source/blender/blenlib/BLI_math_matrix.h
+++ b/source/blender/blenlib/BLI_math_matrix.h
@@ -66,6 +66,9 @@ void swap_m4m4(float A[4][4], float B[4][4]);
void add_m3_m3m3(float R[3][3], float A[3][3], float B[3][3]);
void add_m4_m4m4(float R[4][4], float A[4][4], float B[4][4]);
+void sub_m3_m3m3(float R[3][3], float A[3][3], float B[3][3]);
+void sub_m4_m4m4(float R[4][4], float A[4][4], float B[4][4]);
+
void mul_m3_m3m3(float R[3][3], float A[3][3], float B[3][3]);
void mul_m4_m4m4(float R[4][4], float A[4][4], float B[4][4]);
void mul_m4_m3m4(float R[4][4], float A[3][3], float B[4][4]);
@@ -80,7 +83,7 @@ void mul_serie_m4(float R[4][4],
float M5[4][4], float M6[4][4], float M7[4][4], float M8[4][4]);
void mul_m4_v3(float M[4][4], float r[3]);
-void mul_v3_m4v3(float r[3], float M[4][4], float v[3]);
+void mul_v3_m4v3(float r[3], float M[4][4], const float v[3]);
void mul_mat3_m4_v3(float M[4][4], float r[3]);
void mul_m4_v4(float M[4][4], float r[4]);
void mul_v4_m4v4(float r[4], float M[4][4], float v[4]);
diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h
index c8b598a1e85..a807a395b78 100644
--- a/source/blender/blenlib/BLI_math_vector.h
+++ b/source/blender/blenlib/BLI_math_vector.h
@@ -56,6 +56,12 @@ MINLINE void swap_v2_v2(float a[2], float b[2]);
MINLINE void swap_v3_v3(float a[3], float b[3]);
MINLINE void swap_v4_v4(float a[4], float b[4]);
+/* short */
+MINLINE void copy_v2_v2_short(short r[2], const short a[2]);
+MINLINE void copy_v3_v3_short(short r[3], const short a[3]);
+MINLINE void copy_v4_v4_short(short r[4], const short a[4]);
+
+
/********************************* Arithmetic ********************************/
MINLINE void add_v3_fl(float r[3], float f);
@@ -124,6 +130,7 @@ void interp_v3_v3v3v3(float p[3], const float v1[3], const float v2[3], const fl
void interp_v3_v3v3v3v3(float p[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3], const float w[4]);
void interp_v4_v4v4(float r[4], const float a[4], const float b[4], const float t);
void interp_v4_v4v4v4(float p[4], const float v1[4], const float v2[4], const float v3[4], const float w[3]);
+void interp_v4_v4v4v4v4(float p[4], const float v1[4], const float v2[4], const float v3[4], const float v4[4], const float w[4]);
void mid_v3_v3v3(float r[3], const float a[3], const float b[3]);
diff --git a/source/blender/blenlib/BLI_string.h b/source/blender/blenlib/BLI_string.h
index 4a0c2ab9482..c53ce9dced5 100644
--- a/source/blender/blenlib/BLI_string.h
+++ b/source/blender/blenlib/BLI_string.h
@@ -139,12 +139,15 @@ size_t BLI_strnlen(const char *str, size_t maxlen);
void BLI_timestr(double _time, char *str); /* time var is global */
-int BLI_utf8_invalid_byte(const char *str, int length);
-int BLI_utf8_invalid_strip(char *str, int length);
-
void BLI_ascii_strtolower(char *str, int len);
void BLI_ascii_strtoupper(char *str, int len);
+
+/* string_utf8.c - may move these into their own header some day - campbell */
+char *BLI_strncpy_utf8(char *dst, const char *src, size_t maxncpy);
+int BLI_utf8_invalid_byte(const char *str, int length);
+int BLI_utf8_invalid_strip(char *str, int length);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h
index 1a1f7be2471..9a3b81e5776 100644
--- a/source/blender/blenlib/BLI_utildefines.h
+++ b/source/blender/blenlib/BLI_utildefines.h
@@ -176,6 +176,12 @@
/* useful for debugging */
#define AT __FILE__ ":" STRINGIFY(__LINE__)
+/* so we can use __func__ everywhere */
+#if defined(_MSC_VER)
+# define __func__ __FUNCTION__
+#endif
+
+
/* UNUSED macro, for function argument */
#ifdef __GNUC__
# define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt
index b4fc983008c..aa822731474 100644
--- a/source/blender/blenlib/CMakeLists.txt
+++ b/source/blender/blenlib/CMakeLists.txt
@@ -80,6 +80,7 @@ set(SRC
intern/scanfill.c
intern/storage.c
intern/string.c
+ intern/string_utf8.c
intern/threads.c
intern/time.c
intern/uvproject.c
diff --git a/source/blender/blenlib/intern/BLI_kdopbvh.c b/source/blender/blenlib/intern/BLI_kdopbvh.c
index dcbe043f0d0..eae4f918a67 100644
--- a/source/blender/blenlib/intern/BLI_kdopbvh.c
+++ b/source/blender/blenlib/intern/BLI_kdopbvh.c
@@ -408,7 +408,7 @@ static void create_kdop_hull(BVHTree *tree, BVHNode *node, float *co, int numpoi
// for all Axes.
for (i = tree->start_axis; i < tree->stop_axis; i++)
{
- newminmax = INPR(&co[k * 3], KDOP_AXES[i]);
+ newminmax = dot_v3v3(&co[k * 3], KDOP_AXES[i]);
if (newminmax < bv[2 * i])
bv[2 * i] = newminmax;
if (newminmax > bv[(2 * i) + 1])
@@ -1193,17 +1193,6 @@ BVHTreeOverlap *BLI_bvhtree_overlap(BVHTree *tree1, BVHTree *tree2, unsigned int
return overlap;
}
-
-/*
- * Nearest neighbour - BLI_bvhtree_find_nearest
- */
-static float squared_dist(const float *a, const float *b)
-{
- float tmp[3];
- VECSUB(tmp, a, b);
- return INPR(tmp, tmp);
-}
-
//Determines the nearest point of the given node BV. Returns the squared distance to that point.
static float calc_nearest_point(const float *proj, BVHNode *node, float *nearest)
{
@@ -1226,7 +1215,7 @@ static float calc_nearest_point(const float *proj, BVHNode *node, float *nearest
VECCOPY(nearest, data->co);
for(i = data->tree->start_axis; i != data->tree->stop_axis; i++, bv+=2)
{
- float proj = INPR( nearest, KDOP_AXES[i]);
+ float proj = dot_v3v3( nearest, KDOP_AXES[i]);
float dl = bv[0] - proj;
float du = bv[1] - proj;
@@ -1240,7 +1229,7 @@ static float calc_nearest_point(const float *proj, BVHNode *node, float *nearest
}
}
*/
- return squared_dist(proj, nearest);
+ return len_squared_v3v3(proj, nearest);
}
@@ -1404,7 +1393,7 @@ int BLI_bvhtree_find_nearest(BVHTree *tree, const float *co, BVHTreeNearest *nea
for(i = data.tree->start_axis; i != data.tree->stop_axis; i++)
{
- data.proj[i] = INPR(data.co, KDOP_AXES[i]);
+ data.proj[i] = dot_v3v3(data.co, KDOP_AXES[i]);
}
if(nearest)
@@ -1596,7 +1585,7 @@ int BLI_bvhtree_ray_cast(BVHTree *tree, const float *co, const float *dir, float
for(i=0; i<3; i++)
{
- data.ray_dot_axis[i] = INPR( data.ray.direction, KDOP_AXES[i]);
+ data.ray_dot_axis[i] = dot_v3v3(data.ray.direction, KDOP_AXES[i]);
data.idot_axis[i] = 1.0f / data.ray_dot_axis[i];
if(fabsf(data.ray_dot_axis[i]) < FLT_EPSILON)
diff --git a/source/blender/blenlib/intern/graph.c b/source/blender/blenlib/intern/graph.c
index 2e26f4bd9c9..8b9cddcc1d1 100644
--- a/source/blender/blenlib/intern/graph.c
+++ b/source/blender/blenlib/intern/graph.c
@@ -591,7 +591,7 @@ static void testRadialSymmetry(BGraph *graph, BNode* root_node, RadialArc* ring,
node1 = BLI_otherNode(ring[i].arc, root_node);
node2 = BLI_otherNode(ring[j].arc, root_node);
- VECCOPY(p, node2->p);
+ copy_v3_v3(p, node2->p);
BLI_mirrorAlongAxis(p, root_node->p, normal);
/* check if it's within limit before continuing */
@@ -605,7 +605,7 @@ static void testRadialSymmetry(BGraph *graph, BNode* root_node, RadialArc* ring,
if (symmetric)
{
/* mark node as symmetric physically */
- VECCOPY(root_node->symmetry_axis, axis);
+ copy_v3_v3(root_node->symmetry_axis, axis);
root_node->symmetry_flag |= SYM_PHYSICAL;
root_node->symmetry_flag |= SYM_RADIAL;
diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c
index 3c79a77707a..20c503de2c3 100644
--- a/source/blender/blenlib/intern/math_matrix.c
+++ b/source/blender/blenlib/intern/math_matrix.c
@@ -306,7 +306,7 @@ void mul_serie_m4(float answ[][4], float m1[][4],
}
}
-void mul_m4_v3(float mat[][4], float *vec)
+void mul_m4_v3(float mat[][4], float vec[3])
{
float x,y;
@@ -317,7 +317,7 @@ void mul_m4_v3(float mat[][4], float *vec)
vec[2]=x*mat[0][2] + y*mat[1][2] + mat[2][2]*vec[2] + mat[3][2];
}
-void mul_v3_m4v3(float *in, float mat[][4], float *vec)
+void mul_v3_m4v3(float in[3], float mat[][4], const float vec[3])
{
float x,y;
@@ -329,7 +329,7 @@ void mul_v3_m4v3(float *in, float mat[][4], float *vec)
}
/* same as mul_m4_v3() but doesnt apply translation component */
-void mul_mat3_m4_v3(float mat[][4], float *vec)
+void mul_mat3_m4_v3(float mat[][4], float vec[3])
{
float x,y;
@@ -384,7 +384,7 @@ void mul_m3_v3(float M[3][3], float r[3])
copy_v3_v3(r, tmp);
}
-void mul_transposed_m3_v3(float mat[][3], float *vec)
+void mul_transposed_m3_v3(float mat[][3], float vec[3])
{
float x,y;
@@ -422,7 +422,7 @@ void mul_mat3_m4_fl(float m[4][4], float f)
m[i][j] *= f;
}
-void mul_m3_v3_double(float mat[][3], double *vec)
+void mul_m3_v3_double(float mat[][3], double vec[3])
{
double x,y;
@@ -451,6 +451,24 @@ void add_m4_m4m4(float m1[][4], float m2[][4], float m3[][4])
m1[i][j]= m2[i][j] + m3[i][j];
}
+void sub_m3_m3m3(float m1[][3], float m2[][3], float m3[][3])
+{
+ int i, j;
+
+ for(i=0;i<3;i++)
+ for(j=0;j<3;j++)
+ m1[i][j]= m2[i][j] - m3[i][j];
+}
+
+void sub_m4_m4m4(float m1[][4], float m2[][4], float m3[][4])
+{
+ int i, j;
+
+ for(i=0;i<4;i++)
+ for(j=0;j<4;j++)
+ m1[i][j]= m2[i][j] - m3[i][j];
+}
+
int invert_m3(float m[3][3])
{
float tmp[3][3];
@@ -961,14 +979,14 @@ void size_to_mat4(float mat[][4], const float size[3])
copy_m4_m3(mat, tmat);
}
-void mat3_to_size(float *size, float mat[][3])
+void mat3_to_size(float size[3], float mat[][3])
{
size[0]= len_v3(mat[0]);
size[1]= len_v3(mat[1]);
size[2]= len_v3(mat[2]);
}
-void mat4_to_size(float *size, float mat[][4])
+void mat4_to_size(float size[3], float mat[][4])
{
size[0]= len_v3(mat[0]);
size[1]= len_v3(mat[1]);
diff --git a/source/blender/blenlib/intern/math_vector.c b/source/blender/blenlib/intern/math_vector.c
index 15d671e38d7..7dbceff46e4 100644
--- a/source/blender/blenlib/intern/math_vector.c
+++ b/source/blender/blenlib/intern/math_vector.c
@@ -96,6 +96,14 @@ void interp_v4_v4v4v4(float p[4], const float v1[4], const float v2[4], const fl
p[3] = v1[3]*w[0] + v2[3]*w[1] + v3[3]*w[2];
}
+void interp_v4_v4v4v4v4(float p[4], const float v1[4], const float v2[4], const float v3[4], const float v4[4], const float w[4])
+{
+ p[0] = v1[0]*w[0] + v2[0]*w[1] + v3[0]*w[2] + v4[0]*w[3];
+ p[1] = v1[1]*w[0] + v2[1]*w[1] + v3[1]*w[2] + v4[1]*w[3];
+ p[2] = v1[2]*w[0] + v2[2]*w[1] + v3[2]*w[2] + v4[2]*w[3];
+ p[3] = v1[3]*w[0] + v2[3]*w[1] + v3[3]*w[2] + v4[3]*w[3];
+}
+
void mid_v3_v3v3(float v[3], const float v1[3], const float v2[3])
{
v[0]= 0.5f*(v1[0] + v2[0]);
diff --git a/source/blender/blenlib/intern/math_vector_inline.c b/source/blender/blenlib/intern/math_vector_inline.c
index 28708af7486..13623d9a93a 100644
--- a/source/blender/blenlib/intern/math_vector_inline.c
+++ b/source/blender/blenlib/intern/math_vector_inline.c
@@ -79,6 +79,28 @@ MINLINE void copy_v4_v4(float r[4], const float a[4])
r[3]= a[3];
}
+/* short */
+MINLINE void copy_v2_v2_short(short r[2], const short a[2])
+{
+ r[0]= a[0];
+ r[1]= a[1];
+}
+
+MINLINE void copy_v3_v3_short(short r[3], const short a[3])
+{
+ r[0]= a[0];
+ r[1]= a[1];
+ r[2]= a[2];
+}
+
+MINLINE void copy_v4_v4_short(short r[4], const short a[4])
+{
+ r[0]= a[0];
+ r[1]= a[1];
+ r[2]= a[2];
+ r[3]= a[3];
+}
+
MINLINE void swap_v2_v2(float a[2], float b[2])
{
SWAP(float, a[0], b[0]);
diff --git a/source/blender/blenlib/intern/noise.c b/source/blender/blenlib/intern/noise.c
index 9bc666dc971..9efe8dc9739 100644
--- a/source/blender/blenlib/intern/noise.c
+++ b/source/blender/blenlib/intern/noise.c
@@ -263,13 +263,21 @@ static float newPerlinU(float x, float y, float z)
static float orgBlenderNoise(float x, float y, float z)
{
register float cn1, cn2, cn3, cn4, cn5, cn6, i, *h;
- float ox, oy, oz, jx, jy, jz;
+ float fx, fy, fz, ox, oy, oz, jx, jy, jz;
float n= 0.5;
int ix, iy, iz, b00, b01, b10, b11, b20, b21;
- ox= (x- (ix= (int)floor(x)) );
- oy= (y- (iy= (int)floor(y)) );
- oz= (z- (iz= (int)floor(z)) );
+ fx= floor(x);
+ fy= floor(y);
+ fz= floor(z);
+
+ ox= x- fx;
+ oy= y- fy;
+ oz= z- fz;
+
+ ix= (int)fx;
+ iy= (int)fy;
+ iz= (int)fz;
jx= ox-1;
jy= oy-1;
diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c
index c4ed44f0cdb..8315161aeda 100644
--- a/source/blender/blenlib/intern/string.c
+++ b/source/blender/blenlib/intern/string.c
@@ -1,8 +1,4 @@
-/* util.c
- *
- * various string, file, list operations.
- *
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -129,7 +125,7 @@ size_t BLI_strescape(char *dst, const char *src, const size_t maxlen)
while(len < maxlen) {
switch(*src) {
case '\0':
- break;
+ goto escape_finish;
case '\\':
case '"':
@@ -154,6 +150,8 @@ size_t BLI_strescape(char *dst, const char *src, const size_t maxlen)
len++;
}
+escape_finish:
+
*dst= '\0';
return len;
@@ -397,116 +395,6 @@ size_t BLI_strnlen(const char *str, size_t maxlen)
return end ? (size_t) (end - str) : maxlen;
}
-/* from libswish3, originally called u8_isvalid(),
- * modified to return the index of the bad character (byte index not utf).
- * http://svn.swish-e.org/libswish3/trunk/src/libswish3/utf8.c r3044 - campbell */
-
-/* based on the valid_utf8 routine from the PCRE library by Philip Hazel
-
- length is in bytes, since without knowing whether the string is valid
- it's hard to know how many characters there are! */
-
-static const char trailingBytesForUTF8[256] = {
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
- 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5
-};
-
-int BLI_utf8_invalid_byte(const char *str, int length)
-{
- const unsigned char *p, *pend = (unsigned char*)str + length;
- unsigned char c;
- int ab;
-
- for (p = (unsigned char*)str; p < pend; p++) {
- c = *p;
- if (c < 128)
- continue;
- if ((c & 0xc0) != 0xc0)
- goto utf8_error;
- ab = trailingBytesForUTF8[c];
- if (length < ab)
- goto utf8_error;
- length -= ab;
-
- p++;
- /* Check top bits in the second byte */
- if ((*p & 0xc0) != 0x80)
- goto utf8_error;
-
- /* Check for overlong sequences for each different length */
- switch (ab) {
- /* Check for xx00 000x */
- case 1:
- if ((c & 0x3e) == 0) goto utf8_error;
- continue; /* We know there aren't any more bytes to check */
-
- /* Check for 1110 0000, xx0x xxxx */
- case 2:
- if (c == 0xe0 && (*p & 0x20) == 0) goto utf8_error;
- break;
-
- /* Check for 1111 0000, xx00 xxxx */
- case 3:
- if (c == 0xf0 && (*p & 0x30) == 0) goto utf8_error;
- break;
-
- /* Check for 1111 1000, xx00 0xxx */
- case 4:
- if (c == 0xf8 && (*p & 0x38) == 0) goto utf8_error;
- break;
-
- /* Check for leading 0xfe or 0xff,
- and then for 1111 1100, xx00 00xx */
- case 5:
- if (c == 0xfe || c == 0xff ||
- (c == 0xfc && (*p & 0x3c) == 0)) goto utf8_error;
- break;
- }
-
- /* Check for valid bytes after the 2nd, if any; all must start 10 */
- while (--ab > 0) {
- if ((*(p+1) & 0xc0) != 0x80) goto utf8_error;
- p++; /* do this after so we get usable offset - campbell */
- }
- }
-
- return -1;
-
-utf8_error:
-
- return (int)((char *)p - (char *)str) - 1;
-}
-
-int BLI_utf8_invalid_strip(char *str, int length)
-{
- int bad_char, tot= 0;
-
- while((bad_char= BLI_utf8_invalid_byte(str, length)) != -1) {
- str += bad_char;
- length -= bad_char;
-
- if(length == 0) {
- /* last character bad, strip it */
- *str= '\0';
- tot++;
- break;
- }
- else {
- /* strip, keep looking */
- memmove(str, str + 1, length);
- tot++;
- }
- }
-
- return tot;
-}
-
void BLI_ascii_strtolower(char *str, int len)
{
int i;
diff --git a/source/blender/blenlib/intern/string_utf8.c b/source/blender/blenlib/intern/string_utf8.c
new file mode 100644
index 00000000000..5c37d3003e4
--- /dev/null
+++ b/source/blender/blenlib/intern/string_utf8.c
@@ -0,0 +1,183 @@
+/*
+ * $Id:
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2011 Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Campbell Barton.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+ /** \file blender/blenlib/intern/string_utf8.c
+ * \ingroup bli
+ */
+
+#include <string.h>
+
+/* from libswish3, originally called u8_isvalid(),
+ * modified to return the index of the bad character (byte index not utf).
+ * http://svn.swish-e.org/libswish3/trunk/src/libswish3/utf8.c r3044 - campbell */
+
+/* based on the valid_utf8 routine from the PCRE library by Philip Hazel
+
+ length is in bytes, since without knowing whether the string is valid
+ it's hard to know how many characters there are! */
+
+static const char trailingBytesForUTF8[256] = {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5
+};
+
+int BLI_utf8_invalid_byte(const char *str, int length)
+{
+ const unsigned char *p, *pend = (unsigned char*)str + length;
+ unsigned char c;
+ int ab;
+
+ for (p = (unsigned char*)str; p < pend; p++) {
+ c = *p;
+ if (c < 128)
+ continue;
+ if ((c & 0xc0) != 0xc0)
+ goto utf8_error;
+ ab = trailingBytesForUTF8[c];
+ if (length < ab)
+ goto utf8_error;
+ length -= ab;
+
+ p++;
+ /* Check top bits in the second byte */
+ if ((*p & 0xc0) != 0x80)
+ goto utf8_error;
+
+ /* Check for overlong sequences for each different length */
+ switch (ab) {
+ /* Check for xx00 000x */
+ case 1:
+ if ((c & 0x3e) == 0) goto utf8_error;
+ continue; /* We know there aren't any more bytes to check */
+
+ /* Check for 1110 0000, xx0x xxxx */
+ case 2:
+ if (c == 0xe0 && (*p & 0x20) == 0) goto utf8_error;
+ break;
+
+ /* Check for 1111 0000, xx00 xxxx */
+ case 3:
+ if (c == 0xf0 && (*p & 0x30) == 0) goto utf8_error;
+ break;
+
+ /* Check for 1111 1000, xx00 0xxx */
+ case 4:
+ if (c == 0xf8 && (*p & 0x38) == 0) goto utf8_error;
+ break;
+
+ /* Check for leading 0xfe or 0xff,
+ and then for 1111 1100, xx00 00xx */
+ case 5:
+ if (c == 0xfe || c == 0xff ||
+ (c == 0xfc && (*p & 0x3c) == 0)) goto utf8_error;
+ break;
+ }
+
+ /* Check for valid bytes after the 2nd, if any; all must start 10 */
+ while (--ab > 0) {
+ if ((*(p+1) & 0xc0) != 0x80) goto utf8_error;
+ p++; /* do this after so we get usable offset - campbell */
+ }
+ }
+
+ return -1;
+
+utf8_error:
+
+ return (int)((char *)p - (char *)str) - 1;
+}
+
+int BLI_utf8_invalid_strip(char *str, int length)
+{
+ int bad_char, tot= 0;
+
+ while((bad_char= BLI_utf8_invalid_byte(str, length)) != -1) {
+ str += bad_char;
+ length -= bad_char;
+
+ if(length == 0) {
+ /* last character bad, strip it */
+ *str= '\0';
+ tot++;
+ break;
+ }
+ else {
+ /* strip, keep looking */
+ memmove(str, str + 1, length);
+ tot++;
+ }
+ }
+
+ return tot;
+}
+
+
+/* compatible with BLI_strncpy, but esnure no partial utf8 chars */
+
+/* array copied from glib's glib's gutf8.c,
+ * note: this looks to be at odd's with 'trailingBytesForUTF8',
+ * need to find out what gives here! - campbell */
+static const size_t utf8_skip_data[256] = {
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1
+};
+
+char *BLI_strncpy_utf8(char *dst, const char *src, size_t maxncpy)
+{
+ char *dst_r= dst;
+ size_t utf8_size;
+
+ /* note: currently we dont attempt to deal with invalid utf8 chars */
+
+ while(*src != '\0' && (utf8_size= utf8_skip_data[*src]) < maxncpy) {
+ maxncpy -= utf8_size;
+ switch(utf8_size) {
+ case 6: *dst ++ = *src ++;
+ case 5: *dst ++ = *src ++;
+ case 4: *dst ++ = *src ++;
+ case 3: *dst ++ = *src ++;
+ case 2: *dst ++ = *src ++;
+ case 1: *dst ++ = *src ++;
+ }
+ }
+ *dst= '\0';
+ return dst_r;
+}
+
diff --git a/source/blender/blenloader/BLO_sys_types.h b/source/blender/blenloader/BLO_sys_types.h
index d56723ec1c5..4b3902dca43 100644
--- a/source/blender/blenloader/BLO_sys_types.h
+++ b/source/blender/blenloader/BLO_sys_types.h
@@ -83,7 +83,7 @@ typedef unsigned long uintptr_t;
#define _UINTPTR_T_DEFINED
#endif
-#elif defined(__linux__) || defined(__NetBSD__)
+#elif defined(__linux__) || defined(__NetBSD__) || defined(__OpenBSD__)
/* Linux-i386, Linux-Alpha, Linux-ppc */
#include <stdint.h>
@@ -93,7 +93,8 @@ typedef unsigned long uintptr_t;
#include <inttypes.h>
#elif defined(FREE_WINDOWS)
-
+/* define htoln here, there must be a syntax error in winsock2.h in MinGW */
+unsigned long __attribute__((__stdcall__)) htonl(unsigned long);
#include <stdint.h>
#else
@@ -105,8 +106,14 @@ typedef unsigned long uintptr_t;
#ifdef _WIN32
+#ifndef FREE_WINDOWS
+#ifndef htonl
#define htonl(x) correctByteOrder(x)
+#endif
+#ifndef ntohl
#define ntohl(x) correctByteOrder(x)
+#endif
+#endif
#elif defined (__FreeBSD__) || defined (__OpenBSD__)
#include <sys/param.h>
#elif defined (__APPLE__)
diff --git a/source/blender/blenloader/CMakeLists.txt b/source/blender/blenloader/CMakeLists.txt
index 4088481c844..ab00a8e90dd 100644
--- a/source/blender/blenloader/CMakeLists.txt
+++ b/source/blender/blenloader/CMakeLists.txt
@@ -30,6 +30,7 @@ set(INC
../blenlib
../makesdna
../makesrna
+ ../nodes
../render/extern/include
../../../intern/guardedalloc
)
diff --git a/source/blender/blenloader/SConscript b/source/blender/blenloader/SConscript
index be9908d84e6..d5d2df3ea35 100644
--- a/source/blender/blenloader/SConscript
+++ b/source/blender/blenloader/SConscript
@@ -5,7 +5,7 @@ sources = env.Glob('intern/*.c')
incs = '. #/intern/guardedalloc ../blenlib ../blenkernel'
incs += ' ../makesdna ../editors/include'
-incs += ' ../render/extern/include ../makesrna'
+incs += ' ../render/extern/include ../makesrna ../nodes'
incs += ' ' + env['BF_ZLIB_INC']
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 363e98d7a4b..316999df6f6 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -134,6 +134,8 @@
#include "BKE_utildefines.h" // SWITCH_INT DATA ENDB DNA1 O_BINARY GLOB USER TEST REND
#include "BKE_sound.h"
+#include "NOD_socket.h"
+
//XXX #include "BIF_butspace.h" // badlevel, for do_versions, patching event codes
//XXX #include "BIF_filelist.h" // badlevel too, where to move this? - elubie
//XXX #include "BIF_previewrender.h" // bedlelvel, for struct RenderInfo
@@ -2052,10 +2054,21 @@ static void lib_link_nodetree(FileData *fd, Main *main)
}
}
+static void lib_nodetree_init_types_cb(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree)
+{
+ bNode *node;
+
+ ntreeInitTypes(ntree);
+
+ /* XXX could be replaced by do_versions for new nodes */
+ for (node=ntree->nodes.first; node; node=node->next)
+ node_verify_socket_templates(ntree, node);
+}
+
/* updates group node socket own_index so that
* external links to/from the group node are preserved.
*/
-static void lib_node_do_versions_group(bNode *gnode)
+static void lib_node_do_versions_group_indices(bNode *gnode)
{
bNodeTree *ngroup= (bNodeTree*)gnode->id;
bNode *intnode;
@@ -2088,92 +2101,101 @@ static void lib_node_do_versions_group(bNode *gnode)
}
/* updates external links for all group nodes in a tree */
-static void lib_nodetree_do_versions_group(bNodeTree *ntree)
+static void lib_nodetree_do_versions_group_indices_cb(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree)
{
bNode *node;
for (node=ntree->nodes.first; node; node=node->next) {
if (node->type==NODE_GROUP) {
bNodeTree *ngroup= (bNodeTree*)node->id;
- if (ngroup && (ngroup->flag & NTREE_DO_VERSIONS))
- lib_node_do_versions_group(node);
+ if (ngroup && (ngroup->flag & NTREE_DO_VERSIONS_GROUP_EXPOSE))
+ lib_node_do_versions_group_indices(node);
}
}
}
+/* make an update call for the tree */
+static void lib_nodetree_do_versions_update_cb(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree)
+{
+ if (ntree->update)
+ ntreeUpdateTree(ntree);
+}
+
/* verify types for nodes and groups, all data has to be read */
/* open = 0: appending/linking, open = 1: open new file (need to clean out dynamic
* typedefs*/
static void lib_verify_nodetree(Main *main, int UNUSED(open))
{
- Scene *sce;
- Material *ma;
- Tex *tx;
bNodeTree *ntree;
-
+ int i;
+ bNodeTreeType *ntreetype;
+
/* this crashes blender on undo/redo
if(open==1) {
reinit_nodesystem();
}*/
- /* now create the own typeinfo structs an verify nodes */
- /* here we still assume no groups in groups */
- for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next) {
- ntreeVerifyTypes(ntree); /* internal nodes, no groups! */
+ /* set node->typeinfo pointers */
+ for (i=0; i < NUM_NTREE_TYPES; ++i) {
+ ntreetype= ntreeGetType(i);
+ if (ntreetype && ntreetype->foreach_nodetree)
+ ntreetype->foreach_nodetree(main, NULL, lib_nodetree_init_types_cb);
}
+ for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next)
+ ntreeInitTypes(ntree);
{
- /*int has_old_groups=0;*/ /*UNUSED*/
+ int has_old_groups=0;
/* XXX this should actually be part of do_versions, but since we need
* finished library linking, it is not possible there. Instead in do_versions
* we have set the NTREE_DO_VERSIONS flag, so at this point we can do the
* actual group node updates.
*/
for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next) {
- if (ntree->flag & NTREE_DO_VERSIONS) {
+ if (ntree->flag & NTREE_DO_VERSIONS_GROUP_EXPOSE) {
/* this adds copies and links from all unlinked internal sockets to group inputs/outputs. */
- nodeGroupExposeAllSockets(ntree);
- /*has_old_groups = 1;*/ /*UNUSED*/
+ node_group_expose_all_sockets(ntree);
+ has_old_groups = 1;
}
}
- /* now verify all types in material trees, groups are set OK now */
- for(ma= main->mat.first; ma; ma= ma->id.next) {
- if(ma->nodetree)
- lib_nodetree_do_versions_group(ma->nodetree);
- }
- /* and scene trees */
- for(sce= main->scene.first; sce; sce= sce->id.next) {
- if(sce->nodetree)
- lib_nodetree_do_versions_group(sce->nodetree);
- }
- /* and texture trees */
- for(tx= main->tex.first; tx; tx= tx->id.next) {
- if(tx->nodetree)
- lib_nodetree_do_versions_group(tx->nodetree);
+
+ if (has_old_groups) {
+ for (i=0; i < NUM_NTREE_TYPES; ++i) {
+ ntreetype= ntreeGetType(i);
+ if (ntreetype && ntreetype->foreach_nodetree)
+ ntreetype->foreach_nodetree(main, NULL, lib_nodetree_do_versions_group_indices_cb);
+ }
}
for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next)
- ntree->flag &= ~NTREE_DO_VERSIONS;
+ ntree->flag &= ~NTREE_DO_VERSIONS_GROUP_EXPOSE;
}
-
- /* now verify all types in material trees, groups are set OK now */
- for(ma= main->mat.first; ma; ma= ma->id.next) {
- if(ma->nodetree)
- ntreeVerifyTypes(ma->nodetree);
- }
- /* and scene trees */
- for(sce= main->scene.first; sce; sce= sce->id.next) {
- if(sce->nodetree)
- ntreeVerifyTypes(sce->nodetree);
+
+ /* verify all group user nodes */
+ for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next) {
+ ntreeVerifyNodes(main, &ntree->id);
}
- /* and texture trees */
- for(tx= main->tex.first; tx; tx= tx->id.next) {
- if(tx->nodetree)
- ntreeVerifyTypes(tx->nodetree);
+
+ /* make update calls where necessary */
+ {
+ for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next)
+ if (ntree->update)
+ ntreeUpdateTree(ntree);
+ for (i=0; i < NUM_NTREE_TYPES; ++i) {
+ ntreetype= ntreeGetType(i);
+ if (ntreetype && ntreetype->foreach_nodetree)
+ ntreetype->foreach_nodetree(main, NULL, lib_nodetree_do_versions_update_cb);
+ }
}
}
-
+static void direct_link_node_socket(FileData *fd, bNodeSocket *sock)
+{
+ sock->link= newdataadr(fd, sock->link);
+ sock->storage= newdataadr(fd, sock->storage);
+ sock->default_value= newdataadr(fd, sock->default_value);
+ sock->cache= NULL;
+}
/* ntree itself has been read! */
static void direct_link_nodetree(FileData *fd, bNodeTree *ntree)
@@ -2185,6 +2207,7 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree)
ntree->init= 0; /* to set callbacks and force setting types */
ntree->progress= NULL;
+ ntree->execdata= NULL;
ntree->adt= newdataadr(fd, ntree->adt);
direct_link_animdata(fd, ntree->adt);
@@ -2194,12 +2217,15 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree)
if(node->type == NODE_DYNAMIC) {
node->custom1= 0;
node->custom1= BSET(node->custom1, NODE_DYNAMIC_LOADED);
- node->typeinfo= NULL;
}
+
+ node->typeinfo= NULL;
+
+ link_list(fd, &node->inputs);
+ link_list(fd, &node->outputs);
node->storage= newdataadr(fd, node->storage);
if(node->storage) {
-
/* could be handlerized at some point */
if(ntree->type==NTREE_SHADER && (node->type==SH_NODE_CURVE_VEC || node->type==SH_NODE_CURVE_RGB))
direct_link_curvemapping(fd, node->storage);
@@ -2216,8 +2242,6 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree)
((ImageUser *)node->storage)->ok= 1;
}
}
- link_list(fd, &node->inputs);
- link_list(fd, &node->outputs);
}
link_list(fd, &ntree->links);
@@ -2227,15 +2251,19 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree)
/* and we connect the rest */
for(node= ntree->nodes.first; node; node= node->next) {
+ node->parent = newdataadr(fd, node->parent);
node->preview= newimaadr(fd, node->preview);
node->lasty= 0;
+
for(sock= node->inputs.first; sock; sock= sock->next)
- sock->link= newdataadr(fd, sock->link);
+ direct_link_node_socket(fd, sock);
for(sock= node->outputs.first; sock; sock= sock->next)
- sock->ns.data= NULL;
+ direct_link_node_socket(fd, sock);
}
+ for(sock= ntree->inputs.first; sock; sock= sock->next)
+ direct_link_node_socket(fd, sock);
for(sock= ntree->outputs.first; sock; sock= sock->next)
- sock->link= newdataadr(fd, sock->link);
+ direct_link_node_socket(fd, sock);
for(link= ntree->links.first; link; link= link->next) {
link->fromnode= newdataadr(fd, link->fromnode);
@@ -3868,6 +3896,11 @@ static void lib_link_object(FileData *fd, Main *main)
arma->target= newlibadr(fd, ob->id.lib, arma->target);
arma->subtarget= newlibadr(fd, ob->id.lib, arma->subtarget);
}
+ else if(act->type==ACT_STEERING) {
+ bSteeringActuator *steeringa = act->data;
+ steeringa->target = newlibadr(fd, ob->id.lib, steeringa->target);
+ steeringa->navmesh = newlibadr(fd, ob->id.lib, steeringa->navmesh);
+ }
act= act->next;
}
@@ -4158,6 +4191,13 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
if(tmd->curfalloff)
direct_link_curvemapping(fd, tmd->curfalloff);
}
+ else if (md->type==eModifierType_WeightVGEdit) {
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+
+ wmd->cmap_curve = newdataadr(fd, wmd->cmap_curve);
+ if(wmd->cmap_curve)
+ direct_link_curvemapping(fd, wmd->cmap_curve);
+ }
}
}
@@ -4957,15 +4997,22 @@ static void lib_link_screen(FileData *fd, Main *main)
SpaceNode *snode= (SpaceNode *)sl;
snode->id= newlibadr(fd, sc->id.lib, snode->id);
+ snode->edittree= NULL;
- /* internal data, a bit patchy */
- if(snode->id) {
- if(GS(snode->id->name)==ID_MA)
- snode->nodetree= ((Material *)snode->id)->nodetree;
- else if(GS(snode->id->name)==ID_SCE)
- snode->nodetree= ((Scene *)snode->id)->nodetree;
- else if(GS(snode->id->name)==ID_TE)
- snode->nodetree= ((Tex *)snode->id)->nodetree;
+ if (ELEM3(snode->treetype, NTREE_COMPOSIT, NTREE_SHADER, NTREE_TEXTURE)) {
+ /* internal data, a bit patchy */
+ snode->nodetree= NULL;
+ if(snode->id) {
+ if(GS(snode->id->name)==ID_MA)
+ snode->nodetree= ((Material *)snode->id)->nodetree;
+ else if(GS(snode->id->name)==ID_SCE)
+ snode->nodetree= ((Scene *)snode->id)->nodetree;
+ else if(GS(snode->id->name)==ID_TE)
+ snode->nodetree= ((Tex *)snode->id)->nodetree;
+ }
+ }
+ else {
+ snode->nodetree= newlibadr_us(fd, sc->id.lib, snode->nodetree);
}
snode->linkdrag.first = snode->linkdrag.last = NULL;
@@ -5185,15 +5232,19 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene)
snode->id= restore_pointer_by_name(newmain, snode->id, 1);
snode->edittree= NULL;
- if(snode->id==NULL)
+ if (ELEM3(snode->treetype, NTREE_COMPOSIT, NTREE_SHADER, NTREE_TEXTURE)) {
snode->nodetree= NULL;
+ if(snode->id) {
+ if(GS(snode->id->name)==ID_MA)
+ snode->nodetree= ((Material *)snode->id)->nodetree;
+ else if(GS(snode->id->name)==ID_SCE)
+ snode->nodetree= ((Scene *)snode->id)->nodetree;
+ else if(GS(snode->id->name)==ID_TE)
+ snode->nodetree= ((Tex *)snode->id)->nodetree;
+ }
+ }
else {
- if(GS(snode->id->name)==ID_MA)
- snode->nodetree= ((Material *)snode->id)->nodetree;
- else if(GS(snode->id->name)==ID_SCE)
- snode->nodetree= ((Scene *)snode->id)->nodetree;
- else if(GS(snode->id->name)==ID_TE)
- snode->nodetree= ((Tex *)snode->id)->nodetree;
+ snode->nodetree= restore_pointer_by_name(newmain, &snode->nodetree->id, 1);
}
}
}
@@ -5422,7 +5473,6 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
snode->gpd= newdataadr(fd, snode->gpd);
direct_link_gpencil(fd, snode->gpd);
}
- snode->nodetree= snode->edittree= NULL;
}
else if(sl->spacetype==SPACE_TIME) {
SpaceTime *stime= (SpaceTime *)sl;
@@ -6931,6 +6981,62 @@ static void do_version_bone_roll_256(Bone *bone)
do_version_bone_roll_256(child);
}
+static void do_versions_socket_default_value(bNodeSocket *sock)
+{
+ bNodeSocketValueFloat *valfloat;
+ bNodeSocketValueVector *valvector;
+ bNodeSocketValueRGBA *valrgba;
+
+ if (sock->default_value)
+ return;
+
+ switch (sock->type) {
+ case SOCK_FLOAT:
+ valfloat = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueFloat), "default socket value");
+ valfloat->value = sock->ns.vec[0];
+ valfloat->min = sock->ns.min;
+ valfloat->max = sock->ns.max;
+ valfloat->subtype = PROP_NONE;
+ break;
+ case SOCK_VECTOR:
+ valvector = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueVector), "default socket value");
+ copy_v3_v3(valvector->value, sock->ns.vec);
+ valvector->min = sock->ns.min;
+ valvector->max = sock->ns.max;
+ valvector->subtype = PROP_NONE;
+ break;
+ case SOCK_RGBA:
+ valrgba = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueRGBA), "default socket value");
+ copy_v4_v4(valrgba->value, sock->ns.vec);
+ break;
+ }
+}
+
+static void do_versions_nodetree_default_value(bNodeTree *ntree)
+{
+ bNode *node;
+ bNodeSocket *sock;
+ for (node=ntree->nodes.first; node; node=node->next) {
+ for (sock=node->inputs.first; sock; sock=sock->next)
+ do_versions_socket_default_value(sock);
+ for (sock=node->outputs.first; sock; sock=sock->next)
+ do_versions_socket_default_value(sock);
+ }
+ for (sock=ntree->inputs.first; sock; sock=sock->next)
+ do_versions_socket_default_value(sock);
+ for (sock=ntree->outputs.first; sock; sock=sock->next)
+ do_versions_socket_default_value(sock);
+}
+
+static void do_versions_nodetree_dynamic_sockets(bNodeTree *ntree)
+{
+ bNodeSocket *sock;
+ for (sock=ntree->inputs.first; sock; sock=sock->next)
+ sock->flag |= SOCK_DYNAMIC;
+ for (sock=ntree->outputs.first; sock; sock=sock->next)
+ sock->flag |= SOCK_DYNAMIC;
+}
+
static void do_versions(FileData *fd, Library *lib, Main *main)
{
/* WATCH IT!!!: pointers from libdata have not been converted */
@@ -11514,6 +11620,23 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
+ // init facing axis property of steering actuators
+ {
+ Object *ob;
+ for(ob = main->object.first; ob; ob = ob->id.next) {
+ bActuator *act;
+ for(act= ob->actuators.first; act; act= act->next) {
+ if(act->type==ACT_STEERING) {
+ bSteeringActuator* stact = act->data;
+ if (stact->facingaxis==0)
+ {
+ stact->facingaxis=1;
+ }
+ }
+ }
+ }
+ }
+
if (main->versionfile < 256) {
bScreen *sc;
ScrArea *sa;
@@ -11582,7 +11705,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
* is done in lib_verify_nodetree, because at this point the internal
* nodes may not be up-to-date! (missing lib-link)
*/
- ntree->flag |= NTREE_DO_VERSIONS;
+ ntree->flag |= NTREE_DO_VERSIONS_GROUP_EXPOSE;
}
}
@@ -11707,10 +11830,10 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if(tex->pd) {
if (tex->pd->falloff_speed_scale == 0.0f)
tex->pd->falloff_speed_scale = 100.0f;
-
+
if (!tex->pd->falloff_curve) {
tex->pd->falloff_curve = curvemapping_add(1, 0, 0, 1, 1);
-
+
tex->pd->falloff_curve->preset = CURVE_PRESET_LINE;
tex->pd->falloff_curve->cm->flag &= ~CUMA_EXTEND_EXTRAPOLATE;
curvemap_reset(tex->pd->falloff_curve->cm, &tex->pd->falloff_curve->clipr, tex->pd->falloff_curve->preset, CURVEMAP_SLOPE_POSITIVE);
@@ -11861,12 +11984,99 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
+ if (main->versionfile < 259 || (main->versionfile == 259 && main->subversionfile < 2)){
+ {
+ /* Convert default socket values from bNodeStack */
+ Scene *sce;
+ Material *mat;
+ Tex *tex;
+ bNodeTree *ntree;
+ for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next) {
+ do_versions_nodetree_default_value(ntree);
+ ntree->update |= NTREE_UPDATE;
+ }
+ for (sce=main->scene.first; sce; sce=sce->id.next)
+ if (sce->nodetree) {
+ do_versions_nodetree_default_value(sce->nodetree);
+ sce->nodetree->update |= NTREE_UPDATE;
+ }
+ for (mat=main->mat.first; mat; mat=mat->id.next)
+ if (mat->nodetree) {
+ do_versions_nodetree_default_value(mat->nodetree);
+ mat->nodetree->update |= NTREE_UPDATE;
+ }
+ for (tex=main->tex.first; tex; tex=tex->id.next)
+ if (tex->nodetree) {
+ do_versions_nodetree_default_value(tex->nodetree);
+ tex->nodetree->update |= NTREE_UPDATE;
+ }
+ }
+
+ /* add SOCK_DYNAMIC flag to existing group sockets */
+ {
+ bNodeTree *ntree;
+ /* only need to do this for trees in main, local trees are not used as groups */
+ for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next) {
+ do_versions_nodetree_dynamic_sockets(ntree);
+ ntree->update |= NTREE_UPDATE;
+ }
+ }
+
+ {
+ /* Initialize group tree nodetypes.
+ * These are used to distinguish tree types and
+ * associate them with specific node types for polling.
+ */
+ bNodeTree *ntree;
+ /* all node trees in main->nodetree are considered groups */
+ for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next)
+ ntree->nodetype = NODE_GROUP;
+ }
+ }
+
/* put compatibility code here until next subversion bump */
{
}
+ //set defaults for obstacle avoidance, recast data
+ {
+ Scene *sce;
+ for(sce = main->scene.first; sce; sce = sce->id.next)
+ {
+ if (sce->gm.levelHeight == 0.f)
+ sce->gm.levelHeight = 2.f;
+
+ if(sce->gm.recastData.cellsize == 0.0f)
+ sce->gm.recastData.cellsize = 0.3f;
+ if(sce->gm.recastData.cellheight == 0.0f)
+ sce->gm.recastData.cellheight = 0.2f;
+ if(sce->gm.recastData.agentmaxslope == 0.0f)
+ sce->gm.recastData.agentmaxslope = M_PI/4;
+ if(sce->gm.recastData.agentmaxclimb == 0.0f)
+ sce->gm.recastData.agentmaxclimb = 0.9f;
+ if(sce->gm.recastData.agentheight == 0.0f)
+ sce->gm.recastData.agentheight = 2.0f;
+ if(sce->gm.recastData.agentradius == 0.0f)
+ sce->gm.recastData.agentradius = 0.6f;
+ if(sce->gm.recastData.edgemaxlen == 0.0f)
+ sce->gm.recastData.edgemaxlen = 12.0f;
+ if(sce->gm.recastData.edgemaxerror == 0.0f)
+ sce->gm.recastData.edgemaxerror = 1.3f;
+ if(sce->gm.recastData.regionminsize == 0.0f)
+ sce->gm.recastData.regionminsize = 50.f;
+ if(sce->gm.recastData.regionmergesize == 0.0f)
+ sce->gm.recastData.regionmergesize = 20.f;
+ if(sce->gm.recastData.vertsperpoly<3)
+ sce->gm.recastData.vertsperpoly = 6;
+ if(sce->gm.recastData.detailsampledist == 0.0f)
+ sce->gm.recastData.detailsampledist = 6.0f;
+ if(sce->gm.recastData.detailsamplemaxerror == 0.0f)
+ sce->gm.recastData.detailsamplemaxerror = 1.0f;
+ }
+ }
+
/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
/* WATCH IT 2!: Userdef struct init has to be in editors/interface/resources.c! */
@@ -12771,6 +12981,11 @@ static void expand_object(FileData *fd, Main *mainvar, Object *ob)
bArmatureActuator *arma= act->data;
expand_doit(fd, mainvar, arma->target);
}
+ else if(act->type==ACT_STEERING) {
+ bSteeringActuator *sta= act->data;
+ expand_doit(fd, mainvar, sta->target);
+ expand_doit(fd, mainvar, sta->navmesh);
+ }
act= act->next;
}
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 406a9bdc02e..e92ec5dbe6e 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -135,6 +135,7 @@ Any case: direct data is ALWAYS after the lib block
#include "BLI_blenlib.h"
#include "BLI_linklist.h"
#include "BLI_bpath.h"
+#include "BLI_math.h"
#include "BLI_utildefines.h"
#include "BKE_action.h"
@@ -642,6 +643,46 @@ static void write_curvemapping(WriteData *wd, CurveMapping *cumap)
writestruct(wd, DATA, "CurveMapPoint", cumap->cm[a].totpoint, cumap->cm[a].curve);
}
+static void write_node_socket(WriteData *wd, bNodeSocket *sock)
+{
+ bNodeSocketType *stype= ntreeGetSocketType(sock->type);
+
+ /* forward compatibility code, so older blenders still open */
+ sock->stack_type = 1;
+
+ if(sock->default_value) {
+ bNodeSocketValueFloat *valfloat;
+ bNodeSocketValueVector *valvector;
+ bNodeSocketValueRGBA *valrgba;
+
+ switch (sock->type) {
+ case SOCK_FLOAT:
+ valfloat = sock->default_value;
+ sock->ns.vec[0] = valfloat->value;
+ sock->ns.min = valfloat->min;
+ sock->ns.max = valfloat->max;
+ break;
+ case SOCK_VECTOR:
+ valvector = sock->default_value;
+ copy_v3_v3(sock->ns.vec, valvector->value);
+ sock->ns.min = valvector->min;
+ sock->ns.max = valvector->max;
+ break;
+ case SOCK_RGBA:
+ valrgba = sock->default_value;
+ copy_v4_v4(sock->ns.vec, valrgba->value);
+ sock->ns.min = 0.0f;
+ sock->ns.max = 1.0f;
+ break;
+ }
+ }
+
+ /* actual socket writing */
+ writestruct(wd, DATA, "bNodeSocket", 1, sock);
+ if (sock->default_value)
+ writestruct(wd, DATA, stype->value_structname, 1, sock->default_value);
+}
+
/* this is only direct data, tree itself should have been written */
static void write_nodetree(WriteData *wd, bNodeTree *ntree)
{
@@ -657,6 +698,12 @@ static void write_nodetree(WriteData *wd, bNodeTree *ntree)
writestruct(wd, DATA, "bNode", 1, node);
for(node= ntree->nodes.first; node; node= node->next) {
+ for(sock= node->inputs.first; sock; sock= sock->next)
+ write_node_socket(wd, sock);
+ for(sock= node->outputs.first; sock; sock= sock->next)
+ write_node_socket(wd, sock);
+
+
if(node->storage && node->type!=NODE_DYNAMIC) {
/* could be handlerized at some point, now only 1 exception still */
if(ntree->type==NTREE_SHADER && (node->type==SH_NODE_CURVE_VEC || node->type==SH_NODE_CURVE_RGB))
@@ -665,13 +712,9 @@ static void write_nodetree(WriteData *wd, bNodeTree *ntree)
write_curvemapping(wd, node->storage);
else if(ntree->type==NTREE_TEXTURE && (node->type==TEX_NODE_CURVE_RGB || node->type==TEX_NODE_CURVE_TIME) )
write_curvemapping(wd, node->storage);
- else
+ else
writestruct(wd, DATA, node->typeinfo->storagename, 1, node->storage);
}
- for(sock= node->inputs.first; sock; sock= sock->next)
- writestruct(wd, DATA, "bNodeSocket", 1, sock);
- for(sock= node->outputs.first; sock; sock= sock->next)
- writestruct(wd, DATA, "bNodeSocket", 1, sock);
}
for(link= ntree->links.first; link; link= link->next)
@@ -679,9 +722,9 @@ static void write_nodetree(WriteData *wd, bNodeTree *ntree)
/* external sockets */
for(sock= ntree->inputs.first; sock; sock= sock->next)
- writestruct(wd, DATA, "bNodeSocket", 1, sock);
+ write_node_socket(wd, sock);
for(sock= ntree->outputs.first; sock; sock= sock->next)
- writestruct(wd, DATA, "bNodeSocket", 1, sock);
+ write_node_socket(wd, sock);
}
static void current_screen_compat(Main *mainvar, bScreen **screen)
@@ -933,7 +976,7 @@ static void write_particlesystems(WriteData *wd, ListBase *particles)
writestruct(wd, DATA, "ClothSimSettings", 1, psys->clmd->sim_parms);
writestruct(wd, DATA, "ClothCollSettings", 1, psys->clmd->coll_parms);
}
-
+
write_pointcaches(wd, &psys->ptcaches);
}
}
@@ -1103,6 +1146,9 @@ static void write_actuators(WriteData *wd, ListBase *lb)
case ACT_ARMATURE:
writestruct(wd, DATA, "bArmatureActuator", 1, act->data);
break;
+ case ACT_STEERING:
+ writestruct(wd, DATA, "bSteeringActuator", 1, act->data);
+ break;
default:
; /* error: don't know how to write this file */
}
@@ -1309,6 +1355,12 @@ static void write_modifiers(WriteData *wd, ListBase *modbase)
write_curvemapping(wd, tmd->curfalloff);
}
}
+ else if (md->type==eModifierType_WeightVGEdit) {
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+
+ if (wmd->cmap_curve)
+ write_curvemapping(wd, wmd->cmap_curve);
+ }
}
}
diff --git a/source/blender/collada/AnimationExporter.cpp b/source/blender/collada/AnimationExporter.cpp
index a819f334d33..2ea10111bb9 100755..100644
--- a/source/blender/collada/AnimationExporter.cpp
+++ b/source/blender/collada/AnimationExporter.cpp
@@ -1,26 +1,26 @@
/*
- * $Id: AnimationExporter.cpp 39792 2011-08-30 09:15:55Z nexyon $
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
+* $Id$
+*
+* ***** BEGIN GPL LICENSE BLOCK *****
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+* Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed.
+*
+* ***** END GPL LICENSE BLOCK *****
+*/
#include "GeometryExporter.h"
#include "AnimationExporter.h"
@@ -30,10 +30,10 @@ template<class Functor>
void forEachObjectInScene(Scene *sce, Functor &f)
{
Base *base= (Base*) sce->base.first;
-
+
while(base) {
Object *ob = base->object;
-
+
f(ob);
base= base->next;
@@ -58,10 +58,10 @@ void AnimationExporter::operator() (Object *ob)
{
FCurve *fcu;
char * transformName ;
- bool isMatAnim = false;
+ /* bool isMatAnim = false; */ /* UNUSED */
//Export transform animations
- if(ob->adt && ob->adt->action)
+ if(ob->adt && ob->adt->action)
{
fcu = (FCurve*)ob->adt->action->curves.first;
@@ -72,21 +72,21 @@ void AnimationExporter::operator() (Object *ob)
for (Bone *bone = (Bone*)arm->bonebase.first; bone; bone = bone->next)
write_bone_animation_matrix(ob, bone);
}
-
+
while (fcu) {
//for armature animations as objects
if ( ob->type == OB_ARMATURE )
transformName = fcu->rna_path;
else
transformName = extract_transform_name( fcu->rna_path );
-
+
if ((!strcmp(transformName, "location") || !strcmp(transformName, "scale")) ||
(!strcmp(transformName, "rotation_euler") && ob->rotmode == ROT_MODE_EUL)||
(!strcmp(transformName, "rotation_quaternion")))
dae_animation(ob ,fcu, transformName, false);
fcu = fcu->next;
}
-
+
}
//Export Lamp parameter animations
@@ -94,8 +94,8 @@ void AnimationExporter::operator() (Object *ob)
{
fcu = (FCurve*)(((Lamp*)ob ->data)->adt->action->curves.first);
while (fcu) {
- transformName = extract_transform_name( fcu->rna_path );
-
+ transformName = extract_transform_name( fcu->rna_path );
+
if ((!strcmp(transformName, "color")) || (!strcmp(transformName, "spot_size"))|| (!strcmp(transformName, "spot_blend"))||
(!strcmp(transformName, "distance")) )
dae_animation(ob , fcu, transformName, true );
@@ -108,8 +108,8 @@ void AnimationExporter::operator() (Object *ob)
{
fcu = (FCurve*)(((Camera*)ob ->data)->adt->action->curves.first);
while (fcu) {
- transformName = extract_transform_name( fcu->rna_path );
-
+ transformName = extract_transform_name( fcu->rna_path );
+
if ((!strcmp(transformName, "lens"))||
(!strcmp(transformName, "ortho_scale"))||
(!strcmp(transformName, "clip_end"))||(!strcmp(transformName, "clip_start")))
@@ -125,11 +125,11 @@ void AnimationExporter::operator() (Object *ob)
if (!ma) continue;
if(ma->adt && ma->adt->action)
{
- isMatAnim = true;
+ /* isMatAnim = true; */
fcu = (FCurve*)ma->adt->action->curves.first;
while (fcu) {
transformName = extract_transform_name( fcu->rna_path );
-
+
if ((!strcmp(transformName, "specular_hardness"))||(!strcmp(transformName, "specular_color"))
||(!strcmp(transformName, "diffuse_color"))||(!strcmp(transformName, "alpha"))||
(!strcmp(transformName, "ior")))
@@ -137,384 +137,384 @@ void AnimationExporter::operator() (Object *ob)
fcu = fcu->next;
}
}
-
+
}
}
- //euler sources from quternion sources
- float * AnimationExporter::get_eul_source_for_quat(Object *ob )
+//euler sources from quternion sources
+float * AnimationExporter::get_eul_source_for_quat(Object *ob )
+{
+ FCurve *fcu = (FCurve*)ob->adt->action->curves.first;
+ const int keys = fcu->totvert;
+ float *quat = (float*)MEM_callocN(sizeof(float) * fcu->totvert * 4, "quat output source values");
+ float *eul = (float*)MEM_callocN(sizeof(float) * fcu->totvert * 3, "quat output source values");
+ float temp_quat[4];
+ float temp_eul[3];
+ while(fcu)
{
- FCurve *fcu = (FCurve*)ob->adt->action->curves.first;
- const int keys = fcu->totvert;
- float *quat = (float*)MEM_callocN(sizeof(float) * fcu->totvert * 4, "quat output source values");
- float *eul = (float*)MEM_callocN(sizeof(float) * fcu->totvert * 3, "quat output source values");
- float temp_quat[4];
- float temp_eul[3];
- while(fcu)
- {
- char * transformName = extract_transform_name( fcu->rna_path );
-
- if( !strcmp(transformName, "rotation_quaternion") ) {
- for ( int i = 0 ; i < fcu->totvert ; i++){
- *(quat + ( i * 4 ) + fcu->array_index) = fcu->bezt[i].vec[1][1];
- }
- }
- fcu = fcu->next;
+ char * transformName = extract_transform_name( fcu->rna_path );
+
+ if( !strcmp(transformName, "rotation_quaternion") ) {
+ for ( int i = 0 ; i < fcu->totvert ; i++){
+ *(quat + ( i * 4 ) + fcu->array_index) = fcu->bezt[i].vec[1][1];
}
+ }
+ fcu = fcu->next;
+ }
- for ( int i = 0 ; i < keys ; i++){
- for ( int j = 0;j<4;j++)
- temp_quat[j] = quat[(i*4)+j];
+ for ( int i = 0 ; i < keys ; i++){
+ for ( int j = 0;j<4;j++)
+ temp_quat[j] = quat[(i*4)+j];
- quat_to_eul(temp_eul,temp_quat);
+ quat_to_eul(temp_eul,temp_quat);
- for (int k = 0;k<3;k++)
- eul[i*3 + k] = temp_eul[k];
-
- }
- MEM_freeN(quat);
- return eul;
+ for (int k = 0;k<3;k++)
+ eul[i*3 + k] = temp_eul[k];
}
+ MEM_freeN(quat);
+ return eul;
+
+}
+
+//Get proper name for bones
+std::string AnimationExporter::getObjectBoneName( Object* ob,const FCurve* fcu )
+{
+ //hard-way to derive the bone name from rna_path. Must find more compact method
+ std::string rna_path = std::string(fcu->rna_path);
- //Get proper name for bones
- std::string AnimationExporter::getObjectBoneName( Object* ob,const FCurve* fcu )
+ char* boneName = strtok((char *)rna_path.c_str(), "\"");
+ boneName = strtok(NULL,"\"");
+
+ if( boneName != NULL )
+ return /*id_name(ob) + "_" +*/ std::string(boneName);
+ else
+ return id_name(ob);
+}
+
+//convert f-curves to animation curves and write
+void AnimationExporter::dae_animation(Object* ob, FCurve *fcu, char* transformName , bool is_param, Material * ma )
+{
+ const char *axis_name = NULL;
+ char anim_id[200];
+
+ bool has_tangents = false;
+ bool quatRotation = false;
+
+ if ( !strcmp(transformName, "rotation_quaternion") )
{
- //hard-way to derive the bone name from rna_path. Must find more compact method
- std::string rna_path = std::string(fcu->rna_path);
-
- char* boneName = strtok((char *)rna_path.c_str(), "\"");
- boneName = strtok(NULL,"\"");
-
- if( boneName != NULL )
- return /*id_name(ob) + "_" +*/ std::string(boneName);
- else
- return id_name(ob);
+ fprintf(stderr, "quaternion rotation curves are not supported. rotation curve will not be exported\n");
+ quatRotation = true;
+ return;
}
- //convert f-curves to animation curves and write
- void AnimationExporter::dae_animation(Object* ob, FCurve *fcu, char* transformName , bool is_param, Material * ma )
+ //axis names for colors
+ else if ( !strcmp(transformName, "color")||!strcmp(transformName, "specular_color")||!strcmp(transformName, "diffuse_color")||
+ (!strcmp(transformName, "alpha")))
{
- const char *axis_name = NULL;
- char anim_id[200];
-
- bool has_tangents = false;
- bool quatRotation = false;
-
- if ( !strcmp(transformName, "rotation_quaternion") )
- {
- fprintf(stderr, "quaternion rotation curves are not supported. rotation curve will not be exported\n");
- quatRotation = true;
- return;
- }
-
- //axis names for colors
- else if ( !strcmp(transformName, "color")||!strcmp(transformName, "specular_color")||!strcmp(transformName, "diffuse_color")||
- (!strcmp(transformName, "alpha")))
- {
- const char *axis_names[] = {"R", "G", "B"};
- if (fcu->array_index < 3)
+ const char *axis_names[] = {"R", "G", "B"};
+ if (fcu->array_index < 3)
axis_name = axis_names[fcu->array_index];
- }
+ }
- //axis names for transforms
- else if ((!strcmp(transformName, "location") || !strcmp(transformName, "scale")) ||
- (!strcmp(transformName, "rotation_euler"))||(!strcmp(transformName, "rotation_quaternion")))
- {
- const char *axis_names[] = {"X", "Y", "Z"};
- if (fcu->array_index < 3)
+ //axis names for transforms
+ else if ((!strcmp(transformName, "location") || !strcmp(transformName, "scale")) ||
+ (!strcmp(transformName, "rotation_euler"))||(!strcmp(transformName, "rotation_quaternion")))
+ {
+ const char *axis_names[] = {"X", "Y", "Z"};
+ if (fcu->array_index < 3)
axis_name = axis_names[fcu->array_index];
- }
+ }
- //no axis name. single parameter.
- else{
- axis_name = "";
- }
-
- std::string ob_name = std::string("null");
-
- //Create anim Id
- if (ob->type == OB_ARMATURE)
- {
- ob_name = getObjectBoneName( ob , fcu);
- BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s.%s", (char*)translate_id(ob_name).c_str(),
- transformName, axis_name);
- }
- else
- {
- if (ma)
- ob_name = id_name(ob) + "_material";
- else
- ob_name = id_name(ob);
- BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(),
- fcu->rna_path, axis_name);
- }
-
- openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING);
+ //no axis name. single parameter.
+ else{
+ axis_name = "";
+ }
- // create input source
- std::string input_id = create_source_from_fcurve(COLLADASW::InputSemantic::INPUT, fcu, anim_id, axis_name);
+ std::string ob_name = std::string("null");
- // create output source
- std::string output_id ;
-
- //quat rotations are skipped for now, because of complications with determining axis.
- if(quatRotation)
- {
- float * eul = get_eul_source_for_quat(ob);
- float * eul_axis = (float*)MEM_callocN(sizeof(float) * fcu->totvert, "quat output source values");
- for ( int i = 0 ; i< fcu->totvert ; i++)
- eul_axis[i] = eul[i*3 + fcu->array_index];
- output_id= create_source_from_array(COLLADASW::InputSemantic::OUTPUT, eul_axis , fcu->totvert, quatRotation, anim_id, axis_name);
- MEM_freeN(eul);
- MEM_freeN(eul_axis);
- }
- else
- {
- output_id= create_source_from_fcurve(COLLADASW::InputSemantic::OUTPUT, fcu, anim_id, axis_name);
- }
- // create interpolations source
- std::string interpolation_id = create_interpolation_source(fcu, anim_id, axis_name, &has_tangents);
-
- // handle tangents (if required)
- std::string intangent_id;
- std::string outtangent_id;
-
- if (has_tangents) {
- // create in_tangent source
- intangent_id = create_source_from_fcurve(COLLADASW::InputSemantic::IN_TANGENT, fcu, anim_id, axis_name);
-
- // create out_tangent source
- outtangent_id = create_source_from_fcurve(COLLADASW::InputSemantic::OUT_TANGENT, fcu, anim_id, axis_name);
- }
+ //Create anim Id
+ if (ob->type == OB_ARMATURE)
+ {
+ ob_name = getObjectBoneName( ob , fcu);
+ BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s.%s", (char*)translate_id(ob_name).c_str(),
+ transformName, axis_name);
+ }
+ else
+ {
+ if (ma)
+ ob_name = id_name(ob) + "_material";
+ else
+ ob_name = id_name(ob);
+ BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(),
+ fcu->rna_path, axis_name);
+ }
- std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX;
- COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id);
- std::string empty;
- sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id));
- sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id));
+ openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING);
- // this input is required
- sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id));
+ // create input source
+ std::string input_id = create_source_from_fcurve(COLLADASW::InputSemantic::INPUT, fcu, anim_id, axis_name);
- if (has_tangents) {
- sampler.addInput(COLLADASW::InputSemantic::IN_TANGENT, COLLADABU::URI(empty, intangent_id));
- sampler.addInput(COLLADASW::InputSemantic::OUT_TANGENT, COLLADABU::URI(empty, outtangent_id));
- }
+ // create output source
+ std::string output_id ;
- addSampler(sampler);
+ //quat rotations are skipped for now, because of complications with determining axis.
+ if(quatRotation)
+ {
+ float * eul = get_eul_source_for_quat(ob);
+ float * eul_axis = (float*)MEM_callocN(sizeof(float) * fcu->totvert, "quat output source values");
+ for ( int i = 0 ; i< fcu->totvert ; i++)
+ eul_axis[i] = eul[i*3 + fcu->array_index];
+ output_id= create_source_from_array(COLLADASW::InputSemantic::OUTPUT, eul_axis , fcu->totvert, quatRotation, anim_id, axis_name);
+ MEM_freeN(eul);
+ MEM_freeN(eul_axis);
+ }
+ else
+ {
+ output_id= create_source_from_fcurve(COLLADASW::InputSemantic::OUTPUT, fcu, anim_id, axis_name);
+ }
+ // create interpolations source
+ std::string interpolation_id = create_interpolation_source(fcu, anim_id, axis_name, &has_tangents);
- std::string target ;
+ // handle tangents (if required)
+ std::string intangent_id;
+ std::string outtangent_id;
- if ( !is_param )
- target = translate_id(ob_name)
- + "/" + get_transform_sid(fcu->rna_path, -1, axis_name, true);
- else
- {
- if ( ob->type == OB_LAMP )
- target = get_light_id(ob)
- + "/" + get_light_param_sid(fcu->rna_path, -1, axis_name, true);
+ if (has_tangents) {
+ // create in_tangent source
+ intangent_id = create_source_from_fcurve(COLLADASW::InputSemantic::IN_TANGENT, fcu, anim_id, axis_name);
- if ( ob->type == OB_CAMERA )
- target = get_camera_id(ob)
- + "/" + get_camera_param_sid(fcu->rna_path, -1, axis_name, true);
+ // create out_tangent source
+ outtangent_id = create_source_from_fcurve(COLLADASW::InputSemantic::OUT_TANGENT, fcu, anim_id, axis_name);
+ }
- if( ma )
- target = translate_id(id_name(ma)) + "-effect"
- +"/common/" /*profile common is only supported */ + get_transform_sid(fcu->rna_path, -1, axis_name, true);
- }
- addChannel(COLLADABU::URI(empty, sampler_id), target);
+ std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX;
+ COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id);
+ std::string empty;
+ sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id));
+ sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id));
+
+ // this input is required
+ sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id));
- closeAnimation();
+ if (has_tangents) {
+ sampler.addInput(COLLADASW::InputSemantic::IN_TANGENT, COLLADABU::URI(empty, intangent_id));
+ sampler.addInput(COLLADASW::InputSemantic::OUT_TANGENT, COLLADABU::URI(empty, outtangent_id));
}
+ addSampler(sampler);
-
- //write bone animations in transform matrix sources
- void AnimationExporter::write_bone_animation_matrix(Object *ob_arm, Bone *bone)
+ std::string target ;
+
+ if ( !is_param )
+ target = translate_id(ob_name)
+ + "/" + get_transform_sid(fcu->rna_path, -1, axis_name, true);
+ else
{
- if (!ob_arm->adt)
- return;
-
- //This will only export animations of bones in deform group.
- /*if(!is_bone_deform_group(bone))
- return;*/
-
- sample_and_write_bone_animation_matrix(ob_arm, bone);
-
- for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next)
- write_bone_animation_matrix(ob_arm, child);
+ if ( ob->type == OB_LAMP )
+ target = get_light_id(ob)
+ + "/" + get_light_param_sid(fcu->rna_path, -1, axis_name, true);
+
+ if ( ob->type == OB_CAMERA )
+ target = get_camera_id(ob)
+ + "/" + get_camera_param_sid(fcu->rna_path, -1, axis_name, true);
+
+ if( ma )
+ target = translate_id(id_name(ma)) + "-effect"
+ +"/common/" /*profile common is only supported */ + get_transform_sid(fcu->rna_path, -1, axis_name, true);
}
+ addChannel(COLLADABU::URI(empty, sampler_id), target);
+
+ closeAnimation();
+}
+
+
- bool AnimationExporter::is_bone_deform_group(Bone * bone)
+//write bone animations in transform matrix sources
+void AnimationExporter::write_bone_animation_matrix(Object *ob_arm, Bone *bone)
+{
+ if (!ob_arm->adt)
+ return;
+
+ //This will only export animations of bones in deform group.
+ /*if(!is_bone_deform_group(bone))
+ return;*/
+
+ sample_and_write_bone_animation_matrix(ob_arm, bone);
+
+ for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next)
+ write_bone_animation_matrix(ob_arm, child);
+}
+
+bool AnimationExporter::is_bone_deform_group(Bone * bone)
+{
+ bool is_def;
+ //Check if current bone is deform
+ if((bone->flag & BONE_NO_DEFORM) == 0 ) return true;
+ //Check child bones
+ else
{
- bool is_def;
- //Check if current bone is deform
- if((bone->flag & BONE_NO_DEFORM) == 0 ) return true;
- //Check child bones
- else
- {
- for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next){
- //loop through all the children until deform bone is found, and then return
- is_def = is_bone_deform_group(child);
- if (is_def) return true;
- }
+ for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next){
+ //loop through all the children until deform bone is found, and then return
+ is_def = is_bone_deform_group(child);
+ if (is_def) return true;
}
- //no deform bone found in children also
- return false;
}
+ //no deform bone found in children also
+ return false;
+}
- void AnimationExporter::sample_and_write_bone_animation_matrix(Object *ob_arm, Bone *bone)
- {
- bArmature *arm = (bArmature*)ob_arm->data;
- int flag = arm->flag;
- std::vector<float> fra;
- //char prefix[256];
-
- FCurve* fcu = (FCurve*)ob_arm->adt->action->curves.first;
- while(fcu)
- {
- std::string bone_name = getObjectBoneName(ob_arm,fcu);
- int val = BLI_strcasecmp((char*)bone_name.c_str(),bone->name);
- if(val==0) break;
- fcu = fcu->next;
- }
+void AnimationExporter::sample_and_write_bone_animation_matrix(Object *ob_arm, Bone *bone)
+{
+ bArmature *arm = (bArmature*)ob_arm->data;
+ int flag = arm->flag;
+ std::vector<float> fra;
+ //char prefix[256];
- if(!(fcu)) return;
- bPoseChannel *pchan = get_pose_channel(ob_arm->pose, bone->name);
- if (!pchan)
- return;
-
- find_frames(ob_arm, fra);
+ FCurve* fcu = (FCurve*)ob_arm->adt->action->curves.first;
+ while(fcu)
+ {
+ std::string bone_name = getObjectBoneName(ob_arm,fcu);
+ int val = BLI_strcasecmp((char*)bone_name.c_str(),bone->name);
+ if(val==0) break;
+ fcu = fcu->next;
+ }
- if (flag & ARM_RESTPOS) {
- arm->flag &= ~ARM_RESTPOS;
- where_is_pose(scene, ob_arm);
- }
+ if(!(fcu)) return;
+ bPoseChannel *pchan = get_pose_channel(ob_arm->pose, bone->name);
+ if (!pchan)
+ return;
- if (fra.size()) {
- dae_baked_animation(fra ,ob_arm, bone );
- }
+ find_frames(ob_arm, fra);
- if (flag & ARM_RESTPOS)
- arm->flag = flag;
+ if (flag & ARM_RESTPOS) {
+ arm->flag &= ~ARM_RESTPOS;
where_is_pose(scene, ob_arm);
}
- void AnimationExporter::dae_baked_animation(std::vector<float> &fra, Object *ob_arm , Bone *bone)
- {
- std::string ob_name = id_name(ob_arm);
- std::string bone_name = bone->name;
- char anim_id[200];
-
- if (!fra.size())
- return;
+ if (fra.size()) {
+ dae_baked_animation(fra ,ob_arm, bone );
+ }
- BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(),
- (char*)translate_id(bone_name).c_str(), "pose_matrix");
+ if (flag & ARM_RESTPOS)
+ arm->flag = flag;
+ where_is_pose(scene, ob_arm);
+}
- openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING);
+void AnimationExporter::dae_baked_animation(std::vector<float> &fra, Object *ob_arm , Bone *bone)
+{
+ std::string ob_name = id_name(ob_arm);
+ std::string bone_name = bone->name;
+ char anim_id[200];
- // create input source
- std::string input_id = create_source_from_vector(COLLADASW::InputSemantic::INPUT, fra, false, anim_id, "");
+ if (!fra.size())
+ return;
- // create output source
- std::string output_id;
- output_id = create_4x4_source( fra, ob_arm , bone , anim_id);
+ BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(),
+ (char*)translate_id(bone_name).c_str(), "pose_matrix");
- // create interpolations source
- std::string interpolation_id = fake_interpolation_source(fra.size(), anim_id, "");
+ openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING);
- std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX;
- COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id);
- std::string empty;
- sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id));
- sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id));
+ // create input source
+ std::string input_id = create_source_from_vector(COLLADASW::InputSemantic::INPUT, fra, false, anim_id, "");
- // TODO create in/out tangents source
+ // create output source
+ std::string output_id;
+ output_id = create_4x4_source( fra, ob_arm , bone , anim_id);
- // this input is required
- sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id));
+ // create interpolations source
+ std::string interpolation_id = fake_interpolation_source(fra.size(), anim_id, "");
- addSampler(sampler);
+ std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX;
+ COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id);
+ std::string empty;
+ sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id));
+ sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id));
- std::string target = translate_id(bone_name) + "/transform";
- addChannel(COLLADABU::URI(empty, sampler_id), target);
+ // TODO create in/out tangents source
- closeAnimation();
- }
+ // this input is required
+ sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id));
- // dae_bone_animation -> add_bone_animation
- // (blend this into dae_bone_animation)
- void AnimationExporter::dae_bone_animation(std::vector<float> &fra, float *values, int tm_type, int axis, std::string ob_name, std::string bone_name)
- {
- const char *axis_names[] = {"X", "Y", "Z"};
- const char *axis_name = NULL;
- char anim_id[200];
- bool is_rot = tm_type == 0;
-
- if (!fra.size())
- return;
+ addSampler(sampler);
- char rna_path[200];
- BLI_snprintf(rna_path, sizeof(rna_path), "pose.bones[\"%s\"].%s", bone_name.c_str(),
- tm_type == 0 ? "rotation_quaternion" : (tm_type == 1 ? "scale" : "location"));
+ std::string target = translate_id(bone_name) + "/transform";
+ addChannel(COLLADABU::URI(empty, sampler_id), target);
- if (axis > -1)
- axis_name = axis_names[axis];
-
- std::string transform_sid = get_transform_sid(NULL, tm_type, axis_name, false);
-
- BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(),
- (char*)translate_id(bone_name).c_str(), (char*)transform_sid.c_str());
+ closeAnimation();
+}
- openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING);
+// dae_bone_animation -> add_bone_animation
+// (blend this into dae_bone_animation)
+void AnimationExporter::dae_bone_animation(std::vector<float> &fra, float *values, int tm_type, int axis, std::string ob_name, std::string bone_name)
+{
+ const char *axis_names[] = {"X", "Y", "Z"};
+ const char *axis_name = NULL;
+ char anim_id[200];
+ bool is_rot = tm_type == 0;
- // create input source
- std::string input_id = create_source_from_vector(COLLADASW::InputSemantic::INPUT, fra, is_rot, anim_id, axis_name);
+ if (!fra.size())
+ return;
- // create output source
- std::string output_id;
- if (axis == -1)
- output_id = create_xyz_source(values, fra.size(), anim_id);
- else
- output_id = create_source_from_array(COLLADASW::InputSemantic::OUTPUT, values, fra.size(), is_rot, anim_id, axis_name);
+ char rna_path[200];
+ BLI_snprintf(rna_path, sizeof(rna_path), "pose.bones[\"%s\"].%s", bone_name.c_str(),
+ tm_type == 0 ? "rotation_quaternion" : (tm_type == 1 ? "scale" : "location"));
- // create interpolations source
- std::string interpolation_id = fake_interpolation_source(fra.size(), anim_id, axis_name);
+ if (axis > -1)
+ axis_name = axis_names[axis];
- std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX;
- COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id);
- std::string empty;
- sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id));
- sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id));
+ std::string transform_sid = get_transform_sid(NULL, tm_type, axis_name, false);
- // TODO create in/out tangents source
+ BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(),
+ (char*)translate_id(bone_name).c_str(), (char*)transform_sid.c_str());
- // this input is required
- sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id));
+ openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING);
- addSampler(sampler);
+ // create input source
+ std::string input_id = create_source_from_vector(COLLADASW::InputSemantic::INPUT, fra, is_rot, anim_id, axis_name);
- std::string target = translate_id(ob_name + "_" + bone_name) + "/" + transform_sid;
- addChannel(COLLADABU::URI(empty, sampler_id), target);
+ // create output source
+ std::string output_id;
+ if (axis == -1)
+ output_id = create_xyz_source(values, fra.size(), anim_id);
+ else
+ output_id = create_source_from_array(COLLADASW::InputSemantic::OUTPUT, values, fra.size(), is_rot, anim_id, axis_name);
- closeAnimation();
- }
+ // create interpolations source
+ std::string interpolation_id = fake_interpolation_source(fra.size(), anim_id, axis_name);
- float AnimationExporter::convert_time(float frame)
- {
- return FRA2TIME(frame);
- }
+ std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX;
+ COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id);
+ std::string empty;
+ sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id));
+ sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id));
- float AnimationExporter::convert_angle(float angle)
- {
- return COLLADABU::Math::Utils::radToDegF(angle);
- }
+ // TODO create in/out tangents source
- std::string AnimationExporter::get_semantic_suffix(COLLADASW::InputSemantic::Semantics semantic)
- {
- switch(semantic) {
+ // this input is required
+ sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id));
+
+ addSampler(sampler);
+
+ std::string target = translate_id(ob_name + "_" + bone_name) + "/" + transform_sid;
+ addChannel(COLLADABU::URI(empty, sampler_id), target);
+
+ closeAnimation();
+}
+
+float AnimationExporter::convert_time(float frame)
+{
+ return FRA2TIME(frame);
+}
+
+float AnimationExporter::convert_angle(float angle)
+{
+ return COLLADABU::Math::Utils::radToDegF(angle);
+}
+
+std::string AnimationExporter::get_semantic_suffix(COLLADASW::InputSemantic::Semantics semantic)
+{
+ switch(semantic) {
case COLLADASW::InputSemantic::INPUT:
return INPUT_SOURCE_ID_SUFFIX;
case COLLADASW::InputSemantic::OUTPUT:
@@ -527,14 +527,14 @@ void AnimationExporter::operator() (Object *ob)
return OUTTANGENT_SOURCE_ID_SUFFIX;
default:
break;
- }
- return "";
}
+ return "";
+}
- void AnimationExporter::add_source_parameters(COLLADASW::SourceBase::ParameterNameList& param,
- COLLADASW::InputSemantic::Semantics semantic, bool is_rot, const char *axis, bool transform)
- {
- switch(semantic) {
+void AnimationExporter::add_source_parameters(COLLADASW::SourceBase::ParameterNameList& param,
+ COLLADASW::InputSemantic::Semantics semantic, bool is_rot, const char *axis, bool transform)
+{
+ switch(semantic) {
case COLLADASW::InputSemantic::INPUT:
param.push_back("TIME");
break;
@@ -547,14 +547,14 @@ void AnimationExporter::operator() (Object *ob)
param.push_back(axis);
}
else
- if ( transform )
- {
- param.push_back("TRANSFORM");
- }else{ //assumes if axis isn't specified all axises are added
- param.push_back("X");
- param.push_back("Y");
- param.push_back("Z");
- }
+ if ( transform )
+ {
+ param.push_back("TRANSFORM");
+ }else{ //assumes if axis isn't specified all axises are added
+ param.push_back("X");
+ param.push_back("Y");
+ param.push_back("Z");
+ }
}
break;
case COLLADASW::InputSemantic::IN_TANGENT:
@@ -564,12 +564,12 @@ void AnimationExporter::operator() (Object *ob)
break;
default:
break;
- }
}
+}
- void AnimationExporter::get_source_values(BezTriple *bezt, COLLADASW::InputSemantic::Semantics semantic, bool rotation, float *values, int *length)
- {
- switch (semantic) {
+void AnimationExporter::get_source_values(BezTriple *bezt, COLLADASW::InputSemantic::Semantics semantic, bool rotation, float *values, int *length)
+{
+ switch (semantic) {
case COLLADASW::InputSemantic::INPUT:
*length = 1;
values[0] = convert_time(bezt->vec[1][0]);
@@ -583,9 +583,9 @@ void AnimationExporter::operator() (Object *ob)
values[0] = bezt->vec[1][1];
}
break;
-
+
case COLLADASW::InputSemantic::IN_TANGENT:
- *length = 2;
+ *length = 2;
values[0] = convert_time(bezt->vec[0][0]);
if (bezt->ipo != BEZT_IPO_BEZ) {
// We're in a mixed interpolation scenario, set zero as it's irrelevant but value might contain unused data
@@ -598,7 +598,7 @@ void AnimationExporter::operator() (Object *ob)
values[1] = bezt->vec[0][1];
}
break;
-
+
case COLLADASW::InputSemantic::OUT_TANGENT:
*length = 2;
values[0] = convert_time(bezt->vec[2][0]);
@@ -617,283 +617,285 @@ void AnimationExporter::operator() (Object *ob)
default:
*length = 0;
break;
- }
}
+}
- std::string AnimationExporter::create_source_from_fcurve(COLLADASW::InputSemantic::Semantics semantic, FCurve *fcu, const std::string& anim_id, const char *axis_name)
- {
- std::string source_id = anim_id + get_semantic_suffix(semantic);
-
- //bool is_rotation = !strcmp(fcu->rna_path, "rotation");
- bool is_angle = false;
-
- if (strstr(fcu->rna_path, "rotation")) is_angle = true;
-
- COLLADASW::FloatSourceF source(mSW);
- source.setId(source_id);
- source.setArrayId(source_id + ARRAY_ID_SUFFIX);
- source.setAccessorCount(fcu->totvert);
-
- switch (semantic) {
+std::string AnimationExporter::create_source_from_fcurve(COLLADASW::InputSemantic::Semantics semantic, FCurve *fcu, const std::string& anim_id, const char *axis_name)
+{
+ std::string source_id = anim_id + get_semantic_suffix(semantic);
+
+ //bool is_rotation = !strcmp(fcu->rna_path, "rotation");
+ bool is_angle = false;
+
+ if (strstr(fcu->rna_path, "rotation")) is_angle = true;
+
+ COLLADASW::FloatSourceF source(mSW);
+ source.setId(source_id);
+ source.setArrayId(source_id + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(fcu->totvert);
+
+ switch (semantic) {
case COLLADASW::InputSemantic::INPUT:
case COLLADASW::InputSemantic::OUTPUT:
- source.setAccessorStride(1);
+ source.setAccessorStride(1);
break;
case COLLADASW::InputSemantic::IN_TANGENT:
case COLLADASW::InputSemantic::OUT_TANGENT:
- source.setAccessorStride(2);
+ source.setAccessorStride(2);
break;
- }
-
-
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- add_source_parameters(param, semantic, is_angle, axis_name, false);
+ default:
+ break;
+ }
- source.prepareToAppendValues();
- for (unsigned int i = 0; i < fcu->totvert; i++) {
- float values[3]; // be careful!
- int length = 0;
- get_source_values(&fcu->bezt[i], semantic, is_angle, values, &length);
- for (int j = 0; j < length; j++)
- source.appendValues(values[j]);
- }
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ add_source_parameters(param, semantic, is_angle, axis_name, false);
- source.finish();
+ source.prepareToAppendValues();
- return source_id;
+ for (unsigned int i = 0; i < fcu->totvert; i++) {
+ float values[3]; // be careful!
+ int length = 0;
+ get_source_values(&fcu->bezt[i], semantic, is_angle, values, &length);
+ for (int j = 0; j < length; j++)
+ source.appendValues(values[j]);
}
- //Currently called only to get OUTPUT source values ( if rotation and hence the axis is also specified )
- std::string AnimationExporter::create_source_from_array(COLLADASW::InputSemantic::Semantics semantic, float *v, int tot, bool is_rot, const std::string& anim_id, const char *axis_name)
- {
- std::string source_id = anim_id + get_semantic_suffix(semantic);
-
- COLLADASW::FloatSourceF source(mSW);
- source.setId(source_id);
- source.setArrayId(source_id + ARRAY_ID_SUFFIX);
- source.setAccessorCount(tot);
- source.setAccessorStride(1);
-
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- add_source_parameters(param, semantic, is_rot, axis_name, false);
-
- source.prepareToAppendValues();
-
- for (int i = 0; i < tot; i++) {
- float val = v[i];
- ////if (semantic == COLLADASW::InputSemantic::INPUT)
- // val = convert_time(val);
- //else
- if (is_rot)
- val *= 180.0f / M_PI;
- source.appendValues(val);
- }
+ source.finish();
- source.finish();
+ return source_id;
+}
- return source_id;
+//Currently called only to get OUTPUT source values ( if rotation and hence the axis is also specified )
+std::string AnimationExporter::create_source_from_array(COLLADASW::InputSemantic::Semantics semantic, float *v, int tot, bool is_rot, const std::string& anim_id, const char *axis_name)
+{
+ std::string source_id = anim_id + get_semantic_suffix(semantic);
+
+ COLLADASW::FloatSourceF source(mSW);
+ source.setId(source_id);
+ source.setArrayId(source_id + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(tot);
+ source.setAccessorStride(1);
+
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ add_source_parameters(param, semantic, is_rot, axis_name, false);
+
+ source.prepareToAppendValues();
+
+ for (int i = 0; i < tot; i++) {
+ float val = v[i];
+ ////if (semantic == COLLADASW::InputSemantic::INPUT)
+ // val = convert_time(val);
+ //else
+ if (is_rot)
+ val *= 180.0f / M_PI;
+ source.appendValues(val);
}
-// only used for sources with INPUT semantic
- std::string AnimationExporter::create_source_from_vector(COLLADASW::InputSemantic::Semantics semantic, std::vector<float> &fra, bool is_rot, const std::string& anim_id, const char *axis_name)
- {
- std::string source_id = anim_id + get_semantic_suffix(semantic);
-
- COLLADASW::FloatSourceF source(mSW);
- source.setId(source_id);
- source.setArrayId(source_id + ARRAY_ID_SUFFIX);
- source.setAccessorCount(fra.size());
- source.setAccessorStride(1);
-
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- add_source_parameters(param, semantic, is_rot, axis_name, false);
-
- source.prepareToAppendValues();
-
- std::vector<float>::iterator it;
- for (it = fra.begin(); it != fra.end(); it++) {
- float val = *it;
- //if (semantic == COLLADASW::InputSemantic::INPUT)
- val = convert_time(val);
- /*else if (is_rot)
- val = convert_angle(val);*/
- source.appendValues(val);
- }
- source.finish();
+ source.finish();
- return source_id;
+ return source_id;
+}
+// only used for sources with INPUT semantic
+std::string AnimationExporter::create_source_from_vector(COLLADASW::InputSemantic::Semantics semantic, std::vector<float> &fra, bool is_rot, const std::string& anim_id, const char *axis_name)
+{
+ std::string source_id = anim_id + get_semantic_suffix(semantic);
+
+ COLLADASW::FloatSourceF source(mSW);
+ source.setId(source_id);
+ source.setArrayId(source_id + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(fra.size());
+ source.setAccessorStride(1);
+
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ add_source_parameters(param, semantic, is_rot, axis_name, false);
+
+ source.prepareToAppendValues();
+
+ std::vector<float>::iterator it;
+ for (it = fra.begin(); it != fra.end(); it++) {
+ float val = *it;
+ //if (semantic == COLLADASW::InputSemantic::INPUT)
+ val = convert_time(val);
+ /*else if (is_rot)
+ val = convert_angle(val);*/
+ source.appendValues(val);
}
- std::string AnimationExporter::create_4x4_source(std::vector<float> &frames , Object * ob_arm, Bone *bone , const std::string& anim_id)
- {
- COLLADASW::InputSemantic::Semantics semantic = COLLADASW::InputSemantic::OUTPUT;
- std::string source_id = anim_id + get_semantic_suffix(semantic);
+ source.finish();
- COLLADASW::Float4x4Source source(mSW);
- source.setId(source_id);
- source.setArrayId(source_id + ARRAY_ID_SUFFIX);
- source.setAccessorCount(frames.size());
- source.setAccessorStride(16);
-
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- add_source_parameters(param, semantic, false, NULL, true);
+ return source_id;
+}
- source.prepareToAppendValues();
-
- bPoseChannel *parchan = NULL;
- bPoseChannel *pchan = NULL;
- bPose *pose = ob_arm->pose;
+std::string AnimationExporter::create_4x4_source(std::vector<float> &frames , Object * ob_arm, Bone *bone , const std::string& anim_id)
+{
+ COLLADASW::InputSemantic::Semantics semantic = COLLADASW::InputSemantic::OUTPUT;
+ std::string source_id = anim_id + get_semantic_suffix(semantic);
- pchan = get_pose_channel(pose, bone->name);
+ COLLADASW::Float4x4Source source(mSW);
+ source.setId(source_id);
+ source.setArrayId(source_id + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(frames.size());
+ source.setAccessorStride(16);
- if (!pchan)
- return "";
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ add_source_parameters(param, semantic, false, NULL, true);
- parchan = pchan->parent;
+ source.prepareToAppendValues();
- enable_fcurves(ob_arm->adt->action, bone->name);
+ bPoseChannel *parchan = NULL;
+ bPoseChannel *pchan = NULL;
+ bPose *pose = ob_arm->pose;
- std::vector<float>::iterator it;
- int j = 0;
- for (it = frames.begin(); it != frames.end(); it++) {
- float mat[4][4], ipar[4][4];
+ pchan = get_pose_channel(pose, bone->name);
- float ctime = bsystem_time(scene, ob_arm, *it, 0.0f);
+ if (!pchan)
+ return "";
- BKE_animsys_evaluate_animdata(scene , &ob_arm->id, ob_arm->adt, ctime, ADT_RECALC_ANIM);
- where_is_pose_bone(scene, ob_arm, pchan, ctime, 1);
+ parchan = pchan->parent;
- // compute bone local mat
- if (bone->parent) {
- invert_m4_m4(ipar, parchan->pose_mat);
- mul_m4_m4m4(mat, pchan->pose_mat, ipar);
- }
- else
- copy_m4_m4(mat, pchan->pose_mat);
- UnitConverter converter;
+ enable_fcurves(ob_arm->adt->action, bone->name);
- float outmat[4][4];
- converter.mat4_to_dae(outmat,mat);
+ std::vector<float>::iterator it;
+ int j = 0;
+ for (it = frames.begin(); it != frames.end(); it++) {
+ float mat[4][4], ipar[4][4];
+ float ctime = bsystem_time(scene, ob_arm, *it, 0.0f);
- source.appendValues(outmat);
-
+ BKE_animsys_evaluate_animdata(scene , &ob_arm->id, ob_arm->adt, ctime, ADT_RECALC_ANIM);
+ where_is_pose_bone(scene, ob_arm, pchan, ctime, 1);
- j++;
+ // compute bone local mat
+ if (bone->parent) {
+ invert_m4_m4(ipar, parchan->pose_mat);
+ mul_m4_m4m4(mat, pchan->pose_mat, ipar);
}
+ else
+ copy_m4_m4(mat, pchan->pose_mat);
+ UnitConverter converter;
- enable_fcurves(ob_arm->adt->action, NULL);
+ float outmat[4][4];
+ converter.mat4_to_dae(outmat,mat);
- source.finish();
- return source_id;
- }
- // only used for sources with OUTPUT semantic ( locations and scale)
- std::string AnimationExporter::create_xyz_source(float *v, int tot, const std::string& anim_id)
- {
- COLLADASW::InputSemantic::Semantics semantic = COLLADASW::InputSemantic::OUTPUT;
- std::string source_id = anim_id + get_semantic_suffix(semantic);
-
- COLLADASW::FloatSourceF source(mSW);
- source.setId(source_id);
- source.setArrayId(source_id + ARRAY_ID_SUFFIX);
- source.setAccessorCount(tot);
- source.setAccessorStride(3);
-
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- add_source_parameters(param, semantic, false, NULL, false);
-
- source.prepareToAppendValues();
-
- for (int i = 0; i < tot; i++) {
- source.appendValues(*v, *(v + 1), *(v + 2));
- v += 3;
- }
+ source.appendValues(outmat);
- source.finish();
- return source_id;
+ j++;
}
- std::string AnimationExporter::create_interpolation_source(FCurve *fcu, const std::string& anim_id, const char *axis_name, bool *has_tangents)
- {
- std::string source_id = anim_id + get_semantic_suffix(COLLADASW::InputSemantic::INTERPOLATION);
+ enable_fcurves(ob_arm->adt->action, NULL);
- COLLADASW::NameSource source(mSW);
- source.setId(source_id);
- source.setArrayId(source_id + ARRAY_ID_SUFFIX);
- source.setAccessorCount(fcu->totvert);
- source.setAccessorStride(1);
-
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- param.push_back("INTERPOLATION");
+ source.finish();
- source.prepareToAppendValues();
+ return source_id;
+}
+// only used for sources with OUTPUT semantic ( locations and scale)
+std::string AnimationExporter::create_xyz_source(float *v, int tot, const std::string& anim_id)
+{
+ COLLADASW::InputSemantic::Semantics semantic = COLLADASW::InputSemantic::OUTPUT;
+ std::string source_id = anim_id + get_semantic_suffix(semantic);
- *has_tangents = false;
+ COLLADASW::FloatSourceF source(mSW);
+ source.setId(source_id);
+ source.setArrayId(source_id + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(tot);
+ source.setAccessorStride(3);
- for (unsigned int i = 0; i < fcu->totvert; i++) {
- if (fcu->bezt[i].ipo==BEZT_IPO_BEZ) {
- source.appendValues(BEZIER_NAME);
- *has_tangents = true;
- } else if (fcu->bezt[i].ipo==BEZT_IPO_CONST) {
- source.appendValues(STEP_NAME);
- } else { // BEZT_IPO_LIN
- source.appendValues(LINEAR_NAME);
- }
- }
- // unsupported? -- HERMITE, CARDINAL, BSPLINE, NURBS
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ add_source_parameters(param, semantic, false, NULL, false);
- source.finish();
+ source.prepareToAppendValues();
- return source_id;
+ for (int i = 0; i < tot; i++) {
+ source.appendValues(*v, *(v + 1), *(v + 2));
+ v += 3;
}
- std::string AnimationExporter::fake_interpolation_source(int tot, const std::string& anim_id, const char *axis_name)
- {
- std::string source_id = anim_id + get_semantic_suffix(COLLADASW::InputSemantic::INTERPOLATION);
+ source.finish();
- COLLADASW::NameSource source(mSW);
- source.setId(source_id);
- source.setArrayId(source_id + ARRAY_ID_SUFFIX);
- source.setAccessorCount(tot);
- source.setAccessorStride(1);
-
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- param.push_back("INTERPOLATION");
+ return source_id;
+}
+
+std::string AnimationExporter::create_interpolation_source(FCurve *fcu, const std::string& anim_id, const char *axis_name, bool *has_tangents)
+{
+ std::string source_id = anim_id + get_semantic_suffix(COLLADASW::InputSemantic::INTERPOLATION);
+
+ COLLADASW::NameSource source(mSW);
+ source.setId(source_id);
+ source.setArrayId(source_id + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(fcu->totvert);
+ source.setAccessorStride(1);
+
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ param.push_back("INTERPOLATION");
+
+ source.prepareToAppendValues();
- source.prepareToAppendValues();
+ *has_tangents = false;
- for (int i = 0; i < tot; i++) {
+ for (unsigned int i = 0; i < fcu->totvert; i++) {
+ if (fcu->bezt[i].ipo==BEZT_IPO_BEZ) {
+ source.appendValues(BEZIER_NAME);
+ *has_tangents = true;
+ } else if (fcu->bezt[i].ipo==BEZT_IPO_CONST) {
+ source.appendValues(STEP_NAME);
+ } else { // BEZT_IPO_LIN
source.appendValues(LINEAR_NAME);
}
+ }
+ // unsupported? -- HERMITE, CARDINAL, BSPLINE, NURBS
+
+ source.finish();
- source.finish();
+ return source_id;
+}
+
+std::string AnimationExporter::fake_interpolation_source(int tot, const std::string& anim_id, const char *axis_name)
+{
+ std::string source_id = anim_id + get_semantic_suffix(COLLADASW::InputSemantic::INTERPOLATION);
- return source_id;
+ COLLADASW::NameSource source(mSW);
+ source.setId(source_id);
+ source.setArrayId(source_id + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(tot);
+ source.setAccessorStride(1);
+
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ param.push_back("INTERPOLATION");
+
+ source.prepareToAppendValues();
+
+ for (int i = 0; i < tot; i++) {
+ source.appendValues(LINEAR_NAME);
}
- std::string AnimationExporter::get_light_param_sid(char *rna_path, int tm_type, const char *axis_name, bool append_axis)
- {
- std::string tm_name;
- // when given rna_path, determine tm_type from it
- if (rna_path) {
- char *name = extract_transform_name(rna_path);
-
- if (!strcmp(name, "color"))
- tm_type = 1;
- else if (!strcmp(name, "spot_size"))
- tm_type = 2;
- else if (!strcmp(name, "spot_blend"))
- tm_type = 3;
- else if (!strcmp(name, "distance"))
- tm_type = 4;
- else
- tm_type = -1;
- }
+ source.finish();
- switch (tm_type) {
+ return source_id;
+}
+
+std::string AnimationExporter::get_light_param_sid(char *rna_path, int tm_type, const char *axis_name, bool append_axis)
+{
+ std::string tm_name;
+ // when given rna_path, determine tm_type from it
+ if (rna_path) {
+ char *name = extract_transform_name(rna_path);
+
+ if (!strcmp(name, "color"))
+ tm_type = 1;
+ else if (!strcmp(name, "spot_size"))
+ tm_type = 2;
+ else if (!strcmp(name, "spot_blend"))
+ tm_type = 3;
+ else if (!strcmp(name, "distance"))
+ tm_type = 4;
+ else
+ tm_type = -1;
+ }
+
+ switch (tm_type) {
case 1:
tm_name = "color";
break;
@@ -906,43 +908,43 @@ void AnimationExporter::operator() (Object *ob)
case 4:
tm_name = "blender/blender_dist";
break;
-
+
default:
tm_name = "";
break;
- }
-
- if (tm_name.size()) {
- if (axis_name != "")
- return tm_name + "." + std::string(axis_name);
- else
- return tm_name;
- }
+ }
- return std::string("");
+ if (tm_name.size()) {
+ if (axis_name[0])
+ return tm_name + "." + std::string(axis_name);
+ else
+ return tm_name;
}
-
- std::string AnimationExporter::get_camera_param_sid(char *rna_path, int tm_type, const char *axis_name, bool append_axis)
- {
- std::string tm_name;
- // when given rna_path, determine tm_type from it
- if (rna_path) {
- char *name = extract_transform_name(rna_path);
-
- if (!strcmp(name, "lens"))
- tm_type = 0;
- else if (!strcmp(name, "ortho_scale"))
- tm_type = 1;
- else if (!strcmp(name, "clip_end"))
- tm_type = 2;
- else if (!strcmp(name, "clip_start"))
- tm_type = 3;
-
- else
- tm_type = -1;
- }
- switch (tm_type) {
+ return std::string("");
+}
+
+std::string AnimationExporter::get_camera_param_sid(char *rna_path, int tm_type, const char *axis_name, bool append_axis)
+{
+ std::string tm_name;
+ // when given rna_path, determine tm_type from it
+ if (rna_path) {
+ char *name = extract_transform_name(rna_path);
+
+ if (!strcmp(name, "lens"))
+ tm_type = 0;
+ else if (!strcmp(name, "ortho_scale"))
+ tm_type = 1;
+ else if (!strcmp(name, "clip_end"))
+ tm_type = 2;
+ else if (!strcmp(name, "clip_start"))
+ tm_type = 3;
+
+ else
+ tm_type = -1;
+ }
+
+ switch (tm_type) {
case 0:
tm_name = "xfov";
break;
@@ -955,56 +957,56 @@ void AnimationExporter::operator() (Object *ob)
case 3:
tm_name = "znear";
break;
-
+
default:
tm_name = "";
break;
- }
-
- if (tm_name.size()) {
- if (axis_name != "")
- return tm_name + "." + std::string(axis_name);
- else
- return tm_name;
- }
+ }
- return std::string("");
+ if (tm_name.size()) {
+ if (axis_name[0])
+ return tm_name + "." + std::string(axis_name);
+ else
+ return tm_name;
}
- // Assign sid of the animated parameter or transform
- // for rotation, axis name is always appended and the value of append_axis is ignored
- std::string AnimationExporter::get_transform_sid(char *rna_path, int tm_type, const char *axis_name, bool append_axis)
- {
- std::string tm_name;
- bool is_rotation =false;
- // when given rna_path, determine tm_type from it
- if (rna_path) {
- char *name = extract_transform_name(rna_path);
-
- if (!strcmp(name, "rotation_euler"))
- tm_type = 0;
- else if (!strcmp(name, "rotation_quaternion"))
- tm_type = 1;
- else if (!strcmp(name, "scale"))
- tm_type = 2;
- else if (!strcmp(name, "location"))
- tm_type = 3;
- else if (!strcmp(name, "specular_hardness"))
- tm_type = 4;
- else if (!strcmp(name, "specular_color"))
- tm_type = 5;
- else if (!strcmp(name, "diffuse_color"))
- tm_type = 6;
- else if (!strcmp(name, "alpha"))
- tm_type = 7;
- else if (!strcmp(name, "ior"))
- tm_type = 8;
-
- else
- tm_type = -1;
- }
+ return std::string("");
+}
- switch (tm_type) {
+// Assign sid of the animated parameter or transform
+// for rotation, axis name is always appended and the value of append_axis is ignored
+std::string AnimationExporter::get_transform_sid(char *rna_path, int tm_type, const char *axis_name, bool append_axis)
+{
+ std::string tm_name;
+ bool is_rotation =false;
+ // when given rna_path, determine tm_type from it
+ if (rna_path) {
+ char *name = extract_transform_name(rna_path);
+
+ if (!strcmp(name, "rotation_euler"))
+ tm_type = 0;
+ else if (!strcmp(name, "rotation_quaternion"))
+ tm_type = 1;
+ else if (!strcmp(name, "scale"))
+ tm_type = 2;
+ else if (!strcmp(name, "location"))
+ tm_type = 3;
+ else if (!strcmp(name, "specular_hardness"))
+ tm_type = 4;
+ else if (!strcmp(name, "specular_color"))
+ tm_type = 5;
+ else if (!strcmp(name, "diffuse_color"))
+ tm_type = 6;
+ else if (!strcmp(name, "alpha"))
+ tm_type = 7;
+ else if (!strcmp(name, "ior"))
+ tm_type = 8;
+
+ else
+ tm_type = -1;
+ }
+
+ switch (tm_type) {
case 0:
case 1:
tm_name = "rotation";
@@ -1031,173 +1033,173 @@ void AnimationExporter::operator() (Object *ob)
case 8:
tm_name = "index_of_refraction";
break;
-
+
default:
tm_name = "";
break;
- }
-
- if (tm_name.size()) {
- if (is_rotation)
- return tm_name + std::string(axis_name) + ".ANGLE";
- else
- if (axis_name != "")
- return tm_name + "." + std::string(axis_name);
- else
- return tm_name;
- }
-
- return std::string("");
}
- char* AnimationExporter::extract_transform_name(char *rna_path)
- {
- char *dot = strrchr(rna_path, '.');
- return dot ? (dot + 1) : rna_path;
+ if (tm_name.size()) {
+ if (is_rotation)
+ return tm_name + std::string(axis_name) + ".ANGLE";
+ else
+ if (axis_name[0])
+ return tm_name + "." + std::string(axis_name);
+ else
+ return tm_name;
}
- //find keyframes of all the objects animations
- void AnimationExporter::find_frames(Object *ob, std::vector<float> &fra)
- {
- FCurve *fcu= (FCurve*)ob->adt->action->curves.first;
+ return std::string("");
+}
- for (; fcu; fcu = fcu->next) {
-
- for (unsigned int i = 0; i < fcu->totvert; i++) {
- float f = fcu->bezt[i].vec[1][0]; //
- if (std::find(fra.begin(), fra.end(), f) == fra.end())
- fra.push_back(f);
- }
- }
+char* AnimationExporter::extract_transform_name(char *rna_path)
+{
+ char *dot = strrchr(rna_path, '.');
+ return dot ? (dot + 1) : rna_path;
+}
- // keep the keys in ascending order
- std::sort(fra.begin(), fra.end());
- }
+//find keyframes of all the objects animations
+void AnimationExporter::find_frames(Object *ob, std::vector<float> &fra)
+{
+ FCurve *fcu= (FCurve*)ob->adt->action->curves.first;
-
+ for (; fcu; fcu = fcu->next) {
- // enable fcurves driving a specific bone, disable all the rest
- // if bone_name = NULL enable all fcurves
- void AnimationExporter::enable_fcurves(bAction *act, char *bone_name)
- {
- FCurve *fcu;
- char prefix[200];
-
- if (bone_name)
- BLI_snprintf(prefix, sizeof(prefix), "pose.bones[\"%s\"]", bone_name);
-
- for (fcu = (FCurve*)act->curves.first; fcu; fcu = fcu->next) {
- if (bone_name) {
- if (!strncmp(fcu->rna_path, prefix, strlen(prefix)))
- fcu->flag &= ~FCURVE_DISABLED;
- else
- fcu->flag |= FCURVE_DISABLED;
- }
- else {
- fcu->flag &= ~FCURVE_DISABLED;
- }
+ for (unsigned int i = 0; i < fcu->totvert; i++) {
+ float f = fcu->bezt[i].vec[1][0];
+ if (std::find(fra.begin(), fra.end(), f) == fra.end())
+ fra.push_back(f);
}
}
-
- bool AnimationExporter::hasAnimations(Scene *sce)
- {
- Base *base= (Base*) sce->base.first;
-
- while(base) {
- Object *ob = base->object;
-
- FCurve *fcu = 0;
- //Check for object transform animations
- if(ob->adt && ob->adt->action)
- fcu = (FCurve*)ob->adt->action->curves.first;
- //Check for Lamp parameter animations
- else if( (ob->type == OB_LAMP ) && ((Lamp*)ob ->data)->adt && ((Lamp*)ob ->data)->adt->action )
- fcu = (FCurve*)(((Lamp*)ob ->data)->adt->action->curves.first);
- //Check for Camera parameter animations
- else if( (ob->type == OB_CAMERA ) && ((Camera*)ob ->data)->adt && ((Camera*)ob ->data)->adt->action )
- fcu = (FCurve*)(((Camera*)ob ->data)->adt->action->curves.first);
-
- //Check Material Effect parameter animations.
- for(int a = 0; a < ob->totcol; a++)
- {
- Material *ma = give_current_material(ob, a+1);
- if (!ma) continue;
- if(ma->adt && ma->adt->action)
- {
- fcu = (FCurve*)ma->adt->action->curves.first;
- }
- }
- if ( fcu)
- return true;
- base= base->next;
+ // keep the keys in ascending order
+ std::sort(fra.begin(), fra.end());
+}
+
+
+
+// enable fcurves driving a specific bone, disable all the rest
+// if bone_name = NULL enable all fcurves
+void AnimationExporter::enable_fcurves(bAction *act, char *bone_name)
+{
+ FCurve *fcu;
+ char prefix[200];
+
+ if (bone_name)
+ BLI_snprintf(prefix, sizeof(prefix), "pose.bones[\"%s\"]", bone_name);
+
+ for (fcu = (FCurve*)act->curves.first; fcu; fcu = fcu->next) {
+ if (bone_name) {
+ if (!strncmp(fcu->rna_path, prefix, strlen(prefix)))
+ fcu->flag &= ~FCURVE_DISABLED;
+ else
+ fcu->flag |= FCURVE_DISABLED;
+ }
+ else {
+ fcu->flag &= ~FCURVE_DISABLED;
}
- return false;
}
+}
- //------------------------------- Not used in the new system.--------------------------------------------------------
- void AnimationExporter::find_rotation_frames(Object *ob, std::vector<float> &fra, const char *prefix, int rotmode)
- {
- if (rotmode > 0)
- find_frames(ob, fra, prefix, "rotation_euler");
- else if (rotmode == ROT_MODE_QUAT)
- find_frames(ob, fra, prefix, "rotation_quaternion");
- /*else if (rotmode == ROT_MODE_AXISANGLE)
- ;*/
- }
+bool AnimationExporter::hasAnimations(Scene *sce)
+{
+ Base *base= (Base*) sce->base.first;
- void AnimationExporter::find_frames(Object *ob, std::vector<float> &fra, const char *prefix, const char *tm_name)
- {
- FCurve *fcu= (FCurve*)ob->adt->action->curves.first;
-
- for (; fcu; fcu = fcu->next) {
- if (prefix && strncmp(prefix, fcu->rna_path, strlen(prefix)))
- continue;
-
- char *name = extract_transform_name(fcu->rna_path);
- if (!strcmp(name, tm_name)) {
- for (unsigned int i = 0; i < fcu->totvert; i++) {
- float f = fcu->bezt[i].vec[1][0]; //
- if (std::find(fra.begin(), fra.end(), f) == fra.end())
- fra.push_back(f);
- }
+ while(base) {
+ Object *ob = base->object;
+
+ FCurve *fcu = 0;
+ //Check for object transform animations
+ if(ob->adt && ob->adt->action)
+ fcu = (FCurve*)ob->adt->action->curves.first;
+ //Check for Lamp parameter animations
+ else if( (ob->type == OB_LAMP ) && ((Lamp*)ob ->data)->adt && ((Lamp*)ob ->data)->adt->action )
+ fcu = (FCurve*)(((Lamp*)ob ->data)->adt->action->curves.first);
+ //Check for Camera parameter animations
+ else if( (ob->type == OB_CAMERA ) && ((Camera*)ob ->data)->adt && ((Camera*)ob ->data)->adt->action )
+ fcu = (FCurve*)(((Camera*)ob ->data)->adt->action->curves.first);
+
+ //Check Material Effect parameter animations.
+ for(int a = 0; a < ob->totcol; a++)
+ {
+ Material *ma = give_current_material(ob, a+1);
+ if (!ma) continue;
+ if(ma->adt && ma->adt->action)
+ {
+ fcu = (FCurve*)ma->adt->action->curves.first;
}
}
- // keep the keys in ascending order
- std::sort(fra.begin(), fra.end());
+ if ( fcu)
+ return true;
+ base= base->next;
}
+ return false;
+}
- void AnimationExporter::write_bone_animation(Object *ob_arm, Bone *bone)
- {
- if (!ob_arm->adt)
- return;
-
- //write bone animations for 3 transform types
- //i=0 --> rotations
- //i=1 --> scale
- //i=2 --> location
- for (int i = 0; i < 3; i++)
- sample_and_write_bone_animation(ob_arm, bone, i);
-
- for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next)
- write_bone_animation(ob_arm, child);
+//------------------------------- Not used in the new system.--------------------------------------------------------
+void AnimationExporter::find_rotation_frames(Object *ob, std::vector<float> &fra, const char *prefix, int rotmode)
+{
+ if (rotmode > 0)
+ find_frames(ob, fra, prefix, "rotation_euler");
+ else if (rotmode == ROT_MODE_QUAT)
+ find_frames(ob, fra, prefix, "rotation_quaternion");
+ /*else if (rotmode == ROT_MODE_AXISANGLE)
+ ;*/
+}
+
+void AnimationExporter::find_frames(Object *ob, std::vector<float> &fra, const char *prefix, const char *tm_name)
+{
+ FCurve *fcu= (FCurve*)ob->adt->action->curves.first;
+
+ for (; fcu; fcu = fcu->next) {
+ if (prefix && strncmp(prefix, fcu->rna_path, strlen(prefix)))
+ continue;
+
+ char *name = extract_transform_name(fcu->rna_path);
+ if (!strcmp(name, tm_name)) {
+ for (unsigned int i = 0; i < fcu->totvert; i++) {
+ float f = fcu->bezt[i].vec[1][0];
+ if (std::find(fra.begin(), fra.end(), f) == fra.end())
+ fra.push_back(f);
+ }
+ }
}
- void AnimationExporter::sample_and_write_bone_animation(Object *ob_arm, Bone *bone, int transform_type)
- {
- bArmature *arm = (bArmature*)ob_arm->data;
- int flag = arm->flag;
- std::vector<float> fra;
- char prefix[256];
+ // keep the keys in ascending order
+ std::sort(fra.begin(), fra.end());
+}
- BLI_snprintf(prefix, sizeof(prefix), "pose.bones[\"%s\"]", bone->name);
+void AnimationExporter::write_bone_animation(Object *ob_arm, Bone *bone)
+{
+ if (!ob_arm->adt)
+ return;
+
+ //write bone animations for 3 transform types
+ //i=0 --> rotations
+ //i=1 --> scale
+ //i=2 --> location
+ for (int i = 0; i < 3; i++)
+ sample_and_write_bone_animation(ob_arm, bone, i);
+
+ for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next)
+ write_bone_animation(ob_arm, child);
+}
- bPoseChannel *pchan = get_pose_channel(ob_arm->pose, bone->name);
- if (!pchan)
- return;
- //Fill frame array with key frame values framed at @param:transform_type
- switch (transform_type) {
+void AnimationExporter::sample_and_write_bone_animation(Object *ob_arm, Bone *bone, int transform_type)
+{
+ bArmature *arm = (bArmature*)ob_arm->data;
+ int flag = arm->flag;
+ std::vector<float> fra;
+ char prefix[256];
+
+ BLI_snprintf(prefix, sizeof(prefix), "pose.bones[\"%s\"]", bone->name);
+
+ bPoseChannel *pchan = get_pose_channel(ob_arm->pose, bone->name);
+ if (!pchan)
+ return;
+ //Fill frame array with key frame values framed at @param:transform_type
+ switch (transform_type) {
case 0:
find_rotation_frames(ob_arm, fra, prefix, pchan->rotmode);
break;
@@ -1209,77 +1211,77 @@ void AnimationExporter::operator() (Object *ob)
break;
default:
return;
- }
+ }
- // exit rest position
- if (flag & ARM_RESTPOS) {
- arm->flag &= ~ARM_RESTPOS;
- where_is_pose(scene, ob_arm);
- }
- //v array will hold all values which will be exported.
- if (fra.size()) {
- float *values = (float*)MEM_callocN(sizeof(float) * 3 * fra.size(), "temp. anim frames");
- sample_animation(values, fra, transform_type, bone, ob_arm, pchan);
-
- if (transform_type == 0) {
- // write x, y, z curves separately if it is rotation
- float *axisValues = (float*)MEM_callocN(sizeof(float) * fra.size(), "temp. anim frames");
-
- for (int i = 0; i < 3; i++) {
- for (unsigned int j = 0; j < fra.size(); j++)
- axisValues[j] = values[j * 3 + i];
-
- dae_bone_animation(fra, axisValues, transform_type, i, id_name(ob_arm), bone->name);
- }
- MEM_freeN(axisValues);
- }
- else {
- // write xyz at once if it is location or scale
- dae_bone_animation(fra, values, transform_type, -1, id_name(ob_arm), bone->name);
- }
+ // exit rest position
+ if (flag & ARM_RESTPOS) {
+ arm->flag &= ~ARM_RESTPOS;
+ where_is_pose(scene, ob_arm);
+ }
+ //v array will hold all values which will be exported.
+ if (fra.size()) {
+ float *values = (float*)MEM_callocN(sizeof(float) * 3 * fra.size(), "temp. anim frames");
+ sample_animation(values, fra, transform_type, bone, ob_arm, pchan);
- MEM_freeN(values);
+ if (transform_type == 0) {
+ // write x, y, z curves separately if it is rotation
+ float *axisValues = (float*)MEM_callocN(sizeof(float) * fra.size(), "temp. anim frames");
+
+ for (int i = 0; i < 3; i++) {
+ for (unsigned int j = 0; j < fra.size(); j++)
+ axisValues[j] = values[j * 3 + i];
+
+ dae_bone_animation(fra, axisValues, transform_type, i, id_name(ob_arm), bone->name);
+ }
+ MEM_freeN(axisValues);
+ }
+ else {
+ // write xyz at once if it is location or scale
+ dae_bone_animation(fra, values, transform_type, -1, id_name(ob_arm), bone->name);
}
- // restore restpos
- if (flag & ARM_RESTPOS)
- arm->flag = flag;
- where_is_pose(scene, ob_arm);
+ MEM_freeN(values);
}
- void AnimationExporter::sample_animation(float *v, std::vector<float> &frames, int type, Bone *bone, Object *ob_arm, bPoseChannel *pchan)
- {
- bPoseChannel *parchan = NULL;
- bPose *pose = ob_arm->pose;
+ // restore restpos
+ if (flag & ARM_RESTPOS)
+ arm->flag = flag;
+ where_is_pose(scene, ob_arm);
+}
- pchan = get_pose_channel(pose, bone->name);
+void AnimationExporter::sample_animation(float *v, std::vector<float> &frames, int type, Bone *bone, Object *ob_arm, bPoseChannel *pchan)
+{
+ bPoseChannel *parchan = NULL;
+ bPose *pose = ob_arm->pose;
- if (!pchan)
- return;
+ pchan = get_pose_channel(pose, bone->name);
- parchan = pchan->parent;
+ if (!pchan)
+ return;
- enable_fcurves(ob_arm->adt->action, bone->name);
+ parchan = pchan->parent;
- std::vector<float>::iterator it;
- for (it = frames.begin(); it != frames.end(); it++) {
- float mat[4][4], ipar[4][4];
+ enable_fcurves(ob_arm->adt->action, bone->name);
- float ctime = bsystem_time(scene, ob_arm, *it, 0.0f);
+ std::vector<float>::iterator it;
+ for (it = frames.begin(); it != frames.end(); it++) {
+ float mat[4][4], ipar[4][4];
+ float ctime = bsystem_time(scene, ob_arm, *it, 0.0f);
- BKE_animsys_evaluate_animdata(scene , &ob_arm->id, ob_arm->adt, ctime, ADT_RECALC_ANIM);
- where_is_pose_bone(scene, ob_arm, pchan, ctime, 1);
- // compute bone local mat
- if (bone->parent) {
- invert_m4_m4(ipar, parchan->pose_mat);
- mul_m4_m4m4(mat, pchan->pose_mat, ipar);
- }
- else
- copy_m4_m4(mat, pchan->pose_mat);
+ BKE_animsys_evaluate_animdata(scene , &ob_arm->id, ob_arm->adt, ctime, ADT_RECALC_ANIM);
+ where_is_pose_bone(scene, ob_arm, pchan, ctime, 1);
+
+ // compute bone local mat
+ if (bone->parent) {
+ invert_m4_m4(ipar, parchan->pose_mat);
+ mul_m4_m4m4(mat, pchan->pose_mat, ipar);
+ }
+ else
+ copy_m4_m4(mat, pchan->pose_mat);
- switch (type) {
+ switch (type) {
case 0:
mat4_to_eul(v, mat);
break;
@@ -1289,12 +1291,10 @@ void AnimationExporter::operator() (Object *ob)
case 2:
copy_v3_v3(v, mat[3]);
break;
- }
-
- v += 3;
}
- enable_fcurves(ob_arm->adt->action, NULL);
+ v += 3;
}
-
+ enable_fcurves(ob_arm->adt->action, NULL);
+}
diff --git a/source/blender/collada/AnimationImporter.cpp b/source/blender/collada/AnimationImporter.cpp
index 4a3cd5eeb06..43428f57d4f 100644
--- a/source/blender/collada/AnimationImporter.cpp
+++ b/source/blender/collada/AnimationImporter.cpp
@@ -89,17 +89,11 @@ void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve)
{
COLLADAFW::FloatOrDoubleArray& input = curve->getInputValues();
COLLADAFW::FloatOrDoubleArray& output = curve->getOutputValues();
-
- if( curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_BEZIER ||
- curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_STEP ) {
- COLLADAFW::FloatOrDoubleArray& intan = curve->getInTangentValues();
- COLLADAFW::FloatOrDoubleArray& outtan = curve->getOutTangentValues();
- }
float fps = (float)FPS;
size_t dim = curve->getOutDimension();
unsigned int i;
-
+
std::vector<FCurve*>& fcurves = curve_map[curve->getUniqueId()];
switch (dim) {
@@ -110,18 +104,18 @@ void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve)
{
for (i = 0; i < dim; i++ ) {
FCurve *fcu = (FCurve*)MEM_callocN(sizeof(FCurve), "FCurve");
-
+
fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
// fcu->rna_path = BLI_strdupn(path, strlen(path));
fcu->array_index = 0;
fcu->totvert = curve->getKeyCount();
-
+
// create beztriple for each key
for (unsigned int j = 0; j < curve->getKeyCount(); j++) {
BezTriple bez;
memset(&bez, 0, sizeof(BezTriple));
-
+
// input, output
bez.vec[1][0] = bc_get_float_value(input, j) * fps;
bez.vec[1][1] = bc_get_float_value(output, j * dim + i);
@@ -131,20 +125,20 @@ void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve)
curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_STEP)
{
COLLADAFW::FloatOrDoubleArray& intan = curve->getInTangentValues();
- COLLADAFW::FloatOrDoubleArray& outtan = curve->getOutTangentValues();
+ COLLADAFW::FloatOrDoubleArray& outtan = curve->getOutTangentValues();
// intangent
- bez.vec[0][0] = bc_get_float_value(intan, (j * 2 * dim ) + (2 * i)) * fps;
- bez.vec[0][1] = bc_get_float_value(intan, (j * 2 * dim )+ (2 * i) + 1);
+ bez.vec[0][0] = bc_get_float_value(intan, (j * 2 * dim ) + (2 * i)) * fps;
+ bez.vec[0][1] = bc_get_float_value(intan, (j * 2 * dim )+ (2 * i) + 1);
- // outtangent
- bez.vec[2][0] = bc_get_float_value(outtan, (j * 2 * dim ) + (2 * i)) * fps;
- bez.vec[2][1] = bc_get_float_value(outtan, (j * 2 * dim )+ (2 * i) + 1);
- if(curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_BEZIER)
+ // outtangent
+ bez.vec[2][0] = bc_get_float_value(outtan, (j * 2 * dim ) + (2 * i)) * fps;
+ bez.vec[2][1] = bc_get_float_value(outtan, (j * 2 * dim )+ (2 * i) + 1);
+ if(curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_BEZIER)
bez.ipo = BEZT_IPO_BEZ;
- else
- bez.ipo = BEZT_IPO_CONST;
- //bez.h1 = bez.h2 = HD_AUTO;
+ else
+ bez.ipo = BEZT_IPO_CONST;
+ //bez.h1 = bez.h2 = HD_AUTO;
}
else
{
@@ -153,7 +147,7 @@ void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve)
}
// bez.ipo = U.ipo_new; /* use default interpolation mode here... */
bez.f1 = bez.f2 = bez.f3 = SELECT;
-
+
insert_bezt_fcurve(fcu, &bez, 0);
}
@@ -306,9 +300,9 @@ bool AnimationImporter::write_animation(const COLLADAFW::Animation* anim)
bool AnimationImporter::write_animation_list(const COLLADAFW::AnimationList* animlist)
{
const COLLADAFW::UniqueId& animlist_id = animlist->getUniqueId();
-
+
animlist_map[animlist_id] = animlist;
-
+
#if 0
// should not happen
@@ -317,10 +311,10 @@ bool AnimationImporter::write_animation_list(const COLLADAFW::AnimationList* ani
}
// for bones rna_path is like: pose.bones["bone-name"].rotation
-
+
#endif
-
+
return true;
}
@@ -433,7 +427,7 @@ virtual void AnimationImporter::change_eul_to_quat(Object *ob, bAction *act)
//sets the rna_path and array index to curve
void AnimationImporter::modify_fcurve(std::vector<FCurve*>* curves , char* rna_path , int array_index )
-{
+{
std::vector<FCurve*>::iterator it;
int i;
for (it = curves->begin(), i = 0; it != curves->end(); it++, i++) {
@@ -450,18 +444,18 @@ void AnimationImporter::modify_fcurve(std::vector<FCurve*>* curves , char* rna_p
void AnimationImporter::find_frames( std::vector<float>* frames , std::vector<FCurve*>* curves)
{
std::vector<FCurve*>::iterator iter;
- for (iter = curves->begin(); iter != curves->end(); iter++) {
- FCurve *fcu = *iter;
-
- for (unsigned int k = 0; k < fcu->totvert; k++) {
- //get frame value from bezTriple
- float fra = fcu->bezt[k].vec[1][0];
- //if frame already not added add frame to frames
- if (std::find(frames->begin(), frames->end(), fra) == frames->end())
- frames->push_back(fra);
-
- }
+ for (iter = curves->begin(); iter != curves->end(); iter++) {
+ FCurve *fcu = *iter;
+
+ for (unsigned int k = 0; k < fcu->totvert; k++) {
+ //get frame value from bezTriple
+ float fra = fcu->bezt[k].vec[1][0];
+ //if frame already not added add frame to frames
+ if (std::find(frames->begin(), frames->end(), fra) == frames->end())
+ frames->push_back(fra);
+
}
+ }
}
//creates the rna_paths and array indices of fcurves from animations using transformation and bound animation class of each animation.
@@ -472,18 +466,18 @@ void AnimationImporter:: Assign_transform_animations(COLLADAFW::Transformation *
COLLADAFW::Transformation::TransformationType tm_type = transform->getTransformationType();
bool is_matrix = tm_type == COLLADAFW::Transformation::MATRIX;
bool is_rotation = tm_type == COLLADAFW::Transformation::ROTATE;
-
+
//to check if the no of curves are valid
bool xyz = ((tm_type == COLLADAFW::Transformation::TRANSLATE ||tm_type == COLLADAFW::Transformation::SCALE) && binding->animationClass == COLLADAFW::AnimationList::POSITION_XYZ);
-
-
+
+
if (!((!xyz && curves->size() == 1) || (xyz && curves->size() == 3) || is_matrix)) {
fprintf(stderr, "expected %d curves, got %d\n", xyz ? 3 : 1, (int)curves->size());
return;
}
-
+
char rna_path[100];
-
+
switch (tm_type) {
case COLLADAFW::Transformation::TRANSLATE:
case COLLADAFW::Transformation::SCALE:
@@ -495,96 +489,96 @@ void AnimationImporter:: Assign_transform_animations(COLLADAFW::Transformation *
BLI_strncpy(rna_path, loc ? "location" : "scale", sizeof(rna_path));
switch (binding->animationClass) {
- case COLLADAFW::AnimationList::POSITION_X:
- modify_fcurve(curves, rna_path, 0 );
- break;
- case COLLADAFW::AnimationList::POSITION_Y:
- modify_fcurve(curves, rna_path, 1 );
- break;
- case COLLADAFW::AnimationList::POSITION_Z:
- modify_fcurve(curves, rna_path, 2 );
- break;
- case COLLADAFW::AnimationList::POSITION_XYZ:
- modify_fcurve(curves, rna_path, -1 );
- break;
- default:
- fprintf(stderr, "AnimationClass %d is not supported for %s.\n",
- binding->animationClass, loc ? "TRANSLATE" : "SCALE");
- }
- break;
+ case COLLADAFW::AnimationList::POSITION_X:
+ modify_fcurve(curves, rna_path, 0 );
+ break;
+ case COLLADAFW::AnimationList::POSITION_Y:
+ modify_fcurve(curves, rna_path, 1 );
+ break;
+ case COLLADAFW::AnimationList::POSITION_Z:
+ modify_fcurve(curves, rna_path, 2 );
+ break;
+ case COLLADAFW::AnimationList::POSITION_XYZ:
+ modify_fcurve(curves, rna_path, -1 );
+ break;
+ default:
+ fprintf(stderr, "AnimationClass %d is not supported for %s.\n",
+ binding->animationClass, loc ? "TRANSLATE" : "SCALE");
+ }
+ break;
}
-
-
+
+
case COLLADAFW::Transformation::ROTATE:
{
if (is_joint)
BLI_snprintf(rna_path, sizeof(rna_path), "%s.rotation_euler", joint_path);
else
BLI_strncpy(rna_path, "rotation_euler", sizeof(rna_path));
- std::vector<FCurve*>::iterator iter;
+ std::vector<FCurve*>::iterator iter;
for (iter = curves->begin(); iter != curves->end(); iter++) {
FCurve* fcu = *iter;
-
+
//if transform is rotation the fcurves values must be turned in to radian.
if (is_rotation)
fcurve_deg_to_rad(fcu);
}
COLLADAFW::Rotate* rot = (COLLADAFW::Rotate*)transform;
COLLADABU::Math::Vector3& axis = rot->getRotationAxis();
-
+
switch (binding->animationClass) {
- case COLLADAFW::AnimationList::ANGLE:
- if (COLLADABU::Math::Vector3::UNIT_X == axis) {
- modify_fcurve(curves, rna_path, 0 );
- }
- else if (COLLADABU::Math::Vector3::UNIT_Y == axis) {
- modify_fcurve(curves, rna_path, 1 );
- }
- else if (COLLADABU::Math::Vector3::UNIT_Z == axis) {
- modify_fcurve(curves, rna_path, 2 );
- }
- break;
- case COLLADAFW::AnimationList::AXISANGLE:
- // TODO convert axis-angle to quat? or XYZ?
- default:
- fprintf(stderr, "AnimationClass %d is not supported for ROTATE transformation.\n",
- binding->animationClass);
- }
+ case COLLADAFW::AnimationList::ANGLE:
+ if (COLLADABU::Math::Vector3::UNIT_X == axis) {
+ modify_fcurve(curves, rna_path, 0 );
+ }
+ else if (COLLADABU::Math::Vector3::UNIT_Y == axis) {
+ modify_fcurve(curves, rna_path, 1 );
+ }
+ else if (COLLADABU::Math::Vector3::UNIT_Z == axis) {
+ modify_fcurve(curves, rna_path, 2 );
+ }
break;
+ case COLLADAFW::AnimationList::AXISANGLE:
+ // TODO convert axis-angle to quat? or XYZ?
+ default:
+ fprintf(stderr, "AnimationClass %d is not supported for ROTATE transformation.\n",
+ binding->animationClass);
+ }
+ break;
}
-
+
case COLLADAFW::Transformation::MATRIX:
/*{
- COLLADAFW::Matrix* mat = (COLLADAFW::Matrix*)transform;
- COLLADABU::Math::Matrix4 mat4 = mat->getMatrix();
- switch (binding->animationClass) {
- case COLLADAFW::AnimationList::TRANSFORM:
-
- }
+ COLLADAFW::Matrix* mat = (COLLADAFW::Matrix*)transform;
+ COLLADABU::Math::Matrix4 mat4 = mat->getMatrix();
+ switch (binding->animationClass) {
+ case COLLADAFW::AnimationList::TRANSFORM:
+
+ }
}*/
break;
case COLLADAFW::Transformation::SKEW:
case COLLADAFW::Transformation::LOOKAT:
fprintf(stderr, "Animation of SKEW and LOOKAT transformations is not supported yet.\n");
break;
- }
-
+ }
+
}
//creates the rna_paths and array indices of fcurves from animations using color and bound animation class of each animation.
-void AnimationImporter:: Assign_color_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves ,char * anim_type)
+void AnimationImporter:: Assign_color_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves ,const char * anim_type)
{
char rna_path[100];
BLI_strncpy(rna_path,anim_type, sizeof(rna_path));
-
+
const COLLADAFW::AnimationList *animlist = animlist_map[listid];
const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings();
- //all the curves belonging to the current binding
- std::vector<FCurve*> animcurves;
+ //all the curves belonging to the current binding
+ std::vector<FCurve*> animcurves;
for (unsigned int j = 0; j < bindings.getCount(); j++) {
- animcurves = curve_map[bindings[j].animation];
-
- switch (bindings[j].animationClass) {
+ animcurves = curve_map[bindings[j].animation];
+
+ switch (bindings[j].animationClass) {
case COLLADAFW::AnimationList::COLOR_R:
modify_fcurve(&animcurves, rna_path, 0 );
break;
@@ -598,13 +592,13 @@ void AnimationImporter:: Assign_color_animations(const COLLADAFW::UniqueId& list
case COLLADAFW::AnimationList::COLOR_RGBA: // to do-> set intensity
modify_fcurve(&animcurves, rna_path, -1 );
break;
-
+
default:
fprintf(stderr, "AnimationClass %d is not supported for %s.\n",
- bindings[j].animationClass, "COLOR" );
+ bindings[j].animationClass, "COLOR" );
}
- std::vector<FCurve*>::iterator iter;
+ std::vector<FCurve*>::iterator iter;
//Add the curves of the current animation to the object
for (iter = animcurves.begin(); iter != animcurves.end(); iter++) {
FCurve * fcu = *iter;
@@ -612,10 +606,10 @@ void AnimationImporter:: Assign_color_animations(const COLLADAFW::UniqueId& list
}
}
-
+
}
-void AnimationImporter:: Assign_float_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves, char * anim_type)
+void AnimationImporter:: Assign_float_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves, const char * anim_type)
{
char rna_path[100];
if (animlist_map.find(listid) == animlist_map.end()) return ;
@@ -625,7 +619,7 @@ void AnimationImporter:: Assign_float_animations(const COLLADAFW::UniqueId& list
const COLLADAFW::AnimationList *animlist = animlist_map[listid];
const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings();
//all the curves belonging to the current binding
- std::vector<FCurve*> animcurves;
+ std::vector<FCurve*> animcurves;
for (unsigned int j = 0; j < bindings.getCount(); j++) {
animcurves = curve_map[bindings[j].animation];
@@ -671,28 +665,28 @@ void AnimationImporter::apply_matrix_curves( Object * ob, std::vector<FCurve*>&
copy_m4_m4(rest, bone->arm_mat);
invert_m4_m4(irest, rest);
}
- // new curves to assign matrix transform animation
+ // new curves to assign matrix transform animation
FCurve *newcu[10]; // if tm_type is matrix, then create 10 curves: 4 rot, 3 loc, 3 scale
unsigned int totcu = 10 ;
- const char *tm_str = NULL;
+ const char *tm_str = NULL;
char rna_path[200];
for (int i = 0; i < totcu; i++) {
int axis = i;
- if (i < 4) {
- tm_str = "rotation_quaternion";
- axis = i;
- }
- else if (i < 7) {
- tm_str = "location";
- axis = i - 4;
- }
- else {
- tm_str = "scale";
- axis = i - 7;
- }
-
+ if (i < 4) {
+ tm_str = "rotation_quaternion";
+ axis = i;
+ }
+ else if (i < 7) {
+ tm_str = "location";
+ axis = i - 4;
+ }
+ else {
+ tm_str = "scale";
+ axis = i - 7;
+ }
+
if (is_joint)
BLI_snprintf(rna_path, sizeof(rna_path), "%s.%s", joint_path, tm_str);
@@ -702,11 +696,11 @@ void AnimationImporter::apply_matrix_curves( Object * ob, std::vector<FCurve*>&
newcu[i]->totvert = frames.size();
}
- if (frames.size() == 0)
+ if (frames.size() == 0)
return;
-std::sort(frames.begin(), frames.end());
-
+ std::sort(frames.begin(), frames.end());
+
std::vector<float>::iterator it;
// sample values at each frame
@@ -717,7 +711,7 @@ std::sort(frames.begin(), frames.end());
float matfra[4][4];
unit_m4(matfra);
-
+
// calc object-space mat
evaluate_transform_at_frame(matfra, node, fra);
@@ -743,23 +737,23 @@ std::sort(frames.begin(), frames.end());
}
float rot[4], loc[3], scale[3];
-
- mat4_to_quat(rot, mat);
- /*for ( int i = 0 ; i < 4 ; i ++ )
- {
- rot[i] = rot[i] * (180 / M_PI);
- }*/
- copy_v3_v3(loc, mat[3]);
- mat4_to_size(scale, mat);
-
+
+ mat4_to_quat(rot, mat);
+ /*for ( int i = 0 ; i < 4 ; i ++ )
+ {
+ rot[i] = rot[i] * (180 / M_PI);
+ }*/
+ copy_v3_v3(loc, mat[3]);
+ mat4_to_size(scale, mat);
+
// add keys
for (int i = 0; i < totcu; i++) {
- if (i < 4)
- add_bezt(newcu[i], fra, rot[i]);
- else if (i < 7)
- add_bezt(newcu[i], fra, loc[i - 4]);
- else
- add_bezt(newcu[i], fra, scale[i - 7]);
+ if (i < 4)
+ add_bezt(newcu[i], fra, rot[i]);
+ else if (i < 7)
+ add_bezt(newcu[i], fra, loc[i - 4]);
+ else
+ add_bezt(newcu[i], fra, scale[i - 7]);
}
}
verify_adt_action((ID*)&ob->id, 1);
@@ -774,13 +768,13 @@ std::sort(frames.begin(), frames.end());
BLI_addtail(curves, newcu[i]);
}
- if (is_joint) {
- bPoseChannel *chan = get_pose_channel(ob->pose, bone_name);
- chan->rotmode = ROT_MODE_QUAT;
- }
- else {
- ob->rotmode = ROT_MODE_QUAT;
- }
+ if (is_joint) {
+ bPoseChannel *chan = get_pose_channel(ob->pose, bone_name);
+ chan->rotmode = ROT_MODE_QUAT;
+ }
+ else {
+ ob->rotmode = ROT_MODE_QUAT;
+ }
return;
@@ -803,25 +797,24 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node ,
}
bAction * act;
- bActionGroup *grp = NULL;
-
+
if ( (animType->transform) != 0 )
{
- const char *bone_name = is_joint ? bc_get_joint_name(node) : NULL;
- char joint_path[200];
+ const char *bone_name = is_joint ? bc_get_joint_name(node) : NULL;
+ char joint_path[200];
if ( is_joint )
- armature_importer->get_rna_path_for_joint(node, joint_path, sizeof(joint_path));
-
-
+ armature_importer->get_rna_path_for_joint(node, joint_path, sizeof(joint_path));
+
+
if (!ob->adt || !ob->adt->action) act = verify_adt_action((ID*)&ob->id, 1);
else act = ob->adt->action;
-
- //Get the list of animation curves of the object
- ListBase *AnimCurves = &(act->curves);
+
+ //Get the list of animation curves of the object
+ ListBase *AnimCurves = &(act->curves);
const COLLADAFW::TransformationPointerArray& nodeTransforms = node->getTransformations();
-
+
//for each transformation in node
for (unsigned int i = 0; i < nodeTransforms.getCount(); i++) {
COLLADAFW::Transformation *transform = nodeTransforms[i];
@@ -829,10 +822,10 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node ,
bool is_rotation = tm_type == COLLADAFW::Transformation::ROTATE;
bool is_matrix = tm_type == COLLADAFW::Transformation::MATRIX;
-
+
const COLLADAFW::UniqueId& listid = transform->getAnimationList();
-
- //check if transformation has animations
+
+ //check if transformation has animations
if (animlist_map.find(listid) == animlist_map.end()) continue ;
else
{
@@ -840,25 +833,25 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node ,
const COLLADAFW::AnimationList *animlist = animlist_map[listid];
const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings();
//all the curves belonging to the current binding
- std::vector<FCurve*> animcurves;
+ std::vector<FCurve*> animcurves;
for (unsigned int j = 0; j < bindings.getCount(); j++) {
- animcurves = curve_map[bindings[j].animation];
- if ( is_matrix )
- apply_matrix_curves(ob, animcurves, root , node, transform );
- else {
+ animcurves = curve_map[bindings[j].animation];
+ if ( is_matrix )
+ apply_matrix_curves(ob, animcurves, root , node, transform );
+ else {
//calculate rnapaths and array index of fcurves according to transformation and animation class
- Assign_transform_animations(transform, &bindings[j], &animcurves, is_joint, joint_path );
-
- std::vector<FCurve*>::iterator iter;
- //Add the curves of the current animation to the object
- for (iter = animcurves.begin(); iter != animcurves.end(); iter++) {
- FCurve * fcu = *iter;
- if ((ob->type == OB_ARMATURE))
- add_bone_fcurve( ob, node , fcu );
- else
- BLI_addtail(AnimCurves, fcu);
- }
+ Assign_transform_animations(transform, &bindings[j], &animcurves, is_joint, joint_path );
+
+ std::vector<FCurve*>::iterator iter;
+ //Add the curves of the current animation to the object
+ for (iter = animcurves.begin(); iter != animcurves.end(); iter++) {
+ FCurve * fcu = *iter;
+ if ((ob->type == OB_ARMATURE))
+ add_bone_fcurve( ob, node , fcu );
+ else
+ BLI_addtail(AnimCurves, fcu);
}
+ }
}
}
if (is_rotation) {
@@ -880,7 +873,7 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node ,
Lamp * lamp = (Lamp*) ob->data;
if (!lamp->adt || !lamp->adt->action) act = verify_adt_action((ID*)&lamp->id, 1);
- else act = lamp->adt->action;
+ else act = lamp->adt->action;
ListBase *AnimCurves = &(act->curves);
const COLLADAFW::InstanceLightPointerArray& nodeLights = node->getInstanceLights();
@@ -892,23 +885,23 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node ,
{
const COLLADAFW::Color *col = &(light->getColor());
const COLLADAFW::UniqueId& listid = col->getAnimationList();
-
+
Assign_color_animations(listid, AnimCurves, "color");
}
if ((animType->light & LIGHT_FOA) != 0 )
{
const COLLADAFW::AnimatableFloat *foa = &(light->getFallOffAngle());
const COLLADAFW::UniqueId& listid = foa->getAnimationList();
-
+
Assign_float_animations( listid ,AnimCurves, "spot_size");
}
if ( (animType->light & LIGHT_FOE) != 0 )
{
const COLLADAFW::AnimatableFloat *foe = &(light->getFallOffExponent());
const COLLADAFW::UniqueId& listid = foe->getAnimationList();
-
+
Assign_float_animations( listid ,AnimCurves, "spot_blend");
-
+
}
}
}
@@ -918,7 +911,7 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node ,
Camera * camera = (Camera*) ob->data;
if (!camera->adt || !camera->adt->action) act = verify_adt_action((ID*)&camera->id, 1);
- else act = camera->adt->action;
+ else act = camera->adt->action;
ListBase *AnimCurves = &(act->curves);
const COLLADAFW::InstanceCameraPointerArray& nodeCameras= node->getInstanceCameras();
@@ -957,12 +950,12 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node ,
}
}
if ( animType->material != 0){
- Material *ma = give_current_material(ob, 1);
- if (!ma->adt || !ma->adt->action) act = verify_adt_action((ID*)&ma->id, 1);
- else act = ma->adt->action;
+ Material *ma = give_current_material(ob, 1);
+ if (!ma->adt || !ma->adt->action) act = verify_adt_action((ID*)&ma->id, 1);
+ else act = ma->adt->action;
ListBase *AnimCurves = &(act->curves);
-
+
const COLLADAFW::InstanceGeometryPointerArray& nodeGeoms = node->getInstanceGeometries();
for (unsigned int i = 0; i < nodeGeoms.getCount(); i++) {
const COLLADAFW::MaterialBindingArray& matBinds = nodeGeoms[i]->getMaterialBindings();
@@ -988,7 +981,7 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node ,
const COLLADAFW::UniqueId& listid = cot->getColor().getAnimationList();
Assign_color_animations( listid, AnimCurves , "specular_color" );
}
-
+
if((animType->material & MATERIAL_DIFF_COLOR) != 0){
const COLLADAFW::ColorOrTexture *cot = &(efc->getDiffuse());
const COLLADAFW::UniqueId& listid = cot->getColor().getAnimationList();
@@ -1005,15 +998,15 @@ AnimationImporter::AnimMix* AnimationImporter::get_animation_type ( const COLLAD
std::map<COLLADAFW::UniqueId, const COLLADAFW::Object*> FW_object_map)
{
AnimMix *types = new AnimMix();
-
+
const COLLADAFW::TransformationPointerArray& nodeTransforms = node->getTransformations();
-
+
//for each transformation in node
for (unsigned int i = 0; i < nodeTransforms.getCount(); i++) {
COLLADAFW::Transformation *transform = nodeTransforms[i];
const COLLADAFW::UniqueId& listid = transform->getAnimationList();
-
- //check if transformation has animations
+
+ //check if transformation has animations
if (animlist_map.find(listid) == animlist_map.end()) continue ;
else
{
@@ -1028,9 +1021,9 @@ AnimationImporter::AnimMix* AnimationImporter::get_animation_type ( const COLLAD
types->light = setAnimType(&(light->getColor()),(types->light), LIGHT_COLOR);
types->light = setAnimType(&(light->getFallOffAngle()),(types->light), LIGHT_FOA);
types->light = setAnimType(&(light->getFallOffExponent()),(types->light), LIGHT_FOE);
-
+
if ( types->light != 0) break;
-
+
}
const COLLADAFW::InstanceCameraPointerArray& nodeCameras = node->getInstanceCameras();
@@ -1039,9 +1032,9 @@ AnimationImporter::AnimMix* AnimationImporter::get_animation_type ( const COLLAD
if ( camera->getCameraType() == COLLADAFW::Camera::PERSPECTIVE )
{
- types->camera = setAnimType(&(camera->getXMag()),(types->camera), CAMERA_XFOV);
+ types->camera = setAnimType(&(camera->getXMag()),(types->camera), CAMERA_XFOV);
}
- else
+ else
{
types->camera = setAnimType(&(camera->getXMag()),(types->camera), CAMERA_XMAG);
}
@@ -1059,12 +1052,14 @@ AnimationImporter::AnimMix* AnimationImporter::get_animation_type ( const COLLAD
const COLLADAFW::UniqueId & matuid = matBinds[j].getReferencedMaterial();
const COLLADAFW::Effect *ef = (COLLADAFW::Effect *) (FW_object_map[matuid]);
const COLLADAFW::CommonEffectPointerArray& commonEffects = ef->getCommonEffects();
- COLLADAFW::EffectCommon *efc = commonEffects[0];
- types->material = setAnimType(&(efc->getShininess()),(types->material), MATERIAL_SHININESS);
- types->material = setAnimType(&(efc->getSpecular().getColor()),(types->material), MATERIAL_SPEC_COLOR);
- types->material = setAnimType(&(efc->getDiffuse().getColor()),(types->material), MATERIAL_DIFF_COLOR);
- // types->material = setAnimType(&(efc->get()),(types->material), MATERIAL_TRANSPARENCY);
- types->material = setAnimType(&(efc->getIndexOfRefraction()),(types->material), MATERIAL_IOR);
+ if(!commonEffects.empty()) {
+ COLLADAFW::EffectCommon *efc = commonEffects[0];
+ types->material = setAnimType(&(efc->getShininess()),(types->material), MATERIAL_SHININESS);
+ types->material = setAnimType(&(efc->getSpecular().getColor()),(types->material), MATERIAL_SPEC_COLOR);
+ types->material = setAnimType(&(efc->getDiffuse().getColor()),(types->material), MATERIAL_DIFF_COLOR);
+ // types->material = setAnimType(&(efc->get()),(types->material), MATERIAL_TRANSPARENCY);
+ types->material = setAnimType(&(efc->getIndexOfRefraction()),(types->material), MATERIAL_IOR);
+ }
}
}
return types;
@@ -1101,7 +1096,7 @@ void AnimationImporter::find_frames_old(std::vector<float> * frames, COLLADAFW::
const COLLADAFW::AnimationList *animlist = animlist_map[listid];
const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings();
-
+
if (bindings.getCount()) {
//for each AnimationBinding get the fcurves which animate the transform
for (unsigned int j = 0; j < bindings.getCount(); j++) {
@@ -1113,7 +1108,7 @@ void AnimationImporter::find_frames_old(std::vector<float> * frames, COLLADAFW::
for (iter = curves.begin(); iter != curves.end(); iter++) {
FCurve *fcu = *iter;
-
+
//if transform is rotation the fcurves values must be turned in to radian.
if (is_rotation)
fcurve_deg_to_rad(fcu);
@@ -1448,9 +1443,9 @@ bool AnimationImporter::evaluate_animation(COLLADAFW::Transformation *tm, float
COLLADAFW::Transformation::TransformationType type = tm->getTransformationType();
if (type != COLLADAFW::Transformation::ROTATE &&
- type != COLLADAFW::Transformation::SCALE &&
- type != COLLADAFW::Transformation::TRANSLATE &&
- type != COLLADAFW::Transformation::MATRIX) {
+ type != COLLADAFW::Transformation::SCALE &&
+ type != COLLADAFW::Transformation::TRANSLATE &&
+ type != COLLADAFW::Transformation::MATRIX) {
fprintf(stderr, "animation of transformation %d is not supported yet\n", type);
return false;
}
@@ -1572,7 +1567,7 @@ bool AnimationImporter::evaluate_animation(COLLADAFW::Transformation *tm, float
COLLADAFW::Matrix tm(matrix);
dae_matrix_to_mat4(&tm, mat);
-
+
std::vector<FCurve*>::iterator it;
return true;
diff --git a/source/blender/collada/AnimationImporter.h b/source/blender/collada/AnimationImporter.h
index 18303eb2f0b..9e8f7b42069 100644
--- a/source/blender/collada/AnimationImporter.h
+++ b/source/blender/collada/AnimationImporter.h
@@ -88,7 +88,7 @@ private:
void add_fcurves_to_object(Object *ob, std::vector<FCurve*>& curves, char *rna_path, int array_index, Animation *animated);
int typeFlag;
-
+
enum lightAnim
{
// INANIMATE = 0,
@@ -144,7 +144,7 @@ public:
#if 0
virtual void change_eul_to_quat(Object *ob, bAction *act);
#endif
-
+
void translate_Animations( COLLADAFW::Node * Node ,
std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& root_map,
std::map<COLLADAFW::UniqueId, Object*>& object_map ,
@@ -159,9 +159,9 @@ public:
const COLLADAFW::AnimationList::AnimationBinding * binding,
std::vector<FCurve*>* curves, bool is_joint, char * joint_path);
- void Assign_color_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves ,char * anim_type);
- void Assign_float_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves, char * anim_type);
-
+ void Assign_color_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves, const char * anim_type);
+ void Assign_float_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves, const char * anim_type);
+
int setAnimType ( const COLLADAFW::Animatable * prop , int type, int addition);
void modify_fcurve(std::vector<FCurve*>* curves , char* rna_path , int array_index );
@@ -206,5 +206,5 @@ public:
void extra_data_importer(std::string elementName);
};
-
- #endif
+
+#endif
diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp
index 92d06bb639f..431c67833f1 100644
--- a/source/blender/collada/ArmatureExporter.cpp
+++ b/source/blender/collada/ArmatureExporter.cpp
@@ -49,7 +49,7 @@
// XXX exporter writes wrong data for shared armatures. A separate
// controller should be written for each armature-mesh binding how do
// we make controller ids then?
-ArmatureExporter::ArmatureExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryControllers(sw) {}
+ArmatureExporter::ArmatureExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings) : COLLADASW::LibraryControllers(sw), export_settings(export_settings) {}
// write bone nodes
void ArmatureExporter::add_armature_bones(Object *ob_arm, Scene *sce)
@@ -90,14 +90,14 @@ void ArmatureExporter::add_instance_controller(Object *ob)
ins.add();
}
-void ArmatureExporter::export_controllers(Scene *sce, bool export_selected)
+void ArmatureExporter::export_controllers(Scene *sce)
{
scene = sce;
openLibrary();
GeometryFunctor gf;
- gf.forEachMeshObjectInScene<ArmatureExporter>(sce, *this, export_selected);
+ gf.forEachMeshObjectInScene<ArmatureExporter>(sce, *this, this->export_settings->selected);
closeLibrary();
}
@@ -188,7 +188,7 @@ void ArmatureExporter::add_bone_node(Bone *bone, Object *ob_arm)
for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next) {
add_bone_node(child, ob_arm);
}
- node.end();
+ node.end();
//}
}
diff --git a/source/blender/collada/ArmatureExporter.h b/source/blender/collada/ArmatureExporter.h
index b3441c797e8..554a8a7cfe6 100644
--- a/source/blender/collada/ArmatureExporter.h
+++ b/source/blender/collada/ArmatureExporter.h
@@ -47,16 +47,15 @@
#include "TransformWriter.h"
#include "InstanceWriter.h"
+#include "ExportSettings.h"
+
// XXX exporter writes wrong data for shared armatures. A separate
// controller should be written for each armature-mesh binding how do
// we make controller ids then?
class ArmatureExporter: public COLLADASW::LibraryControllers, protected TransformWriter, protected InstanceWriter
{
-private:
- Scene *scene;
-
public:
- ArmatureExporter(COLLADASW::StreamWriter *sw);
+ ArmatureExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings);
// write bone nodes
void add_armature_bones(Object *ob_arm, Scene *sce);
@@ -65,13 +64,14 @@ public:
void add_instance_controller(Object *ob);
- void export_controllers(Scene *sce, bool export_selected);
+ void export_controllers(Scene *sce);
void operator()(Object *ob);
private:
-
+ Scene *scene;
UnitConverter converter;
+ const ExportSettings *export_settings;
#if 0
std::vector<Object*> written_armatures;
@@ -119,25 +119,4 @@ private:
Object *ob_arm, ListBase *defbase);
};
-/*
-struct GeometryFunctor {
- // f should have
- // void operator()(Object* ob)
- template<class Functor>
- void forEachMeshObjectInScene(Scene *sce, Functor &f)
- {
-
- Base *base= (Base*) sce->base.first;
- while(base) {
- Object *ob = base->object;
-
- if (ob->type == OB_MESH && ob->data) {
- f(ob);
- }
- base= base->next;
-
- }
- }
-};*/
-
#endif
diff --git a/source/blender/collada/ArmatureImporter.cpp b/source/blender/collada/ArmatureImporter.cpp
index 2ec8ae540d2..ae25d343d36 100644
--- a/source/blender/collada/ArmatureImporter.cpp
+++ b/source/blender/collada/ArmatureImporter.cpp
@@ -87,7 +87,7 @@ void ArmatureImporter::create_unskinned_bone( COLLADAFW::Node *node, EditBone *p
if ( it != finished_joints.end()) return;
float mat[4][4];
- float obmat[4][4];
+ float obmat[4][4];
// object-space
get_node_mat(obmat, node, NULL, NULL);
@@ -95,8 +95,6 @@ void ArmatureImporter::create_unskinned_bone( COLLADAFW::Node *node, EditBone *p
EditBone *bone = ED_armature_edit_bone_add((bArmature*)ob_arm->data, (char*)bc_get_joint_name(node));
totbone++;
- bPoseChannel *pchan = get_pose_channel(ob_arm->pose, (char*)bc_get_joint_name(node));
-
if (parent) bone->parent = parent;
float angle = 0;
@@ -280,8 +278,6 @@ void ArmatureImporter::add_leaf_bone(float mat[][4], EditBone *bone, COLLADAFW:
copy_m4_m4(leaf.mat, mat);
BLI_strncpy(leaf.name, bone->name, sizeof(leaf.name));
- float vec[3];
-
TagsMap::iterator etit;
ExtraTags *et = 0;
etit = uid_tags_map.find(node->getUniqueId().toAscii());
@@ -296,7 +292,7 @@ void ArmatureImporter::add_leaf_bone(float mat[][4], EditBone *bone, COLLADAFW:
et->setData("tip_z",&z);
float vec[3] = {x,y,z};
copy_v3_v3(leaf.bone->tail, leaf.bone->head);
- add_v3_v3v3(leaf.bone->tail, leaf.bone->head, vec);
+ add_v3_v3v3(leaf.bone->tail, leaf.bone->head, vec);
}else
leaf_bones.push_back(leaf);
}
@@ -579,9 +575,8 @@ void ArmatureImporter::set_pose ( Object * ob_arm , COLLADAFW::Node * root_node
float mat[4][4];
float obmat[4][4];
- bArmature * arm = (bArmature * ) ob_arm-> data ;
float ax[3];
- float angle = NULL;
+ float angle = 0.0f;
// object-space
get_node_mat(obmat, root_node, NULL, NULL);
diff --git a/source/blender/collada/ArmatureImporter.h b/source/blender/collada/ArmatureImporter.h
index 4f4aed210f2..a197e612a87 100644
--- a/source/blender/collada/ArmatureImporter.h
+++ b/source/blender/collada/ArmatureImporter.h
@@ -115,7 +115,7 @@ private:
void fix_leaf_bones();
- void set_pose ( Object * ob_arm , COLLADAFW::Node * root_node ,char * parentname, float parent_mat[][4]);
+ void set_pose ( Object * ob_arm , COLLADAFW::Node * root_node ,char * parentname, float parent_mat[][4]);
#if 0
@@ -171,7 +171,7 @@ public:
// gives a world-space mat
bool get_joint_bind_mat(float m[][4], COLLADAFW::Node *joint);
-
+
void set_tags_map( TagsMap& tags_map);
};
diff --git a/source/blender/collada/CMakeLists.txt b/source/blender/collada/CMakeLists.txt
index ffe3d5f4f85..2ee34091fc9 100644
--- a/source/blender/collada/CMakeLists.txt
+++ b/source/blender/collada/CMakeLists.txt
@@ -51,6 +51,8 @@ set(SRC
DocumentExporter.cpp
DocumentImporter.cpp
EffectExporter.cpp
+ ErrorHandler.cpp
+ ExportSettings.cpp
ExtraHandler.cpp
ExtraTags.cpp
GeometryExporter.cpp
@@ -60,6 +62,7 @@ set(SRC
MaterialExporter.cpp
MeshImporter.cpp
SkinInfo.cpp
+ SceneExporter.cpp
TransformReader.cpp
TransformWriter.cpp
collada.cpp
@@ -74,6 +77,8 @@ set(SRC
DocumentExporter.h
DocumentImporter.h
EffectExporter.h
+ ErrorHandler.h
+ ExportSettings.h
ExtraHandler.h
ExtraTags.h
GeometryExporter.h
@@ -83,6 +88,7 @@ set(SRC
MaterialExporter.h
MeshImporter.h
SkinInfo.h
+ SceneExporter.h
TransformReader.h
TransformWriter.h
collada.h
diff --git a/source/blender/collada/CameraExporter.cpp b/source/blender/collada/CameraExporter.cpp
index a935f45c403..542409072f1 100644
--- a/source/blender/collada/CameraExporter.cpp
+++ b/source/blender/collada/CameraExporter.cpp
@@ -39,7 +39,7 @@
#include "collada_internal.h"
-CamerasExporter::CamerasExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryCameras(sw){}
+CamerasExporter::CamerasExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings): COLLADASW::LibraryCameras(sw), export_settings(export_settings) {}
template<class Functor>
void forEachCameraObjectInScene(Scene *sce, Functor &f, bool export_selected)
@@ -56,11 +56,11 @@ void forEachCameraObjectInScene(Scene *sce, Functor &f, bool export_selected)
}
}
-void CamerasExporter::exportCameras(Scene *sce, bool export_selected)
+void CamerasExporter::exportCameras(Scene *sce)
{
openLibrary();
- forEachCameraObjectInScene(sce, *this, export_selected);
+ forEachCameraObjectInScene(sce, *this, this->export_settings->selected);
closeLibrary();
}
diff --git a/source/blender/collada/CameraExporter.h b/source/blender/collada/CameraExporter.h
index 999a6ddd3e5..8d08fe23f80 100644
--- a/source/blender/collada/CameraExporter.h
+++ b/source/blender/collada/CameraExporter.h
@@ -36,12 +36,16 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "ExportSettings.h"
+
class CamerasExporter: COLLADASW::LibraryCameras
{
public:
- CamerasExporter(COLLADASW::StreamWriter *sw);
- void exportCameras(Scene *sce, bool export_selected);
+ CamerasExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings);
+ void exportCameras(Scene *sce);
void operator()(Object *ob, Scene *sce);
+private:
+ const ExportSettings *export_settings;
};
#endif
diff --git a/source/blender/collada/DocumentExporter.cpp b/source/blender/collada/DocumentExporter.cpp
index 285ab283b37..d562e51b922 100644
--- a/source/blender/collada/DocumentExporter.cpp
+++ b/source/blender/collada/DocumentExporter.cpp
@@ -34,6 +34,7 @@ extern "C"
{
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
+#include "DNA_group_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_mesh_types.h"
#include "DNA_image_types.h"
@@ -104,15 +105,18 @@ extern char build_rev[];
#include "COLLADASWConstants.h"
#include "COLLADASWLibraryControllers.h"
#include "COLLADASWInstanceController.h"
+#include "COLLADASWInstanceNode.h"
#include "COLLADASWBaseInputElement.h"
#include "collada_internal.h"
#include "DocumentExporter.h"
+#include "ExportSettings.h"
// can probably go after refactor is complete
#include "InstanceWriter.h"
#include "TransformWriter.h"
+#include "SceneExporter.h"
#include "ArmatureExporter.h"
#include "AnimationExporter.h"
#include "CameraExporter.h"
@@ -142,170 +146,13 @@ char *bc_CustomData_get_active_layer_name(const CustomData *data, int type)
return data->layers[layer_index].name;
}
-
-/*
- Utilities to avoid code duplication.
- Definition can take some time to understand, but they should be useful.
-*/
-
-
-template<class Functor>
-void forEachObjectInScene(Scene *sce, Functor &f)
-{
- Base *base= (Base*) sce->base.first;
- while(base) {
- Object *ob = base->object;
-
- f(ob);
-
- base= base->next;
- }
-}
-
-
-
-class SceneExporter: COLLADASW::LibraryVisualScenes, protected TransformWriter, protected InstanceWriter
-{
- ArmatureExporter *arm_exporter;
-public:
- SceneExporter(COLLADASW::StreamWriter *sw, ArmatureExporter *arm) : COLLADASW::LibraryVisualScenes(sw),
- arm_exporter(arm) {}
-
- void exportScene(Scene *sce, bool export_selected) {
- // <library_visual_scenes> <visual_scene>
- std::string id_naming = id_name(sce);
- openVisualScene(translate_id(id_naming), id_naming);
-
- // write <node>s
- //forEachMeshObjectInScene(sce, *this);
- //forEachCameraObjectInScene(sce, *this);
- //forEachLampObjectInScene(sce, *this);
- exportHierarchy(sce, export_selected);
-
- // </visual_scene> </library_visual_scenes>
- closeVisualScene();
-
- closeLibrary();
- }
-
- void exportHierarchy(Scene *sce, bool export_selected)
- {
- Base *base= (Base*) sce->base.first;
- while(base) {
- Object *ob = base->object;
-
- if (!ob->parent) {
- if(sce->lay & ob->lay) {
- switch(ob->type) {
- case OB_MESH:
- case OB_CAMERA:
- case OB_LAMP:
- case OB_ARMATURE:
- case OB_EMPTY:
- if (export_selected && !(ob->flag & SELECT)) {
- break;
- }
- // write nodes....
- writeNodes(ob, sce);
- break;
- }
- }
- }
-
- base= base->next;
- }
- }
-
-
- // called for each object
- //void operator()(Object *ob) {
- void writeNodes(Object *ob, Scene *sce)
- {
- COLLADASW::Node node(mSW);
- node.setNodeId(translate_id(id_name(ob)));
- node.setType(COLLADASW::Node::NODE);
-
- node.start();
-
- bool is_skinned_mesh = arm_exporter->is_skinned_mesh(ob);
-
- if (ob->type == OB_MESH && is_skinned_mesh)
- // for skinned mesh we write obmat in <bind_shape_matrix>
- TransformWriter::add_node_transform_identity(node);
- else
- TransformWriter::add_node_transform_ob(node, ob);
-
- // <instance_geometry>
- if (ob->type == OB_MESH) {
- if (is_skinned_mesh) {
- arm_exporter->add_instance_controller(ob);
- }
- else {
- COLLADASW::InstanceGeometry instGeom(mSW);
- instGeom.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob)));
-
- InstanceWriter::add_material_bindings(instGeom.getBindMaterial(), ob);
-
- instGeom.add();
- }
- }
-
- // <instance_controller>
- else if (ob->type == OB_ARMATURE) {
- arm_exporter->add_armature_bones(ob, sce);
-
- // XXX this looks unstable...
- node.end();
- }
-
- // <instance_camera>
- else if (ob->type == OB_CAMERA) {
- COLLADASW::InstanceCamera instCam(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_camera_id(ob)));
- instCam.add();
- }
-
- // <instance_light>
- else if (ob->type == OB_LAMP) {
- COLLADASW::InstanceLight instLa(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_light_id(ob)));
- instLa.add();
- }
-
- // empty object
- else if (ob->type == OB_EMPTY) {
- }
-
- // write nodes for child objects
- Base *b = (Base*) sce->base.first;
- while(b) {
- // cob - child object
- Object *cob = b->object;
-
- if (cob->parent == ob) {
- switch(cob->type) {
- case OB_MESH:
- case OB_CAMERA:
- case OB_LAMP:
- case OB_EMPTY:
- case OB_ARMATURE:
- // write node...
- writeNodes(cob, sce);
- break;
- }
- }
-
- b = b->next;
- }
-
- if (ob->type != OB_ARMATURE)
- node.end();
- }
-};
+DocumentExporter::DocumentExporter(const ExportSettings *export_settings) : export_settings(export_settings) {}
// TODO: it would be better to instantiate animations rather than create a new one per object
// COLLADA allows this through multiple <channel>s in <animation>.
// For this to work, we need to know objects that use a certain action.
-void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename, bool selected)
+void DocumentExporter::exportCurrentScene(Scene *sce)
{
PointerRNA sceneptr, unit_settings;
PropertyRNA *system; /* unused , *scale; */
@@ -313,7 +160,7 @@ void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename, bool
clear_global_id_map();
COLLADABU::NativeString native_filename =
- COLLADABU::NativeString(std::string(filename));
+ COLLADABU::NativeString(std::string(this->export_settings->filepath));
COLLADASW::StreamWriter sw(native_filename);
// open <collada>
@@ -328,9 +175,7 @@ void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename, bool
//scale = RNA_struct_find_property(&unit_settings, "scale_length");
std::string unitname = "meter";
- float linearmeasure = 1.0f;
-
- linearmeasure = RNA_float_get(&unit_settings, "scale_length");
+ float linearmeasure = RNA_float_get(&unit_settings, "scale_length");
switch(RNA_property_enum_get(&unit_settings, system)) {
case USER_UNIT_NONE:
@@ -368,8 +213,7 @@ void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename, bool
asset.setUnit(unitname, linearmeasure);
asset.setUpAxisType(COLLADASW::Asset::Z_UP);
- // TODO: need an Author field in userpref
- if(strlen(U.author) > 0) {
+ if(U.author[0] != '\0') {
asset.getContributor().mAuthor = U.author;
}
else {
@@ -386,32 +230,32 @@ void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename, bool
// <library_cameras>
if(has_object_type(sce, OB_CAMERA)) {
- CamerasExporter ce(&sw);
- ce.exportCameras(sce, selected);
+ CamerasExporter ce(&sw, this->export_settings);
+ ce.exportCameras(sce);
}
// <library_lights>
if(has_object_type(sce, OB_LAMP)) {
- LightsExporter le(&sw);
- le.exportLights(sce, selected);
+ LightsExporter le(&sw, this->export_settings);
+ le.exportLights(sce);
}
// <library_images>
- ImagesExporter ie(&sw, filename);
- ie.exportImages(sce, selected);
+ ImagesExporter ie(&sw, this->export_settings);
+ ie.exportImages(sce);
// <library_effects>
- EffectsExporter ee(&sw);
- ee.exportEffects(sce, selected);
+ EffectsExporter ee(&sw, this->export_settings);
+ ee.exportEffects(sce);
// <library_materials>
- MaterialsExporter me(&sw);
- me.exportMaterials(sce, selected);
+ MaterialsExporter me(&sw, this->export_settings);
+ me.exportMaterials(sce);
// <library_geometries>
if(has_object_type(sce, OB_MESH)) {
- GeometryExporter ge(&sw);
- ge.exportGeom(sce, selected);
+ GeometryExporter ge(&sw, this->export_settings);
+ ge.exportGeom(sce);
}
// <library_animations>
@@ -419,14 +263,14 @@ void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename, bool
ae.exportAnimations(sce);
// <library_controllers>
- ArmatureExporter arm_exporter(&sw);
+ ArmatureExporter arm_exporter(&sw, this->export_settings);
if(has_object_type(sce, OB_ARMATURE)) {
- arm_exporter.export_controllers(sce, selected);
+ arm_exporter.export_controllers(sce);
}
// <library_visual_scenes>
- SceneExporter se(&sw, &arm_exporter);
- se.exportScene(sce, selected);
+ SceneExporter se(&sw, &arm_exporter, this->export_settings);
+ se.exportScene(sce);
// <scene>
std::string scene_name(translate_id(id_name(sce)));
diff --git a/source/blender/collada/DocumentExporter.h b/source/blender/collada/DocumentExporter.h
index 923313c4ed9..83724505efa 100644
--- a/source/blender/collada/DocumentExporter.h
+++ b/source/blender/collada/DocumentExporter.h
@@ -29,13 +29,18 @@
#ifndef __DOCUMENTEXPORTER_H__
#define __DOCUMENTEXPORTER_H__
+#include "ExportSettings.h"
+
struct Scene;
class DocumentExporter
{
public:
- void exportCurrentScene(Scene *sce, const char* filename, bool selected);
+ DocumentExporter(const ExportSettings *export_settings);
+ void exportCurrentScene(Scene *sce);
void exportScenes(const char* filename);
+private:
+ const ExportSettings *export_settings;
};
#endif
diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp
index 3a92c95e7ee..366837421e3 100644
--- a/source/blender/collada/DocumentImporter.cpp
+++ b/source/blender/collada/DocumentImporter.cpp
@@ -76,6 +76,7 @@
#include "MEM_guardedalloc.h"
#include "ExtraHandler.h"
+#include "ErrorHandler.h"
#include "DocumentImporter.h"
#include "TransformReader.h"
@@ -113,17 +114,19 @@ DocumentImporter::~DocumentImporter()
bool DocumentImporter::import()
{
- /** TODO Add error handler (implement COLLADASaxFWL::IErrorHandler */
- COLLADASaxFWL::Loader loader;
+ ErrorHandler errorHandler;
+ COLLADASaxFWL::Loader loader(&errorHandler);
COLLADAFW::Root root(&loader, this);
ExtraHandler *ehandler = new ExtraHandler(this, &(this->anim_importer));
loader.registerExtraDataCallbackHandler(ehandler);
-
if (!root.loadDocument(mFilename))
return false;
+ if(errorHandler.hasError())
+ return false;
+
/** TODO set up scene graph and such here */
mImportStage = Controller;
@@ -240,15 +243,15 @@ void DocumentImporter::translate_anim_recursive(COLLADAFW::Node *node, COLLADAFW
root_map[node->getUniqueId()] = root_map[par->getUniqueId()];
}
- COLLADAFW::Transformation::TransformationType types[] = {
+ /*COLLADAFW::Transformation::TransformationType types[] = {
COLLADAFW::Transformation::ROTATE,
COLLADAFW::Transformation::SCALE,
COLLADAFW::Transformation::TRANSLATE,
COLLADAFW::Transformation::MATRIX
};
+ Object *ob;*/
unsigned int i;
- Object *ob;
//for (i = 0; i < 4; i++)
//ob =
@@ -410,18 +413,15 @@ void DocumentImporter::write_node (COLLADAFW::Node *node, COLLADAFW::Node *paren
while (geom_done < geom.getCount()) {
ob = mesh_importer.create_mesh_object(node, geom[geom_done], false, uid_material_map,
material_texture_mapping_map);
- if ( ob != NULL )
- ++geom_done;
+ ++geom_done;
}
while (camera_done < camera.getCount()) {
ob = create_camera_object(camera[camera_done], sce);
- if ( ob != NULL )
- ++camera_done;
+ ++camera_done;
}
while (lamp_done < lamp.getCount()) {
ob = create_lamp_object(lamp[lamp_done], sce);
- if ( ob != NULL )
- ++lamp_done;
+ ++lamp_done;
}
while (controller_done < controller.getCount()) {
COLLADAFW::InstanceGeometry *geom = (COLLADAFW::InstanceGeometry*)controller[controller_done];
diff --git a/source/blender/collada/EffectExporter.cpp b/source/blender/collada/EffectExporter.cpp
index 355e384d000..6863e26a3ce 100644
--- a/source/blender/collada/EffectExporter.cpp
+++ b/source/blender/collada/EffectExporter.cpp
@@ -37,6 +37,7 @@
#include "DNA_mesh_types.h"
#include "DNA_texture_types.h"
+#include "DNA_world_types.h"
#include "BKE_customdata.h"
@@ -55,7 +56,7 @@ static std::string getActiveUVLayerName(Object *ob)
return "";
}
-EffectsExporter::EffectsExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryEffects(sw){}
+EffectsExporter::EffectsExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings) : COLLADASW::LibraryEffects(sw), export_settings(export_settings) {}
bool EffectsExporter::hasEffects(Scene *sce)
{
@@ -78,12 +79,13 @@ bool EffectsExporter::hasEffects(Scene *sce)
return false;
}
-void EffectsExporter::exportEffects(Scene *sce, bool export_selected)
+void EffectsExporter::exportEffects(Scene *sce)
{
if(hasEffects(sce)) {
+ this->scene = sce;
openLibrary();
MaterialFunctor mf;
- mf.forEachMaterialInScene<EffectsExporter>(sce, *this, export_selected);
+ mf.forEachMaterialInScene<EffectsExporter>(sce, *this, this->export_settings->selected);
closeLibrary();
}
@@ -175,7 +177,12 @@ void EffectsExporter::operator()(Material *ma, Object *ob)
ep.setDiffuse(cot, false , "diffuse");
// ambient
- cot = getcol(ma->ambr, ma->ambg, ma->ambb, 1.0f);
+ /* ma->ambX is calculated only on render, so lets do it here manually and not rely on ma->ambX. */
+ if(this->scene->world)
+ cot = getcol(this->scene->world->ambr*ma->amb, this->scene->world->ambg*ma->amb, this->scene->world->ambb*ma->amb, 1.0f);
+ else
+ cot = getcol(ma->amb, ma->amb, ma->amb, 1.0f);
+
ep.setAmbient(cot, false , "ambient");
// reflective, reflectivity
diff --git a/source/blender/collada/EffectExporter.h b/source/blender/collada/EffectExporter.h
index 86143ae4d07..25d7ed15bc3 100644
--- a/source/blender/collada/EffectExporter.h
+++ b/source/blender/collada/EffectExporter.h
@@ -43,11 +43,13 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "ExportSettings.h"
+
class EffectsExporter: COLLADASW::LibraryEffects
{
public:
- EffectsExporter(COLLADASW::StreamWriter *sw);
- void exportEffects(Scene *sce, bool export_selected);
+ EffectsExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings);
+ void exportEffects(Scene *sce);
void operator()(Material *ma, Object *ob);
@@ -66,6 +68,10 @@ private:
void writePhong(COLLADASW::EffectProfile &ep, Material *ma);
bool hasEffects(Scene *sce);
+
+ const ExportSettings *export_settings;
+
+ Scene *scene;
};
#endif
diff --git a/source/blender/collada/ErrorHandler.cpp b/source/blender/collada/ErrorHandler.cpp
new file mode 100644
index 00000000000..61c03ed673c
--- /dev/null
+++ b/source/blender/collada/ErrorHandler.cpp
@@ -0,0 +1,89 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/collada/ErrorHandler.cpp
+ * \ingroup collada
+ */
+#include "ErrorHandler.h"
+#include <iostream>
+
+#include "COLLADASaxFWLIError.h"
+#include "COLLADASaxFWLSaxParserError.h"
+#include "COLLADASaxFWLSaxFWLError.h"
+
+#include "GeneratedSaxParserParserError.h"
+
+#include <string.h>
+
+//--------------------------------------------------------------------
+ErrorHandler::ErrorHandler() : mError(false)
+{
+}
+
+//--------------------------------------------------------------------
+ErrorHandler::~ErrorHandler()
+{
+}
+
+//--------------------------------------------------------------------
+bool ErrorHandler::handleError( const COLLADASaxFWL::IError* error )
+{
+ mError = true;
+
+ if ( error->getErrorClass() == COLLADASaxFWL::IError::ERROR_SAXPARSER )
+ {
+ COLLADASaxFWL::SaxParserError* saxParserError = (COLLADASaxFWL::SaxParserError*) error;
+ const GeneratedSaxParser::ParserError& parserError = saxParserError->getError();
+
+ // Workaround to avoid wrong error
+ if ( parserError.getErrorType() == GeneratedSaxParser::ParserError::ERROR_VALIDATION_MIN_OCCURS_UNMATCHED)
+ {
+ if ( strcmp(parserError.getElement(), "effect") == 0 )
+ {
+ mError = false;
+ }
+ }
+ if ( parserError.getErrorType() == GeneratedSaxParser::ParserError::ERROR_VALIDATION_SEQUENCE_PREVIOUS_SIBLING_NOT_PRESENT)
+ {
+ if ( !((strcmp(parserError.getElement(), "extra") == 0)
+ && (strcmp(parserError.getAdditionalText().c_str(), "sibling: fx_profile_abstract") == 0)))
+ {
+ mError = false;
+ }
+ }
+
+ if ( parserError.getErrorType() == GeneratedSaxParser::ParserError::ERROR_COULD_NOT_OPEN_FILE)
+ {
+ std::cout << "Couldn't open file" << std::endl;
+ }
+
+ std::cout << "Schema validation error: " << parserError.getErrorMessage() << std::endl;
+ }
+ else if ( error->getErrorClass() == COLLADASaxFWL::IError::ERROR_SAXFWL )
+ {
+ COLLADASaxFWL::SaxFWLError* saxFWLError = (COLLADASaxFWL::SaxFWLError*) error;
+ std::cout << "Sax FWL Error: " << saxFWLError->getErrorMessage() << std::endl;
+ }
+ return false;
+}
diff --git a/source/blender/collada/ErrorHandler.h b/source/blender/collada/ErrorHandler.h
new file mode 100644
index 00000000000..4064abb89f6
--- /dev/null
+++ b/source/blender/collada/ErrorHandler.h
@@ -0,0 +1,58 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/collada/ErrorHandler.h
+ * \ingroup collada
+ */
+
+#include <string>
+#include <map>
+#include <vector>
+#include <algorithm> // sort()
+
+#include "COLLADASaxFWLIErrorHandler.h"
+
+/** \brief Handler class for parser errors
+ */
+class ErrorHandler : public COLLADASaxFWL::IErrorHandler
+{
+public:
+ /** Constructor. */
+ ErrorHandler();
+
+ /** Destructor. */
+ virtual ~ErrorHandler();
+ /** handle any error thrown by the parser. */
+ bool virtual handleError(const COLLADASaxFWL::IError* error);
+ /** True if there was an error during parsing. */
+ bool hasError() { return mError; }
+private:
+ /** Disable default copy ctor. */
+ ErrorHandler( const ErrorHandler& pre );
+ /** Disable default assignment operator. */
+ const ErrorHandler& operator= ( const ErrorHandler& pre );
+ /** Hold error status. */
+ bool mError;
+};
+
diff --git a/source/blender/collada/ExportSettings.cpp b/source/blender/collada/ExportSettings.cpp
new file mode 100644
index 00000000000..19f1c05ddcf
--- /dev/null
+++ b/source/blender/collada/ExportSettings.cpp
@@ -0,0 +1,29 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/collada/ExportSettings.cpp
+ * \ingroup collada
+ */
+
+#include "ExportSettings.h"
diff --git a/source/blender/collada/ExportSettings.h b/source/blender/collada/ExportSettings.h
new file mode 100644
index 00000000000..2636ca88a23
--- /dev/null
+++ b/source/blender/collada/ExportSettings.h
@@ -0,0 +1,39 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file ExportSettings.h
+ * \ingroup collada
+ */
+
+#ifndef __EXPORTSETTINGS_H__
+#define __EXPORTSETTINGS_H__
+
+struct ExportSettings
+{
+ public:
+ bool selected;
+ char *filepath;
+};
+
+#endif
diff --git a/source/blender/collada/ExtraTags.cpp b/source/blender/collada/ExtraTags.cpp
index 653d4a377cd..f0c6d2228b1 100644
--- a/source/blender/collada/ExtraTags.cpp
+++ b/source/blender/collada/ExtraTags.cpp
@@ -90,32 +90,28 @@ std::string ExtraTags::asString( std::string tag, bool *ok)
void ExtraTags::setData(std::string tag, short *data)
{
bool ok = false;
- int tmp = 0;
- tmp = asInt(tag, &ok);
+ int tmp = asInt(tag, &ok);
if(ok)
*data = (short)tmp;
}
void ExtraTags::setData(std::string tag, int *data)
{
bool ok = false;
- int tmp = 0;
- tmp = asInt(tag, &ok);
+ int tmp = asInt(tag, &ok);
if(ok)
*data = tmp;
}
void ExtraTags::setData(std::string tag, float *data)
{
bool ok = false;
- float tmp = 0.0f;
- tmp = asFloat(tag, &ok);
+ float tmp = asFloat(tag, &ok);
if(ok)
*data = tmp;
}
void ExtraTags::setData(std::string tag, char *data)
{
bool ok = false;
- int tmp = 0;
- tmp = asInt(tag, &ok);
+ int tmp = asInt(tag, &ok);
if(ok)
*data = (char)tmp;
}
diff --git a/source/blender/collada/GeometryExporter.cpp b/source/blender/collada/GeometryExporter.cpp
index b724844b1ec..4da0a4c6e1f 100644
--- a/source/blender/collada/GeometryExporter.cpp
+++ b/source/blender/collada/GeometryExporter.cpp
@@ -44,16 +44,16 @@
#include "collada_internal.h"
// TODO: optimize UV sets by making indexed list with duplicates removed
-GeometryExporter::GeometryExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryGeometries(sw) {}
+GeometryExporter::GeometryExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings) : COLLADASW::LibraryGeometries(sw), export_settings(export_settings) {}
-void GeometryExporter::exportGeom(Scene *sce, bool export_selected)
+void GeometryExporter::exportGeom(Scene *sce)
{
openLibrary();
mScene = sce;
GeometryFunctor gf;
- gf.forEachMeshObjectInScene<GeometryExporter>(sce, *this, export_selected);
+ gf.forEachMeshObjectInScene<GeometryExporter>(sce, *this, this->export_settings->selected);
closeLibrary();
}
diff --git a/source/blender/collada/GeometryExporter.h b/source/blender/collada/GeometryExporter.h
index d9d265a66fc..64c51b6324e 100644
--- a/source/blender/collada/GeometryExporter.h
+++ b/source/blender/collada/GeometryExporter.h
@@ -42,6 +42,8 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "ExportSettings.h"
+
// TODO: optimize UV sets by making indexed list with duplicates removed
class GeometryExporter : COLLADASW::LibraryGeometries
{
@@ -58,9 +60,9 @@ class GeometryExporter : COLLADASW::LibraryGeometries
Scene *mScene;
public:
- GeometryExporter(COLLADASW::StreamWriter *sw);
+ GeometryExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings);
- void exportGeom(Scene *sce, bool export_selected);
+ void exportGeom(Scene *sce);
void operator()(Object *ob);
@@ -96,6 +98,8 @@ public:
/* int getTriCount(MFace *faces, int totface);*/
private:
std::set<std::string> exportedGeometry;
+
+ const ExportSettings *export_settings;
};
struct GeometryFunctor {
diff --git a/source/blender/collada/ImageExporter.cpp b/source/blender/collada/ImageExporter.cpp
index 8e426e9dba8..747f3c783d7 100644
--- a/source/blender/collada/ImageExporter.cpp
+++ b/source/blender/collada/ImageExporter.cpp
@@ -43,7 +43,7 @@
#include "BLI_path_util.h"
#include "BLI_string.h"
-ImagesExporter::ImagesExporter(COLLADASW::StreamWriter *sw, const char* filename) : COLLADASW::LibraryImages(sw), mfilename(filename)
+ImagesExporter::ImagesExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings) : COLLADASW::LibraryImages(sw), export_settings(export_settings)
{}
bool ImagesExporter::hasImages(Scene *sce)
@@ -71,12 +71,12 @@ bool ImagesExporter::hasImages(Scene *sce)
return false;
}
-void ImagesExporter::exportImages(Scene *sce, bool export_selected)
+void ImagesExporter::exportImages(Scene *sce)
{
if(hasImages(sce)) {
openLibrary();
MaterialFunctor mf;
- mf.forEachMaterialInScene<ImagesExporter>(sce, *this, export_selected);
+ mf.forEachMaterialInScene<ImagesExporter>(sce, *this, this->export_settings->selected);
closeLibrary();
}
@@ -97,7 +97,7 @@ void ImagesExporter::operator()(Material *ma, Object *ob)
char src[FILE_MAX];
char dir[FILE_MAX];
- BLI_split_dirfile(mfilename, dir, NULL);
+ BLI_split_dirfile(this->export_settings->filepath, dir, NULL);
BKE_rebase_path(abs, sizeof(abs), rel, sizeof(rel), G.main->name, image->name, dir);
diff --git a/source/blender/collada/ImageExporter.h b/source/blender/collada/ImageExporter.h
index 6b81c099259..9e5767fd9d3 100644
--- a/source/blender/collada/ImageExporter.h
+++ b/source/blender/collada/ImageExporter.h
@@ -40,17 +40,19 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "ExportSettings.h"
+
class ImagesExporter: COLLADASW::LibraryImages
{
- const char *mfilename;
- std::vector<std::string> mImages; // contains list of written images, to avoid duplicates
public:
- ImagesExporter(COLLADASW::StreamWriter *sw, const char* filename);
+ ImagesExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings);
- void exportImages(Scene *sce, bool export_selected);
+ void exportImages(Scene *sce);
void operator()(Material *ma, Object *ob);
private:
+ std::vector<std::string> mImages; // contains list of written images, to avoid duplicates
bool hasImages(Scene *sce);
+ const ExportSettings *export_settings;
};
#endif
diff --git a/source/blender/collada/LightExporter.cpp b/source/blender/collada/LightExporter.cpp
index 31ade5604a7..3d5814cb6db 100644
--- a/source/blender/collada/LightExporter.cpp
+++ b/source/blender/collada/LightExporter.cpp
@@ -52,13 +52,13 @@ void forEachLampObjectInScene(Scene *sce, Functor &f, bool export_selected)
}
}
-LightsExporter::LightsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryLights(sw){}
+LightsExporter::LightsExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings): COLLADASW::LibraryLights(sw), export_settings(export_settings) {}
-void LightsExporter::exportLights(Scene *sce, bool export_selected)
+void LightsExporter::exportLights(Scene *sce)
{
openLibrary();
- forEachLampObjectInScene(sce, *this, export_selected);
+ forEachLampObjectInScene(sce, *this, this->export_settings->selected);
closeLibrary();
}
diff --git a/source/blender/collada/LightExporter.h b/source/blender/collada/LightExporter.h
index 2ae1a19fdb1..6c52ed2b76d 100644
--- a/source/blender/collada/LightExporter.h
+++ b/source/blender/collada/LightExporter.h
@@ -37,14 +37,17 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "ExportSettings.h"
+
class LightsExporter: COLLADASW::LibraryLights
{
public:
- LightsExporter(COLLADASW::StreamWriter *sw);
- void exportLights(Scene *sce, bool export_selected);
+ LightsExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings);
+ void exportLights(Scene *sce);
void operator()(Object *ob);
private:
bool exportBlenderProfile(COLLADASW::Light &cla, Lamp *la);
+ const ExportSettings *export_settings;
};
#endif
diff --git a/source/blender/collada/MaterialExporter.cpp b/source/blender/collada/MaterialExporter.cpp
index 9d29177578d..37c1a6f6b68 100644
--- a/source/blender/collada/MaterialExporter.cpp
+++ b/source/blender/collada/MaterialExporter.cpp
@@ -33,15 +33,15 @@
#include "COLLADABUUtils.h"
#include "collada_internal.h"
-MaterialsExporter::MaterialsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryMaterials(sw){}
+MaterialsExporter::MaterialsExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings): COLLADASW::LibraryMaterials(sw), export_settings(export_settings) {}
-void MaterialsExporter::exportMaterials(Scene *sce, bool export_selected)
+void MaterialsExporter::exportMaterials(Scene *sce)
{
if(hasMaterials(sce)) {
openLibrary();
MaterialFunctor mf;
- mf.forEachMaterialInScene<MaterialsExporter>(sce, *this, export_selected);
+ mf.forEachMaterialInScene<MaterialsExporter>(sce, *this, this->export_settings->selected);
closeLibrary();
}
diff --git a/source/blender/collada/MaterialExporter.h b/source/blender/collada/MaterialExporter.h
index c080e4b0596..97a1e27358f 100644
--- a/source/blender/collada/MaterialExporter.h
+++ b/source/blender/collada/MaterialExporter.h
@@ -44,16 +44,18 @@
#include "GeometryExporter.h"
#include "collada_internal.h"
+#include "ExportSettings.h"
class MaterialsExporter: COLLADASW::LibraryMaterials
{
public:
- MaterialsExporter(COLLADASW::StreamWriter *sw);
- void exportMaterials(Scene *sce, bool export_selected);
+ MaterialsExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings);
+ void exportMaterials(Scene *sce);
void operator()(Material *ma, Object *ob);
private:
bool hasMaterials(Scene *sce);
+ const ExportSettings *export_settings;
};
// used in forEachMaterialInScene
diff --git a/source/blender/collada/MeshImporter.cpp b/source/blender/collada/MeshImporter.cpp
index 760fb2359a4..15bd9c48f12 100644
--- a/source/blender/collada/MeshImporter.cpp
+++ b/source/blender/collada/MeshImporter.cpp
@@ -221,7 +221,7 @@ void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
if (quad) uvs.getUV(indices[index + 3], mtface->uv[3]);
#ifdef COLLADA_DEBUG
- /*if (quad) {
+ if (quad) {
fprintf(stderr, "face uv:\n"
"((%d, %d, %d, %d))\n"
"((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n",
@@ -248,7 +248,7 @@ void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
mtface->uv[0][0], mtface->uv[0][1],
mtface->uv[1][0], mtface->uv[1][1],
mtface->uv[2][0], mtface->uv[2][1]);
- }*/
+ }
#endif
}
@@ -411,7 +411,7 @@ int MeshImporter::count_new_tris(COLLADAFW::Mesh *mesh, Mesh *me)
}
// TODO: import uv set names
-void MeshImporter::read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris) //TODO:: Refactor. Possibly replace by iterators
+void MeshImporter::read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris) //TODO:: Refactor. Possibly replace by iterators
{
unsigned int i;
@@ -587,7 +587,7 @@ void MeshImporter::read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris)
for (k = 0; k < index_list_array.getCount(); k++) {
// get mtface by face index and uv set index
MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, k);
- set_face_uv(&mtface[face_index], uvs, *index_list_array[k], index, mface->v4 != 0);
+ set_face_uv(&mtface[face_index], uvs, *index_list_array[k], index, vcount == 4);
}
#endif
@@ -796,7 +796,7 @@ MTFace *MeshImporter::assign_material_to_geom(COLLADAFW::MaterialBinding cmateri
std::multimap<COLLADAFW::UniqueId, COLLADAFW::UniqueId>::iterator it;
it=materials_mapped_to_geom.find(*geom_uid);
while(it!=materials_mapped_to_geom.end()) {
- if(it->second == ma_uid) return NULL; // do nothing if already found
+ if(it->second == ma_uid && it->first == *geom_uid) return NULL; // do nothing if already found
it++;
}
// first time we get geom_uid, ma_uid pair. Save for later check.
diff --git a/source/blender/collada/SceneExporter.cpp b/source/blender/collada/SceneExporter.cpp
new file mode 100644
index 00000000000..a561d18c6e3
--- /dev/null
+++ b/source/blender/collada/SceneExporter.cpp
@@ -0,0 +1,161 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/collada/SceneExporter.cpp
+ * \ingroup collada
+ */
+
+#include "SceneExporter.h"
+
+SceneExporter::SceneExporter(COLLADASW::StreamWriter *sw, ArmatureExporter *arm, const ExportSettings *export_settings)
+ : COLLADASW::LibraryVisualScenes(sw), arm_exporter(arm), export_settings(export_settings)
+{}
+
+void SceneExporter::exportScene(Scene *sce)
+{
+ // <library_visual_scenes> <visual_scene>
+ std::string id_naming = id_name(sce);
+ openVisualScene(translate_id(id_naming), id_naming);
+ exportHierarchy(sce);
+ closeVisualScene();
+ closeLibrary();
+}
+
+void SceneExporter::exportHierarchy(Scene *sce)
+{
+ Base *base= (Base*) sce->base.first;
+ while(base) {
+ Object *ob = base->object;
+
+ if (!ob->parent) {
+ if(sce->lay & ob->lay) {
+ switch(ob->type) {
+ case OB_MESH:
+ case OB_CAMERA:
+ case OB_LAMP:
+ case OB_ARMATURE:
+ case OB_EMPTY:
+ if (this->export_settings->selected && !(ob->flag & SELECT)) {
+ break;
+ }
+ // write nodes....
+ writeNodes(ob, sce);
+ break;
+ }
+ }
+ }
+
+ base= base->next;
+ }
+}
+
+void SceneExporter::writeNodes(Object *ob, Scene *sce)
+{
+ COLLADASW::Node node(mSW);
+ node.setNodeId(translate_id(id_name(ob)));
+ node.setType(COLLADASW::Node::NODE);
+
+ node.start();
+
+ bool is_skinned_mesh = arm_exporter->is_skinned_mesh(ob);
+
+ if (ob->type == OB_MESH && is_skinned_mesh)
+ // for skinned mesh we write obmat in <bind_shape_matrix>
+ TransformWriter::add_node_transform_identity(node);
+ else
+ TransformWriter::add_node_transform_ob(node, ob);
+
+ // <instance_geometry>
+ if (ob->type == OB_MESH) {
+ if (is_skinned_mesh) {
+ arm_exporter->add_instance_controller(ob);
+ }
+ else {
+ COLLADASW::InstanceGeometry instGeom(mSW);
+ instGeom.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob)));
+
+ InstanceWriter::add_material_bindings(instGeom.getBindMaterial(), ob);
+
+ instGeom.add();
+ }
+ }
+
+ // <instance_controller>
+ else if (ob->type == OB_ARMATURE) {
+ arm_exporter->add_armature_bones(ob, sce);
+
+ // XXX this looks unstable...
+ node.end();
+ }
+
+ // <instance_camera>
+ else if (ob->type == OB_CAMERA) {
+ COLLADASW::InstanceCamera instCam(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_camera_id(ob)));
+ instCam.add();
+ }
+
+ // <instance_light>
+ else if (ob->type == OB_LAMP) {
+ COLLADASW::InstanceLight instLa(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_light_id(ob)));
+ instLa.add();
+ }
+
+ // empty object
+ else if (ob->type == OB_EMPTY) { // TODO: handle groups (OB_DUPLIGROUP
+ if((ob->transflag & OB_DUPLIGROUP) == OB_DUPLIGROUP && ob->dup_group) {
+ GroupObject *go = NULL;
+ Group *gr = ob->dup_group;
+ /* printf("group detected '%s'\n", gr->id.name+2); */
+ for(go = (GroupObject*)(gr->gobject.first); go; go=go->next) {
+ printf("\t%s\n", go->ob->id.name);
+ }
+ }
+ }
+
+ // write nodes for child objects
+ Base *b = (Base*) sce->base.first;
+ while(b) {
+ // cob - child object
+ Object *cob = b->object;
+
+ if (cob->parent == ob) {
+ switch(cob->type) {
+ case OB_MESH:
+ case OB_CAMERA:
+ case OB_LAMP:
+ case OB_EMPTY:
+ case OB_ARMATURE:
+ // write node...
+ writeNodes(cob, sce);
+ break;
+ }
+ }
+
+ b = b->next;
+ }
+
+ if (ob->type != OB_ARMATURE)
+ node.end();
+}
+
diff --git a/source/blender/collada/SceneExporter.h b/source/blender/collada/SceneExporter.h
new file mode 100644
index 00000000000..919cba61ec0
--- /dev/null
+++ b/source/blender/collada/SceneExporter.h
@@ -0,0 +1,109 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file SceneExporter.h
+ * \ingroup collada
+ */
+
+#ifndef __SCENEEXPORTER_H__
+#define __SCENEEXPORTER_H__
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+
+extern "C" {
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+#include "DNA_group_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_image_types.h"
+#include "DNA_material_types.h"
+#include "DNA_texture_types.h"
+#include "DNA_anim_types.h"
+#include "DNA_action_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_userdef_types.h"
+
+#include "BKE_DerivedMesh.h"
+#include "BKE_fcurve.h"
+#include "BKE_animsys.h"
+#include "BLI_path_util.h"
+#include "BLI_fileops.h"
+#include "ED_keyframing.h"
+}
+
+#include "COLLADASWAsset.h"
+#include "COLLADASWLibraryVisualScenes.h"
+#include "COLLADASWNode.h"
+#include "COLLADASWSource.h"
+#include "COLLADASWInstanceGeometry.h"
+#include "COLLADASWInputList.h"
+#include "COLLADASWPrimitves.h"
+#include "COLLADASWVertices.h"
+#include "COLLADASWLibraryAnimations.h"
+#include "COLLADASWLibraryImages.h"
+#include "COLLADASWLibraryEffects.h"
+#include "COLLADASWImage.h"
+#include "COLLADASWEffectProfile.h"
+#include "COLLADASWColorOrTexture.h"
+#include "COLLADASWParamTemplate.h"
+#include "COLLADASWParamBase.h"
+#include "COLLADASWSurfaceInitOption.h"
+#include "COLLADASWSampler.h"
+#include "COLLADASWScene.h"
+#include "COLLADASWTechnique.h"
+#include "COLLADASWTexture.h"
+#include "COLLADASWLibraryMaterials.h"
+#include "COLLADASWBindMaterial.h"
+#include "COLLADASWInstanceCamera.h"
+#include "COLLADASWInstanceLight.h"
+#include "COLLADASWConstants.h"
+#include "COLLADASWLibraryControllers.h"
+#include "COLLADASWInstanceController.h"
+#include "COLLADASWInstanceNode.h"
+#include "COLLADASWBaseInputElement.h"
+
+#include "ArmatureExporter.h"
+
+#include "ExportSettings.h"
+
+class SceneExporter: COLLADASW::LibraryVisualScenes, protected TransformWriter, protected InstanceWriter
+{
+public:
+ SceneExporter(COLLADASW::StreamWriter *sw, ArmatureExporter *arm, const ExportSettings *export_settings);
+ void exportScene(Scene *sce);
+
+private:
+ void exportHierarchy(Scene *sce);
+ void writeNodes(Object *ob, Scene *sce);
+
+ ArmatureExporter *arm_exporter;
+ const ExportSettings *export_settings;
+};
+
+#endif
diff --git a/source/blender/collada/SkinInfo.cpp b/source/blender/collada/SkinInfo.cpp
index ce0d561c524..1d890415ebe 100644
--- a/source/blender/collada/SkinInfo.cpp
+++ b/source/blender/collada/SkinInfo.cpp
@@ -266,9 +266,9 @@ void SkinInfo::link_armature(bContext *C, Object *ob, std::map<COLLADAFW::Unique
// ^ bone index can be -1 meaning weight toward bind shape, how to express this in Blender?
// for each vertex in weight indices
- // for each bone index in vertex
- // add vertex to group at group index
- // treat group index -1 specially
+ // for each bone index in vertex
+ // add vertex to group at group index
+ // treat group index -1 specially
// get def group by index with BLI_findlink
diff --git a/source/blender/collada/TransformReader.cpp b/source/blender/collada/TransformReader.cpp
index 0fd0c85aa09..625a0220830 100644
--- a/source/blender/collada/TransformReader.cpp
+++ b/source/blender/collada/TransformReader.cpp
@@ -37,7 +37,6 @@ void TransformReader::get_node_mat(float mat[][4], COLLADAFW::Node *node, std::m
{
float cur[4][4];
float copy[4][4];
- float eul[3];
unit_m4(mat);
diff --git a/source/blender/collada/TransformWriter.cpp b/source/blender/collada/TransformWriter.cpp
index 7bad9bdeba7..88ed112c3fe 100644
--- a/source/blender/collada/TransformWriter.cpp
+++ b/source/blender/collada/TransformWriter.cpp
@@ -50,7 +50,7 @@ void TransformWriter::add_node_transform(COLLADASW::Node& node, float mat[][4],
double dmat[4][4];
UnitConverter* converter = new UnitConverter();
- converter->mat4_to_dae_double(dmat,local);
+ converter->mat4_to_dae_double(dmat,local);
TransformBase::decompose(local, loc, rot, NULL, scale);
if ( node.getType() == COLLADASW::Node::JOINT)
diff --git a/source/blender/collada/collada.cpp b/source/blender/collada/collada.cpp
index c15e608c360..8059b1cf3ff 100644
--- a/source/blender/collada/collada.cpp
+++ b/source/blender/collada/collada.cpp
@@ -30,6 +30,7 @@
/* COLLADABU_ASSERT, may be able to remove later */
#include "COLLADABUPlatform.h"
+#include "ExportSettings.h"
#include "DocumentExporter.h"
#include "DocumentImporter.h"
@@ -46,14 +47,17 @@ extern "C"
int collada_import(bContext *C, const char *filepath)
{
DocumentImporter imp (C, filepath);
- imp.import();
+ if(imp.import()) return 1;
- return 1;
+ return 0;
}
int collada_export(Scene *sce, const char *filepath, int selected)
{
- DocumentExporter exp;
+ ExportSettings export_settings;
+
+ export_settings.selected = selected != 0;
+ export_settings.filepath = (char *)filepath;
/* annoying, collada crashes if file cant be created! [#27162] */
if(!BLI_exist(filepath)) {
@@ -64,7 +68,8 @@ extern "C"
}
/* end! */
- exp.exportCurrentScene(sce, filepath, selected);
+ DocumentExporter exporter(&export_settings);
+ exporter.exportCurrentScene(sce);
return 1;
}
diff --git a/source/blender/editors/animation/anim_channels_defines.c b/source/blender/editors/animation/anim_channels_defines.c
index bdc654ff25a..276765bf96e 100644
--- a/source/blender/editors/animation/anim_channels_defines.c
+++ b/source/blender/editors/animation/anim_channels_defines.c
@@ -121,7 +121,7 @@ static void acf_generic_root_backdrop(bAnimContext *ac, bAnimListElem *ale, floa
glColor3fv(color);
/* rounded corners on LHS only - top only when expanded, but bottom too when collapsed */
- uiSetRoundBox((expanded)? (1):(1|8));
+ uiSetRoundBox(expanded ? UI_CNR_TOP_LEFT : (UI_CNR_TOP_LEFT | UI_CNR_BOTTOM_LEFT));
uiDrawBox(GL_POLYGON, offset, yminc, v2d->cur.xmax+EXTRA_SCROLL_PAD, ymaxc, 8);
}
@@ -401,7 +401,7 @@ static void acf_summary_backdrop(bAnimContext *ac, bAnimListElem *ale, float ymi
* - top and bottom
* - special hack: make the top a bit higher, since we are first...
*/
- uiSetRoundBox((1|8));
+ uiSetRoundBox(UI_CNR_TOP_LEFT | UI_CNR_BOTTOM_LEFT);
uiDrawBox(GL_POLYGON, 0, yminc-2, v2d->cur.xmax+EXTRA_SCROLL_PAD, ymaxc, 8);
}
@@ -756,7 +756,7 @@ static void acf_group_backdrop(bAnimContext *ac, bAnimListElem *ale, float yminc
glColor3fv(color);
/* rounded corners on LHS only - top only when expanded, but bottom too when collapsed */
- uiSetRoundBox((expanded)? (1):(1|8));
+ uiSetRoundBox(expanded ? UI_CNR_TOP_LEFT : (UI_CNR_TOP_LEFT | UI_CNR_BOTTOM_LEFT));
uiDrawBox(GL_POLYGON, offset, yminc, v2d->cur.xmax+EXTRA_SCROLL_PAD, ymaxc, 8);
}
diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c
index 8010a41ccb3..bb710a32794 100644
--- a/source/blender/editors/animation/anim_filter.c
+++ b/source/blender/editors/animation/anim_filter.c
@@ -1177,29 +1177,34 @@ static size_t animfilter_nla (bAnimContext *UNUSED(ac), ListBase *anim_data, bDo
/* determine what animation data from AnimData block should get displayed */
static size_t animfilter_block_data (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, ID *id, int filter_mode)
{
- IdAdtTemplate *iat = (IdAdtTemplate*)id;
AnimData *adt = BKE_animdata_from_id(id);
size_t items = 0;
-
- /* NOTE: this macro is used instead of inlining the logic here, since this sort of filtering is still needed
- * in a few places in he rest of the code still - notably for the few cases where special mode-based
- * different types of data expanders are required.
- */
- ANIMDATA_FILTER_CASES(iat,
- { /* AnimData */
- /* specifically filter animdata block */
- ANIMCHANNEL_NEW_CHANNEL(adt, ANIMTYPE_ANIMDATA, id);
- },
- { /* NLA */
- items += animfilter_nla(ac, anim_data, ads, adt, filter_mode, id);
- },
- { /* Drivers */
- items += animfilter_fcurves(anim_data, ads, adt->drivers.first, NULL, filter_mode, id);
- },
- { /* Keyframes */
- items += animfilter_action(ac, anim_data, ads, adt->action, filter_mode, id);
- });
-
+
+ /* image object datablocks have no anim-data so check for NULL */
+ if(adt) {
+ IdAdtTemplate *iat = (IdAdtTemplate*)id;
+
+ /* NOTE: this macro is used instead of inlining the logic here, since this sort of filtering is still needed
+ * in a few places in he rest of the code still - notably for the few cases where special mode-based
+ * different types of data expanders are required.
+ */
+ ANIMDATA_FILTER_CASES(iat,
+ { /* AnimData */
+ /* specifically filter animdata block */
+ ANIMCHANNEL_NEW_CHANNEL(adt, ANIMTYPE_ANIMDATA, id);
+ },
+ { /* NLA */
+ items += animfilter_nla(ac, anim_data, ads, adt, filter_mode, id);
+ },
+ { /* Drivers */
+ items += animfilter_fcurves(anim_data, ads, adt->drivers.first, NULL, filter_mode, id);
+ },
+ { /* Keyframes */
+ items += animfilter_action(ac, anim_data, ads, adt->action, filter_mode, id);
+ }
+ );
+ }
+
return items;
}
diff --git a/source/blender/editors/animation/anim_ops.c b/source/blender/editors/animation/anim_ops.c
index 554df7eb0e0..3cb4cbe30c4 100644
--- a/source/blender/editors/animation/anim_ops.c
+++ b/source/blender/editors/animation/anim_ops.c
@@ -42,6 +42,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BKE_sound.h"
#include "UI_view2d.h"
@@ -77,6 +78,7 @@ static int change_frame_poll(bContext *C)
/* Set the new frame number */
static void change_frame_apply(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
/* set the new frame number */
@@ -85,7 +87,7 @@ static void change_frame_apply(bContext *C, wmOperator *op)
SUBFRA = 0.f;
/* do updates */
- sound_seek_scene(C);
+ sound_seek_scene(bmain, scene);
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
}
diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c
index 33d0556cda9..8f6f7c6fac6 100644
--- a/source/blender/editors/animation/keyframing.c
+++ b/source/blender/editors/animation/keyframing.c
@@ -532,7 +532,8 @@ static short visualkey_can_use (PointerRNA *ptr, PropertyRNA *prop)
{
bConstraint *con= NULL;
short searchtype= VISUALKEY_NONE;
- char *identifier= NULL;
+ short has_parent = FALSE;
+ const char *identifier= NULL;
/* validate data */
// TODO: this check is probably not needed, but it won't hurt
@@ -549,33 +550,46 @@ static short visualkey_can_use (PointerRNA *ptr, PropertyRNA *prop)
Object *ob= (Object *)ptr->data;
con= ob->constraints.first;
- identifier= (char *)RNA_property_identifier(prop);
+ identifier= RNA_property_identifier(prop);
+ has_parent= (ob->parent != NULL);
}
else if (ptr->type == &RNA_PoseBone) {
/* Pose Channel */
bPoseChannel *pchan= (bPoseChannel *)ptr->data;
con= pchan->constraints.first;
- identifier= (char *)RNA_property_identifier(prop);
+ identifier= RNA_property_identifier(prop);
+ has_parent= (pchan->parent != NULL);
}
/* check if any data to search using */
- if (ELEM(NULL, con, identifier))
+ if (ELEM(NULL, con, identifier) && (has_parent == FALSE))
return 0;
/* location or rotation identifiers only... */
- if (strstr(identifier, "location"))
+ if(identifier == NULL) {
+ printf("%s failed: NULL identifier\n", __func__);
+ return 0;
+ }
+ else if (strstr(identifier, "location")) {
searchtype= VISUALKEY_LOC;
- else if (strstr(identifier, "rotation"))
+ }
+ else if (strstr(identifier, "rotation")) {
searchtype= VISUALKEY_ROT;
+ }
else {
- printf("visualkey_can_use() failed: identifier - '%s' \n", identifier);
+ printf("%s failed: identifier - '%s' \n", __func__, identifier);
return 0;
}
/* only search if a searchtype and initial constraint are available */
- if (searchtype && con) {
+ if (searchtype) {
+ /* parent is always matching */
+ if (has_parent)
+ return 1;
+
+ /* constraints */
for (; con; con= con->next) {
/* only consider constraint if it is not disabled, and has influence */
if (con->flag & CONSTRAINT_DISABLE) continue;
@@ -647,39 +661,34 @@ static float visualkey_get_value (PointerRNA *ptr, PropertyRNA *prop, int array_
if (ptr->type == &RNA_Object) {
Object *ob= (Object *)ptr->data;
- /* parented objects are not supported, as the effects of the parent
- * are included in the matrix, which kindof beats the point
- */
- if (ob->parent == NULL) {
- /* only Location or Rotation keyframes are supported now */
- if (strstr(identifier, "location")) {
- return ob->obmat[3][array_index];
- }
- else if (strstr(identifier, "rotation_euler")) {
- float eul[3];
-
- mat4_to_eulO(eul, ob->rotmode, ob->obmat);
- return eul[array_index];
- }
- else if (strstr(identifier, "rotation_quaternion")) {
- float trimat[3][3], quat[4];
-
- copy_m3_m4(trimat, ob->obmat);
- mat3_to_quat_is_ok(quat, trimat);
-
- return quat[array_index];
- }
- else if (strstr(identifier, "rotation_axis_angle")) {
- float axis[3], angle;
-
- mat4_to_axis_angle(axis, &angle, ob->obmat);
-
- /* w = 0, x,y,z = 1,2,3 */
- if (array_index == 0)
- return angle;
- else
- return axis[array_index - 1];
- }
+ /* only Location or Rotation keyframes are supported now */
+ if (strstr(identifier, "location")) {
+ return ob->obmat[3][array_index];
+ }
+ else if (strstr(identifier, "rotation_euler")) {
+ float eul[3];
+
+ mat4_to_eulO(eul, ob->rotmode, ob->obmat);
+ return eul[array_index];
+ }
+ else if (strstr(identifier, "rotation_quaternion")) {
+ float trimat[3][3], quat[4];
+
+ copy_m3_m4(trimat, ob->obmat);
+ mat3_to_quat_is_ok(quat, trimat);
+
+ return quat[array_index];
+ }
+ else if (strstr(identifier, "rotation_axis_angle")) {
+ float axis[3], angle;
+
+ mat4_to_axis_angle(axis, &angle, ob->obmat);
+
+ /* w = 0, x,y,z = 1,2,3 */
+ if (array_index == 0)
+ return angle;
+ else
+ return axis[array_index - 1];
}
}
else if (ptr->type == &RNA_PoseBone) {
diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c
index 3709c672ec0..e7ccd8a346b 100644
--- a/source/blender/editors/armature/editarmature.c
+++ b/source/blender/editors/armature/editarmature.c
@@ -645,7 +645,7 @@ static void applyarmature_fix_boneparents (Scene *scene, Object *armob)
static int apply_armature_pose2bones_exec (bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C)); // must be active object, not edit-object
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C)); // must be active object, not edit-object
bArmature *arm= get_armature(ob);
bPose *pose;
bPoseChannel *pchan;
@@ -747,7 +747,7 @@ void POSE_OT_armature_apply (wmOperatorType *ot)
/* set the current pose as the restpose */
static int pose_visual_transform_apply_exec (bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C)); // must be active object, not edit-object
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C)); // must be active object, not edit-object
/* don't check if editmode (should be done by caller) */
if (ob->type!=OB_ARMATURE)
@@ -4888,7 +4888,7 @@ static int pose_clear_transform_generic_exec(bContext *C, wmOperator *op,
void (*clear_func)(bPoseChannel*), const char default_ksName[])
{
Scene *scene= CTX_data_scene(C);
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
short autokey = 0;
/* sanity checks */
@@ -5115,7 +5115,7 @@ void POSE_OT_select_all(wmOperatorType *ot)
static int pose_select_parent_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
bPoseChannel *pchan,*parent;
/* Determine if there is an active bone */
@@ -5191,7 +5191,7 @@ static int hide_unselected_pose_bone_cb(Object *ob, Bone *bone, void *UNUSED(ptr
/* active object is armature in posemode, poll checked */
static int pose_hide_exec(bContext *C, wmOperator *op)
{
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
bArmature *arm= ob->data;
if(RNA_boolean_get(op->ptr, "unselected"))
@@ -5240,7 +5240,7 @@ static int show_pose_bone_cb(Object *ob, Bone *bone, void *UNUSED(ptr))
/* active object is armature in posemode, poll checked */
static int pose_reveal_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
bArmature *arm= ob->data;
bone_looper(ob, arm->bonebase.first, NULL, show_pose_bone_cb);
diff --git a/source/blender/editors/armature/editarmature_sketch.c b/source/blender/editors/armature/editarmature_sketch.c
index 20f1c72ed9e..b238ae3c0c0 100644
--- a/source/blender/editors/armature/editarmature_sketch.c
+++ b/source/blender/editors/armature/editarmature_sketch.c
@@ -411,10 +411,10 @@ static ReebNode *sk_pointToNode(SK_Point *pt, float imat[][4], float tmat[][3])
ReebNode *node;
node = MEM_callocN(sizeof(ReebNode), "reeb node");
- VECCOPY(node->p, pt->p);
+ copy_v3_v3(node->p, pt->p);
mul_m4_v3(imat, node->p);
- VECCOPY(node->no, pt->no);
+ copy_v3_v3(node->no, pt->no);
mul_m3_v3(tmat, node->no);
return node;
@@ -434,10 +434,10 @@ static ReebArc *sk_strokeToArc(SK_Stroke *stk, float imat[][4], float tmat[][3])
for (i = 0; i < arc->bcount; i++)
{
- VECCOPY(arc->buckets[i].p, stk->points[i + 1].p);
+ copy_v3_v3(arc->buckets[i].p, stk->points[i + 1].p);
mul_m4_v3(imat, arc->buckets[i].p);
- VECCOPY(arc->buckets[i].no, stk->points[i + 1].no);
+ copy_v3_v3(arc->buckets[i].no, stk->points[i + 1].no);
mul_m3_v3(tmat, arc->buckets[i].no);
}
@@ -1804,8 +1804,8 @@ void sk_applyCutGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED
pt.type = PT_EXACT;
pt.mode = PT_PROJECT; /* take mode from neighbouring points */
- VECCOPY(pt.p, isect->p);
- VECCOPY(pt.no, isect->stroke->points[isect->before].no);
+ copy_v3_v3(pt.p, isect->p);
+ copy_v3_v3(pt.no, isect->stroke->points[isect->before].no);
sk_insertStrokePoint(isect->stroke, &pt, isect->after);
}
@@ -1846,8 +1846,8 @@ void sk_applyTrimGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSE
pt.type = PT_EXACT;
pt.mode = PT_PROJECT; /* take mode from neighbouring points */
- VECCOPY(pt.p, isect->p);
- VECCOPY(pt.no, isect->stroke->points[isect->before].no);
+ copy_v3_v3(pt.p, isect->p);
+ copy_v3_v3(pt.no, isect->stroke->points[isect->before].no);
sub_v3_v3v3(stroke_dir, isect->stroke->points[isect->after].p, isect->stroke->points[isect->before].p);
diff --git a/source/blender/editors/armature/meshlaplacian.c b/source/blender/editors/armature/meshlaplacian.c
index b99605e65c1..48ca6d6fd72 100644
--- a/source/blender/editors/armature/meshlaplacian.c
+++ b/source/blender/editors/armature/meshlaplacian.c
@@ -518,7 +518,7 @@ static float heat_source_distance(LaplacianSystem *sys, int vertex, int source)
dist= normalize_v3(d);
/* if the vertex normal does not point along the bone, increase distance */
- cosine= INPR(d, sys->heat.vnors[vertex]);
+ cosine= dot_v3v3(d, sys->heat.vnors[vertex]);
return dist/(0.5f*(cosine + 1.001f));
}
@@ -1120,7 +1120,7 @@ static int meshdeform_tri_intersect(float orig[3], float end[3], float vert0[3],
cross_v3_v3v3(pvec, dir, edge2);
/* if determinant is near zero, ray lies in plane of triangle */
- det = INPR(edge1, pvec);
+ det = dot_v3v3(edge1, pvec);
if (det == 0.0f)
return 0;
@@ -1130,7 +1130,7 @@ static int meshdeform_tri_intersect(float orig[3], float end[3], float vert0[3],
sub_v3_v3v3(tvec, orig, vert0);
/* calculate U parameter and test bounds */
- u = INPR(tvec, pvec) * inv_det;
+ u = dot_v3v3(tvec, pvec) * inv_det;
if (u < -EPSILON || u > 1.0f+EPSILON)
return 0;
@@ -1138,7 +1138,7 @@ static int meshdeform_tri_intersect(float orig[3], float end[3], float vert0[3],
cross_v3_v3v3(qvec, tvec, edge1);
/* calculate V parameter and test bounds */
- v = INPR(dir, qvec) * inv_det;
+ v = dot_v3v3(dir, qvec) * inv_det;
if (v < -EPSILON || u + v > 1.0f+EPSILON)
return 0;
@@ -1153,10 +1153,10 @@ static int meshdeform_tri_intersect(float orig[3], float end[3], float vert0[3],
/* check if it is within the length of the line segment */
sub_v3_v3v3(isectdir, isectco, orig);
- if(INPR(dir, isectdir) < -EPSILON)
+ if(dot_v3v3(dir, isectdir) < -EPSILON)
return 0;
- if(INPR(dir, dir) + EPSILON < INPR(isectdir, isectdir))
+ if(dot_v3v3(dir, dir) + EPSILON < dot_v3v3(isectdir, isectdir))
return 0;
return 1;
@@ -1202,7 +1202,7 @@ static int meshdeform_intersect(MeshDeformBind *mdb, MeshDeformIsect *isec)
if(len < isec->labda) {
isec->labda= len;
isec->face = mface;
- isec->isect= (INPR(isec->vec, nor) <= 0.0f);
+ isec->isect= (dot_v3v3(isec->vec, nor) <= 0.0f);
is= 1;
}
}
diff --git a/source/blender/editors/armature/poseSlide.c b/source/blender/editors/armature/poseSlide.c
index 1ee0c3c64ac..c6927de0f87 100644
--- a/source/blender/editors/armature/poseSlide.c
+++ b/source/blender/editors/armature/poseSlide.c
@@ -53,6 +53,7 @@
#include "BKE_fcurve.h"
#include "BKE_context.h"
+#include "BKE_object.h"
#include "BKE_report.h"
#include "RNA_access.h"
@@ -131,7 +132,7 @@ static int pose_slide_init (bContext *C, wmOperator *op, short mode)
/* get info from context */
pso->scene= CTX_data_scene(C);
- pso->ob= ED_object_pose_armature(CTX_data_active_object(C));
+ pso->ob= object_pose_armature_get(CTX_data_active_object(C));
pso->arm= (pso->ob)? pso->ob->data : NULL;
pso->sa= CTX_wm_area(C); /* only really needed when doing modal() */
pso->ar= CTX_wm_region(C); /* only really needed when doing modal() */
@@ -1166,7 +1167,7 @@ static void pose_propagate_fcurve (wmOperator *op, Object *ob, FCurve *fcu,
static int pose_propagate_exec (bContext *C, wmOperator *op)
{
Scene *scene = CTX_data_scene(C);
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
bAction *act= (ob && ob->adt)? ob->adt->action : NULL;
ListBase pflinks = {NULL, NULL};
diff --git a/source/blender/editors/armature/poselib.c b/source/blender/editors/armature/poselib.c
index 1d6ec1685b2..61435602446 100644
--- a/source/blender/editors/armature/poselib.c
+++ b/source/blender/editors/armature/poselib.c
@@ -56,6 +56,7 @@
#include "BKE_depsgraph.h"
#include "BKE_idprop.h"
#include "BKE_library.h"
+#include "BKE_object.h"
#include "BKE_context.h"
#include "BKE_report.h"
@@ -172,7 +173,7 @@ static Object *get_poselib_object (bContext *C)
if (sa && (sa->spacetype == SPACE_BUTS))
return CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- return ED_object_pose_armature(CTX_data_active_object(C));
+ return object_pose_armature_get(CTX_data_active_object(C));
}
/* Poll callback for operators that require existing PoseLib data (with poses) to work */
@@ -634,7 +635,7 @@ static int poselib_rename_invoke (bContext *C, wmOperator *op, wmEvent *evt)
static int poselib_rename_exec (bContext *C, wmOperator *op)
{
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
bAction *act= (ob) ? ob->poselib : NULL;
TimeMarker *marker;
char newname[64];
diff --git a/source/blender/editors/armature/poseobject.c b/source/blender/editors/armature/poseobject.c
index da66d6fcfbb..1c4740a7c4d 100644
--- a/source/blender/editors/armature/poseobject.c
+++ b/source/blender/editors/armature/poseobject.c
@@ -60,6 +60,7 @@
#include "BKE_depsgraph.h"
#include "BKE_fcurve.h"
#include "BKE_modifier.h"
+#include "BKE_object.h"
#include "BKE_report.h"
@@ -80,36 +81,6 @@
#include "armature_intern.h"
-static int object_pose_context(Object *ob)
-{
- if( (ob) &&
- (ob->type == OB_ARMATURE) &&
- (ob->pose) &&
- (ob->mode & OB_MODE_POSE)
- ) {
- return 1;
- }
- else {
- return 0;
- }
-}
-
-Object *ED_object_pose_armature(Object *ob)
-{
- if(ob==NULL)
- return NULL;
-
- if(object_pose_context(ob))
- return ob;
-
- ob= modifiers_isDeformedByArmature(ob);
-
- if(object_pose_context(ob))
- return ob;
-
- return NULL;
-}
-
/* This function is used to process the necessary updates for */
void ED_armature_enter_posemode(bContext *C, Base *base)
{
@@ -240,7 +211,7 @@ static int pose_calculate_paths_exec (bContext *C, wmOperator *UNUSED(op))
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= ED_object_pose_armature(CTX_data_active_object(C));
+ ob= object_pose_armature_get(CTX_data_active_object(C));
if (ELEM(NULL, ob, ob->pose))
return OPERATOR_CANCELLED;
@@ -316,7 +287,7 @@ static int pose_clear_paths_exec (bContext *C, wmOperator *UNUSED(op))
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= ED_object_pose_armature(CTX_data_active_object(C));
+ ob= object_pose_armature_get(CTX_data_active_object(C));
/* only continue if there's an object */
if ELEM(NULL, ob, ob->pose)
@@ -350,7 +321,7 @@ void POSE_OT_paths_clear (wmOperatorType *ot)
static int pose_select_constraint_target_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
bConstraint *con;
int found= 0;
@@ -410,7 +381,7 @@ void POSE_OT_select_constraint_target(wmOperatorType *ot)
static int pose_select_hierarchy_exec(bContext *C, wmOperator *op)
{
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
bArmature *arm= ob->data;
Bone *curbone, *pabone, *chbone;
int direction = RNA_enum_get(op->ptr, "direction");
@@ -648,7 +619,7 @@ static int pose_select_same_keyingset(bContext *C, Object *ob, short extend)
static int pose_select_grouped_exec (bContext *C, wmOperator *op)
{
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
short extend= RNA_boolean_get(op->ptr, "extend");
short changed = 0;
@@ -715,7 +686,7 @@ void POSE_OT_select_grouped (wmOperatorType *ot)
static int pose_bone_flip_active_exec (bContext *C, wmOperator *UNUSED(op))
{
Object *ob_act= CTX_data_active_object(C);
- Object *ob= ED_object_pose_armature(ob_act);
+ Object *ob= object_pose_armature_get(ob_act);
if(ob && (ob->mode & OB_MODE_POSE)) {
bArmature *arm= ob->data;
@@ -1137,7 +1108,7 @@ static bPoseChannel *pose_bone_do_paste (Object *ob, bPoseChannel *chan, short s
static int pose_copy_exec (bContext *C, wmOperator *op)
{
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
/* sanity checking */
if ELEM(NULL, ob, ob->pose) {
@@ -1175,7 +1146,7 @@ void POSE_OT_copy (wmOperatorType *ot)
static int pose_paste_exec (bContext *C, wmOperator *op)
{
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
Scene *scene= CTX_data_scene(C);
bPoseChannel *chan;
int flip= RNA_boolean_get(op->ptr, "flipped");
@@ -1274,7 +1245,7 @@ static int pose_group_add_exec (bContext *C, wmOperator *UNUSED(op))
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= ED_object_pose_armature(CTX_data_active_object(C));
+ ob= object_pose_armature_get(CTX_data_active_object(C));
/* only continue if there's an object */
if (ob == NULL)
@@ -1314,7 +1285,7 @@ static int pose_group_remove_exec (bContext *C, wmOperator *UNUSED(op))
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= ED_object_pose_armature(CTX_data_active_object(C));
+ ob= object_pose_armature_get(CTX_data_active_object(C));
/* only continue if there's an object */
if (ob == NULL)
@@ -1362,7 +1333,7 @@ static int pose_groups_menu_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= ED_object_pose_armature(CTX_data_active_object(C));
+ ob= object_pose_armature_get(CTX_data_active_object(C));
/* only continue if there's an object, and a pose there too */
if (ELEM(NULL, ob, ob->pose))
@@ -1411,7 +1382,7 @@ static int pose_group_assign_exec (bContext *C, wmOperator *op)
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= ED_object_pose_armature(CTX_data_active_object(C));
+ ob= object_pose_armature_get(CTX_data_active_object(C));
/* only continue if there's an object, and a pose there too */
if (ELEM(NULL, ob, ob->pose))
@@ -1474,7 +1445,7 @@ static int pose_group_unassign_exec (bContext *C, wmOperator *UNUSED(op))
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= ED_object_pose_armature(CTX_data_active_object(C));
+ ob= object_pose_armature_get(CTX_data_active_object(C));
/* only continue if there's an object, and a pose there too */
if (ELEM(NULL, ob, ob->pose))
@@ -1709,7 +1680,7 @@ static int pose_group_select_exec (bContext *C, wmOperator *UNUSED(op))
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= ED_object_pose_armature(CTX_data_active_object(C));
+ ob= object_pose_armature_get(CTX_data_active_object(C));
/* only continue if there's an object, and a pose there too */
if (ELEM(NULL, ob, ob->pose))
@@ -1747,7 +1718,7 @@ static int pose_group_deselect_exec (bContext *C, wmOperator *UNUSED(op))
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= ED_object_pose_armature(CTX_data_active_object(C));
+ ob= object_pose_armature_get(CTX_data_active_object(C));
/* only continue if there's an object, and a pose there too */
if (ELEM(NULL, ob, ob->pose))
@@ -1780,7 +1751,7 @@ void POSE_OT_group_deselect (wmOperatorType *ot)
static int pose_flip_names_exec (bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
bArmature *arm;
/* paranoia checks */
@@ -1825,7 +1796,7 @@ void POSE_OT_flip_names (wmOperatorType *ot)
static int pose_autoside_names_exec (bContext *C, wmOperator *op)
{
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
bArmature *arm;
char newname[32];
short axis= RNA_enum_get(op->ptr, "axis");
@@ -1929,7 +1900,7 @@ static int pose_armature_layers_showall_poll (bContext *C)
static int pose_armature_layers_showall_exec (bContext *C, wmOperator *op)
{
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
bArmature *arm = (ob)? ob->data : NULL;
PointerRNA ptr;
int maxLayers = (RNA_boolean_get(op->ptr, "all"))? 32 : 16;
@@ -1981,7 +1952,7 @@ void ARMATURE_OT_layers_show_all (wmOperatorType *ot)
/* Present a popup to get the layers that should be used */
static int pose_armature_layers_invoke (bContext *C, wmOperator *op, wmEvent *evt)
{
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
bArmature *arm= (ob)? ob->data : NULL;
PointerRNA ptr;
int layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
@@ -2002,7 +1973,7 @@ static int pose_armature_layers_invoke (bContext *C, wmOperator *op, wmEvent *ev
/* Set the visible layers for the active armature (edit and pose modes) */
static int pose_armature_layers_exec (bContext *C, wmOperator *op)
{
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
PointerRNA ptr;
int layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
@@ -2092,7 +2063,7 @@ static int pose_bone_layers_invoke (bContext *C, wmOperator *op, wmEvent *evt)
/* Set the visible layers for the active armature (edit and pose modes) */
static int pose_bone_layers_exec (bContext *C, wmOperator *op)
{
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
PointerRNA ptr;
int layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
@@ -2215,7 +2186,7 @@ void ARMATURE_OT_bone_layers (wmOperatorType *ot)
static int pose_flip_quats_exec (bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
KeyingSet *ks = ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
/* loop through all selected pchans, flipping and keying (as needed) */
diff --git a/source/blender/editors/curve/curve_ops.c b/source/blender/editors/curve/curve_ops.c
index 1c9ad8fe247..adf4f0fac2e 100644
--- a/source/blender/editors/curve/curve_ops.c
+++ b/source/blender/editors/curve/curve_ops.c
@@ -46,14 +46,12 @@
#include "WM_api.h"
#include "WM_types.h"
-#include "ED_curve.h"
#include "ED_object.h"
#include "ED_screen.h"
#include "ED_transform.h"
#include "curve_intern.h"
-
/************************* registration ****************************/
void ED_operatortypes_curve(void)
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index c5a7080db22..facd4e8a4a3 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -119,7 +119,7 @@ static float nurbcircle[8][2]= {
{0.0, 1.0}, { 1.0, 1.0}, { 1.0, 0.0}, { 1.0, -1.0}
};
-ListBase *curve_get_editcurve(Object *ob)
+ListBase *object_editcurve_get(Object *ob)
{
if(ob && ELEM(ob->type, OB_CURVE, OB_SURF)) {
Curve *cu= ob->data;
@@ -136,7 +136,7 @@ static void set_actNurb(Object *obedit, Nurb *nu)
if(nu==NULL)
cu->actnu = -1;
else {
- ListBase *nurbs= ED_curve_editnurbs(cu);
+ ListBase *nurbs= curve_editnurbs(cu);
cu->actnu = BLI_findindex(nurbs, nu);
}
}
@@ -144,7 +144,7 @@ static void set_actNurb(Object *obedit, Nurb *nu)
static Nurb *get_actNurb(Object *obedit)
{
Curve *cu= obedit->data;
- ListBase *nurbs= ED_curve_editnurbs(cu);
+ ListBase *nurbs= curve_editnurbs(cu);
return BLI_findlink(nurbs, cu->actnu);
}
@@ -270,7 +270,7 @@ static int isNurbsel_count(Curve *cu, Nurb *nu)
void printknots(Object *obedit)
{
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
Nurb *nu;
int a, num;
@@ -304,11 +304,6 @@ static CVKeyIndex *init_cvKeyIndex(void *cv, int key_index, int nu_index, int pt
return cvIndex;
}
-static void free_cvKeyIndex(CVKeyIndex *pointIndex)
-{
- MEM_freeN(pointIndex);
-}
-
static void init_editNurb_keyIndex(EditNurb *editnurb, ListBase *origBase)
{
Nurb *nu= editnurb->nurbs.first;
@@ -360,15 +355,6 @@ static void init_editNurb_keyIndex(EditNurb *editnurb, ListBase *origBase)
editnurb->keyindex= gh;
}
-static void free_editNurb_keyIndex(EditNurb *editnurb)
-{
- if (!editnurb->keyindex) {
- return;
- }
- BLI_ghash_free(editnurb->keyindex, NULL, (GHashValFreeFP)free_cvKeyIndex);
- editnurb->keyindex= NULL;
-}
-
static CVKeyIndex *getCVKeyIndex(EditNurb *editnurb, void *cv)
{
return BLI_ghash_lookup(editnurb->keyindex, cv);
@@ -413,7 +399,7 @@ static void keyIndex_delCV(EditNurb *editnurb, void *cv)
return;
}
- BLI_ghash_remove(editnurb->keyindex, cv, NULL, (GHashValFreeFP)free_cvKeyIndex);
+ BLI_ghash_remove(editnurb->keyindex, cv, NULL, (GHashValFreeFP)MEM_freeN);
}
static void keyIndex_delBezt(EditNurb *editnurb, BezTriple *bezt)
@@ -439,7 +425,7 @@ static void keyIndex_delNurb(EditNurb *editnurb, Nurb *nu)
a= nu->pntsu;
while (a--) {
- BLI_ghash_remove(editnurb->keyindex, bezt, NULL, (GHashValFreeFP)free_cvKeyIndex);
+ BLI_ghash_remove(editnurb->keyindex, bezt, NULL, (GHashValFreeFP)MEM_freeN);
++bezt;
}
} else {
@@ -447,7 +433,7 @@ static void keyIndex_delNurb(EditNurb *editnurb, Nurb *nu)
a= nu->pntsu * nu->pntsv;
while (a--) {
- BLI_ghash_remove(editnurb->keyindex, bp, NULL, (GHashValFreeFP)free_cvKeyIndex);
+ BLI_ghash_remove(editnurb->keyindex, bp, NULL, (GHashValFreeFP)MEM_freeN);
++bp;
}
}
@@ -1200,7 +1186,7 @@ int ED_curve_updateAnimPaths(Object *obedit)
/* load editNurb in object */
void load_editNurb(Object *obedit)
{
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
if(obedit==NULL) return;
@@ -1253,7 +1239,7 @@ void make_editNurb(Object *obedit)
if(editnurb) {
freeNurblist(&editnurb->nurbs);
- free_editNurb_keyIndex(editnurb);
+ free_curve_editNurb_keyIndex(editnurb);
editnurb->keyindex= NULL;
} else {
editnurb= MEM_callocN(sizeof(EditNurb), "editnurb");
@@ -1285,16 +1271,6 @@ void make_editNurb(Object *obedit)
}
}
-void free_curve_editNurb (Curve *cu)
-{
- if(cu->editnurb) {
- freeNurblist(&cu->editnurb->nurbs);
- free_editNurb_keyIndex(cu->editnurb);
- MEM_freeN(cu->editnurb);
- cu->editnurb= NULL;
- }
-}
-
void free_editNurb(Object *obedit)
{
Curve *cu= obedit->data;
@@ -1304,7 +1280,7 @@ void free_editNurb(Object *obedit)
void CU_deselect_all(Object *obedit)
{
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
if (editnurb) {
selectend_nurb(obedit, FIRST, 0, DESELECT); /* set first control points as unselected */
@@ -1314,7 +1290,7 @@ void CU_deselect_all(Object *obedit)
void CU_select_all(Object *obedit)
{
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
if (editnurb) {
selectend_nurb(obedit, FIRST, 0, SELECT); /* set first control points as unselected */
@@ -1324,7 +1300,7 @@ void CU_select_all(Object *obedit)
void CU_select_swap(Object *obedit)
{
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
if (editnurb) {
Curve *cu= obedit->data;
@@ -1399,7 +1375,7 @@ static int separate_exec(bContext *C, wmOperator *op)
make_editNurb(newob);
newedit= newcu->editnurb;
freeNurblist(&newedit->nurbs);
- free_editNurb_keyIndex(newedit);
+ free_curve_editNurb_keyIndex(newedit);
/* 3. move over parts from old object */
for(nu= oldedit->nurbs.first; nu; nu=nu1) {
@@ -1590,7 +1566,7 @@ static int deleteflagNurb(bContext *C, wmOperator *UNUSED(op), int flag)
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
Nurb *nu, *next;
BPoint *bp, *bpn, *newbp;
int a, b, newu, newv, sel;
@@ -1837,7 +1813,7 @@ static short extrudeflagNurb(EditNurb *editnurb, int flag)
static void adduplicateflagNurb(Object *obedit, short flag)
{
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
Nurb *nu, *newnu;
BezTriple *bezt, *bezt1;
BPoint *bp, *bp1;
@@ -2053,7 +2029,7 @@ void CURVE_OT_switch_direction(wmOperatorType *ot)
static int set_goal_weight_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
Nurb *nu;
BezTriple *bezt;
BPoint *bp;
@@ -2105,7 +2081,7 @@ void CURVE_OT_spline_weight_set(wmOperatorType *ot)
static int set_radius_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
Nurb *nu;
BezTriple *bezt;
BPoint *bp;
@@ -2157,7 +2133,7 @@ void CURVE_OT_radius_set(wmOperatorType *ot)
static int smooth_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
Nurb *nu;
BezTriple *bezt, *beztOrig;
BPoint *bp, *bpOrig;
@@ -2230,7 +2206,7 @@ void CURVE_OT_smooth(wmOperatorType *ot)
static int smooth_radius_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
Nurb *nu;
BezTriple *bezt;
BPoint *bp;
@@ -2463,7 +2439,7 @@ static void select_adjacent_cp(ListBase *editnurb, short next, short cont, short
/* selstatus: selection status in case doswap is false */
void selectend_nurb(Object *obedit, short selfirst, short doswap, short selstatus)
{
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
Nurb *nu;
BPoint *bp;
BezTriple *bezt;
@@ -2605,7 +2581,7 @@ static short nurb_has_selected_cps(ListBase *editnurb)
static int de_select_all_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
int action = RNA_enum_get(op->ptr, "action");
if (action == SEL_TOGGLE) {
@@ -2654,7 +2630,7 @@ static int hide_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
Nurb *nu;
BPoint *bp;
BezTriple *bezt;
@@ -2727,7 +2703,7 @@ void CURVE_OT_hide(wmOperatorType *ot)
static int reveal_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
Nurb *nu;
BPoint *bp;
BezTriple *bezt;
@@ -2785,7 +2761,7 @@ static int select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
Nurb *nu;
BPoint *bp;
BezTriple *bezt;
@@ -3544,7 +3520,7 @@ void ED_nurb_set_spline_type(Nurb *nu, int type)
static int set_spline_type_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
Nurb *nu;
int changed=0, type= RNA_enum_get(op->ptr, "type");
@@ -3608,7 +3584,7 @@ void CURVE_OT_spline_type_set(wmOperatorType *ot)
static int set_handle_type_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
sethandlesNurb(editnurb, RNA_enum_get(op->ptr, "type"));
@@ -3930,7 +3906,7 @@ static void merge_2_nurb(wmOperator *op, ListBase *editnurb, Nurb *nu1, Nurb *nu
static int merge_nurb(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
NurbSort *nus1, *nus2;
int ok= 1;
@@ -3986,7 +3962,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
/* joins 2 curves */
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
- ListBase *nubase= curve_get_editcurve(obedit);
+ ListBase *nubase= object_editcurve_get(obedit);
Nurb *nu, *nu1=NULL, *nu2=NULL;
BPoint *bp;
float *fp, offset;
@@ -4182,7 +4158,7 @@ int mouse_nurb(bContext *C, const int mval[2], int extend)
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
ViewContext vc;
Nurb *nu;
BezTriple *bezt=NULL;
@@ -4266,7 +4242,7 @@ int mouse_nurb(bContext *C, const int mval[2], int extend)
static int spin_nurb(float viewmat[][4], Object *obedit, float *axis, float *cent)
{
Curve *cu= (Curve*)obedit->data;
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
Nurb *nu;
float si,phi,n[3],q[4],cmat[3][3],tmat[3][3],imat[3][3];
float bmat[3][3], rotmat[3][3], scalemat1[3][3], scalemat2[3][3];
@@ -4788,7 +4764,7 @@ static int toggle_cyclic_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
Nurb *nu;
BezTriple *bezt;
BPoint *bp;
@@ -4865,7 +4841,7 @@ static int toggle_cyclic_exec(bContext *C, wmOperator *op)
static int toggle_cyclic_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
uiPopupMenu *pup;
uiLayout *layout;
Nurb *nu;
@@ -5052,7 +5028,7 @@ static int select_row_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
static BPoint *last= NULL;
static int direction=0;
Nurb *nu;
@@ -5126,7 +5102,7 @@ void CURVE_OT_select_row(wmOperatorType *ot)
static int select_next_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
select_adjacent_cp(editnurb, 1, 0, SELECT);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
@@ -5153,7 +5129,7 @@ void CURVE_OT_select_next(wmOperatorType *ot)
static int select_previous_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
select_adjacent_cp(editnurb, -1, 0, SELECT);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
@@ -5180,7 +5156,7 @@ void CURVE_OT_select_previous(wmOperatorType *ot)
static int select_more_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
Nurb *nu;
BPoint *bp, *tempbp;
int a;
@@ -5268,7 +5244,7 @@ void CURVE_OT_select_more(wmOperatorType *ot)
static int select_less_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
Nurb *nu;
BPoint *bp;
BezTriple *bezt;
@@ -5460,7 +5436,7 @@ static void selectrandom_curve(ListBase *editnurb, float randfac)
static int select_random_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
if(!RNA_boolean_get(op->ptr, "extend"))
CU_deselect_all(obedit);
@@ -5552,7 +5528,7 @@ static void select_nth_bp(Nurb *nu, BPoint *bp, int nth)
int CU_select_nth(Object *obedit, int nth)
{
Curve *cu= (Curve*)obedit->data;
- ListBase *nubase= ED_curve_editnurbs(cu);
+ ListBase *nubase= curve_editnurbs(cu);
Nurb *nu;
int ok=0;
@@ -6026,7 +6002,7 @@ void CURVE_OT_delete(wmOperatorType *ot)
static int shade_smooth_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
Nurb *nu;
int clear= (strcmp(op->idname, "CURVE_OT_shade_flat") == 0);
@@ -6198,7 +6174,7 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newob)
{
static int xzproj= 0; /* this function calls itself... */
Object *obedit= CTX_data_edit_object(C);
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
View3D *v3d= CTX_wm_view3d(C);
RegionView3D *rv3d= ED_view3d_context_rv3d(C);
Nurb *nu = NULL;
@@ -6614,7 +6590,7 @@ static int curvesurf_prim_add(bContext *C, wmOperator *op, int type, int isSurf)
ED_object_new_primitive_matrix(C, obedit, loc, rot, mat);
nu= add_nurbs_primitive(C, mat, type, newob);
- editnurb= curve_get_editcurve(obedit);
+ editnurb= object_editcurve_get(obedit);
BLI_addtail(editnurb, nu);
/* userdef */
@@ -6897,7 +6873,7 @@ static int clear_tilt_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
Nurb *nu;
BezTriple *bezt;
BPoint *bp;
@@ -6967,7 +6943,7 @@ static void undoCurve_to_editCurve(void *ucu, void *obe)
Curve *cu= (Curve*)obedit->data;
UndoCurve *undoCurve= ucu;
ListBase *undobase= &undoCurve->nubase;
- ListBase *editbase= ED_curve_editnurbs(cu);
+ ListBase *editbase= curve_editnurbs(cu);
Nurb *nu, *newnu;
EditNurb *editnurb= cu->editnurb;
void *lastsel= NULL;
@@ -6976,7 +6952,7 @@ static void undoCurve_to_editCurve(void *ucu, void *obe)
freeNurblist(editbase);
if (undoCurve->undoIndex) {
- BLI_ghash_free(editnurb->keyindex, NULL, (GHashValFreeFP)free_cvKeyIndex);
+ BLI_ghash_free(editnurb->keyindex, NULL, (GHashValFreeFP)MEM_freeN);
editnurb->keyindex= dupli_keyIndexHash(undoCurve->undoIndex);
}
@@ -7015,7 +6991,7 @@ static void *editCurve_to_undoCurve(void *obe)
{
Object *obedit= obe;
Curve *cu= (Curve*)obedit->data;
- ListBase *nubase= ED_curve_editnurbs(cu);
+ ListBase *nubase= curve_editnurbs(cu);
UndoCurve *undoCurve;
EditNurb *editnurb= cu->editnurb, tmpEditnurb;
Nurb *nu, *newnu;
@@ -7064,7 +7040,7 @@ static void free_undoCurve(void *ucv)
freeNurblist(&undoCurve->nubase);
if(undoCurve->undoIndex)
- BLI_ghash_free(undoCurve->undoIndex, NULL, (GHashValFreeFP)free_cvKeyIndex);
+ BLI_ghash_free(undoCurve->undoIndex, NULL, (GHashValFreeFP)MEM_freeN);
free_fcurves(&undoCurve->fcurves);
free_fcurves(&undoCurve->drivers);
@@ -7084,15 +7060,6 @@ void undo_push_curve(bContext *C, const char *name)
undo_editmode_push(C, name, get_data, free_undoCurve, undoCurve_to_editCurve, editCurve_to_undoCurve, NULL);
}
-/* Get list of nurbs from editnurbs structure */
-ListBase *ED_curve_editnurbs(Curve *cu)
-{
- if (cu->editnurb) {
- return &cu->editnurb->nurbs;
- }
-
- return NULL;
-}
void ED_curve_beztcpy(EditNurb *editnurb, BezTriple *dst, BezTriple *src, int count)
{
memcpy(dst, src, count*sizeof(BezTriple));
diff --git a/source/blender/editors/datafiles/blenderbuttons.c b/source/blender/editors/datafiles/blenderbuttons.c
index b2b2612cd4a..243e9838e9e 100644
--- a/source/blender/editors/datafiles/blenderbuttons.c
+++ b/source/blender/editors/datafiles/blenderbuttons.c
@@ -1,6736 +1,6723 @@
/* DataToC output of file <blenderbuttons> */
-int datatoc_blenderbuttons_size= 215334;
+int datatoc_blenderbuttons_size= 214916;
char datatoc_blenderbuttons[]= {
-137, 80, 78, 71, 13, 10,
- 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 2, 90, 0, 0, 2,128, 8, 6, 0, 0, 0, 68,254,214,163, 0, 0, 10, 79,105,
- 67, 67, 80, 80,104,111,116,111,115,104,111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108,101, 0, 0,120,218,157, 83,103, 84,
- 83,233, 22, 61,247,222,244, 66, 75,136,128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, 20,145, 38, 42, 33, 9, 16, 74,136, 33,
-161,217, 21, 81,193, 17, 69, 69, 4, 27,200,160,136, 3,142,142,128,140, 21, 81, 44, 12,138, 10,216, 7,228, 33,162,142,131,163,
-136,138,202,251,225,123,163,107,214,188,247,230,205,254,181,215, 62,231,172,243,157,179,207, 7,192, 8, 12,150, 72, 51, 81, 53,
-128, 12,169, 66, 30, 17,224,131,199,196,198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8,179,100, 33,115,253, 35, 1, 0,248,126,
- 60, 60, 43, 34,192, 7,190, 0, 1,120,211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, 15,234, 66,153, 92, 1,128,132, 1,192,
-116,145, 56, 75, 8,128, 20, 0, 64,122,142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, 0,160, 4, 0, 96,203, 99, 98,227, 0,
- 80, 45, 0, 96, 39,127,230,211, 0,128,157,248,153,123, 1, 0, 91,148, 33, 21, 1,160,145, 0, 32, 19,101,136, 68, 0,104, 59,
- 0,172,207, 86,138, 69, 0, 88, 48, 0, 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87,102, 72, 0,176,183, 0,192,206, 16, 11,
-178, 0, 8, 12, 0, 48, 81,136,133, 41, 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, 0, 20, 70,242, 87, 60,241, 43,174, 16,
-231, 42, 0, 0,120,153,178, 60,185, 36, 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, 40,206, 73, 23, 43, 20, 54, 97, 2, 97,
-154, 64, 46,194,121,153, 25, 50,129, 52, 15,224,243,204, 0, 0,160,145, 21, 17,224,131,243,253,120,206, 14,174,206,206, 54,142,
-182, 14, 95, 45,234,191, 6,255, 34, 98, 98,227,254,229,207,171,112, 64, 0, 0,225,116,126,209,254, 44, 47,179, 26,128, 59, 6,
-128,109,254,162, 37,238, 4,104, 94, 11,160,117,247,139,102,178, 15, 64,181, 0,160,233,218, 87,243,112,248,126, 60, 60, 69,161,
-144,185,217,217,229,228,228,216, 74,196, 66, 91, 97,202, 87,125,254,103,194, 95,192, 87,253,108,249,126, 60,252,247,245,224,190,
-226, 36,129, 50, 93,129, 71, 4,248,224,194,204,244, 76,165, 28,207,146, 9,132, 98,220,230,143, 71,252,183, 11,255,252, 29,211,
- 34,196, 73, 98,185, 88, 42, 20,227, 81, 18,113,142, 68,154,140,243, 50,165, 34,137, 66,146, 41,197, 37,210,255,100,226,223, 44,
-251, 3, 62,223, 53, 0,176,106, 62, 1,123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88,116,192,226,247, 0, 0,242,187,111,193,
-212, 40, 8, 3,128,104,131,225,207,119,255,239, 63,253, 71,160, 37, 0,128,102, 73,146,113, 0, 0, 94, 68, 36, 46, 84,202,179,
- 63,199, 8, 0, 0, 68,160,129, 42,176, 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220,193, 11,252, 96, 54,132, 66, 36,196,194,
- 66, 16, 66, 10,100,128, 28,114, 96, 41,172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, 64, 29, 52,192, 81,104,134,147,112, 14,
- 46,194, 85,184, 14, 61,112, 15,250, 97, 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, 97, 33,218,136, 1, 98,138, 88, 35,142,
- 8, 23,153,133,248, 33,193, 72, 4, 18,139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, 49, 82,138, 84, 32, 85, 72, 29,242, 61,
-114, 2, 57,135, 92, 70,186,145, 59,200, 0, 50,130,252,134,188, 71, 49,148,129,178, 81, 61,212, 12,181, 67,185,168, 55, 26,132,
- 70,162, 11,208,100,116, 49,154,143, 22,160,155,208,114,180, 26, 61,140, 54,161,231,208,171,104, 15,218,143, 62, 67,199, 48,192,
-232, 24, 7, 51,196,108, 48, 46,198,195, 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12,171,198, 26,176, 86,172, 3,187,137,245,
- 99,207,177,119, 4, 18,129, 69,192, 9, 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, 78,216, 72,168, 32, 28, 36, 52, 17,218,
- 9, 55, 9, 3,132, 81,194, 39, 34,147,168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49,135, 88, 72, 44, 35,214, 18,143, 19, 47,
- 16,123,136, 67,196, 55, 36, 18,137, 67, 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, 70,210,110, 82, 35,233, 44,169,155, 52,
- 72, 26, 35,147,201,218,100,107,178, 7, 57,148, 44, 32, 43,200,133,228,157,228,195,228, 51,228, 27,228, 33,242, 91, 10,157, 98,
- 64,113,164,248, 83,226, 40, 82,202,106, 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, 85,163,154, 82,221,168,161, 84, 17, 53,
-143, 90, 66,173,161,182, 82,175, 81,135,168, 19, 52,117,154, 57,205,131, 22, 73, 75,165,173,162,149,211, 26,104, 23,104,247,105,
-175,232,116,186, 17,221,149, 30, 78,151,208, 87,210,203,233, 71,232,151,232, 3,244,119, 12, 13,134, 21,131,199,136,103, 40, 25,
-155, 24, 7, 24,103, 25,119, 24,175,152, 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235,152,231,153, 15,153,111, 85, 88, 42,182,
- 42,124, 21,145,202, 10,149, 74,149, 38,149, 27, 42, 47, 84,169,170,166,170,222,170, 11, 85,243, 85,203, 84,143,169, 94, 83,125,
-174, 70, 85, 51, 83,227,169, 9,212,150,171, 85,170,157, 80,235, 83, 27, 83,103,169, 59,168,135,170,103,168,111, 84, 63,164,126,
- 89,253,137, 6, 89,195, 76,195, 79, 67,164, 81,160,177, 95,227,188,198, 32, 11, 99, 25,179,120, 44, 33,107, 13,171,134,117,129,
- 53,196, 38,177,205,217,124,118, 42,187,152,253, 29,187,139, 61,170,169,161, 57, 67, 51, 74, 51, 87,179, 82,243,148,102, 63, 7,
-227,152,113,248,156,116, 78, 9,231, 40,167,151,243,126,138,222, 20,239, 41,226, 41, 27,166, 52, 76,185, 49,101, 92,107,170,150,
-151,150, 88,171, 72,171, 81,171, 71,235,189, 54,174,237,167,157,166,189, 69,187, 89,251,129, 14, 65,199, 74, 39, 92, 39, 71,103,
-143,206, 5,157,231, 83,217, 83,221,167, 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, 27,161,187, 68,119,191,110,167,238,152,
-158,190, 94,128,158, 76,111,167,222,121,189,231,250, 28,125, 47,253, 84,253,109,250,167,245, 71, 12, 88, 6,179, 12, 36, 6,219,
- 12,206, 24, 60,197, 53,113,111, 60, 29, 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97,149, 97,151,225,132,145,185,209, 60,163,
-213, 70,141, 70, 15,140,105,198, 92,227, 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, 75, 77,234, 77,238,154, 82, 77,185,166,
- 41,166, 59, 76, 59, 76,199,205,204,205,162,205,214,153, 53,155, 61, 49,215, 50,231,155,231,155,215,155,223,183, 96, 90,120, 90,
- 44,182,168,182,184,101, 73,178,228, 90,166, 89,238,182,188,110,133, 90, 57, 89,165, 88, 85, 90, 93,179, 70,173,157,173, 37,214,
-187,173,187,167, 17,167,185, 78,147, 78,171,158,214,103,195,176,241,182,201,182,169,183, 25,176,229,216, 6,219,174,182,109,182,
-125, 97,103, 98, 23,103,183,197,174,195,238,147,189,147,125,186,125,141,253, 61, 7, 13,135,217, 14,171, 29, 90, 29,126,115,180,
-114, 20, 58, 86, 58,222,154,206,156,238, 63,125,197,244,150,233, 47,103, 88,207, 16,207,216, 51,227,182, 19,203, 41,196,105,157,
- 83,155,211, 71,103, 23,103,185,115,131,243,136,139,137, 75,130,203, 46,151, 62, 46,155, 27,198,221,200,189,228, 74,116,245,113,
- 93,225,122,210,245,157,155,179,155,194,237,168,219,175,238, 54,238,105,238,135,220,159,204, 52,159, 41,158, 89, 51,115,208,195,
-200, 67,224, 81,229,209, 63, 11,159,149, 48,107,223,172,126, 79, 67, 79,129,103,181,231, 35, 47, 99, 47,145, 87,173,215,176,183,
-165,119,170,247, 97,239, 23, 62,246, 62,114,159,227, 62,227, 60, 55,222, 50,222, 89, 95,204, 55,192,183,200,183,203, 79,195,111,
-158, 95,133,223, 67,127, 35,255,100,255,122,255,209, 0,167,128, 37, 1,103, 3,137,129, 65,129, 91, 2,251,248,122,124, 33,191,
-142, 63, 58,219,101,246,178,217,237, 65,140,160,185, 65, 21, 65,143,130,173,130,229,193,173, 33,104,200,236,144,173, 33,247,231,
-152,206,145,206,105, 14,133, 80,126,232,214,208, 7, 97,230, 97,139,195,126, 12, 39,133,135,133, 87,134, 63,142,112,136, 88, 26,
-209, 49,151, 53,119,209,220, 67,115,223, 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, 45, 74, 53, 42, 62,170, 46,106, 60,218,
- 55,186, 52,186, 63,198, 46,102, 89,204,213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, 54,110,108,190,223,252,237,243,135,226,
-157,226, 11,227,123, 23,152, 47,200, 93,112,121,161,206,194,244,133,167, 22,169, 46, 18, 44, 58,150, 64, 76,136, 78, 56,148,240,
- 65, 16, 42,168, 22,140, 37,242, 19,119, 37,142, 10,121,194, 29,194,103, 34, 47,209, 54,209,136,216, 67, 92, 42, 30, 78,242, 72,
- 42, 77,122,146,236,145,188, 53,121, 36,197, 51,165, 44,229,185,132, 39,169,144,188, 76, 13, 76,221,155, 58,158, 22,154,118, 32,
-109, 50, 61, 58,189, 49,131,146,145,144,113, 66,170, 33, 77,147,182,103,234,103,230,102,118,203,172,101,133,178,254,197,110,139,
-183, 47, 30,149, 7,201,107,179,144,172, 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, 42, 7,178,103,101, 87,102,191,205,137,
-202, 57,150,171,158, 43,205,237,204,179,202,219,144, 55,156,239,159,255,237, 18,194, 18,225,146,182,165,134, 75, 87, 45, 29, 88,
-230,189,172,106, 57,178, 60,113,121,219, 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138,182, 42,109,213, 79,171,237, 87,151,174,
-126,189, 38,122, 77,107,129, 94,193,202,130,193,181, 1,107,235, 11, 85, 10,229,133,125,235,220,215,237, 93, 79, 88, 47, 89,223,
-181, 97,250,134,157, 27, 62, 21,137,138,174, 20,219, 23,151, 21,127,216, 40,220,120,229, 27,135,111,202,191,153,220,148,180,169,
-171,196,185,100,207,102,210,102,233,230,222, 45,158, 91, 14,150,170,151,230,151, 14,110, 13,217,218,180, 13,223, 86,180,237,245,
-246, 69,219, 47,151,205, 40,219,187,131,182, 67,185,163,191, 60,184,188,101,167,201,206,205, 59, 63, 84,164, 84,244, 84,250, 84,
- 54,238,210,221,181, 97,215,248,110,209,238, 27,123,188,246, 52,236,213,219, 91,188,247,253, 62,201,190,219, 85, 1, 85, 77,213,
-102,213,101,251, 73,251,179,247, 63,174,137,170,233,248,150,251,109, 93,173, 78,109,113,237,199, 3,210, 3,253, 7, 35, 14,182,
-215,185,212,213, 29,210, 61, 84, 82,143,214, 43,235, 71, 14,199, 31,190,254,157,239,119, 45, 13, 54, 13, 85,141,156,198,226, 35,
-112, 68,121,228,233,247, 9,223,247, 30, 13, 58,218,118,140,123,172,225, 7,211, 31,118, 29,103, 29, 47,106, 66,154,242,154, 70,
-155, 83,154,251, 91, 98, 91,186, 79,204, 62,209,214,234,222,122,252, 71,219, 31, 15,156, 52, 60, 89,121, 74,243, 84,201,105,218,
-233,130,211,147,103,242,207,140,157,149,157,125,126, 46,249,220, 96,219,162,182,123,231, 99,206,223,106, 15,111,239,186, 16,116,
-225,210, 69,255,139,231, 59,188, 59,206, 92,242,184,116,242,178,219,229, 19, 87,184, 87,154,175, 58, 95,109,234,116,234, 60,254,
-147,211, 79,199,187,156,187,154,174,185, 92,107,185,238,122,189,181,123,102,247,233, 27,158, 55,206,221,244,189,121,241, 22,255,
-214,213,158, 57, 61,221,189,243,122,111,247,197,247,245,223, 22,221,126,114, 39,253,206,203,187,217,119, 39,238,173,188, 79,188,
- 95,244, 64,237, 65,217, 67,221,135,213, 63, 91,254,220,216,239,220,127,106,192,119,160,243,209,220, 71,247, 6,133,131,207,254,
-145,245,143, 15, 67, 5,143,153,143,203,134, 13,134,235,158, 56, 62, 57, 57,226, 63,114,253,233,252,167, 67,207,100,207, 38,158,
- 23,254,162,254,203,174, 23, 22, 47,126,248,213,235,215,206,209,152,209,161,151,242,151,147,191,109,124,165,253,234,192,235, 25,
-175,219,198,194,198, 30,190,201,120, 51, 49, 94,244, 86,251,237,193,119,220,119, 29,239,163,223, 15, 79,228,124, 32,127, 40,255,
-104,249,177,245, 83,208,167,251,147, 25,147,147,255, 4, 3,152,243,252, 99, 51, 45,219, 0, 0, 0, 6, 98, 75, 71, 68, 0,255,
- 0,255, 0,255,160,189,167,147, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0,
- 7,116, 73, 77, 69, 7,219, 8, 3, 13, 27, 3,174, 15,171, 16, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236, 93,119,120, 20,213,
-226, 61, 51, 59, 91,178, 37,155, 70,122, 32,133, 18,192, 0,134,162, 4,169,130,160, 24, 21, 21,172, 8, 79,159,207,138, 13, 11,
-168,136,136, 64,108,128,224, 79,228,161, 79, 1, 65, 1, 11,188,192,163, 68, 74,232, 29,233, 9,144, 4, 18, 66, 58,201,102,123,
-155,251,251, 35, 59,235,102,179, 45,144,160,194, 61,223, 55,223,238,206,206,156,185,247,206,189,119,206,156,219, 24, 66, 8, 40,
- 40, 40, 40, 40, 40, 40, 40, 40, 90, 30, 44, 77, 2, 10, 10, 10, 10, 10, 10, 10,138,191, 8,178,179,179,155, 99,129, 13, 11,148,
-211,177, 13,250,171,115,182, 98,220, 73, 11,114, 14,114,112,190,255, 55, 9,231,160,191, 42,167, 16,223,102,240, 14,107, 78, 62,
-106,169,244,116, 9, 39,105,233,112,182, 22,103, 75,149, 35, 15,225, 36,173,112,223,223,255,155,132,115,208, 95,141,211, 61,255,
- 4,200,219, 44,206, 0,243, 84,115,195, 73, 90, 58,156,173,197,121,181,229,200, 71, 56,201,213,230, 37, 47,247,254,125,220, 32,
- 32,132,128,107, 69,145, 21, 48, 50, 51, 51, 25, 23,126,230,175,202,233,154, 14, 2,127, 75,134,181, 5,177,181,165, 57,221,210,
-179,165,240,126,102,102, 38,147,157,157,189, 13,192,160,150,140,123, 75,220,119,183,184,182, 8,239, 21,136,172,102,113,182, 84,
-190,111,109,206,150, 42, 75,238,156, 45,145,239, 61,221,247, 86,188, 71, 45, 21,206, 22, 41, 75,173,145,231, 61,228,159,171,230,
-117,231,108,137,178,228,206,217, 18,249,254, 90,112,182, 68, 89,242,196,217, 18,249,222,219,189,191,209, 12, 42,246, 74, 18,173,
- 21,157,178,193,127,101, 65,212, 90, 98,179, 25, 14,204,159,206,217,194,247,232,125, 7,103, 75,190,221, 12,110,169,123,212, 26,
-249,221,149,179,165,248,221,121, 90,226, 62,121,226,188,218,240,122, 9,103,139,199,253,106,243,253,181,226,108,225,123,212, 34,
-101,201,141,115,112, 11,191, 12, 12,118,249,253,126, 75,114,182, 84, 89,242, 16,206,171,190, 79,158, 56,175, 54,188, 94,194,217,
-226,113,111,137,103, 72,107,241, 94,215,104,173,230,179,150,230,108, 38,247,117,197,217,204,230,153, 97,173,112,239,255,212,112,
-182, 36,167,123, 24, 91,178,185,167, 53,195,217,146,156,205, 8,235,117,199,249,119,187,239,127,197,244,244,198,119, 53,205, 82,
-222,220,209,214, 8,103, 75,114, 6,200,125, 93,112, 94,197,189,191,174,208,236,166,195,107, 33,224, 90,248,205, 4, 45,236,192,
-180,166,112,109,201,112, 14,110, 13,135,176, 21,208,226,225,116,188, 41, 79,109,133,184,255, 93,210,148,150, 37, 90,150,254,114,
-101,201, 45, 79, 14,110, 65,167,168, 69,157,103,119,206,150,184,134, 43, 71, 75,229,209,214,142,123, 75,150,165,214,184,247, 20,
- 87,225, 66, 80, 78,202, 73, 57, 41, 39,229,164,156,148,243,134,229,188,238, 64, 8,161,211, 59, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80,252,141,224,179,143, 86, 92, 92, 92,182, 66,161,232,224,237,127,157, 78,119,233,210,165, 75,
- 67,104, 50,254,121,160,247,136,226,111, 4, 22,127,140,114,230, 1, 16,199, 70, 65, 65, 65,113, 93,195,171,208,146,201,100, 41,
-167, 78,157,234,196,243, 60,236,118, 59,108, 54,155,243,211,108, 54, 99,224,192,129,205,238, 72, 31, 29, 29,157, 43, 18,137,146,
-154,115,142,221,110,191, 80, 94, 94,222,223,199, 33,187, 0,164, 48,204, 31,125, 2,133,239,222, 62, 1,148, 90,173,214,158,190,
- 56, 25,134, 73,113,231,243,194, 37,124,247,201, 25, 18, 18,114,128,227,184, 4, 79, 92,222,190,243, 60, 95, 80, 89, 89,217,239,
- 90,222,163, 27, 25,209,209,209,185, 28,199, 53, 59,127,150,149,149,121,205,159,177,177,177,135, 89,150,141,107, 6,165,136,231,
-249,188, 75,151, 46,245,247, 33, 68,118, 1, 72,241, 69,226,158,159, 24,134, 41,177,219,237,189,253,149, 35, 95, 92, 30,242,168,
- 63, 78,167,200,226, 56, 46, 43, 42, 42,234, 57,189, 94,111, 4, 64, 68, 34, 17,113, 9, 27, 0,192,102,179, 85,214,214,214,118,
-163, 57,145,130,130,226,134, 16, 90, 60,207,179, 38,147, 9,249,249,249,240,178, 30,162,253, 10,174,215,233,224,111,155,162,130,
-163,162, 97,179, 88,160,108, 19,233,228, 46, 63,121, 28, 54,171, 5, 54,179, 25,237,250,244, 21,194,128,174, 93,187,138,252,112,
- 38,124,244,209, 71, 81,193,193,193, 48, 26,141, 48, 26,141, 48,153, 76, 48, 26,141, 48,155,205, 48,155,205,176, 88, 44,176, 88,
- 44,176,217,108, 48,153, 76,200,201,201,177, 91,173, 86,159,156, 51,102,204,136, 82,171,213, 78, 62, 97, 19, 56, 5, 94,171,213,
- 10,163,209,136,205,155, 55,251,228,228, 56, 46,161,180,180, 52, 74, 34,145,128, 16, 2,158,231, 65, 8,105,180,185,163,125,251,
-246, 22, 95,129,108,165,123,116, 35,163,211,140,229,107,163, 66,228, 50,216,120, 30,153, 61,218, 59,255, 40,248,122, 37,136,205,
- 14,222,102, 67,199, 23,199, 58,247,119,233,210,197,103,254, 36,132, 36,206, 88,190, 54, 52, 80,206,234,234,106, 67,231,206,157,
- 75,209, 48,185,159, 55,161,149, 96, 48, 24,162, 28,252, 77, 4, 17,203,178,141,182, 13, 27, 54, 32, 51, 51,211, 95,220, 19, 94,
-125,245,213, 40,171,213, 10,179,217, 12,147,201, 4,171,213, 10,155,205,230,220,236,118,187,115, 51,155,205,216,187,119,111,160,
- 78,214, 71,119,220,113,199,147,107,215,174, 85,254,250,235,175,202,164,164, 36, 72, 36, 18,136, 68, 34,136, 68, 34,176, 44, 11,
-142,227,112,235,173,183, 50, 52, 11, 82, 80, 80,220, 48, 66,203,100, 50, 21,166,167,167, 19,199,247,120,153, 76, 38,113,123,203,
-141,235,216,177, 99,158,251,121,254,154,171,130,163,162, 49,185,109, 56, 0,224,189,243,213,206, 7,196,199,253,110,118, 30,243,
-193,197, 58, 0,128, 92, 46, 7,227,250, 26,237, 5, 74,165, 18,119,220,113, 7,164, 82, 41,122,247,238, 13,177, 88,236,113,147,
- 72, 36, 16,139,197,126, 19,133, 97, 24,168, 84, 42, 76,155, 54, 77, 16, 73, 80, 6,201, 48,161, 95,111, 4,129,224,223,199,207,
-192,204, 19,112, 28,231,220, 2,225,148, 72, 36, 56,118,236, 24, 56,142,131, 72, 36,114,126, 10,223,215,172, 89,131,209,163, 71,
-131,227, 56,200,229,114,192,207,204,193,174,247,200,108, 54,199, 74,165, 82, 11, 0, 65,156, 73, 24,134,137,185,146,123,116, 35,
- 35, 68, 46,195,184, 5,191, 0, 0,138,231,188,232,188,119,123,159,127,207,121, 76,226,191, 30, 2,195, 48, 16,139,197, 96, 89,
-182,197, 56,107,106,106, 12,143, 60,242,200,142,224,224,224, 13, 26,141, 6,126, 4, 28,138,139,139,193,113,156,215,252,206,178,
- 44,102,207,158,141,179,103,207, 6, 20,119,163,209,136, 69,139, 22,193,110,183, 55,226, 21,190,187,239, 11, 80,100,125, 56,124,
-248,240,177,107,215,174, 13, 99, 24, 6, 95,124,241, 5, 36, 18, 9, 70,142, 28,137,136,136, 8,108,220,184, 17, 18,137, 4,111,
-190,249, 38,205,124, 20, 20, 20,190,234, 60, 49,128,155, 1, 68, 58, 76,132,122, 0,161, 46,135, 84, 58, 62, 35,133,223, 12,195,
-236,247,192,211,199,113, 76, 37,195, 48,251, 93,126,155, 1, 72, 61,236,175, 6, 32,119,108, 38, 52,184,255,105, 46,215, 17,206,
-131,183,235,114, 64,195,250, 67, 0,182, 2, 24,156,153,153,185, 13, 0,202,202,202,238, 42, 43, 43, 3, 0,164,164,164,156,202,
-203,203,235, 44,104, 30, 71,243,148,196,102,179,117, 18,154,170, 4,183,104,216,176, 97, 62,223,240,109, 22, 75, 19, 1,226, 73,
- 75,121,106,174,240, 38, 96, 44, 22, 11, 30,122,232, 33, 0,240,250,208,113,221, 2,208,110, 48,155,205,224, 56, 14,169,109, 35,
- 49,101, 68, 58,110, 33, 86,232,180, 12,108,117, 58,220,167,178,226, 84,215,158, 88,120,161, 18,231, 53, 90,112, 28, 23, 16, 39,
-207,243, 94, 69,150, 72, 36,194,130, 5, 11,240,200, 35,143, 64, 36, 18, 5,196,231,122,143,146,147,147,215,230,229,229, 69, 48,
- 12, 99,114,220, 35,153,205,102, 83,219,108,182, 8,187,221, 30,209,156,123,116, 35,195,198,243, 30,243,161,183, 60, 27,200,125,
- 10,132,179,166,166,198,144,153,153,185, 71, 38,147, 45,142,142,142, 46, 45, 41, 41,241, 43,180,220,197,143,251, 75,197,103,159,
-125,134,121,243,230, 97,200,144, 33, 1,133,211,100, 50,129, 97, 24, 44, 92,184,176,201,127,211,167, 79,111,114, 61, 63,156, 12,
- 0, 54, 46, 46,238,249,245,235,215,171,133, 99,219,180,105, 3,177, 88,140,110,221,186, 33, 56, 56, 24, 59,118,236,128,221,110,
- 15,184, 92, 82, 80, 80, 92,191,240,164, 69, 92, 48,112,242,228,201,189,179,178,178,102,102,100,100,252,176,107,215,174,229, 12,
-195,100,187,212,137,153,142,250, 53, 91,248, 77, 8,233,227, 42,122, 28, 98, 45,146, 97,152,108,225,120,215,223,194, 39, 33,100,
- 24, 0,169,240,123,242,228,201,105, 89, 89, 89, 51, 39, 77,154,244,246,172, 89,179, 36,147, 39, 79,238,158,149,149, 53, 83,184,
-142,167,112,120,114,180,124,174, 61, 37, 52, 81,157, 62,125,218, 91, 19,149,235, 3,192,103,109,169,108, 19,233,116,178, 62, 72,
-140,112,238,159, 86, 82,235,124,128,205,239,213, 1, 74,165, 18, 35, 62,248, 36, 32,167,200,108, 54,163,162,162,194,233, 50,248,
-219, 2,229, 84,200,131,144,243,106, 55, 20, 87, 75,241,254,238, 26,172, 61,114, 22, 98,177, 24,119,118,237,134,187, 36,193,120,
- 55, 81,138, 87,207, 20,193, 74, 2,235,211, 75, 8,241, 40,176,132,239, 66, 19, 74,160, 66,203,237, 30, 21, 27,141,198,234,252,
-252,124, 3,223,240, 96,151, 19, 66,194, 24,134,169,119,184, 92,177,129,222,163, 27, 25,153, 61,218, 59, 93,167,189,193, 67,157,
-251, 71,235,142, 57,239,201,196, 5, 31, 3, 0,134,244,188,213,111,121, 8,132,179,186,186,218,208,127,232,224,109,118,131,249,
-187,177, 99,199, 22,110,217,178, 69, 30, 72, 88, 61, 9, 45,193,181, 21, 68, 22,199,113, 48,155,205, 1,197,221,108, 54,123, 45,
- 31, 18,137,228, 74, 28, 45,232,116, 58,243,234,213,171, 49,127,254,124, 68, 68, 68, 96,248,240,225,136,141,141,197,202,149, 43,
- 65, 8,193,139, 47,190, 8,185, 92, 46,184,215, 52, 3, 82, 80,220,216,240,165, 69,100, 89, 89, 89, 51,221,133,140,235,111, 87,
- 1,229, 38,166, 92,197, 90,154,159,231,127,182,187,120, 18,174,203, 48, 76,246,172, 89,179, 50,253,132,163,210,155,208,242, 57,
- 37,190,201,100, 42,236,209,163, 71, 64,106, 66,175,215,151,249, 19, 27,158,222,234, 93, 93, 2,149, 74, 5,165, 90, 5, 54,192,
-122,215,106,181, 58,133,202,166, 77,155, 32,151,203, 49,114,228,200,171,114,180, 44, 22, 11,164, 18, 49,216, 54,209, 24, 55,103,
- 11,170,235, 13,206, 7,204,214,130, 66, 28, 42,175,192,171, 25, 67,161,148, 87, 64,107, 54, 7,228,188,241, 60,223, 68,100,113,
- 28,135,135, 30,122,200,233, 38,184,246, 91,129,143,166,195,136,136,136, 3, 28,199, 37,184,220,163,160,148,148, 20,224,143,126,
- 61, 12,207,243,218,208,208,208,159, 1,196, 17, 66, 18, 0, 4, 7,114,143, 40, 60,231, 79,247,253,188,155, 83,117, 37,156,213,
-213,213,134,204,204,204, 61,118,131,249,187,139, 23, 47,238, 1, 16,116,203, 45,183, 52, 91,104, 9, 2, 75, 44, 22, 99,246,236,
-217,152, 55,111,158,243,255, 64,133,150,205,102,107, 36,160,206,156, 57,211,232, 90,238,194,206, 79,179, 41, 65,195,232, 66, 62,
- 37, 37,197,121, 78, 76, 76, 12, 66, 67, 67,193,243, 60,120,158, 71, 80, 80, 16,228,114, 57, 36, 18, 9,205,116, 20, 20, 20,190,
-180,136, 97,210,164, 73,111, 51, 12,147,237,112,150,142,251, 16, 84,158,180, 71, 31, 55,177, 86,233,229,184, 76, 79, 98,203,245,
-187,128,201,147, 39,167,185,135,195, 83,115,165,179, 86,117,155,118,191, 17, 92,155,168, 90,234, 33,230,235, 65,166, 10, 85, 67,
-174, 84, 66, 36, 98,193, 48, 12,241,199,101,177, 88,156, 21,255,115,207, 61,231,179,223, 74,160,253,169, 44, 22, 11, 88, 78,132,
- 75, 49,201,176,179,219,157,231, 10, 27,203,137,113, 62,166, 51, 68,167, 15, 67, 28,224, 3,215,221,209,122,241,197, 23,177,104,
-209, 34,176, 44,235, 76, 19,142,227,208,177, 99, 71, 20, 22, 22,250,228,226, 56, 46,225,252,249,243, 81,174,233, 40,136, 88, 66,
- 8,236,118, 59,218,183,111,111,204,207,207,127,153, 22,221,171, 19, 89,222,246,219,237,124,192, 46,140,167,227,170,171,171, 13,
- 99,198,140,217, 86, 87, 87,247,221, 77, 55,221,116, 6,141,167, 64,240,203,199,113, 92, 35,129, 37,136,172,207, 63,255,188,145,
- 40,178, 90,173, 1,189, 8, 88,173,214, 38,130,231,211, 79, 63,109,244, 9, 0,253,250,245, 11,200, 25, 6, 64, 88,150, 37, 18,
-137, 4,119,220,113, 7,186,119,239,142, 95,127,253, 21, 60,207,227,133, 23, 94,128, 92, 46,199,220,185,115, 97,179,217,240,209,
- 71, 31, 81, 71,139,130,130,194,151, 22, 49,205,154, 53,235,248,172, 89,179,156,206,146,187,163,229,229,185,123,183, 67, 84, 69,
- 10, 34, 13,128,201,147, 32,242,228,146,185, 11, 48,215,125, 89, 89, 89, 51,221,195,225,222, 92,217, 72,104, 93, 43,148,157, 56,
-134, 79,110, 75, 7,208,184,185,112,193,173,157,161, 84, 41,161, 12, 86, 97,204,154,237, 0,224,168,244, 39, 5,228,104, 9, 66,
-171,186,186,218,167,200,106,142,163,197, 74, 57,172, 74,184, 12, 34, 21,131, 51, 91, 27, 9, 45, 17, 39, 70,113, 68, 50, 88,177,
- 4,156,221, 22, 16, 39, 33,164, 73, 83,225,248,241,227,193, 48,140,115,132, 88,143, 30, 61, 92,185, 24,127, 15,199, 55,194, 27,
-250,224,185, 55,199,126, 84,101,164, 37,246, 74,242,231,129,175,113,234,167,231, 1, 0,253,117, 58,231,189,152,209,227,143,177,
- 3,115,142,109,115,186,143, 31,224,245, 43,226,172,174,174, 54,220,210, 37,109,143, 36, 60,228,187, 11, 23, 46,236, 1,192, 62,
-252,240,195,161, 61,122,244, 8,168, 76, 10,131, 43,220, 69,150,171,147, 37,124,250, 25, 97,235, 34, 28,237, 1, 9, 40,161, 25,
- 49,128, 60, 79,132,188,173, 86,171,161, 82,169,156, 35,110,131,130,130,160, 80, 40,156,253, 59, 3, 20,110, 20, 20, 20, 55, 46,
-194, 4,161,227, 16, 75,141,156, 38, 71,223,170, 76,215,223,158, 28, 47,135, 3,149,235,167,126, 93,235, 16,104, 30, 33, 56,107,
-110,231,100,123, 19,105,156,160, 32, 93, 63, 99, 98, 98,254,167, 82,169,146, 3,141,125,115, 70,177,217,173,150, 38,206, 22,195,
- 48, 80, 5,171, 32, 87, 41, 33, 15, 86,121,117,189,124, 9, 45,193, 41, 18, 30, 58,139, 23, 47,134, 74,165,194, 63,254,241,143,
-102,247,209,114, 10, 45, 9,139,141,178,205, 16, 73,185, 70, 34,139,227, 56,136,196, 98,148,169, 98,193,138,197,224,108,129,185,
-100,117,117,117,224, 56, 14, 83,166, 76,113,190,193,187,138,172,230,196,217, 23, 88,134, 17,220, 45, 89,135, 14, 29, 94,103, 24,
- 38, 17, 64,146, 78,167,147, 93,186,116,233,118, 90, 94,125, 40, 3,187,181,137, 11,229,205,125,189, 82, 78,193,201,146,132,135,
-124,215,185,115,103,167,147,165, 80, 40,132,209,166,254,239, 49,203,122, 20, 89,238, 35, 4, 57,142,107,200,203,126, 70, 71,186,
- 58, 90,179,102,205,114,242,186, 58, 89, 2,154, 83,142,132,176,110,219,182, 13,135, 14, 29,194,115,207, 61, 7,185, 92,142,121,
-243,230,193,102,179, 97,250,244,233,144,203,229,144, 74,165, 52,243, 81, 80, 80, 55,171,145, 22,113, 67,165, 91, 63, 40,198, 77,
-212, 84,122, 18, 88,174,205,132,194,119,134, 97,172, 30,120,205,110, 77,138,238,251,133,207,234, 89,179,102,109, 17,156, 44,151,
-253,141,194,225,215,209,146,201,100,201,249,249,249,206,137, 48,125,125,154,205,102, 12, 25, 50, 36, 96,103, 76, 24,117,200,113,
-162, 70,194, 66, 17,172,130, 66, 29, 12,185, 74,229, 46, 56, 24,127,149,184,240, 70,236, 42,180,166, 78,157, 10,142,227,176,104,
-209, 34, 0,192,235,175,191, 30,112, 31, 45,129, 19,118, 6, 37,228, 28,210,231,140,134,249,123, 43,202,119,254, 14,142,227, 16,
-213,247, 46,240,183,140,134, 94,174, 2,103,183, 5, 60,234,176,166,166, 6,133,133,133, 16,137, 68,120,237,181,215, 26,205,117,
-228, 62,146,109,211,166, 77,126,227,238,201,201,154,122,161,198,201, 35,151,203,217,223,127,255, 61,153,231,249, 20,131,193,208,
-161, 95,191,126, 60, 45,202,126, 68, 17,111, 11, 72, 84, 5,154, 63,221, 57,133, 62, 89,117,117,117,223, 93,184,112, 97, 47, 0,
-118,236,216,177,161, 10,133, 2,223,124,243,141, 30,128,116,229,202,149,114,127,162, 72,200, 55,254, 68,150, 88, 44,110,200,203,
-129,196,157, 52,158,178,196, 95,199,248, 64,242,188, 16, 86,134, 97, 96,183,219, 33,151,203, 27, 57, 89, 65, 65, 65,144,201,100,
- 52,227, 81, 80, 80,248,171, 75,246, 7, 92,143, 19,210,199, 69, 84,237,191, 18,222,230, 92,207, 31, 56,111, 66,195,100, 50,225,
-228,201,147,129,242, 4, 60, 49,102,219,222,183,226,131,139,117, 96, 24, 6,255,238,119, 19,148,106, 21, 20, 74, 37, 30,252,117,
-155,179,226, 62, 54,243,117,200,148, 42,196, 13, 24, 30, 80, 69, 46, 52, 29,186, 10,173,218,218, 90,136,197, 98,124,248,225,135,
- 96, 89, 22, 31,125,244, 17,226,227,227,113,233,210, 37,172, 92,185, 50, 32, 71, 75,100, 23, 33,246,137, 46, 80,140, 15,129,250,
-137,129, 8,187, 99, 42, 46,154, 57,236, 50, 42, 48,208,120, 2,210,141,159,195,204,219, 3, 30,129,101,179,217,176,109,219, 54,
-247, 14,239,206, 62, 85, 54,155, 13, 86,171, 21, 22,139, 5, 31,125,244, 81, 32, 35, 60,155,220, 55, 33, 13, 29,147,160,138,242,
-242,242, 34, 9, 33,225, 0, 66, 0, 84,209,226,234, 27,177,125, 95, 68,100,239,103, 1, 0,107,102, 61,229,220, 63,229,216, 31,
-249,115,246,247, 13, 11, 0,116, 78, 26,222, 44,206,234,234,106,195,157, 67,250,229, 26,121,241,183,221,186,117,107,228,100, 5,
- 5, 5, 49,142,223, 1,217,101, 44,203, 66, 36, 18, 53,105, 46,244, 38,182, 2,233,163,101,179,217,156, 19,137,250,234,207,120,
- 37,142,214, 83, 79, 61,133,216,216, 88,167,147,245,193, 7, 31, 64, 46,151, 99,242,228,201,176, 90,173,248,252,243,207,105,230,
-163,160,160,184,230,162,236, 90,192, 99, 77,106, 52, 26,139,186,119,239, 14, 47,255,197, 7, 5, 5,137,221, 34, 21,215,177, 99,
-199, 60, 15, 77,136,195, 0,228,120,170,212, 25,134, 65,176, 58, 24, 65, 42, 37, 20,110, 46, 86, 80,176, 26, 50,149, 10,172,196,
- 99,101,222,132, 83,232, 91,226, 42,180,132,173,174,174, 14, 98,177, 24,243,231,207,135, 90,173,134,201,100,242,203, 41, 60,116,
- 68, 34, 17,244,197,245, 56, 53, 51, 7,210,160, 93,232, 48,252, 17,196,138,229,144,236,248, 25, 6,187,213,223,132,165, 77, 56,
- 59,117,234,132,247,222,123,175,201,180, 14,222, 16, 31, 31,239, 55,238,238, 78,214,236,155,218, 65, 34,149, 96,226,137, 98,152,
- 76, 38,230,145, 71, 30,225, 1, 24, 0, 84, 26, 12,134, 11,129,164,103, 11,224,111,207,233,107, 84,172, 0,158,216, 61, 9, 24,
-143,156,130,147,101,228,197,223, 22, 22, 22, 10, 78, 86,136, 66,161,192, 87, 95,125,165, 7,192, 78,159, 62, 93,145,152,152, 40,
- 10, 36, 47,137, 68, 34,204,153, 51,199, 99,159, 44, 79,162,171, 57,229,200,245,220, 65,131, 6,121,156,176,212,139,120,107,194,
- 41,132, 53, 34, 34,194,233,100,217,237,118,231,104, 67, 97,246,121, 31, 47, 21, 52,127, 82, 78,202,121,227,112, 94,151,240, 88,
- 3, 95,186,116,233, 78,111, 39,180,111,223, 62, 63, 63, 63,191,163,176, 20,135,163,226,148, 24,141,198, 78,253,250,245,243,107,
-237,240, 60, 15,153, 76, 6, 66, 8,110,127, 47, 11, 12, 11,176,104,252, 16,139,186,109, 40, 68, 34, 14,124,195, 82, 31,126, 71,
- 29, 26, 12,134, 70, 15, 7, 79,155, 86,171,133,201,100, 10,120, 54,111,163,209,216,104, 10, 6,134,240, 56,255,219,138, 38,163,
- 15,133, 45,208,126, 59, 65, 65, 65,141,154,126,252, 56, 86, 76, 32,142,150,107,211,163, 68, 42, 1, 39, 17, 11,142, 86,253,153,
- 51,103,198,208,108, 30, 56,132, 1, 11, 0,144,218,111, 36,120,222, 14, 98,183, 55, 90, 38,169, 75,242,157,224,137, 29, 22,171,
- 30, 38,147,201,223,180, 39, 76, 85, 85,149, 97,204,152, 49,219, 0,252,231,190,251,238,203, 67,195,236,194, 68,165, 82,201,196,
- 98, 49, 15,160, 6, 0,185,124,249,114,200,197,139, 23,121,163,209,216,206, 95, 56,215,174, 93,139,147, 39, 79, 98,192,128, 1,
-141,150,131, 18, 92, 81,215,217,221, 3,201,159, 66,115,185,167, 25,225,189, 9,185, 64, 33, 18,137, 16, 18, 18, 2,137, 68,130,
- 15, 63,252, 16, 18,137, 4, 10,133, 2, 0,240,249,231,159, 59, 39, 95,165,160,160,160,184, 97,132,150,191,122,211, 71,179,162,
-207, 38, 68,155,205, 86,146,152,152,216,172,139,217,237,246,114, 63,194,173,100,229,202,149, 18, 87, 23,194,223, 39, 33,164,220,
-207,195,182,100,205,154, 53, 18, 79,238,134,183, 5,166,253,113,218,237,246,146,164,164, 36,175,142,137, 39, 88,173,214,139,254,
- 68,107, 86,165,161,145, 72,152,120,162,216,235,218,137, 20,126,243,154,143,252,249,206,149,230,207, 51,169,169,169, 23, 67, 67,
- 67,215, 69, 71, 71, 87,239,220,185, 51,162, 79,159, 62, 17,174,199,244,233,211, 39,214,237, 52, 51,188,175,115, 8,134, 97, 74,
-238,187,239, 62,143,121, 94, 16, 77, 30,242,103,137,191, 60,191,111,223, 62,137,235,249,222,248, 93,202, 81, 73, 0,194,245,124,
-122,122, 58,235,202,227, 45,239, 91,173,214, 74,154, 11, 41, 40, 40,110,120,161,101, 48, 24,138,187,119,239,110,243,242,223, 5,
- 95,231, 86, 87, 87,247,110,233, 8, 88,173,214,126,127, 7,206,170,170,170, 22,141,187,205,102, 43,113, 76, 80,234,243, 24,154,
-197,255,188,123, 4, 0, 21, 21, 21,183, 0,128, 78,167,131,191,101,117,154, 33, 8, 91, 60,127,218,108,182,126,173,145,166, 53,
- 53, 53, 25, 52,103, 81, 80, 80, 80,161,213, 12,208,197,136,255, 26,104, 13,209, 74, 65, 65, 65, 65, 65, 65,209,178, 96,105, 18,
- 80, 80, 80, 80, 80, 80, 80, 80,180, 14, 24, 52,140, 28,240,132,230,140, 38, 24,118, 5,215,206,161,156,148,147,114, 82, 78,202,
- 73, 57, 41,231, 13,199,233,143,251,186, 25,205,120, 45,250, 75, 15,163,156,148,147,114, 82, 78,202, 73, 57, 41, 39,229,188, 17,
- 65, 8,161, 77,135, 20, 20, 20, 20, 20, 20, 20, 20,173, 5,142, 38,193,159, 6, 17,154, 49,163,126, 0,170, 57, 12,128,183, 5,
-227,204, 12,195, 92,190, 2, 78, 6,128,196,177, 9, 19, 29, 89, 1, 88, 0, 88, 24,134, 33,254, 57,222,103, 75, 75,195,210,136,
- 93,220,135, 48,140,152,231,113,164, 93,187,182,135, 25,230, 46, 51, 0, 40,163,187,116, 85, 41,229,195, 76, 22,115,178, 76, 44,
- 61, 89,171,211,110, 50, 85,228, 23,209,236, 65, 65,241,167,224, 30, 0,211,208,208,173,100, 22,128, 21, 52, 73, 40, 40, 90, 73,
-104,169, 84,170, 3, 44,203, 38,248,155,159, 71,128, 99, 45,179,146,203,151, 47,247,110,198,181,199,168, 84,170, 33, 98,177,248,
- 54, 0,176, 90,173, 59,181, 90,237, 22, 0, 43, 1,216,174, 48, 78,106, 0, 15, 1,120,204,241,123,153,163,178,208, 92, 33, 95,
-247,144,144,144,159,196, 98, 49,169,170,170,234, 11, 0, 17, 17, 17,123,172, 86, 43,163,209,104, 30, 4,112,180,153,124,172, 88,
- 44,158,221,183,111,223,129,219,183,111,255, 15,128,249, 45,116, 47,101, 44,203,122, 20, 40, 60,207, 39, 93,129,200,146, 0, 8,
-153, 63,127,126,196,210,165, 75,211, 75, 74, 74,186, 1, 64, 66, 66,194,177,177, 99,199, 30,158, 48, 97, 66, 53, 33,164,142, 97,
- 24,139, 47,158,210,210,176,180,138,178,130,231,202, 43, 78, 62, 4, 0, 49,177,221, 86,136, 68,172,132,144,131,187, 21,109, 30,
-107,211,177, 67,210,179, 63,124, 51, 95,146,148,220, 22,155,119, 29,186,121,194,203,111,167, 93, 4, 62,163, 98,235,218, 33, 56,
- 56,248, 0,203,178, 9,190,202,184,167, 50,111,183,219, 75,106,106,106,122,123,227,228, 56, 46,193, 87,125,225,105, 31,207,243,
- 5, 85, 85, 85, 30,167,154, 80,171,213,187, 57,142, 75, 14,148, 75,248,180,217,108, 37,222, 70,233,170,213,234, 3, 34,145, 40,
-193, 87, 60, 61,253,199,243,124, 65,101,101,165,183,112, 54,137,123, 75,132,243, 74, 56,125,133, 83,168,143, 0,124, 30, 17, 17,
-113,107,117,117,245,227, 0,222,214,104, 52, 61, 68, 34, 17,194,195,195,223, 54,155,205,103, 67, 66, 66,190,174,171,171,219, 5,
-224,101, 0,116,189, 84, 10,138,150,130, 90,173, 46,215,106,181, 68, 0,207,243,196,106,181, 18,147,201, 68, 12, 6, 3,209,233,
-116, 68,171,213, 18,141, 70, 67,234,234,234, 72,117,117, 53,137,140,140,116,159,188,209, 91, 27,110, 55,181, 90,157,159,149,149,
-101, 42, 44, 44, 36, 22,139,133, 88, 44, 22, 82, 84, 84, 68, 62,249,228, 19,147, 90,173,206, 7,208,205,203,185,195,188, 84, 22,
-119, 0, 88,158,158,158,110, 94,187,118, 45, 49, 26,141, 68,167,211,145, 21, 43, 86,144,155,110,186,201, 12, 96,185,227, 24, 54,
- 64, 78, 0,232, 31, 19, 19, 83,114,238,220, 57,251,166, 77,155, 44, 33, 33, 33, 57, 33, 33, 33, 57, 69, 69, 69,246,115,231,206,
-241,109,218,180, 41, 1,208,191, 25,225, 4,128,209, 19, 39, 78, 44, 47, 42, 42, 34,131, 6, 13, 58,226,178,159,129,255,117,238,
-134,121,114,178, 8, 33, 49,132,144, 88, 52, 76,114,217,100, 35,132,196, 58,142, 9, 11,144, 83, 89, 80, 80,208, 54, 58, 58, 58,
-139, 97, 24,179, 59, 31,195, 48,230,232,232,232,172,130,130,130,182,132, 16,165, 47,206,146, 11, 11,158, 94,183,118,104,173,238,
-242,105,162,187,124,154,252,231,219,193,154,103, 38, 60,190, 60,182,125,207, 69,161, 9,105,243, 79,158, 62,179,144, 16,178,112,
-203,254,252,133, 83,191,252,223,194,251, 39,204,253, 42, 34, 49,253,153,102,164,231,213,128,114, 2, 8, 13, 13, 45,211,233,116,
-132, 16, 66,236,118, 59,177, 88, 44,196,100, 50, 17,189, 94, 79,180, 90, 45,169,175,175,119,150,243,186,186, 58,231,247,168,168,
- 40,175,229, 61, 44, 44,172,220, 96, 48, 52,170, 59,204,102,179,179,254,208,235,245, 68,175,215, 19,157, 78,231,220,180, 90, 45,
-137,139,139, 43,246, 17,206, 75, 66, 56,121,158, 39, 54,155,141, 88, 44, 22, 39,175,209,104,108,180,153, 76, 38, 98, 50,153, 72,
- 98, 98, 98,192,225, 12,132,211,104, 52,146,132,132,132, 82,111,156,225,225,225,229, 70,163,177, 17,167,107,252,221,121,133,223,
- 49, 49, 49,101,205,225, 12, 36,156,190,210,211,129,249,121,121,121,196, 96, 48,144,248,248,248,234, 7, 31,124,208,106,183,219,
-201,218,181,107, 73,122,122, 58, 63,120,240, 96, 75, 85, 85, 21,249,199, 63,254, 65,124,188, 20,210,114, 68, 57, 41,188,155, 22,
-222, 29, 45,134, 97,160, 84, 42,241,227,143, 63,122, 93,142,195,245,123,187,118,237, 2,189,110,239,228,228,228,109, 59,118,236,
-144,199,198,254, 49, 33,182,217,108, 70, 88, 88, 24, 94,120,225, 5,233, 61,247,220,211,113,248,240,225,123,206,159, 63, 63, 8,
-192, 1, 63,124, 15, 68, 70, 70,126, 49,101,202,148,232,135, 31,126, 24, 17, 17,141, 38,221,198,152, 49, 99,240,224,131, 15, 74,
-242,242,242, 30, 89,188,120,241, 35, 11, 22, 44, 40,211,106,181, 19, 0,252,236,139, 84, 46,151,223, 23, 23, 23,247,213,142, 29,
- 59,162,162,162,162,144,146,146,194,190,249,230,155, 29, 59,117,234, 36, 79, 72, 72, 96, 47, 93,186,132, 95,127,253, 53,254,209,
- 71, 31, 93, 85, 94, 94,254,172,197, 98, 89, 29, 64,220,165, 17, 17, 17,111, 63,251,236,179,109, 52, 26,141,237,224,193,131,249,
-194,126,169, 84, 58, 61, 35, 35,163,207,214,173, 91,191, 7,240,245,149, 56, 89,132, 16, 13,254,104,226, 19, 96, 21,254, 15,196,
-217, 34,132, 72,143, 28, 57, 18,158,145,145,241,179,201,100,234,249,220,115,207, 93,152, 57,115,166, 92,173, 86,171, 1, 48, 26,
-141,230,242,180,105,211,204,115,231,206,125,171,107,215,174, 67,119,239,222,253, 0, 33,196,234, 16,100, 77,249, 24,198, 25,158,
-226,139,149,216,182,139,151,190, 55,249,245,132,143,103, 36,159,223,127,162,152,231,228,106,252, 55,247, 56,202,171,181,248,223,
-238, 19,136,137, 8,102, 36, 50,113, 90, 72,252, 77,131,234, 46,158,200,133,143, 25,210, 41, 90, 6, 12,195, 64,161, 80,224,191,
-255,253,111,147,165,171, 60, 45,107,197,113, 28, 66, 67, 67,253,174,110, 16, 20, 20,132, 77,155, 54,121, 92,123,209,211,146, 62,
- 33, 33, 33,240,245,178,193, 48, 12,130,130,130,176,115,231, 78,176, 44,235,113,105, 32,247,125, 74,165, 18,172,143,181,174, 4,
-206,220,220, 92,191, 92,194,167, 74,165, 2, 26,154,254,189, 23, 74,153, 12, 59,118,236,240, 26,103,247,239, 42,199,122,175,254,
- 56,119,238,220,217,104,233, 47,247, 37,193, 92,127, 43,149, 74, 48,126, 72,195,194,194,250, 38, 36, 36, 96,223,190,125, 88,185,
-114,101,120, 90, 90, 26,206,156, 57, 3,134, 97, 48,115,230, 76,230,166,155,110, 18,151,149,149, 97,192,128, 1,248,229,151, 95,
-250,105, 52, 26, 90, 96, 40,254, 44,193, 34, 6,112, 51,128, 72, 52,116,187,169, 7, 16,138,134,149, 52,164, 0,170, 1,200, 29,
-155, 9,128, 22, 64, 27,199,233, 85,142,186,197, 85, 32, 84,186, 46, 62, 77, 8,233,227,224, 22, 86,168,136,116, 57, 86,184,134,
-251,111,247, 79,143,220, 28, 0,100,103,103, 11, 15,179,193,153,153,153,219, 92, 35, 23,136,200, 18,214, 41,243, 80,166,221,135,
-104,202,148, 74,229, 79,123,246,236,145, 71, 70,254, 17, 7,147,201,132,250,250,122,104,181, 90,212,215,215, 35, 56, 56, 24, 43,
- 87,174,148, 15, 29, 58,244,167,250,250,250, 78,142, 68,243,198, 57,231,210,165, 75,209, 54,155, 13, 82,169,231, 46, 74, 44,203,
-162, 75,151, 46,120,251,237,183, 49, 98,196,136,152, 33, 67,134,204,113, 19, 90, 77,134,146, 42, 20,138,175, 14, 30, 60, 24,165,
- 80, 40,144,159,159,143,146,146, 18, 76,156, 56,177, 45,207,243, 40, 46, 46,198,153, 51,103,112,241,226, 69, 44, 94,188, 56,106,
-212,168, 81, 95,121, 16, 90,158,134,167, 62,247,234,171,175,118, 14, 11, 11, 99, 63,249,228,147, 90,157, 78,247,127,142,253,239,
-205,155, 55,239,137,129, 3, 7, 70,253,243,159,255, 36, 59,119,238, 92,234,184,113, 94,211,211,181, 79,150,163,153, 15,142,204,
-119,202,237,156, 46, 46,255,131, 16, 18, 3,192,196, 48, 76,173, 7, 78, 6, 64,200,240,225,195, 95, 51,153, 76, 61,119,236,216,
-113,246,182,219,110, 75, 4,112, 73,200,124, 33, 33, 33,202, 57,115,230, 68,103,102,102,230,221,126,251,237, 61,135, 15, 31,254,
- 90,101,101,229, 76, 66, 72,165, 75,159, 45, 39, 39,207,227, 72, 76,108,183, 21,185,187, 39, 60,180,117,167, 89,242,250,203, 83,
- 47,180,107,155, 84,119, 36,191,198,126,162,160, 18,245, 6, 27,238,191,189, 97, 1,243,190,221,218,225,139, 31,119,224,133, 87,
-222, 17,255,188, 98,201,131,103, 9,148,218,210, 19,107,125,164,231,213,130,114,194,217,196, 4,177, 88,140,187,238,186, 11, 12,
-195, 52, 89,203, 83, 44, 22, 99,247,238,221,184,253,246,219, 33, 22,139,241,212, 83, 79, 5,196,201,113, 28,134, 15, 31,238, 92,
- 71,209,149,207, 93, 52,120,209, 4, 57, 77,222, 14, 57, 14, 44,203,122, 93, 72,219,157,211, 95,189, 36,132,211, 23,151,235,127,
-254,194,233, 88,242, 40, 96,145, 21, 40,167, 16, 78,142,227,208,175, 95, 63, 28, 62,124,216,167,232,242,162, 47, 27,197,253,242,
-229,203,227, 58,117,234,148, 59,127,254,252,112, 0,168,174,174,118, 46,120, 47, 18,137,112,250,244,105,152,205,102,188,255,254,
-251, 22,141, 70,243, 79, 90,142, 40,103,107,114,250,210, 34, 0, 6, 78,158, 60,185,119, 86, 86,214,204,140,140,140, 31,118,237,
-218,181,156, 97,152,108, 66, 72,166,240, 57,121,242,228,180,172,172,172,153,147, 38, 77,122,123,214,172, 89,199, 25,134,201, 6,
- 0,247,223,142,186, 36,211, 77,196, 69, 10, 60,142, 50,215,232, 88, 79,191,221, 63, 61,113, 59,133, 22, 0,100,102,102, 50,142,
- 72, 50,174,149, 90,160, 66, 43,144,181,251, 56,142,123,113,230,204,153,209,190, 68,150, 86,171, 69,105,105, 41, 18, 19, 19,241,
-212, 83, 79, 69,207,159, 63,255, 69,155,205,246,169, 15, 90,137, 72, 36,194,190,125,251, 80, 81, 81,129,238,221,187, 35, 57, 57,
-185,209, 1,231,206,157,195,186,117,235, 80, 91, 91,139, 94,189,122, 1, 13,157,187, 61,162, 71,143, 30,239,119,233,210,101, 56,
-203,178, 54,185, 92,142, 35, 71,142,160,103,207,158,248,241,199, 31,209,174, 93, 59, 40, 20, 10,228,229,229,161,123,247,238,216,
-182,109, 27, 34, 35, 35,145,158,158,110,211,104, 52,219,107,106,106,182,156, 63,127,254,125,111,225,140,143,143,159,250,204, 51,
-207, 72, 75, 75, 75,249,239,190,251,110, 7,128, 29, 0, 94,124,231,157,119,158, 28, 49, 98, 68,212,161, 67,135,234,246,239,223,
-191,215,139,200, 10,196,201,178,185, 63,148,236,118,187,201, 96, 48,152, 77, 38,147,149,101,217, 34,134, 97,204,118,187,189,147,
- 55, 19, 98,252,248,241,237,171,170,170, 94,120,229,149, 87, 10, 29, 34,235, 52, 26, 58,192, 3, 0,108, 54,155, 73,171,213,106,
- 50, 50, 50, 18, 31,125,244,209,179,203,151, 47,127, 97,252,248,241, 43,191,251,238, 59, 45, 0,131, 59, 97,187,118,109, 15,139,
- 68,172, 68, 87, 31, 94,176,106,229,215,175,174, 91,243, 98,219,226,226,139, 29, 35,218, 68,234, 36,170,200,210,149,203,190, 61,
- 0,192, 92, 90,169,193,209,115,101, 16,139, 69, 56, 89, 92,135,129,119,142, 17,159,205,159,209, 31,192, 90,250, 46,215,250, 47,
-139,194, 34,212, 91,183,110,245,233,104,237,222,189, 27, 98,177, 24,114,185, 28,115,231,206,245, 73, 42, 8, 3,193, 45,242, 39,
-102,132,197,209,125,185, 79, 60,207, 59, 23,122,119,223,254,239,255,254, 15,175,188,242, 74,163,107, 56,196, 6,227,143,211, 91,
-248, 18,147,146, 80, 81, 94,222,104, 95, 32,139,210,219,237,118,136,197, 98, 44, 90,180, 8,153,153,153,200,206,206,246,249,121,
-215, 93,119,129,101, 89, 18, 72,122,246,235,215, 15, 22,139,197, 25,230,211,167, 79,123,228, 93,176, 96,129,191, 96,222, 3, 96,
- 90,207,158, 61,213, 67,134, 12, 65,110,110, 46, 30,124,240, 65,147,197, 98,201, 7,128,187,239,190, 59,117,254,252,249,210,131,
- 7, 15, 34, 34, 34, 66,124,225,194,133,255,128,118,144,167,104,101,120,210, 34,194, 51, 47, 43, 43,107,166,187,136,113,133,240,
- 63,195, 48,217,179,102,205,202,116, 21, 69,174,191, 5,215,201, 77,196,165,185, 58, 82,174, 34,202,155,128,114,123,222,186, 30,
- 95,233, 81,104, 57, 34, 54,216,213, 5, 18, 42, 95,127, 34,203,199,155, 99, 35,132,132,132,140,188,255,254,251,157, 34,199,104,
- 52, 58, 5,150, 32,178,132,223,121,121,121,232,221,187,183, 36, 36, 36,100,100,117,117,245,167, 1,136, 56,196,197,197,161,170,
-170, 10,199,142, 29, 67, 98, 98, 34,172, 86, 43, 54,108,216,128,186,186, 58,136,197, 98, 72, 36, 18, 88, 44, 62,251,110,163, 75,
-151, 46,119, 45, 93,186,180,247,146, 37, 75, 46, 11,111,116,203,150, 45, 3, 33, 4,145,145,145,208,235,245, 40, 47, 47,199,150,
- 45, 91, 96,179,217,160, 82,169,144,146,146, 34,189,239,190,251,250, 79,155, 54, 77,236, 67,104,245,123,240,193, 7, 67,212,106,
- 53, 94,126,249,101, 98,177, 88,102, 57,246, 77,157, 48, 97, 66, 68, 81, 81,145,249,233,167,159,222,103,177, 88, 62, 17,204, 68,
- 87,129,227,229,198,122,117,178,172, 86,171,144,166,133, 90,173, 22,109,218,180, 73,116,117,182,188,137,193,157, 59,119,246, 3,
- 32,154, 62,125,122, 16,128,114,215, 48,152,205,102,104,181, 90,232,116, 58,107, 93, 93, 93,197, 27,111,188, 97, 91,190,124,185,
-200,113,206, 73, 79, 66,139, 97,238, 50,171,213, 10, 41, 33,162,119, 22, 46, 92,168, 26, 49, 98, 4,171, 82,169, 80, 95, 95,175,
-254,223,250,245,170,161, 67,250,167,204,204,250,120,163, 58,161,123,249,206, 35, 5,184, 88, 86, 7,179,213,138,148,216,144, 6,
- 63,140,162,213,225, 24,200,226,116,180, 92, 69, 69,110,110, 46,238,188,243, 78,103, 89,151, 72, 36,141,156, 47,127,156, 28,199,
-225,206, 59,239,108,226,240,108,221,186,213,163,251,228, 15,174,162,200, 93, 28,121, 18, 96, 44,203,250,157, 48, 80,112,243, 60,
-137, 45, 87, 87,223, 77,188,249,107,230, 0,199,113,152, 48, 97, 2,196, 98, 49,222,124,243, 77,112, 28,135,244,244,116,112, 28,
-135,140,140, 12,136,197, 98,220,126,251,237,205,142,251,158, 61,123,208,179,103, 79,103,152,210,211,211,209,167, 79, 31,112, 28,
-135, 1, 3, 6, 64, 44, 22, 99,248,240,225,129,112,190, 93, 95, 95,223, 67,165, 82, 33, 47, 47, 11, 97,163,210, 0, 0, 32, 0,
- 73, 68, 65, 84, 15, 34,145, 8, 12,195,156, 1,208, 3, 0, 98, 99, 99,207,234,245,250,246, 70,163, 17,207, 60,243, 12, 99, 54,
-155,187,191,249,230,155,239, 24,141, 70, 42,180, 40, 90, 13,238, 90,196, 5,134, 73,147, 38,189,205, 48, 76,182,224, 80,185, 59,
- 79,158,126,123,168,155, 4, 7,106,191,163,172,246,113, 19,113,149, 12,195,236, 39,132,220,237,237, 92, 0,102, 55, 97,213,168,
-233,208,181,217,208,175,163, 37, 84,190,129, 10, 45,127, 48, 26,141, 55, 71, 69, 69,121, 21, 89,174,159,102,179, 25,201,201,201,
- 48, 26,141, 55, 55,247,161, 17, 27, 27, 11,139,197,130,175,191,254, 26, 18,137, 4, 18,201, 31,250,194,108,246,109, 22,157, 56,
-113,162,112,207,158, 61, 61,123,245,234, 21,246,203, 47,191, 84, 14, 26, 52, 40,114,196,136, 17,144,203,229, 48, 24, 12,176, 90,
-173,232,219,183, 47,186,116,233,130,146,146, 18,252,239,127,255,171,234,212,169, 83,155,189,123,247,242,101,101,101,231,125, 80,
-223, 49,116,232, 80, 48, 12,131,245,235,215, 87, 1,216, 47,147,201,214,205,152, 49, 35,204,108, 54,243, 99,199,142,189, 80, 83,
- 83,243, 10, 0,139, 84, 42,157, 55,104,208,160,140,156,156,156,239,121,158,159,219,220,140,234,158,182, 58,157, 14, 65, 65, 65,
-129, 76, 37, 33,174,169,169,233, 6, 0, 74,165, 50, 28,192, 89,103, 14, 55, 24, 26,137, 97,179,217,108, 12, 15, 15, 87, 2,128,
-227, 28,177, 23,206, 72,155, 13,171,206,159, 47, 8,118,237, 63, 23, 26, 26,138,199, 30,125,148,189,173, 95, 63,105,143,155,111,
- 30,254,238,103, 75,126,140,139, 80,155, 83,226, 34, 96,181, 91,145,179,113, 3, 79,120,235, 70, 90,237, 92, 27,161, 37,136, 13,
-119, 71, 75, 44, 22, 99,219,182,109, 77,246, 73, 36, 18,252,251,223,255, 14, 72, 24, 8,162,202, 91,211,153, 91, 83, 23,227, 79,
-192,136,197, 98,136, 68, 34, 44, 90,180, 8, 60,207,227,213, 87, 95,109,212,156,232,202, 31,144,157,231, 34, 2,187, 76,229, 1,
-152, 81, 50, 91,230, 60,223, 61,188,142,115, 2,114,201,230,207,159, 31,144,163,117,247,221,119,251, 21,174,174, 45, 12,174,225,
- 58,124,248,176, 71,222,133, 11, 23,250, 77, 79,187,221,142,181,107,215, 58, 69,170,128,119,223,125,247, 25,169, 84, 26,189,125,
-251,118,148,149,149, 65,167,211, 65,171,213,162,111,223,190, 41, 44,203, 30, 41, 43, 43, 43, 58,121,242,228,253,180,244, 80, 92,
- 67, 71,203, 52,107,214,172,227,179,102,205,242,232, 88,185, 59, 75,190,156, 39, 65, 96, 57, 4, 81,164, 32,222,208,208,173,102,
-191,191,115, 1, 72,221,155, 14,125, 26, 65,110, 42,114,154,167,202, 55,144,230,195, 0,237,116,142, 97, 24, 24,141, 70,143, 2,
-203, 85, 28, 88, 44, 22,212,212,212,192,110,183, 95,241, 92, 95,158,222,100,253, 9,173, 99,199,142,253,227,201, 39,159, 44, 13,
- 9, 9,233, 81, 89, 89, 89,193,243,252,237,187,119,239,142,228, 56, 14,106,181, 26,106,181, 26,235,214,173,131, 66,161,192,132,
- 9, 19, 42,236,118,123,110,112,112,112,132,193, 96,248,189,172,172,236, 93,175, 10, 70, 44, 30, 62, 96,192, 0, 28, 60,120, 16,
-151, 47, 95,222, 4, 32,253,241,199, 31,191,179,109,219,182,204,140, 25, 51,140,231,206,157,155, 11,160, 66,169, 84, 46, 93,186,
-116,233,144, 94,189,122, 5,143, 29, 59, 22,219,182,109, 91, 8,192, 24,104,156,117, 58, 93, 35,129,165,209,104, 80, 95, 95, 15,
-165, 82,105, 11, 48,205,196,248, 99,132, 33, 8, 33,206,123,227,112,179,132,251, 67, 56,142, 19, 70, 53,122, 19, 89, 80, 42,149,
-211,151, 44, 89, 34,119, 31,164, 96,183,219, 81, 94, 94, 14,181, 90,141, 41,239,190, 43,249, 96,226, 63,123,138, 84,209,187, 89,
-150,129,217, 66,106, 9,111,222,160, 43,127,120, 59,240, 62,173,121,174, 1, 4, 97,112,239,189,247, 54,105, 46,148, 72, 36,216,
-180,105, 19, 70,141, 26,229,124,113,233,213,171,151,223,151, 43, 65, 24,220,115,207, 61, 78,103,104,195,134, 13, 30,155,253, 4,
- 71, 42, 16, 65, 40, 28,251,210, 75, 47,129,227, 56,124,241,197, 23,120,237,181,215,192,178, 44,102,207,158, 13,150,101,241,222,
-123,239, 5, 44, 50, 93, 5, 76,209,199, 13,159, 9,175,105, 80,189, 32, 26, 0, 16,172, 86, 11, 17,106, 86,221,195,113,156,211,
-201,186,249,230,155, 33, 22,139,145,145,145, 1,142,227,156, 78,214,200,145, 35, 93,211,145, 4,194,201,113, 28,242,243,243,157,
- 97,206,200,200,104,228,100,113, 28,135,187,239,190, 59,144, 96,206, 12, 13, 13,157,214,165, 75,151,174,115,230,204, 17,139, 68,
- 34, 12, 29, 58, 52, 53, 38, 38,230,188,205,102,139,152, 62,125,186,194,195, 57,114, 0, 61,186,118,237,170,164,165,134,162, 21,
- 29,173,105, 30,254, 10,115,237,115,213,140, 23,201,108,215,227, 5, 14,119,113,228,112,200,114,253,113,121, 58,215, 31, 56, 65,
- 65,250,178,212, 3, 17, 90, 14,219,217,231,197, 20, 10,197,209,138,138,138, 12,185, 92,222, 72,100,121, 18, 92, 34,145, 8,101,
-101,101, 80, 40, 20, 71, 77, 38, 83,139,221, 68,127, 77,135, 0,140,103,206,156,153,232,242,123,216,200,145, 35,191,219,180,105,
- 83,108, 78, 78, 14,246,238,221,139,200,200, 72,204,159, 63,255, 82,121,121,249, 63, 0,108,170,170,170,242,123,221,246,237,219,
-119, 83,169, 84,216,185,115, 39, 0,108, 3,240,207, 23, 94,120,129,177, 90,173, 88,176, 96,129, 14,192,250,208,208,208,181, 43,
- 87,174,236,217,163, 71, 15,105, 78, 78,142,102,239,222,189,191, 5, 40,178,236, 60,207, 55, 17, 88,174,105, 26, 28, 28, 28,136,
-163,101, 13, 9, 9, 57,166,209,104,198, 24, 12, 6,141, 76, 38, 11,214,104, 52, 38, 87,129, 37,240,115, 28, 39,206,207,207, 47,
- 5,144, 18, 18, 18,114, 12, 94,154, 57, 57,142, 27, 58,116,232, 80,206,253, 30,148,151,151,163,172,172, 12, 22,139, 5,189,122,
-245, 98, 68,140, 85,116,185,248,168,219,180, 14, 84,100, 93, 35, 71,139, 8,101, 93, 24, 37,232,105,164,225,134, 13, 27,156,191,
- 89,150,197,183,223,126, 27,144, 40,218,180,105,147,207, 14,235,110, 77,135,126,173,113,225,248, 47,191,252,178, 97,121, 11,135,
-147,197,178, 44, 38, 77,154, 4,153, 76,134, 25, 51,102, 96,210,164, 73,224, 56,206,111,211,161,171,128, 73,122, 83,239,250,114,
-212, 80, 40, 28,253,161, 24,134,113, 21, 91, 76,160,226,205,151,155, 23, 72, 75,128, 43,167,112, 94, 80, 80,144,215,142,240,110,
-156,190, 46,240, 95, 0, 5,177,177,177, 59, 51, 50, 50, 66, 14, 28, 56,128,217,179,103, 75, 76, 38, 83,187,156,156, 28,231,117,
- 61,165,151, 78,167,147,211,146, 67,209, 26,110,150,143,191, 43,221,250, 87, 49,174,205,120, 62, 62,221,143,135,203, 62, 87,222,
- 74,134, 97,172, 30,174, 87,233, 65, 92,185, 95,195,245,152, 74,175,142,150,191,202,194,159,224, 10,196,209,210,235,245,191,173,
- 95,191,190,207,163,143, 62,202,249,106, 54,212,233,116,136,142,142,198,241,227,199,109,122,189,254,183, 0,156,178,150, 20, 90,
-238,200,169,168,168, 16, 89,173, 86,116,236,216, 17,241,241,241, 48, 26,141,168,173,173, 21, 1,216, 20, 32,135, 68,169, 84,138,
- 0,160,182,182, 22,104, 24,106,154,218,169, 83, 39, 28, 60,120, 16, 53, 53, 53, 63, 3, 24, 49,109,218,180, 94,125,251,246,149,
-252,248,227,143,250,231,158,123,238,103,171,213, 26,144,210,224,121,222,108,179,217,146, 89,150,181,212,214,214, 94,116, 77,207,
-232,232,232,112,165, 82,201,148,151,151, 91, 3, 17, 90, 61,122,244,216,119,225,194, 5, 76,159, 62,189,114,230,204,153,157,234,
-235,235, 47,215,213,213,217, 92,197,150,209,104,100,219,180,105, 35, 91,176, 96,129, 28, 0,122,244,232,177,207,155,208,210,233,
-116,109, 21,138, 63, 94,140, 77, 38, 19,202,202,202, 80, 86, 86,134,242,242,114,212,215,215, 35, 37, 37, 5,122,189, 62,145, 86,
- 51,127,154,208,106,212,124,230, 90,190, 93, 31,228,205, 41,235,174, 2,230,222,123,239,117,246,237, 18, 28, 50, 97, 91,181,106,
-149,123, 7,243,128,132,214,151, 95,126,137,151, 94,122, 9, 65, 65, 65,152, 51,103, 78,163,166, 67,119,113,192,243, 60, 19, 72,
-220,147,223, 50,160,108, 94, 56,196, 98, 49, 34,158, 43,111,212, 68,231, 65,112, 4, 20,206,153, 51,103,182, 72,211,161, 43,103,
- 98, 98, 67, 81, 89,180,104, 17,198,140, 25,131,237,219,183, 95,113,211, 97, 90, 90,218,178,236,236,236,144, 19, 39, 78, 64,163,
-209,160,178,178, 18, 38,147, 9, 37, 37, 37, 94, 91, 5, 28,117,121, 16, 45, 57, 20,215,184,158,218,127, 45,121, 91,242,122,156,
-159, 7,120,192, 66, 43, 16, 71,203,100, 50,205,121,249,229,151, 95, 24, 54,108, 88,120,112,112, 48, 74, 75, 75,155,136, 44,173,
- 86, 11,149, 74, 5,131,193,128, 53,107,214,104, 76, 38,211, 28,127,226,192,106,181, 34, 42, 42, 10, 85, 85, 85,224,189,244,159,
-102, 89, 22,114,185, 28, 90,173, 22,240,211,201,220,211, 3,195, 98,177,192,106,181,194,106,181,194, 98,177, 52,119, 69,110,133,
- 82,169, 20,132, 7, 0,232,226,226,226, 58, 6, 5, 5,161,176,176, 16,104, 24,217, 55,236,206, 59,239, 20, 87, 87, 87,147,167,
-159,126,122, 7, 33,228, 25,248,158, 29,223,156,155,155,155, 12, 0,114,185, 60, 15, 0, 74, 74, 74,172,181,181,181,141,156, 66,
-133, 66, 65, 70,141, 26, 21, 75, 8, 65,110,110,110,178, 68, 34, 33,240, 62,170,209,184,122,245,234, 19, 33, 33, 33,203,179,178,
-178, 30,205,204,204, 60,222,173, 91,183,100,157, 78, 87, 97, 48, 24, 12, 70,163,145,136, 68, 34, 73, 88, 88, 88,208,198,141, 27,
-207,238,222,189,123,152, 90,173, 94,190,122,245,234, 19,222,156, 55,165, 82, 89,162,215,235,147,132,123,234, 42,178,202,202,202,
- 64, 8, 65, 65, 65, 1, 20, 10,197, 5,127,205,186, 20,173, 7,225,165,202,221,121,113,223, 23,168,200,114, 21, 6, 27, 55,110,
-244, 57,135, 86,160,156,174,162,232,181,215, 94,195,188,121,243,154, 56, 90, 51,102,204, 0, 0,188,251,238,187, 1,247,209, 18,
-220,171,178,121,225,136,121,169,166, 81,216, 1,128, 17,194,215,188, 50, 15,142,227, 48,125,250,244, 38,157,212, 93,155,246, 2,
-108,226,107, 20,206,138,138, 10,112, 28,135,240,240,112, 60,246,216, 99, 24, 62,124,184,179, 9,178,185,188,167, 78,157,218,249,
-214, 91,111,117, 79, 75, 75,195,135, 31,126, 88, 19, 26, 26, 26,252,175,127,253,139,171,173,173,101,124, 57, 90, 84,104, 81, 80,
-180,128,208, 18, 10, 88,160,163, 14,189, 84,150,195,208,120,174,141, 58,189, 94,255,216, 29,119,220,241,203,138, 21, 43,228,237,
-219,183,199,169, 83,167, 80, 83, 83, 3,179,217, 12,137, 68,130,216,216, 88,212,214,214,226,219,111,191, 53,232,245,250,199, 0,
-212,249,225,124,167,119,239,222, 95,125,250,233,167, 65,233,233,233,168,169,169,129, 86,171,117, 10, 33,134, 97,160, 86,171, 33,
-151,203,177,111,223, 62,108,216,176,193, 0,224, 29, 63,156,158,212, 28, 44, 22,139, 83,112, 5, 32,180, 92, 57,149,130,171,163,
-215,235, 1,192,218,182,109,219, 24, 0, 40, 40, 40, 0,128,162,148,148,148,105,237,219,183,103,150, 46, 93, 74, 8, 33, 27,188,
-136, 44, 39, 39,195, 48, 53,132,144,203, 0, 98,204,102,179, 4, 0,234,234,234, 44,109,218,180,137,146,201,100,188, 92, 46,231,
-131,130,130,248,210,210, 82,155,205,102,147, 0,192,128, 1, 3,204, 0,202,220,214, 40,116,229,228, 9, 33,154,133, 11, 23, 78,
- 27, 59,118,108, 70,191,126,253,210,158,127,254,249, 99, 79, 63,253, 52, 27, 31, 31, 31, 86, 95, 95,111, 60,115,230,204,229,207,
- 62,251,172,126,207,158, 61,195,196, 98,241,249,133, 11, 23, 78, 3,160, 97, 24,134,247,196,105,179,217,126,203,201,201,249, 71,
-102,102, 38,119,241,226, 69,148,151,151, 59, 69, 86,121,121, 57,186,116,233,130,221,187,119,219, 45, 22, 75, 78, 51,210,179,165,
- 64, 57, 27, 94, 66,136, 80,214,189, 9, 44,225,101, 42, 80, 78, 87, 81, 52,102,204,152, 70, 46,150, 68, 34,193, 79, 63,253,228,
-177,222,240, 80,174, 26,197,221,117,142,175,183,222,122,171,145,104,155, 50,101,138,215,234,204, 95,122, 10, 60,117,139,226, 27,
-143, 58,244, 82,206,125,133, 83,168, 59,197, 98, 49,166, 76,153, 18,176,163,133,166,125,180,154,112, 10,113, 31, 52,104, 16,244,
-122,189, 83,200,122,115,180,252,165,167,221,110,127,105,222,188,121, 68,173, 86,223,170,209,104, 30,191,112,225,194, 98,189, 94,
-127, 75, 93, 93,157, 79, 71,203,100, 50,201,104, 57,162,156,104,157,249,185,110, 28,161,229,120, 72,162,109,219,182,141,214,206,
- 98, 89,182,209,214,156,126, 6, 14,108,204,207,207,127,224,182,219,110,251,254,165,151, 94, 10, 78, 79, 79, 23, 39, 37, 37, 65,
-167,211,161,176,176, 16,199,143, 31,183,173, 94,189, 90,163,215,235, 31, 7, 16,200,168,179, 37, 39, 78,156,216, 48, 98,196,136,
-247,250,246,237,251,236,212,169, 83, 69,169,169,169,168,171,171, 67, 88, 88, 24,162,162,162,112,250,244,105,172, 89,179,198, 94,
- 85, 85,245, 21,128, 15,224,161, 13,213,223, 11,191,197, 98,193, 35,143, 60, 2,158,231, 49,119,238, 92, 4,178,160,178, 11, 44,
- 22,139,133, 0, 96, 28,253,185,244,142,217,165,113,230,204, 25, 0, 56,159,156,156, 28, 12, 0, 57, 57, 57, 12, 26,230,215, 10,
-228, 13,159, 16, 66,156,206, 86,151, 46, 93, 10,221, 43, 71,193,201, 18, 92, 48,127,225,102, 24,198, 72, 8,169,208,235,245, 35,
- 94,123,237,181,247,190,252,242,203, 71,191,252,242,203, 38,199,169,213,234,229,179,103,207,254,224,161,135, 30,170, 96, 24,198,
-107, 63, 50,157, 78,247,238,184,113,227, 30, 58,122,244,104,112, 80, 80, 16,116, 58, 29,170,171,171, 97,177, 88,144,146,146,130,
-138,138, 10, 44, 89,178,164,222, 96, 48,188, 79,139,227,159, 3, 87, 97,224,205,213, 10, 64,100,121,117,117,254,251,223,255,122,
-156,163,170,185,156,238, 98, 35,208,185,173,124,189, 20, 9,211,210,120,154, 50,162,153,245, 90, 19, 94,142,227,240,201, 39,159,
- 56, 39,109,245,228,100, 53,199,209, 18, 56,195,195,195, 27,108,114,133, 2, 60,207,227,238,187,239,190, 26, 94, 30,192, 4,151,
- 25,223,103,190,241,198, 27,211,186,116,233,146, 10, 64,230,154, 6,205,116,241, 41, 40, 40,252, 9, 45,187,221, 94,210,185,115,
-231, 70, 21,156,191,197, 76,173, 86,107, 73,128,215,221,160,211,233, 82,102,207,158,253,178, 82,169, 28,166,215,235,187, 59, 42,
-142,163, 58,157, 46,199,100, 50,125,142,230, 45, 2, 93, 9,224,197, 61,123,246,204, 29, 49, 98,196,140,219,111,191,125,244,196,
-137, 19, 25, 66, 8, 22, 44, 88, 64,206,157, 59,183,202,225, 98,157,187,146, 68, 10, 15, 15, 63,241,237,183,223, 70,255,242,203,
- 47,176, 90,173,248,252,243,207, 17, 28, 28,124,162,166,166, 38, 80,138,138,205,155, 55,127,215,175, 95,191, 39,118,239,222,189,
- 4,192,239,219,182,109, 91,220,191,127,255,113,187,119,239, 94, 6,224,248,150, 45, 91, 22,247,237,219,119,220,254,253,251, 87,
- 2, 56,220,140,202,215,233,108,217,108,158, 91, 26,189, 56, 89,190, 56, 53,132, 16,203,147, 79, 62, 57,241,161,135, 30,250,122,
-255,254,253,183,212,214,214,118, 7,128,208,208,208,163,125,250,244,217,183, 98,197,138,211, 14, 39,203, 95,103,253, 74,157, 78,
- 55,170,123,247,238, 63,127,248,225,135,202,180,180, 52,174, 99,199,142, 40, 42, 42,194,177, 99,199,108,255,249,207,127,180, 6,
-131,225, 94, 0,151,105,113,252,243,132, 22, 33, 4,161,161,161,141, 94,162,132, 33,255,205,109, 46,116,125, 48, 11, 75,245,184,
-243,122,227,244, 53,109,130, 0,149, 74,229,156,220, 52,144, 46, 11, 60,239,123, 62, 54, 66,136,147, 83,216, 2, 16, 89,126, 71,
- 8, 58,150,192, 9,152, 51,144,233, 29,148, 74, 37,172, 86,171,147, 55,128,145,159,205, 85,139,255, 5,240, 95,171,213,122, 6,
- 64, 7, 42,174, 40, 40, 90, 81,104, 93,190,124,185,119, 43, 95, 91, 99, 50,153, 62, 48,153, 76, 31, 8, 59,140, 70,227,213,114,
-158, 3,240,208,230,205,155, 63,221,188,121,179,208,142, 48, 29,254,215, 75,244,137, 83,167, 78,101,138,197,226,127, 47, 95,190,
-188, 47, 33, 4, 33, 33, 33,123,138,138,138,254,213, 28, 14,187,221,254,228,238,221,187, 95,128,163, 47,147,197, 98,121,114,231,
-206,157, 47,163, 97, 61, 38,216,237,246, 39,247,238,221,235,252,221,204, 7, 37, 33,132,152, 8, 33,113, 94, 14, 49, 53,211,129,
- 19,156, 45,243,138, 21, 43,180, 0,142,224,143,121,178,172,142,205,232,214, 92,232, 11, 91,116, 58, 93,199, 41, 83,166,204, 20,
-137, 68, 67,117, 58, 93,188, 82,169, 44,182,217,108,191,233,245,250,119,208,176, 70, 21,197,159, 4,179,217,124,177,115,231,206,
-156,167, 23, 40, 95, 15,114, 95, 47, 86,118,187,189,164, 83,167, 78,126, 95,206, 60,112, 94,244, 33, 26,206,167,164,164,176,129,
-114, 9,176, 88, 44, 21,190,194,153,146,146,130,230,114,250,139,123,114,114,178,199,184,251, 17,132, 94,227,110,179,217,174,136,
-211, 87,122,250,130,193, 96,184, 28, 25, 25,169, 53, 26,141, 98,147,201, 36,182,217,108,141,236, 71,185, 92, 94,105, 48, 24,104,
-225,161,160,184, 26,161,245, 55,199, 1, 52, 44, 47,209, 82, 48, 29, 61,122,244, 9,167, 61, 85, 81,113,165, 60,238, 74, 82,235,
-231,119,115,132, 81,139, 59, 66, 14, 33,165,111, 33,186, 42,173, 86,251,180,240, 67,232, 3, 66,241,231,163,186,186,250,214,150,
-230,172,169,169,105,241, 23,181,170,170,170,140, 86,136,123,239, 27,149,211, 23, 74, 75, 75,111,245, 35,196,104,193,161,160, 8,
- 16, 44, 77, 2, 10, 10, 10, 10, 10, 10, 10,138,214, 1,131,134,145, 3,158,208,156,209, 4,195,174,224,218, 57,148,147,114, 82,
- 78,202, 73, 57, 41, 39,229,188,225, 56,253,113, 95, 55,163, 25,175, 69, 63,199, 97,148,147,114, 82, 78,202, 73, 57, 41, 39,229,
-164,156, 55, 34, 8, 33,180,233,144,130,130,130,130,130,130,130,162,181, 64,133, 22, 5, 5, 5, 5, 5, 5, 5, 5, 21, 90, 20,
- 20, 20,127, 83,164,182,109,219,246,100,106,106,234, 69, 0,227, 91,249, 90,143,245,237,219,183, 90, 38,147,109, 4,144, 74,147,
-158,130,130,130, 10, 45, 10, 10,138,235, 90,100,117,239,222,125,199,169, 83,167,186,228,228,228,196,197,199,199,127,220,154, 23,
-235,221,187,247, 71,219,183,111, 15, 95,191,126,253, 29, 49, 49, 49,185, 87, 40,182, 82,219,181,107,119, 50, 53, 53,181, 4,192,
- 99, 45, 28,196,241, 25, 25, 25, 53, 82,169,116, 3, 21,130, 20, 55, 0,186, 1,232, 78,133, 22, 5, 5, 5, 69, 43,138,172, 93,
-187,118, 69, 24,141, 70,156, 58,117, 10,149,149,149,135, 91,243,130,121,121,121,151,119,237,218,133,132,132, 4, 44, 91,182, 44,
- 50, 57, 57,121,123, 51, 5, 77,106,247,238,221,119,156, 60,121,178, 75, 78, 78, 78,124, 84, 84,212,103, 45, 25,190, 91,110,185,
-101,198,246,237,219,195, 54,110,220, 56, 60, 50, 50,242, 74,133, 32, 5,197, 95, 25, 50, 0, 79, 48, 12,179,175, 91,183,110, 71,
-211,210,210,126,103, 24,102, 55,128, 49,184,126,231,238, 12, 12,217,217,217,219,178,179,179,183,209, 60, 66, 65, 65,209, 2, 72,
- 75, 75, 75,211,233,116, 58, 82, 89, 89, 73,190,248,226, 11, 18, 30, 30,110, 1,240, 27,128,213, 30,182,183, 1,168, 3,228, 86,
- 59,142,247,196,243, 91,120,120,184,229,139, 47,190, 32, 5, 5, 5,228,196,137, 19, 36, 53, 53,213, 16,160,160, 73,237,222,189,
-123,149, 16,230,117,235,214, 17,142,227, 54,180,100,162,168,213,234,227,185,185,185,228,220,185,115,100,227,198,141, 36, 58, 58,
-186,130,138, 45,138,235, 4, 73, 0, 62, 82,169, 84, 53,247,220,115, 15,249,230,155,111,200,154, 53,107,200,207, 63,255, 76,230,
-204,153, 67,134, 12, 25, 66,164, 82,233, 69, 0,111, 2, 8,189, 81,180, 8, 33,164, 97, 85,251,236,236,108, 2, 96, 48, 0,100,
-102,102, 82,177, 69, 65, 65,113,181,216,165,215,235, 51,244,122, 61,234,235,235,209,182,109, 91,136,197, 98,143, 7, 86, 84, 84,
- 96,231,206,157,152, 48, 97,194,137,178,178,178,129,240,189,238,101, 88,207,158, 61,119,109,217,178, 37, 53, 56, 56,216,185,147,
-231,121, 88, 44, 22, 88,173, 86, 88, 44, 22,152, 76, 38,152, 76, 38, 72,165, 82,200,229,114,132,135,135, 31,131,239, 38, 12,167,
-251,102, 48, 24,112,232,208, 33,140, 29, 59,182,178,186,186,122, 32,128,188, 22, 76,151,212,168,168,168,220, 37, 75,150, 68,166,
-164,164,224,194,133, 11,120,234,169,167,170,206,159, 63, 63,160,133,175, 67, 65,113, 45, 49,233,129, 7, 30,152, 17, 29, 29,205,
-118,235,214, 13,177,177,177, 48,153, 76, 48, 24, 12, 32,132,128,227, 56, 16, 66, 80, 87, 87,135,220,220, 92,108,217,178,197,116,
-249,242,229,111, 1,124, 14, 32,223, 69,100, 93,119, 90,164,145,208,202,204,204,100,104, 94,161,160,160,104, 33, 28,173,171,171,
-235,102, 50,153,160,211,233, 2, 58,161,160,160, 0,227,199,143, 63, 81, 86, 86,118, 27, 60, 47, 42,175,238,217,179,231,222,220,
-220,220, 84,163,209, 8,141,198,255,186,243, 82,169, 20, 65, 65, 65,136,136,136,216, 13,160,159,183, 55,241,110,221,186, 29,216,
-189,123,119,184,193, 96,192,225,195,135,241,216, 99,143, 89,106,106,106,118, 0,240, 22,248, 26, 52,172,163,122,222,195,127,137,
- 0, 94,118,188,225,123,130, 50, 50, 50,178,255,210,165, 75, 37,237,219,183,135, 94,175,199,152, 49, 99,106,242,242,242,250, 0,
- 40,164, 89,135,226,111,136,188, 83,167, 78,117,178,219,237,168,170,170,130,201,100,130, 94,175,119, 10, 45,145, 72, 4, 66, 8,
-108, 54,155,243,197,232,224,193,131,200,201,201, 33, 5, 5, 5, 83, 29,101,233,186,212, 34, 84,104, 81, 80, 80,180, 22, 82, 59,
-117,234,116,248,127,255,251, 95,144, 68, 34,193,154, 53,107, 48,117,234, 84,107, 77, 77,205,118,119,241, 18, 29, 29,157,182,120,
-241,226,228,148,148, 20,252,254,251,239,120,240,193, 7,223, 1, 48,211, 3,231,219, 26,141,102,134,197, 98,193,225,195,135, 49,
-110,220,184,194,242,242,242,227,238, 34, 38, 57, 57,121,192,103,159,125, 38,238,213,171, 23, 52, 26, 13, 70,143, 30,173, 63,125,
-250,116, 95, 0,199,189,132,245,179,154,154,154,215,236,118, 59,234,235,235,145,144,144, 0,137, 68,226, 51,114, 6,131, 1, 73,
- 73, 73,187, 43, 43, 43,155,136,183,136,136,136,205, 23, 46, 92, 24, 34,151,203,125,114, 88, 44, 22,148,148,148, 64, 42,149,194,
-100, 50,161, 67,135, 14,223, 2,120,146,102, 29,138,191,163,208, 58,114,228, 72,167, 31,126,248, 1, 61,123,246, 68,215,174, 93,
-161,213,106,157,162,203,108, 54,195,106,181, 54, 57, 73,163,209,224,213, 87, 95,205,135,163,249,252,122, 21, 90, 66,199,180,105,
- 66,155,104,102,102,230, 32,154,103, 40, 40, 40,174,182,226,205,207,207, 79, 31, 54,108,216,246, 85,171, 86,181, 25, 57,114, 36,
- 58,116,232, 32,190,255,254,251, 35,245,122,253, 80,215, 3,203,203,203,195,198,141, 27,119,160,184,184, 56,217,177,171,143, 23,
-206, 62,193,193,193, 40, 40, 40, 16, 68, 86,111,184, 53, 51, 74,165,210, 13, 71,142, 28, 17, 75,165, 82,236,223,191, 31,227,199,
-143,175, 42, 44, 44,244,215, 44, 23,106, 54,155, 33, 18,137, 0, 0, 37, 37, 37,126, 35,119,225,194, 5,240, 60,111,242,244, 31,
-203,178,178,131, 7, 15, 34, 46, 46,206, 39, 7,203,178,238,130,174,150,102, 27,138,191, 41,172,102,179, 25,189,123,247, 70, 97,
- 97, 33, 14, 30, 60,232, 20, 92, 85, 85, 85, 40, 45, 45,109,116,240,190,125,251,112,232,208, 33, 12, 28, 56,208,157,231,186,212,
- 34, 78,229,152,157,157, 61,200, 17,185,109, 52,207, 80, 80, 80,180, 16, 82,227,226,226,114,151, 44, 89, 18, 25, 27, 27,139, 33,
- 67,134, 20,151,149,149,181,243,112,220,106, 66,200,189, 5, 5, 5,104,223,190,253, 26, 0,247, 93,201, 49,137,137,137,149,251,
-247,239,111,115,226,196, 9, 60,246,216, 99,149,142, 62, 95,254,250, 62, 37,119,233,210,101,255,198,141, 27,195, 89,150,197,241,
-227,199, 3,105, 58, 44, 66, 67,255,146,243, 30,254, 75, 4, 48, 5, 64,184,151,115,149,157, 58,117,234,127,224,192, 1, 9,195,
- 48, 40, 42, 42, 18,154, 14,123, 59,120, 41, 40,254,110, 24, 21, 23, 23,247,159, 23, 94,120, 33,164,111,223,190, 40, 41, 41,193,
-197,139, 23,113,249,242,101,164,167,167, 35, 45, 45, 13,231,206,157,195,134, 13, 27,112,232,208, 33,200,100, 50, 36, 36, 36, 64,
-181,252, 7,252,155,193, 9, 0,105,215,171, 22,185, 22,107, 29, 82, 80, 80, 80,164, 74, 36,146, 13,241,241,241, 21,240, 60, 47,
- 85,216,232,209,163, 75,237,118, 59, 57,119,238, 28, 65,195,232, 65,120, 17, 90,228,220,185,115, 36, 58, 58,186, 0, 64,152,135,
- 99,198,199,196,196, 20, 43, 20,138, 99,104,230,180, 14, 29, 59,118,172, 60,125,250, 52, 41, 46, 46, 38,235,215,175, 39, 17, 17,
- 17,173, 49, 34, 48,181,115,231,206, 85,245,245,245,196,104, 52,146,220,220, 92,146,152,152, 88, 9, 58,242,144,226,239,143, 96,
- 0,211, 83, 82, 82,140,159,126,250, 41,217,176, 97, 3, 89,180,104, 17,153, 49, 99, 6,153, 56,113, 34,201,200,200, 32, 25, 25,
- 25,100,204,152, 49,228,181,215, 94, 35,119,222,121, 39, 81,169, 84,117, 0,238,191,158, 19,133, 10, 45, 10, 10,138, 63, 3,137,
- 0,230, 56, 4,213,234,209,163, 71,151,154, 76, 38,114,241,226, 69,242,211, 79, 63, 17, 52, 76,221,224, 9,111,151,149,149,145,
-178,178, 50, 97,106,132, 2,252, 49,173,195, 55, 14,222,171, 18, 65, 73, 73, 73,149, 7, 14, 28, 32, 69, 69, 69,100,221,186,117,
-196, 33,216, 90, 12,114,185,124,163, 70,163, 33, 70,163,145,108,222,188,153, 78,239, 64,113, 61, 34, 10,192,252,155,110,186,201,
- 58,119,238, 92,178,122,245,106,242,197, 23, 95,144, 81,163, 70,145, 55,223,124,147, 60,252,240,195, 36, 50, 50,210, 4, 32, 11,
- 64,200,245,158, 24,215, 66,104,209,149,205, 41, 39,229,164,156,238,216,112,226,196, 9, 34,192,110,183,147,139, 23, 47,146,141,
- 27, 55,146,152,152,152,227,104, 60,159,150, 43,167,186,107,215,174,167, 78,159, 62, 77, 46, 92,184, 64, 44, 22,139,147,227,212,
-169, 83, 4,192,182, 22, 8,103,106,124,124,124,197,214,173, 91,201,233,211,167, 73, 76, 76, 76,113, 75,198, 61, 41, 41,169,162,
-178,178,146,108,222,188,153, 68, 70, 70,250, 19, 89, 52, 47, 81,206,191, 51,103, 18,128,165,189,122,245,178,207,155, 55,143, 60,
-251,236,179, 36, 49, 49,209,238,120, 41,138,191, 81, 84,167,107,103,120, 10, 10, 10,138,107, 5,217,158, 61,123, 32,147,201,156,
- 59,126,255,253,119,215,121,180,188,205,219,160, 57,121,242,228,109, 35, 71,142,220, 62,111,222,188,174,174,163,152,182,110,221,
- 10, 0,166, 22, 8, 91,222,197,139, 23, 7,142, 24, 49,226,243,136,136,136,155,203,202,202,222,107,201,136, 23, 21, 21,189,214,
-189,123,247,153,245,245,245, 26,189, 94, 63, 6,116,238, 44,138,235, 23, 69, 0,198, 30, 60,120,240,227,131, 7, 15,190, 3,128,
- 0,248, 16,192,201, 27, 45, 33,168,208,162,160,160,184,214, 24,255,244,211, 79,187,119, 22,223, 15,224,255,124,136, 44, 1,151,
- 11, 11, 11,251,221,125,247,221, 47,160,241,232, 68,161,115,122, 75, 32,207,108, 54, 15,119, 31, 41,213, 66, 88, 86, 86, 86,182,
-140,102, 1,138, 27, 8,199, 1, 60,124, 35, 39, 0, 21, 90, 20, 20, 20,215, 26,231, 1, 60,117, 21,231,107,224,121,158, 45, 10,
- 10, 10,138,191, 28,232,162,210, 20, 20, 20, 20, 20, 20, 20, 20, 84,104, 81, 80, 80, 80, 80, 80, 80, 80,252,189,192,192,251,200,
-129,156,102,240, 92,201,136,134, 28,202, 73, 57, 41, 39,229,164,156,148,147,114,222,112,156,254,184,115,112,157,128, 78,239, 64,
- 57, 41, 39,229,164,156,148,179, 53, 56, 25,199,198, 58, 54,225,247, 95, 57,238,204, 95, 56,238, 55, 10,231,117,135, 63,115,122,
- 7,225, 70,240,104, 24,242, 73,241,215,131,107, 1, 33,244, 62, 81, 80, 80, 52,179,238, 16,185, 60,108,237,142, 13,127,193,186,
-196, 85, 20,240, 87,249, 92,106,141,184,223,200,156,215, 5,124, 9,173,155,149, 74,229, 84,169, 84,154,194, 48,140, 93,167,211,
- 29, 53,153, 76, 11, 1,236,190,202,107,126, 19, 29, 29, 61,190,186,186,154,103, 89, 22, 44,203,130, 97, 24,176, 44, 11,177, 88,
-108,168,171,171, 83, 95, 9,105,100,183, 81,175,115, 12,243,146,157,216, 23, 86, 28, 91, 51,195,223,126, 10,223, 5, 70, 34,145,
- 60, 16, 30, 30, 30, 90, 89, 89, 73, 88,182,161, 43,159, 72, 36, 18, 22,194,181,213,213,213,125, 23, 40, 89, 88, 88,216,190,240,
-240,240, 80,225,124,134, 97, 80, 93, 93, 93, 91, 81, 81,113, 11, 0, 4, 5, 5,237, 84, 42,149, 17, 28,199, 65, 36, 18, 65, 36,
- 18, 65,175,215, 87, 87, 87, 87,223, 70,111,197,223, 19, 43, 87,174, 20,141,136,127,170, 3, 71, 12, 61, 88,150,132,240, 60, 83,
-103, 99,228,191,111,184,248,205,217, 64,206, 31, 51,102,140,157,166,226,181,131, 84, 42,157, 27, 29, 29,253, 79,173, 86,171,103,
- 24,134, 48, 12, 3,134,105,120,207,114,255,180,219,237, 37,213,213,213,189,253, 60,108,197, 82,169,116,118, 76, 76,204, 56,189,
- 94,175,119,240,121,228, 5, 0,171,213, 90, 82, 85, 85,213, 59,160,186, 62, 50,114,161, 92, 46,127, 92,175,215,235, 24,134,225,
-221,220, 3,215,135,249,185,170,170,170, 1,254,132,129, 84, 42,253, 60, 58, 58,250, 31,142,184, 59,195,121,181,113,143,142,142,
- 30,167,211,233, 2,226,244, 17,247, 38,156,173, 17,206,191, 40,231,245, 47,180,210,211,211,127,216,187,119,111, 39,177, 88, 12,
- 0, 48, 26,141,221,231,207,159,255,196, 91,111,189,149, 5, 96,242, 21, 94,111,241,128, 1, 3, 30,201,205,205,101, 87,175, 94,
-205,246,233,211, 7, 12,195,192,110,183,195,110,183,163, 91,183,110,242, 43,141, 72,136, 82, 49,233,208,166,127, 7,221, 60,236,
-233,151, 42,128, 25,254,246,251, 18,152, 0,222, 5,144,210,204, 32, 84, 58,210,229,144, 23,177,177,139,101,217,102,113,242, 60,
- 95,112,249,242,229,126, 62, 4, 76,139,115, 58, 68,214,131, 3, 6, 12, 8,201,201,201, 97,138,139,139, 25,185, 92, 14,158,231,
- 97,183,219, 97,181, 90,113,211, 77, 55, 53,203, 9, 13, 13, 13, 85, 79,154, 52,169,195, 93,119,221,133,159,126,250, 9, 79, 60,
-241, 4,250,247,239,159, 95, 81, 81, 1, 0, 80, 42,149, 17, 39, 78,156,232, 20, 30, 30, 14,189, 94,143,186,186, 58,220,113,199,
- 29,168,174,174,254, 91, 23,174, 91,211, 19, 62,100, 88,198, 57, 87, 20,177,217,107,246,254, 94,250,238,213,242,134,135,135, 31,
-146,201,100,209,126,213,178,203,131,204,104, 52,150,215,212,212,244,244,115, 74, 18,128,123, 68, 34, 81, 71,142,227, 58, 3, 72,
-178,217,108,209, 0, 32,145, 72,202, 69, 34, 81,145,213,106, 61,109, 54,155,207, 0,248, 47,124, 44,128, 60, 34,254,169, 14,140,
- 77, 63,186,222,196,143, 84,180,207, 74,213,159,155,148,167,144,233,215,141,136,127,106, 85,160, 98,235, 79, 68, 42,128, 21,104,
- 88, 80,250, 89, 52,204, 3,116, 53,136, 7,112, 47, 26,214,124, 76,182, 88, 44, 85, 0, 14,162,161, 31, 74, 62,128,196,200,200,
-200,101, 60,207,155,170,171,171,159,130,135,133,170,251,246,106,123,128,101,217, 4,193, 19,224,137,189,100,207,193,146, 22,121,
- 64,177, 44,251,121,102,102,230, 63, 86,173, 90,165, 56,120,240,160,162,107,215,174,206, 23, 34,158,231,155,244, 49, 73, 78, 78,
-246,231,106,112, 44,203,206, 29, 61,122,244,163, 75,151, 46, 85,156, 63,127, 94, 17, 23, 23,231,228,116, 21, 91, 2,226,226,226,
- 2,205,251,223, 12, 31, 62,124,236,146, 37, 75,196,107,214,172,145,183,105,211, 6, 17, 17, 17,144, 72, 36, 77,142,189,237,182,
-219,120,255, 81,103, 63,191,239,190,251,198,254,248,227,143,138,189,123,247, 42,186,117,235, 6,145, 72,116,213,113, 31, 53,106,
-212,163, 63,252,240,131,226,232,209,163,138,142, 29, 59, 66, 48, 21,220,249, 88,150, 69,219,182,109, 3,226,188,247,222,123, 31,
- 93,177, 98,133,226,208,161, 67,138,206,157, 59, 59,211,147, 16,114,197,225,252,139,115,222, 16,142,150,212, 98,177, 96,219,182,
-109, 96, 89, 22,225,225,225, 24, 63,126, 60, 54,109,218, 52,105,243,230,205,217, 87,224,108,125,227, 16, 89, 98, 0,248,249,241,
- 81, 40, 16, 3, 19, 42,204,144, 72, 36, 56,119,238, 28, 68, 34, 81,179,173, 69,153, 76, 54,142, 16, 50, 69,127,113,191,204, 96,
-176,194, 88,122, 64, 33,151,203,157, 15, 0,125,169, 99,255,165, 3, 10,185, 92,126, 78, 36, 18, 77,215,106,181,139,189,241,117,
-236,216,241,251,227,199,143,119,241, 84,112,125, 65,175,215,163, 93,187,118,137, 53, 53, 53, 29, 61,253, 47, 22,139, 19,206,159,
- 63, 31, 37,149, 74, 65, 8,113, 22, 98,247, 79,225,187,197, 98,193, 77, 55,221,100,241,117, 77, 95,156, 54,155, 13, 65, 65, 65,
- 16,220, 40,179,217, 12,173, 86,235,143,147,145, 72, 36, 15, 8, 34, 11, 0,150, 47, 95,142,152,152, 24, 68, 69, 69, 65,169, 84,
- 66, 46,151, 59, 57, 3,133, 72, 36,194,136, 17, 35,240,254,251,239, 35, 43, 43, 11,111,188,241, 70,163,138, 86, 44, 22, 35, 60,
- 60, 28,235,215,175,135, 90,173, 70, 98, 98, 34, 4,129,255,183,182, 5, 89, 38,124,247,129, 11, 78,135,246,206,219,187,112,183,
-246,228,190,116, 60, 42,193,178, 0,207, 55, 60, 58, 25, 6,196,102,229, 47, 31, 56, 90,250, 94, 0,233, 25, 87, 84, 84, 20, 21,
-104, 26,217,108, 54,196,197,197,137,252, 28, 54, 50, 45, 45,237,231,231,159,127, 94,210,177, 99, 71, 70, 34,145,128,227, 56,112,
- 28, 39, 8,244, 68, 66, 72, 34,207,243,131,203,203,203,201,252,249,243, 63,222,186,117,235,253, 0,214,121,172, 88,136,161, 71,
-189,137, 31,185,253, 48,110, 25, 61,236, 45,172, 95, 57,233,150, 1,233, 60,130, 21,134,179, 0,254,202, 66, 43, 53, 45, 45,237,
-240,222,189,123,131, 44, 22, 11,250,246,237,187, 39, 47, 47,175, 23,174,108, 6,247, 48, 0,159, 77,158, 60,121,236,243,207, 63,
- 47, 10, 13, 13,133, 84, 42, 69,125,125, 61,206,158, 61, 59,238,187,239,190, 35, 95,125,245,213,255, 1, 8, 46, 42, 42,202,216,
-183,111, 31,134, 12, 25,242, 50,128, 87,155, 42, 2, 81,194,206,125,133, 81,194,239,123, 71,116,151,100,244,102,203, 27, 92, 28,
-247,163, 9,120, 59, 95,178,239,200,197, 64,132,216,199,163, 70,141,122,108,213,170, 85, 42, 0, 88,176, 96, 1, 30,120,224, 1,
-132,135,135, 67,161, 80, 64, 34,145, 64, 44, 22, 55,250,244,243,176, 21, 1,248,248,225,135, 31, 30,189,116,233,210, 96, 0, 88,
-186,116, 41, 70,141, 26,133,136,136, 8, 4, 7, 7, 67, 42,149, 66, 36, 18, 53, 59, 49,195,195,195,191,233,127,203, 45, 79, 46,
- 89,178, 4, 0,240,206, 43,175,224,174, 91,111,133, 74, 33,135, 66, 46,133,144, 22, 82,145, 24,119, 78,120,201,175,190, 4,240,
-233, 3, 15, 60,240,208,143, 63,254, 24, 12, 0, 7, 15, 30, 68, 69, 69, 5,162,163,163, 33,151,203, 33,149, 74,157,113,102, 24,
- 6,114,185, 60,160,184, 63,240,192, 3,163,127,248,225,135, 96, 0, 88,188,120, 49, 70,140, 24,225,140,187, 76, 38,131, 68, 34,
-105,180,185,139, 78, 79,156,247,223,127,255,232, 21, 43, 86, 4, 3,192,119,223,125,135, 97,195,134, 33, 44, 44,204,153,158, 2,
- 87,115,238,209, 95,156,243,198, 16, 90,135, 15, 31,126, 80,169, 84,206, 2, 16, 41,149, 74, 67, 31,125,244,209,182, 79, 62,249,
- 36, 30,126,248, 97,108,222,188,249,153,102, 10, 45, 38, 58, 58,122,124,110,110,174,243, 9,109, 38, 77, 4, 83,179, 31,224, 14,
- 76, 57,240,204, 51, 49, 89,103,181,216,179,239, 52,130,192, 50,251, 62,253, 52,210,120,230, 12,236,102, 51, 62, 56, 87,223,176,
-223, 70,152,109,175, 77,136,185,121,238,255, 77, 1,176,216,135, 11, 32, 51,153, 76,200,207,207,111, 86, 32,138,139,139,193,243,
-188,201,151,187, 32,145, 72,112,236,216,177,128, 70, 33, 36, 38, 38,250, 42,128,126, 57, 55,108,216,128,137, 19, 39,226,244,233,
-211, 16,150, 42, 9,128,147, 9, 15, 15, 15, 21, 68,150, 32,130,228,114, 57,196, 98, 49,195,113, 28, 35, 52,237, 57, 10, 87, 64,
-194,152,101, 89,124,255,253,247,248,232,163,143,240,230,155,111, 98,225,194,133,232,209,163,199, 31,153,144,227,160,209,104, 16,
- 22, 22,134,176,176,176, 70, 2,241,239, 12,247,219, 60,123,206, 60, 5,120,210,208, 9,132,240, 0, 15, 16, 16,240,132, 71,249,
-197,179,152,250,254, 39, 1, 63,125,196, 98, 49,206,156, 57,227,204, 7,130, 51, 44, 8, 35, 87,215, 32, 41, 41,201,111, 94,146,
- 72, 36,211,126, 42,220,225,142, 0, 0, 32, 0, 73, 68, 65, 84,253,245, 87,233,247,223,127,143, 31,127,252, 17, 12,195, 64, 38,
-147, 65,169, 84, 34, 52, 52, 20, 17, 17, 17,206, 45, 33, 33,129,249,207,127,254, 35,233,209,163,199, 52,141, 70,179,206,243, 61,
- 39, 33,138,246, 89,169,163,135,189, 5, 0, 24,253, 22,193,229,252, 25, 55,179,181,239,253,149, 23,145, 77,237,222,189,251,142,
- 93,187,118, 5,233,245,122,240, 60,143,117,235,214, 41,134, 13, 27,182,189,176,176,112, 64,115,197, 86, 82, 82,210,154, 93,187,
-118,221, 22, 25, 25,137,186,186, 58,104, 52, 26, 88,173, 86,136, 68, 34, 36, 38, 38,226,227,143, 63,102,238,187,239,190, 23,199,
-141, 27,103,148,203,229,130,179,145,228, 57, 47, 53,206, 76,243,191,248, 50,148,144,134,252, 67,120,210,232,179,166,162, 8,175,
-188, 54, 53,160, 48,182,109,219,246,217,159,126,250, 73,229,234, 44,185,138, 0, 87,145, 37,108,126,132, 1,219,174, 93,187, 39,
-151, 45, 91,230,228,108,211,166, 13, 56,142,131, 88, 44, 6,199,113, 96, 89, 22,219,183,111,199,172,105,147, 17, 22, 25,135,121,
- 95, 44,240, 27,206,200,200,200,133, 35, 70,140,120,124,241,226, 63,170,238,238,237,219,227,238,219,110, 69, 84, 27, 53,218,132,
- 5, 55,164, 19,207,224,247,211,133,126,159, 71, 0,216,182,109,219, 62,181,114,229, 74,149,235, 11,161, 16, 87,225,229, 89,112,
-241,205,102, 51,122,247,238, 29, 80,220, 93, 57, 5,183, 77, 16,109, 66,122, 10,215, 17,202,171,159,112, 62, 41, 8, 97,135,224,
-108,196, 33, 22,139,177,114,253, 18,175,110,246,149,114, 54,247,190,187,115, 22, 21, 21, 97,230,204,153, 16, 94,218, 92,187, 10,
-197,199,199, 99,222,188,121,126,235, 37,183, 50,208, 7, 64,164,203, 46, 51, 0,169,203,103, 37,195, 48,251, 61, 28, 39,236, 23,
- 59, 90,172, 34,209,208,111,172, 30, 64,168, 7, 62,111, 60, 85,142,103, 94,164,219,241,141,174,227, 85,104,101,103,103, 11,165,
-120,112,102,102,230, 54,199,247, 90,153, 76, 86,172, 80, 40, 98, 0,212,175, 91,183, 14,255,250,215,191,224,176, 86,239, 13, 9,
- 9, 57,238,193,213, 57,108, 50,153,222, 2, 80,238,216, 37, 12,209,100,107,106,106,248, 77,155, 54,177, 75,239, 31, 14, 51, 1,
-210,167,204,194,136,204, 76,108,136,151, 66, 4,224,150, 83, 85, 80, 40, 20,156, 70,163,177,186,246,219,242,208,119, 43,199, 45,
- 67,137,130, 56, 14,125,119,172,197,196, 29,107,113,139, 82,138,234, 85, 43, 80,191, 51, 23, 44,203, 96,160,178, 13,222,120,108,
- 19,250,169,101,144,154,116, 96, 89,214, 83,206,118,114,230,231,231,143, 81,171,213,179,220, 18, 56, 16, 20,160, 97, 29, 39,120,
- 9, 39, 8, 33,232,209,163, 7, 24,134,113,186, 5,194, 38, 20, 58, 97, 59,116,200, 99, 11,164, 87, 78, 71, 19, 28,148, 74, 37,
-126,251,237, 55,231, 49, 67,135, 14,133,209,104, 68,120,120,120, 64,156,149,149,149,164,180,180,148, 89,186,116, 41,196, 98, 49,
- 34, 34, 34,160, 80, 40,152, 37, 75,150, 76,150, 72, 36, 9, 70,163,145, 55,155,205,144, 74,165,243,132,251,195,113,156, 78,163,
-209, 68,120,227, 20,137, 68,120,254,249,231,241,250,235,175, 99,225,194,133,120,230,153,103,154, 56, 94, 70,163, 17,109,218,180,
-113,138, 45, 15, 5,176, 53,134,251,182, 46, 39, 79,112,252,208, 6,156, 56,154, 3,222,206,195,206, 19, 16, 98, 7,111, 3, 14,
-110,218,211,233, 82, 65,105, 60, 1,105,232,122, 11, 64, 86,167,181, 13,138,144,118, 6,176,122, 91,181,121,174,191,112,114, 28,
- 7,163,209,136, 95,127,253, 21,167, 78,157,194,186,117,235, 96, 48, 24,208,166, 77, 27,132,134,134,226,214, 91,111,197,184,113,
-227,144,148,148,228, 55,238,132,144,197,197,197,197,233,253,251,247,103,106,107,107, 81, 91, 91, 11,131,193, 0,187,221, 14,155,
-205, 6,142,227, 16, 20, 20, 4,185, 92,142,232,232,104, 24,141, 70, 98, 50,153, 22,123,227,228,121,166, 78,127,110, 82,222,250,
-149,147,110, 25,253, 22,193,170,143, 24,116,104, 39,211,255,118, 32,248,201,213, 59,222,184, 3, 0,225,137,211, 90, 32, 86, 59,
- 95,245,250,228,207, 94,188,230,247,168,169,200,138, 48, 24, 12,168,175,175,111,176,245,165, 82,172, 90,181,170,205, 61,247,220,
-147, 91, 90, 90, 58,208,135,216,106,194, 25, 28, 28,156, 40, 18,137,112,236,216, 49,124,245,213, 87,248,237,183,223, 80, 94, 94,
-126, 57, 46, 46, 46,100,240,224,193,236, 43,175,188,130,244,244,116,124,251,237,183, 65,254, 56, 9, 33, 40,202,223,142,162, 51,
- 59,192,243, 13,174,117,195,230,249, 59, 9, 48,238, 58,157,206,120,248,240, 97,213,215, 95,127,141,168,168, 40, 36, 39, 39, 67,
-161, 80, 32, 40, 40,168,209, 67,214,245,193,235,175,108, 26, 12, 6, 99, 81, 81,145,234,135, 31,126, 64, 68, 68, 4,146,146,146,
-160, 80, 40, 32,149, 74,193,113, 28, 24,134,193,210,165, 75,177,252,253,199, 80,116,250, 40, 70,221,125,135,223,112, 42, 20,138,
-199, 23, 47, 94,220,200, 2,137, 14, 11, 3, 39,102, 33, 18, 51, 8, 27,122, 63, 0,224,242,230, 95,124,205, 14,233,202,201,212,
-215,215, 27,247,238,221,171, 58,112,224, 0,120,158, 71, 82, 82, 18,244,122, 61,212,106,181, 51,254,155, 54,109,194,125,247,221,
-135,239,191,255, 30, 25, 25, 25,126,227,174,213,106,141, 71,143, 30, 85, 45, 91,182, 12,225,225,225,104,219,182,173, 51,238,194,
- 38, 22,139, 33, 18,137,144,146,146,130,186,186, 58,168, 84, 42,191,247,232,224,193,131,170,101,203,150, 33, 44, 44, 12, 9, 9,
- 9, 78,199, 77, 16, 71, 31,125,249,126, 35,130, 32, 38,246,170, 57,155,123,223,221, 57, 71,141, 26,133, 14, 29, 58, 64,173, 86,
- 67,169, 84, 58,185,125,113,122,209, 34, 78,189,205, 48, 76,182, 75,153,200,100, 24, 38,219,245,211,219,113,142,175, 3, 39, 79,
-158,220, 59, 43, 43,107,102, 70, 70,198, 15,187,118,237, 90,238,141,207, 27,207,228,201,147,211,178,178,178,102,186, 30,239,225,
- 58,222, 29,173,204,204, 76,198, 17, 73, 6, 64,114,175, 94,189,246,111,222,188, 57, 60, 56, 56,216,121,240,133, 11, 23, 80, 91,
- 91,139,224,224, 96,245,236,217,179,213,131, 7, 15, 70,116,116,180,243, 13, 32, 63, 63,255,166,212,212, 84, 13, 0,119,223,150,
-103, 89, 22,253,250,245,195,113, 71,107,199,136,204, 76, 36, 36, 36, 56, 59,121, 4, 5, 5,225,197, 23, 95,100, 38, 78,156,200,
- 9,110, 6, 33, 4, 6,131, 1,177,177,177,114, 95,174, 14, 0,164, 25,170,240,203,224,129, 96, 25, 64,127,104, 31, 36, 82, 6,
-172,136, 65, 79, 82,141,255, 13, 25, 8, 6,128,249,200,110, 4,224,194, 28, 2,112, 71,235, 56, 28, 4,103,207,158, 13,200,209,
-114,196,139,185, 82, 78,193,209,216,181,107, 23,236,118,123,160,156,132,101, 89, 40,149, 74,196,196,196, 64, 46,151, 67,161, 80,
- 48, 63,252,240,195,187,201,201,201,177, 19, 39, 78,100, 53, 26, 13,219,175, 95, 63, 60,240,192, 3,156,208,196,153,150,150,230,
- 55, 46,219,182,109,195, 87, 95,125,133,103,158,121,198,163,163,197, 48, 12, 34, 35, 35,161, 86,171,113,189,128, 7, 96,177, 89,
-161,215, 26,156, 77,186,118,187, 29, 71,183, 30,233, 84,112, 36, 63, 45,251,135,239,197, 0, 96,220,250,139,235,105,177, 15,124,
-185, 34,117, 80,152,120,239,182,203,214,189,190,242, 60,199,113, 24, 63,126, 60,178,178,178,240,248,227,143, 99,221,186,117,120,
-239,189,247,240,207,127,254,179,137,171,229,239,205,209,106,181,254,251,137, 39,158,120,102,213,170, 85,157,223,122,235, 45, 86,
-112,180, 20, 10, 5, 24,134,129,209,104,132,201,100,130,193, 96,192,233,211,167,249,167,159,126, 58,207,108, 54,255,219,107,115,
- 37, 35,255, 93, 33,211,175,107,159,192,118,208, 21,126, 18,220,255,214, 36, 3, 35,239, 85,119,127,234, 48, 50,114,124, 82, 24,
- 8, 1,225, 1,158, 0, 38,147, 14, 47,190,248,178,232, 79,188, 85, 78,145,101, 52, 26,113,248,240, 97, 12, 25, 50, 4,197,197,
-197, 56,121,242, 36, 58,117,234,132, 37, 75,150, 68, 62,250,232,163,185, 21, 21, 21, 3, 3,117,182,142, 30, 61, 58,249,230,155,
-111,254, 92,171,213,214,104,181,218,207, 1, 44, 7, 80,123,246,236,217,174,103,207,158,157,191, 97,195,134, 1, 83,167, 78, 21,
-185,245,209, 17,121,179, 71,173, 86, 27, 12, 6,147, 79,129, 37,252, 38,132, 15, 40,226, 12,195,144,206,157, 59,227,158,123,238,
-129, 88, 44,134, 66,161,128, 74,165,106,212,108,230, 46,184,124,213, 31, 0,120,134, 97, 16, 23, 23,135,145, 35, 71, 66, 34,145,
- 52,226, 20,242,225,200,145, 35,241,210, 7, 83,240,239,151,110,199, 87, 79,116,194,176, 15,203,125,134, 83,175,215,107,183,108,
-217, 34,127,253,153,103,112,115,199,142,104,163, 86,163, 93,116, 36,228, 50, 41, 36,174, 97, 98, 2, 50,217, 9, 0, 94, 36, 18,
-161, 91,183,110, 40, 47, 47, 71, 97, 97, 33, 10, 11, 11,193,178, 44,250,247,239,239,116, 97,206,156, 57,131, 15, 62,248, 0, 38,
-147, 41,224,184,119,236,216, 17,183,223,126, 59,164, 82, 41, 20, 10, 69,163, 38, 67, 33, 77,235,235,235,209,161, 67, 7,172, 94,
-189, 26,169,169,169,126, 57,187,116,233,130, 65,131, 6, 53, 74, 79,185, 92,238, 20, 69, 0, 80,188, 87,235,188, 70,124,124,124,
-179, 56, 55,238,187,128,175, 55,109,129,201,204, 67,163,183, 54, 58, 33,182,141, 26, 59,150,189, 21, 80,220, 5,206, 69,139, 22,
-161,182,182,214,105, 28, 8, 47,229,130,137,210,182,109, 91, 44, 88,224,217,201,116,211, 34,158,158,121,153, 1, 62,111,133,227,
-132,204, 37,203,202,202,154,233,126,190, 63, 62,215,255,221,206, 55,187,137,179,242,102, 53, 29,202,100,178,183,183,108,217, 18,
- 94, 87, 87,135, 51,103,206,128,101, 89,103,155, 58,199,113,176, 88, 44, 56,119,238, 28,194,195,195, 81, 81, 81, 1,153, 76, 6,
-145, 72, 4,179,217, 12, 0, 61,189, 61,192, 9, 33,120,169,178,161,139,208,250, 56, 9,138, 0,220, 93,217, 80, 48,132, 14,241,
- 63,253,244, 19, 84, 42, 21,130,131,131,157,159,254,154,145,142, 22,158, 69,185,152, 1,187,123, 59, 24, 22, 96, 25,128, 17, 1,
- 44, 75,192, 50, 12,216,221,185, 96, 24, 64, 25, 17,214,220, 10,216, 95,199,120,159, 29,224,189,185, 79,158, 92, 44,247,239, 91,
-183,110, 69,160,156, 29, 58,116,128, 74,165,114,110, 27, 54,108,104,228,104,217,237,118, 68, 68, 68, 4,194, 73, 26,220, 8, 30,
- 81, 81, 81,255,207,222,117,135, 71, 81,181,223, 51,179,125, 55,201,102,211, 19, 18, 66, 9, 32, 37,210, 20, 62,144, 94, 2, 8,
-161,137, 20,249, 32,136,136, 82, 68, 5,137, 8,252, 80, 1, 9, 77,154, 84, 65, 62, 2,130,116,233, 82, 68, 58, 88, 64, 65, 18,
- 8,132, 18, 72,223,212,237,101,218,239,143,236,198,205,102,147,108,138, 32, 56,231,121,230,217,157,118,230,222,185,119,238,156,
-251,222,247,190, 3,145, 72, 68,108,221,186,245,147,250,245,235,135, 76,157, 58,149, 20, 8, 4,184,118,237, 26, 18, 18, 18, 80,
-183,110, 93,183,125,182, 10, 10, 10, 50, 62,249,228, 19,230,147, 79,138,230, 80, 68, 70, 70,162,160,160, 32,219,190, 95,163,209,
-228,246,234,213,171,132,223, 70, 78, 78,206,179,237, 9,111,187,143,180,149,134,193,100,130, 78,107, 40,182, 14,101,167,103,169,
- 62,158,246,161,104,233,228, 55, 1, 0,211, 86,172,134,118,195, 95, 13,217,254,105, 35, 2, 7,127,185,115, 6,128,129,229,241,
-235,116, 58,152, 76, 38, 68, 68, 68,224,210,165, 75,208,106,181,232,211,167, 15, 8,130, 40,158, 33, 90, 9, 88,210,210,210, 58,
- 68, 71, 71,255,186,124,249,242,136,166, 77,155, 18,122,189, 30, 6,131, 1,142,191, 55,110,220,224,118,236,216,113,223, 96, 48,
-188, 98, 51,157,187,196,241,180,111,146,123,135,190,181,231,199,107,130,232,192, 6, 73,202,180,252, 8, 58, 55, 77,170,215, 24,
-111,155, 24, 46, 1, 28, 3, 48, 96,193,209, 44, 24,219,176,215,211,130, 92, 46,255,234,194,133, 11,126, 38,147, 9, 87,175, 94,
-197,168, 81,163, 44, 57, 57, 57, 18, 0,248,239,127,255,107,217,182,109,155,164, 65,131, 6,216,186,117,107,192,107,175,189,182,
- 91,175,215,191,232, 38,245,183, 25, 25, 25,223, 58,111,244,243,243, 91,245,232,209,163,174,142, 62, 63, 52, 77, 23, 39,199,229,
-131,201, 2, 20, 69,193,104, 52,163,176, 80, 11,139,149,178,181,153, 44, 24,134,182,253,178,160,109,237,168, 68, 44,244,106,253,
- 98,176,142,227, 56,144, 4, 81,112,245,207,204,218,229,137,118, 87, 67, 92,110, 90,179,156,193,216,103,153,249,249,249, 65, 36,
- 18,225,219,111,191,197,245,139,199, 33, 17,112, 96,104, 10, 52,101, 5, 67, 89, 32, 18, 8,240,227,181, 7,136,106,226,229,150,
- 32,244,247,247, 71,191,246,237, 17,221,190,125,209,244, 54,161, 16,158, 82, 41, 20, 98, 89,145, 37, 11, 0,199,144,238, 6, 17,
- 96,237,233, 12, 10, 10,194,111,191,253,134, 41, 83,166, 96,209,162, 69,144,203,229,197,179,159,111,221,186,133, 93,187,118, 33,
- 42, 42,170,210,121,183, 91,240,102,204,152,129,244,244,116,172, 88,177, 2, 47,189,244, 18, 68, 34, 17, 10, 10, 10,240,202, 43,
-175, 32, 43, 43,203, 45, 78,199,225, 61,137, 68, 82,194,250,100, 23,128,149, 45, 35, 71,206, 55, 7,133,224,224,197, 29, 32, 64,
-224,202,246, 15, 75,136,194,117, 59,207, 87,154,115,206,156, 57, 37,210,233,142, 53,203, 93, 56, 89,157, 42, 60,142, 32,136,171,
-118, 99,235,140, 25, 51,102, 18, 4,113,120,198,140, 25, 51,227,226,226,110,186,195,231,106, 63, 65, 16, 71,108, 34,172,159,195,
-182,171,149, 18, 90, 10,133,162,173,167,167, 39,238,222,189,139, 62,125,250, 88,114,115,115,147, 68, 34, 81,163,156,156, 28,105,
-118,118, 54, 12, 6,131,110,222,188,121, 15, 0,200,219,181,107,215,224,199, 31,127,196,227,199,143,177,109,219, 54, 0,216,239,
-218,103,131, 4,203,178,197,149,194,185,219, 38, 16, 8,112,249,242,101, 92,190, 92,210,245,107,211,166, 77, 21,190, 48, 94,251,
-254, 16,174, 93,187, 6,199,240, 0,246,255,142,219,100, 50, 25, 80,254, 12,143, 18,168,200, 49,190, 34, 7,120, 87,112,215,247,
-203,213,204,156,178,144,150,150, 86,230,249,151, 47, 95, 46, 97,209,170,136, 83, 32, 16,128, 97, 24,200,229,114, 66, 44, 22, 19,
- 98,177, 56,204, 46,178, 4, 2, 65,241, 3, 35,149, 74, 33,149, 74, 75,244, 82,203, 66,122,122,122,183,244,244,244, 50,247,171,
-213,234, 14,106,181, 26,207, 35,172, 20, 5,163,193, 2,173,206,136,207,227,254, 87,180,241,115,252, 12,224,231, 14,239, 78,193,
-196,222, 81,221, 43, 59, 76,109,191,223,129,129,129, 56,123,246, 44, 8,130,192,238,221,187,225,237,237,141,222,189,123, 67,169,
- 84, 98,198,140, 25, 24, 58,116,104,101, 27,179,194,220,220,220, 14, 31,124,240,193,175, 75,150, 44, 9,175, 93,187, 54, 44, 22,
- 11,172, 86, 43, 44, 22, 11,146,147,147,177, 99,199,142,199, 6,131,161, 3,128,194,138,200,142,167,125,147,188,239,220,180,244,
-158,195, 95, 51,222,202,250, 1,153,153,185,160,233, 52,176, 12, 13, 43,205, 20, 89,248,104, 26, 52,205, 64, 44, 22, 40,151,124,
-241,225, 73, 22, 28, 72,146,176, 0,120,245, 73,149,145, 74,165,138, 84,171,213,184,115,231, 14, 98, 98, 98, 50,115,115,115, 19,
- 1,244, 0,128,220,220,220, 11,163, 70,141,106, 26, 31, 31, 31, 92,175, 94, 61,120,122,122, 42,245,122,125, 69,148,158, 0, 38,
- 2,232,133, 34, 63, 16, 59,242, 0,204, 35, 73, 82,122,245,234,213, 82, 51,237,206,157, 59, 7, 0, 63,187,238, 1,217, 44, 90,
- 38, 19,212,185,249, 24,247,238,236,191,122, 70,224, 74,136, 11, 14, 28, 38,188, 7, 25, 0,228,100, 37,227,205,113, 83,164, 21,
-117, 8, 92,189, 8, 43,225,163, 83,162,163,102,175,163,158,158,158, 69,195,111, 7,118,224,200,151,239, 2,140, 21, 28,101, 4,
-172, 6,192,170, 3,107, 49,128, 16,203, 1,202,232,150,208,242,244,244,132,167, 92,142, 64,149,170, 40, 8,164, 64, 0,145, 72,
- 8,150, 2, 8,134, 40, 22,164,172,123,129, 65,138, 59,149,114,185, 28, 15, 31, 62,196,196,137, 19, 97,181, 90, 49,104,208, 32,
- 88, 44, 22,152, 76, 38, 24,141, 70,212,175, 95, 31, 6,131,193, 45, 62,251,108, 69, 79, 79, 79,136,197, 98,124,248,225,135,120,
-249,229,151, 49,119,238, 92,196,198,198,162,126,253,250,152, 48, 97, 2,118,236,216,129,200,200,200,138,120, 57,199, 50,178,223,
- 79,187,216,114, 28,226, 3, 80,233, 50,114,230, 36, 8,178,132, 96,179, 47,239,143,238, 81,105,206,133, 11, 23, 66,173, 86,151,
-178,100,217,255,135,134,134, 98,237,218,181, 85, 29, 25,178, 91,143,130, 92,236,235,231,108,137,226, 56,174,141,205,119,202, 28,
- 23, 23,119, 51, 46, 46, 46,154, 32,136,195,113,113,113,209,101, 89,180, 92,241,184,216,239,246, 75, 75,232, 52, 54,218,213,113,
-167,253, 70,251,250,250, 10,194,195,195, 73,165, 82,137,130,130, 2, 4, 4, 4,112,106,181,122,184, 66,161,248,236,187,239,190,
-107,160,211,233,112,235,214, 45,172, 90,181,234,103, 0, 43,203, 19, 90, 71, 3,108,166, 99,155, 37,203,113,189,127,255,254,168,
- 87,175, 94, 9,107,150, 92, 46, 47,183,242,216,247,217, 45, 66, 2,129, 0, 47,188,240,130,252,254,253,251, 70,177, 88,140,176,
-176, 48,121,102,102,166, 81, 44, 22, 87,122,166, 75, 69,142,241, 21, 57,192,187, 18, 62,109,218,180, 41, 97,193,114,252,117,252,
-127,240,224,193, 10,135, 14,237,156, 77,155, 54, 45,190, 95, 94, 94, 94,246,115, 1, 0,125,250,244, 1,203,178,240,247,247,119,
-139,211, 46,106,109, 14,240, 48,153, 76,172, 86,171, 37,175, 94,189, 10,137, 68, 2, 47, 47,175, 98, 95, 29,153, 76, 86,108,205,
-228,225,170, 65, 96, 97,161, 40, 24,141, 70,232,116, 58, 0, 64,242,159,123, 75, 10, 49,179,166,202,252,246, 6, 54, 47, 47, 15,
-199,143, 31,199, 15, 63,252,128,151, 95,126,217,165,168,174,132,224, 82,231,229,229,117,156, 62,125,250,149,249,243,231,215,242,
-245,245,133,213,106,197,163, 71,143,176,121,243,230,116,131,193,208,177, 50, 13, 12, 56,128,162,104,152, 12,102, 20,106,180,248,
-236,139, 45,101, 86, 61, 0,200,203,190,141,254, 3,134, 74,158,100, 57,165,167,167, 79,237,216,177,227, 23, 90,173,182,192, 96,
- 48, 12, 5,176,212,177, 63,149,155,155,219,105,192,128, 1,203,125,125,125, 95,202,206,206,158,233, 6,229,140,135, 15, 31,206,
-172, 83,167, 78,137,141,102,179, 25,117,234,212,121, 33, 59, 59,123,100,231,206,157,255, 15,128,175,195,110, 47, 0, 39, 0,172,
- 45,171, 46,217,135, 14,117, 58, 35,148,170, 16,164, 61, 56, 91, 97, 66,196, 2, 19, 56,150, 45,183, 13,177,119,128,203, 90, 42,
-152, 25, 87, 42,169,246, 99,237, 47,236, 87,135,140,198,171, 19, 23, 66, 33, 2, 22,188,217, 1,245, 85, 0,228,190, 16,119,254,
- 24,132,202,118,143, 38, 30,114,139, 60,118,253,122, 92,179,181,199, 97, 1, 1,152, 62,124, 56, 56, 10,184,148,144,128,157, 63,
-253,132,225,221,186, 65, 33,147,185,221, 97, 97, 89, 22, 98,177, 24,201,201,201,184,116,233, 18,154, 52,105,130,187,119,239,150,
- 8, 67,193,113,156,187,249, 47,206,187, 84, 42,133, 72, 36, 66,102,102, 38,162,163,163, 33, 22,139,177,101,203, 22,156, 61,123,
- 22,211,167, 79,199,216,177, 99,209,181,107, 87, 36, 38, 38,186,197,201,113, 92,169,217,138,206,195,185,149, 45, 35,103, 78,231,
-247,126, 85,202,221,206, 57,127,254,124,151, 19, 42,220,225,116,165, 69, 92,148,221, 85, 71, 49,100,183, 60, 57, 10, 35,231,117,
- 0, 62,246,109, 51,102,204,152,233,238,121,142,235,118,139, 88,101,134, 48,139,133, 86,116,116,116,137,156,231,229,229, 93,185,
-114,229, 74, 51, 15, 15, 15,220,190,125, 91,162, 84, 42,155,217, 27,116,146, 36,177,123,247,110,175,190,125,251,158, 92,186,116,
-105, 24,203,178,200,202,202,194, 71, 31,125,164,163,105,122, 4, 0,186,172, 23,120, 69,150,169, 67,135, 74, 63,108, 7, 14, 28,
-112,107, 8,196, 46,164,132, 66, 33,124,124,124,140, 70,163, 17, 10,133, 2, 62, 62, 62, 70,131,193, 0, 15, 15, 15,251, 88, 49,
-137,191,102, 42, 84,100,125,170,200, 49,222,217, 1,190, 66, 36, 36, 36,184,117,156,109,168,213,173, 90,254,240,225,195, 50, 27,
-146,179,103,207,130,181, 53,180,238,114,218,122,121,156, 93,248, 41, 20, 10,248,250,250, 66, 42,149, 66, 46,151,151, 16, 89, 82,
-169,180,194, 7,167,162,128,164, 50,153,236, 23, 15, 15, 15,149,125,191, 72, 36,130, 86,171, 45,200,203,203,107,251, 76, 15, 29,
-130, 3,109,165, 97, 52,154,160,211, 26,107,156,223, 98,177, 64, 42,149, 98,199,142, 29,232,208,161, 3,218,181,107, 87, 74,100,
- 85,209, 60,159,154,151,151,215,117,229,202,149, 63, 47, 91,182,204, 71,167,211,225,127,255,251, 95,161, 78,167,235, 10, 32,181,
- 82, 98,147,229, 64, 89,173, 48,152,204,208,235,138,238,193,189,155,123,255,105, 69,181, 35, 51, 51,115, 71, 57,251,239,209, 52,
- 29,109,143,251,230, 6,254, 83,167, 78, 29,100,102,102,150,216,152,146,146, 2,134, 97,204, 40,138,147,245,150,163, 33, 25,127,
- 69,207, 46,171, 23, 95,100, 29, 53,154,161,211, 21, 89, 65, 76,250,156,154,169,167, 54,177, 81,150, 79, 86, 85,234, 16, 65, 16,
-197, 78,223,147, 39, 79,198,141,235,215,209,163,150, 6,245,131,189,192,105,210, 32,238,254, 41,254, 80,203,177,116,249,209, 74,
-115,239,114,112,129, 88,186,107,151,203,125,247, 6, 14,172, 84,222,147,146,146, 32,151,203,193, 48, 76,169,247, 77,101,243,239,
- 40, 96,150, 47, 95,142,233,211,167, 99,203,150, 45,184,113,227, 6, 90,182,108,137,158, 61,123, 34, 59, 59, 27,215,175, 95,135,
-217,108,118, 59,157,142,126,115, 73,247, 19,112,234,210, 49,164,164, 62, 64,122,230,227, 42,151,187, 35,167,179,208,218,119,234,
-119, 12,137,106, 93, 37,206,207, 62,251, 12,217,217,217, 37, 44, 89,142,237, 82, 89, 22, 45,103, 45,226,132, 28, 39, 95, 40,251,
-186,197, 73,244, 56,175, 59, 31, 15, 0,217, 0, 4, 21,156,231,188,158, 19, 23, 23,119,198,110, 9,179,241, 10, 42,242,207, 42,
- 97,209,114,194,194,129, 3, 7, 14, 88,181,106, 85,128, 76, 38, 43,158,129, 52, 99,198, 12, 76,159, 62, 29, 17, 17, 17,240,247,
-247, 15, 85,169, 84,200,205,205,197,162, 69,139,240,240,225,195,241,112, 17,104,207, 89,104,117,186,175,133, 68,242, 87,135,213,
-110,217, 2,128,177, 99,199,150,178,104,217, 11,168, 60, 80, 20, 5, 63, 63, 63, 24, 12, 6, 8, 4, 2, 12, 26, 52, 72,240,231,
-159,127, 50,189,123,247,198,224,193,131, 5,215,175, 95,103,250,245,235, 7,129, 64,128,238,221,187,107,246,237,219, 55, 13,192,
-151,110,136,173, 26,115,140,183, 87, 50,119, 99, 31,185, 35, 46,203,227, 36, 8, 2, 6,131, 1, 66,161,176,216, 81,222, 29, 78,
-251,208,161,227, 3, 72,146, 36, 84, 42, 85,113,227, 97,183,104,217,133, 86, 69,188, 21, 5, 36, 85, 40, 20,202,219,183,111, 55,
-176, 79,188,200,201,201, 65,247,238,221,239,228,229,229, 61,219, 38, 45, 22,176,210, 12,116, 70, 19,116, 70, 67,141,209,218,159,
-135, 13, 27, 54, 32, 49, 49, 17, 38,147, 9, 95,125,245, 85,241,164, 2, 71,145, 85, 13,193,149, 44,151,203,217, 62,125,250,224,
-202,149, 43,144, 74,165, 20,170, 16,255,138,229, 88, 88,105, 26, 38,163, 17,186,138,135,220,158, 23, 20,171,234,196,196, 68, 88,
- 44, 22,204,157, 59,151,249,245,215, 95,207,160, 40, 0,170,221,130, 55,178, 75,151, 46,243, 60, 60, 60, 84, 71,142, 28,121, 31,
-192,150,242, 94,222, 20,109, 19,237, 53,120, 31, 29, 71, 4, 92,249,100, 85, 37,204,138,227,139,149,101, 89,140,127,251,109,244,
-172,165,193,224,151, 2,160,207,184, 3,133,119, 0, 8, 85, 93, 44, 93,126, 20, 55,239,187,237,138,201, 1, 64,159, 46, 3,209,
-162, 73,233,240, 96, 29,123, 20,245,201, 46,252,248, 11,178,114,210, 43,157,119,189, 94, 95,166,229,170, 18, 22,173,226,103,206,
-126,255, 90,181,106,133, 70,141, 26,225,204,153, 51,104,221,186, 53,238,222,189,139,187,119,239,226,225,195,135,184,113,227, 6,
-242,243,243, 43, 93, 70,223,159,216,137,124,109, 30, 36, 98, 9,242, 10,114,144,146,246, 0, 65,126,193,213, 46,119, 59, 26,247,
-251, 12, 0, 80, 43,192,187, 82, 66,203,145,115,241,226,197,165,196,123,117, 67,246, 16, 4,241, 75,121,235,149, 61,255, 73,162,
- 44,161,245, 64,173, 86,183, 27, 62,124,248, 12, 0,109,108,219, 10, 1,236, 58,121,242,228,192,192,192,192,110,237,219,183, 23,
- 74, 36, 18, 92,186,116, 9,251,246,237,219, 2, 96,103,121, 23,146, 72, 36,198,186,117,235,202,237, 21,209,254, 32, 42,149, 74,
-193,162, 69,139,136, 77,155, 54,149,105,229,170,168,128, 10, 11, 11,161,215,235,225,237,237, 13,171,213,138, 62,125,250, 48,137,
-137,137, 16,139,197, 24, 48, 96, 0,147,144,144, 80, 92,208, 27, 55,110, 12, 51, 26,141,175,252,240,195, 15,189, 0,116,174,196,
-189,178, 59,198,123,194, 77, 7,248,178,122,121,238,192,221,225,184,178, 56,167, 76,153, 82, 37, 78,177, 88, 76,219, 35,191,147,
- 36, 9,171,213,138,214,173, 91, 35, 59, 59,187,248,161,241,240,240, 40, 22, 89,238, 8,173,138, 2,146, 10,133, 66, 88, 44, 22,
-116,238,220, 25, 4, 65, 96,245,234,213,207,199,112, 36,203, 18,158,158,126,168, 85,235, 5, 4, 4,154,192,178, 53,251, 85,153,
-216,216,216, 18, 98,202, 85,228,101,251,253,175, 10,236, 92,213,249,250, 60, 7, 20, 15,121,233,245,166,103,174, 8, 3, 3, 3,
-219,101,103,103, 31,112,218,156, 7, 96, 94, 57, 29,203,226,130,126,252,248, 49,122,247,238,141, 99,199,142, 9,246,239,223,223,
-227,224,193,131, 9,119,238,220,121,220,186,117,235,218,239,188,243,142,180,115,231,206,200,201,201,193, 75, 47,189,244,121, 90,
- 90, 90, 57, 66,203,118, 31, 77,102,232,245, 53,111, 29,117,101,205,170,206,139,209, 94, 39,231,204,249, 63,244, 12, 41,192,160,
-150,222,136, 63,124, 17, 35, 91,201, 1,139,180,210,124,246,180,248,214,170,135,186,145,237, 74,237,151, 42,139, 98,185,214,141,
-108, 7,242,241,221, 74,231,221, 49,205,206,162,170, 42, 22, 61,199,251, 57,110,220, 56,124,252,241,199,232,213,171, 23,238,222,
-189,139,115,231,206,225,238,221,187,152, 50,101, 10, 34, 35, 35,209,178,101,203, 74,113, 30, 60,181, 7, 26, 93, 33, 72,130, 68,
- 94, 97, 46, 76,102, 35, 98, 39,204,169,118,185, 23,191,252, 79,197, 1, 0,246,158,188, 86,101,206, 89,179,102, 33, 51, 51,179,
-132, 37,171, 58,126, 89,207, 58,202,139,150,246, 0,192,120,231,141, 22,139,197,107,238,220,185, 81,254,254,254, 32, 8, 2,203,
-151, 47,135,175,175,111, 7, 0, 55, 45, 22, 75,142, 94,175,159,238, 32, 66,122,194, 22,107, 35, 43, 43,203,229,188,125,189, 94,
-111,141,138,138, 18,133,132,132,148,152,109,232,225,225, 81,150,117,167,152,211,190,143,166,105,196,198,198, 98,193,130, 5, 8,
- 15, 15, 71,191,126,253, 16, 29, 29, 13,130, 32,208,167, 79, 31,244,235,247,215, 80,174, 74,165, 18, 31, 59,118,172, 11, 73,146,
- 9, 14, 47,144, 18,156,174, 96,119,140,167, 40,202, 93, 7,248, 18,156,246,202, 54,101,202, 20, 44, 88,176, 0, 51,103,150,239,
-234,177,126,253,122,160,180, 63,213,223,206,153,151,151, 87,162,177, 87, 40, 20,171, 7, 15, 30, 44,124,252,248,113, 9,113,229,
-184,184,104,136, 74,112, 86, 20,144, 84, 32, 16, 32, 40, 40, 8,243,231,207,135,159,159, 31,130,131,131, 93, 5,242,171,176,140,
-170,128,191,149,147,225,216,171, 75, 22,254, 95,199,255,109, 59, 40,146, 74,128,203,231,246, 66,147, 95,114, 56,201,108,253,107,
- 42,181,164,117, 15, 88,174,253,232, 86, 93,178,139,233,207, 62,251, 12,159,125,246, 89,185, 9,218,176, 97, 67,181,243,238,166,
-216, 42,205,201,114,132,194,195, 7, 50,143, 90,104, 22,233, 3,150,163,255, 81,101, 84, 6,126,253,229,151, 95, 6,248,249,249,
- 33, 53, 53, 53, 64, 36, 18, 13, 40, 97,174, 50, 26, 81,183,110,221, 23,212,106,245, 43, 21,113, 78,153, 50,197, 60,123,246,108,
-233,136, 17, 35, 48,120,240, 96,140, 24, 49, 66, 42, 22,139, 27,114, 28, 7,171,213,138,212,212, 84,252,248,227,143, 80,171,213,
-183,202, 75, 39,203,113,132, 92,161,130,204, 35, 4,205, 94, 84,129,101,233, 26,201,187,163, 85,220,209,154, 85, 73,145,229,178,
-126, 2,192,175, 63, 30,192,156, 15, 95,196,150, 35, 63, 99,213, 47, 64, 11, 85, 54,154, 5,168,193,170,111,225,163,145, 47, 99,
-233,246,223, 0, 0,231,206, 86, 88, 70, 92,121,117,208,100,180, 86, 43,239,142,150, 43,199,235,184,225,163, 85,138,211,222, 73,
-212,106,181, 40, 40, 40, 64,124,124, 60,222,124,243, 77,100,103,103,227,225,195,135,184,115,231, 14,190,251,238, 59, 40, 20,138,
- 42,149,209,180,183,103, 97,246,210,169,224,192,161,113,131,102,152, 49,241, 51,180,105,209,190,218,229,238, 12, 55,172, 89,101,
-114,174, 88,177,162,170,117,233, 95, 39,180, 92,194,223,223,127, 68,151, 46, 93, 96, 50,153, 16, 16, 16,128,135, 15, 31,130, 36,
-201, 8,160,104, 8, 47, 52, 52,116,151, 90,173,142,112,151, 79, 32, 16,128,166,233, 98,223, 31,251, 2, 0,253,251,247,199,161,
- 67,135, 42,236, 81, 4, 7, 7,163,118,237,218,248,224,131, 15, 74,205,114,112,156,233, 32,151,203,113,228,200,145,204,188,188,
-188, 60,142,227, 42, 53,205,205,238, 24,127,225,194, 5,183, 29,224, 29, 97,181, 90, 31,223,185,115, 39,100,195,134, 13,130,114,
- 94,126,197, 56,119,238, 28,141, 10,134,106,254, 14, 78, 87, 61, 83,142,227,202, 20, 89,238,132, 17,168, 40, 32,169, 80, 40, 68,
- 82, 82, 18,230,204,153, 3,130, 32,176,119,239,222,231,226,225,250,243,118,238, 38,146, 36,125,250,191,218,177, 57, 8, 2, 86,
- 75,233,145,106,207,124, 93,177,200, 26,252,229, 78,236,159, 54,220, 29,209,147,124,254,252,121,223, 13, 27, 54, 8,221, 41,247,
-243,231,207,211, 28,199, 85,122,216,207,254,194,177, 90,173, 48, 26,171,102, 69,225, 56,238, 82,220, 23,179,163,182,126,123, 84,
- 68, 16, 22, 92, 62,187, 23,133, 5,174,221, 25, 36, 34, 33, 54,197,239,163,197, 34,193,227,167, 92,116,107, 6, 13, 26, 52,226,
-171,175,190,106,230,106,167, 27,147, 96, 30,154, 76, 38,164,165,165,193, 96, 48,236,249,228,147, 79,172, 71,143, 30,125,235,181,
-215, 94, 67,203,150, 45, 17, 18, 18,130,140,140, 12, 36, 39, 39, 35, 62, 62,158,187,120,241,226, 30, 0,147, 42,184,143, 7, 22,
-126, 49, 59, 38,126,251, 81, 9, 73, 88,113,249,220, 94, 20, 58,137,246,210,214,105, 17,190,217,178,207, 42, 22,139,110, 87,100,
- 45,114,180,102,213,228,139,113,192,168,137, 24,188,114, 21, 34,218,244,198,194, 69, 61,241,205, 23, 67,177,172,143, 24,214,221,
- 35,209,226,245,173,216, 49,183, 47, 0,160,214, 55,110, 90, 75,132, 98, 60,114, 97,177, 42, 40,148,217,196, 77,229,172,166,246,
-188,151,103,185,170,172, 69,139, 36, 73,212,171, 87, 15, 17, 17, 17,232,208,161, 3, 90,183,110,141,110,221,186,225,250,245,235,
-184,126,253, 58,166, 76,153, 82,158,200,170,176,140,186,190, 18,133,159, 59,221,174,118,217, 56,151,123, 77,192,157,186, 52,113,
-226, 68, 0,248, 87, 89,183, 42, 45,180, 52, 26,205,117,150,101,155,123,123,123,219, 45, 82,197,251, 82, 82, 82,192,178,172,161,
-178, 5, 99,177, 88,236,193, 49, 75,196,101,178, 59,199,151,247,224,115, 28,199,228,229,229,161, 75,151, 46,232,212,169, 83,241,
-240,137,227,226, 32, 76,176,127,255,126,112, 28, 87,105, 39,107, 7,199,120, 29, 42,233, 0, 15, 0,217,217,217,189, 59,119,238,
-124, 82, 40, 20,186,245, 21, 77,150,101, 31,102,101,101,189,250,164, 57, 93,149, 15,203,178,101,138, 44,119, 26,162,138, 2,146,
- 10,133, 66,120,120,120,224,251,239,191,135,191,191,255,115,245,128, 93, 79, 84, 47, 46,111,127, 23, 63,201, 89, 0, 1,131,191,
-220,249,232,108,174,181,206,224, 47,119,166,236,159, 54, 60,188,188,115, 50, 51, 51,123, 13, 31, 62,252,152,187,229, 78,211,244,
-131,204,204,204, 74,135, 75,224, 56, 14,183,111,223,102,199,141, 27,151,163, 86,171,135, 86, 37,255, 51,230,172, 90,182,224,243,
-201,126,125,162,218,181, 1, 9, 88,202,118,254,229, 8,128, 19,138, 4,143,167,207, 92,241,246,208,161, 67,159,102,177,105, 50,
- 51, 51, 59, 12, 25, 50,100, 18,254,114,157, 40, 33,164, 80,198,236,106, 27, 86,214,174, 93,251, 69,129, 64, 32, 5, 48, 7, 64,
-202,197,139, 23,215, 92,188,120,177, 23,128,255, 8, 4,130, 16,134, 97,210,108,157,158,157, 0,254,168,184, 30,101,191, 3,142,
- 13,235,211,243, 63,189, 65, 16,156,197, 98,174,160,131, 4, 14, 28,199,137,197,162,219,191, 94,207,104, 81, 94, 71,202,225, 11,
- 28, 53, 62,100, 63,105,210, 36, 76,154, 52,169,184, 62,173, 94,221, 9,123,254,188,128,215, 91,164,194,252,117, 71, 16,202,112,
-183, 59,124, 0, 48,235,255,198,213, 88,218, 28,243,238,104,209,114,245, 28, 84,198, 71, 75, 32, 16, 32, 39, 39, 7, 73, 73, 73,
-200,202,202,130,193, 96, 64, 98, 98, 34,172, 86, 43,242,243,243,241,226,139, 47, 86, 57,157, 53, 85, 70, 79,147,243,223, 56,124,
- 88,105,161,101,181, 90, 63,173, 87,175,158, 72, 38,147, 53, 99, 24, 6, 28,199,129, 97, 24,206, 38,106, 42, 61, 11, 79, 36, 18,
-153, 26, 53,106, 68,184,154,157, 96,255,239,225,225, 97, 44,199, 90, 18, 87,183,110,221, 79, 8,130, 16,148,213, 11,177,255,103,
- 89,150, 17, 10,133,113, 85,188, 87,213,117,140,215,171,213,234,246, 53, 92,126,127, 7,167,115,249,232,155, 52,105, 82,252, 69,
-123,231,152, 40,182,143,173,234, 43, 16,231,229, 6, 36,213,235,245, 25,189,123,247,102, 28,247, 59, 6, 52,125,174, 65,112, 41,
-125, 71,188, 85,231,108,174,181, 14, 0,216,197, 22, 56, 46,165,156,179,140,153,153,153, 93,254,238,164,221,191,127,223,242,159,
-255,252,231, 91,173, 86, 59, 17, 64,149,189,249,103,126,186,122,230, 51, 88, 50, 26, 0, 11,170,120,110, 74,110,110,110,119,167,
-109,127,216, 5,149, 61,174, 93,165, 69,251,173,156, 26,143, 45, 70,211,116,106, 68, 68, 68,165, 44, 55, 20, 69,165, 86,180,223,
- 57, 70,152, 35,110,194, 27, 51,175, 0, 69,147,191,115,221,226, 52,153, 76,121,237,219,183, 23, 85, 50,111,217,238,230, 61, 36,
- 36, 4,181,106,213, 42,254,181,195,121,123, 69,233,164,105, 58, 53, 44, 44, 12,254,254,254,101, 70,124,119,246,201,114,135,179,
-166,203,168, 60,206, 90,181,182,214, 56,103, 85,211,201,195, 61,244,228, 57,121, 78,158,243,153,229, 20,240,247,147,231,228, 57,
-121,206, 39,200,249,220,129,227, 56,240, 94,106, 60,120,240, 40, 11, 12,127, 11,120,240,224,193,163,122, 32,202, 81,165,149,153,
-233, 83, 21,101,123,138,231,228, 57,121, 78,158,147,231,228, 57,121,206,127, 29,103, 69,220, 53, 61,211,248,169,161, 58,225,113,
-254, 78, 1,198,115,242,156, 60, 39,207,201,115,242,156, 60,231,191,143,243,185, 3, 63,116,200,131, 7, 15, 30, 60,120,240,224,
-241, 55,130, 23, 90, 60,120,240,224,193,131, 7, 15, 30,188,208,226,193,131, 7, 15, 30, 60,120,240,224,133, 22, 15, 30, 60,120,
-240,224,193,131, 7, 15, 94,104,241,224,193,131, 7, 15, 30, 60,120,240,224,193,131, 7, 15, 30, 60,120,240,120,166,192,113, 92,
-209, 39,120, 14, 31, 62, 92, 28,232, 33, 58, 58,154,224,111, 13, 15, 30, 60,120,240,224,193,227, 73,226,121,213, 34, 66, 94, 96,
-241,224,193,131, 7, 15, 30, 60,254, 9,120, 30,181, 8,233, 74, 73,242,224,193,131, 7, 15, 30, 60,120, 60,105, 60,143, 90,132,
-124,158, 85, 36, 15, 30, 60,120,240,224,193,227,217,193,115,111,209,226,173, 90, 60,120,240,224,193,131, 7,143,167,133,103, 88,
-139,112,182,197,113,157, 7, 15, 30, 60,120,240,224,193,131, 71, 53, 5, 86,153,191,252,183, 14,121,240,224,193,131, 7, 15, 30,
- 60,170, 14,194,197,250, 19,181,102,241, 95, 54,231, 57,121, 78,158,147,231,228, 57,121, 78,158,243, 95,137,226, 56, 90, 60,120,
-240,224,193,131, 7, 15, 30, 60,170,167,171, 28,254, 23, 91,186,120,161,197,131, 7, 15, 30, 60,120,240,224, 81,125,145, 69,184,
- 90,231,125,180,120,240,224,193,131, 7, 15, 30, 60,254, 38,240, 22, 45, 30, 60,120,240,224,193,131, 7,143,234,193,217, 9,158,
- 31, 58,228,193,131, 7, 15, 30, 60,120,240,168, 97,177,229,114, 99, 89, 51, 7, 78, 85,130,188, 42,179, 15, 78,241,156, 60, 39,
-207,201,115,242,156, 60, 39,207,249,175,227,172,136,251, 20,158, 13,137,148,178, 0, 0, 32, 0, 73, 68, 65, 84, 61,116, 1,112,
- 6, 64, 87,219, 47, 0, 16, 28,247,247, 71,122,224,167,190,242,156, 60, 39,207,201,115,242,156, 60, 39,207,249,188,195, 57, 96,
-105,209, 10, 31,176,148,135, 27, 16,162,252, 33,230,138,246,243,224,193,131, 7, 15, 30,255, 54,177,197, 57,190, 36, 93,161, 33,
-128,153, 0,188, 29,182,253, 2, 32,206,233,184,237, 0, 20, 14,235,122, 0,115, 1,220,173, 48, 53, 28, 39,182,241, 75,109, 11,
- 11,192, 4,192, 12, 64, 75, 16, 4,197,151,217, 83, 71,123, 0,209,182,255,135, 1, 92,174,228,254,231, 10, 33, 33, 33,114, 31,
- 31,159, 94,215,174, 93,147, 36, 38, 38,226,252,249,243,220,166, 77,155,172,249,249,249, 39, 50, 50, 50,140,124,117,121, 46,208,
- 27,192, 12,219,255,133, 0,142, 87,147,143, 80, 40, 20, 83, 60, 60, 60,250, 74,165,210, 90, 52, 77, 19, 6,131, 33, 93,175,215,
-159,164,105,250, 75, 91,187, 87, 89, 12,244,245,245,125,171,113,227,198, 13, 31, 62,124,152,150,158,158,190, 29,192,110, 0, 67,
-107,213,170, 53,178,110,221,186,161,183,111,223,190,155,151,151,247, 13,128, 3, 79, 49,157, 60,120,252,155, 64,148,103,141,112,
-133, 57, 28,199,141, 44,193, 64,148,230,232,222,189,251,128, 19, 39, 78, 40, 88,150,133,125,145,203,229, 52,128, 49, 21,136, 44,
-191, 75,151, 46,213,153, 56,113,226,224,244,244,244,151,181, 90,109, 91, 0, 80, 40, 20, 63, 7, 6, 6,254,186,114,229,202,239,
- 56,142, 75, 37, 8, 66, 91,201,140, 10, 69, 34,209,155, 62, 62, 62,125,105,154,110,205,113, 28, 68, 34,209,181,252,252,252,227,
- 20, 69,125, 3,160, 42,226, 77, 34, 20, 10, 39, 73,165,210,222, 52, 77, 55, 7, 0,161, 80,120,195,108, 54, 31,167,105,122, 13,
- 0, 75, 21, 56,101, 18,137,100,146, 82,169,140,178, 88, 44,205, 1, 64, 34,145,220,208,104, 52, 39, 45, 22,203, 26,155,224,124,
-218, 16, 2,136,230, 56, 78, 4, 0, 2,129, 96, 96,219,182,109,235, 16, 4,193, 18, 4,193,113, 28, 71,252,252,243,207,173, 24,
-134, 33,109,245, 35, 26,192,175, 0,232,103,241, 9,241,247,247, 95,192,178,108,173,114, 11, 77, 38,123,249,218,181,107,141,119,
-237,218,197,124,253,245,215, 5, 99,199,142,245,156, 56,113,162,112,245,234,213,107, 50, 50, 50,222,119, 62,222,207,207,111, 25,
- 73,146,254,238, 92,159,101,217,156,220,220,220,169, 79, 43,255, 49, 49,166, 18,230,238,248,120, 89, 3, 0,169, 85,172,223,127,
- 31,167, 41,134, 3,128,120, 89,124,131, 24, 83, 76,178,253,127,117,121, 29, 48, 99,237, 41,109,103,142, 3, 38, 69,121,145,213,
- 21, 90,161,161,161,241, 49, 49, 49, 35,154, 55,111, 46,228, 56, 14, 20, 69,193,108, 54, 55,190,124,249,114,215,189,123,247,190,
-172,213,106,135, 86,146,242,237,143, 63,254,120,254,188,121,243,252, 69, 34, 17, 65, 81, 84,131, 93,187,118,181,126,231,157,119,
- 62,216,176, 97, 67,237, 97,195,134,121,217,183,207,153, 51,167,205,194,133, 11,235, 3,248,242, 41,164,147, 7,143,127, 27,186,
-160,164,143,214,231, 0, 62, 43, 79,104,121,216, 94,158, 89, 54, 75, 22, 28,126,139,113,250,244,233,131, 66,161,208,110,209,106,
-171,215,235,131,156,172, 96,174, 68, 86,221, 81,163, 70,181,223,179,103,207,130, 97,195,134,101, 42, 20,138, 70,175,189,246,154,
-150, 32, 8,193,174, 93,187, 90, 69, 68, 68,200,251,247,239, 63,170,123,247,238,211, 56,142, 59, 79, 16,132,218,205, 76, 54,243,
-245,245,221,183,120,241,226, 58,189,123,247, 22,251,251,251,131,227, 56,164,167,167,135, 30, 57,114,164,207,231,159,127, 62, 45,
- 47, 47,111, 16,128,132, 74,220,184, 54,114,185,124,207,231,159,127, 30,210,167, 79, 31, 97,112,112, 48, 76, 38, 19, 18, 19, 19,
-123, 30, 63,126,188,243,134, 13, 27,222, 55, 26,141,175,219, 4,134,187,104,235,237,237,189,247,127, 31,127, 28,212,238,205, 55,
-133,190,190,190,224, 56, 14,106,181,186,231,133,173, 91,187, 78, 88,188,248,253,194,194,194, 33,174,238,247,211,132, 68, 34, 33,
-183,109,219,214, 82, 34,145, 0, 0, 44, 22, 11, 34, 35, 35,137,231,166, 43, 66, 16, 97,233,233,233,222, 98,177,216,229,126,134,
- 97,208,185,115,231,122, 98,177, 24, 95,126,249, 37,149,147,147,211,234,171,175,190,186,182, 99,199, 14,255, 53,107,214,188, 14,
-160,148,208, 34, 73,210, 63, 53, 53,213, 37, 39,195, 48,176, 90,173,160,105, 26, 22,139, 5, 77,155, 54,125,170,249,143,143,151,
-133, 1,152, 26, 19, 99,250,208,182,233, 75, 0,211, 0,220, 71, 21,191,219,245, 55,112, 58,214,183,101, 14,255,171,157, 86, 7,
-212, 1,128,163,215, 77, 0,224, 91,221,251,234,225,225,209,228,141, 55,222, 16,170,213,106,136, 68, 34, 88,173, 86,100,102,102,
- 34, 50, 50, 82,240,237,183,223,190, 80, 89,190, 6, 13, 26,140, 93,184,112, 97,192,209,163, 71,173,219,182,109,179, 68, 69, 69,
-137,198,142, 29,171,236,220,185,115,211,176,176, 48,114,243,230,205,230,147, 39, 79, 82,163, 70,141,146,196,197,197, 5, 28, 57,
-114,164,127, 66, 66,194,151, 79, 58,157, 60,120,252, 11,113, 6,127,133,120,176,255,150, 43,180,224, 32,174, 6, 2,128, 72, 36,
-106, 21, 20, 20, 20, 79,211,116,176,205,170,147,153,149,149,245, 37, 69, 81,191,219,142, 61,192,178,236,128,138, 44, 89,163, 70,
-141,106,127,236,216,177,165,151, 47, 95, 46,204,205,205, 13, 62,120,240,160,105,218,180,105, 15, 1,224,254,253,251,245,251,247,
-239, 31, 58,121,242,228,212, 94,189,122,173,236,214,173,219,123, 28,199,157, 36, 8, 66, 95,145,200,138,140,140,188,116,238,220,
- 57, 47,149, 74, 85, 98, 71,221,186,117,241,222,123,239,137, 7, 12, 24, 16,209,163, 71,143,139,201,201,201,157, 0,252,233,142,
- 32,106,216,176,225,169,211,167, 79,123,250,248,248,160,160,160, 0,153,153,153, 48, 24, 12, 80, 42,149, 24, 54,108,152,184, 75,
-199, 14,181, 39, 79,121,255, 84,106, 90, 90, 79, 55,197, 86,219, 14,205,154,157,218, 17, 23,231, 73, 61,122, 4,185, 92, 14,157,
- 78, 7, 0,240,242,242,194,203,245,234, 9,127,219,186, 53,116,100,108,236,169, 95,147,146,122, 62, 37,177, 37,181,253,154, 1,
- 28, 22, 8, 4, 3, 37, 18, 9, 57,112,224, 64,156, 58,117,138, 48,153, 76, 66,155,117,135, 30, 56,112, 32,228,114, 57, 44, 22,
- 11,139,162,161, 67,250, 89,126, 74, 36, 18, 9,146,147,147, 75,108,211,106,181, 80,171,213,200,205,205,133,217,108, 70, 65, 65,
- 1, 88,150, 37,228,114,185,154,101, 89,144, 36,233, 44, 0, 74, 64, 44, 22, 35, 41, 41,169,196, 54,154,166,161,215,235, 97, 54,
-155, 97,181, 90,161,213,106,229, 94, 94, 94, 13,253,253,253, 83, 1, 28,200,203,203,251, 50, 43, 43, 43,229, 9,103, 63,199, 46,
-136,226,227,101,247, 0, 72,254,137,156, 14,150,172, 80,219,250, 31, 53,148, 86, 59, 30, 29,254,221, 20,110,179,142, 61,168, 1,
- 62, 22, 0,206,159, 63,143,172,172, 44,228,228,228, 64,173, 86, 35, 44, 44, 12, 28,199, 85,122, 56, 46, 57, 57,121,237,139, 47,
-190, 72,220,188,121,243, 56,128,213,187,118,237, 26,147,151,151, 55, 99,250,244,233,190, 75,150, 44,201,139,141,141, 93, 8, 96,
-203,174, 93,187,222,109,210,164, 73,223, 91,183,110,109,120, 26,233,228,193,163,166,193,113, 92, 27, 0, 1,246,182,197,214,238,
-250, 57,172, 95, 39, 8,194,226,112,156,197,214, 54, 56,255,218, 97, 95, 87, 19, 4,241,171,195,121,106,130, 32,126,173,106, 50,
-157,126,139, 58,221, 0,112,248,240, 97,206,190,184, 58, 51, 48, 48,112, 74,247,238,221,151, 94,189,122,181,105, 70, 70,134, 79,
- 70, 70,134,207,213,171, 87,155,118,239,222,125,105, 96, 96,224, 20,135, 27,225,124,234, 41,135,125,226, 75,151, 46,213,217,183,
-111,223,194, 83,167, 78, 21,182,106,213,202,114,250,244,105,186, 87,175, 94,217,182, 23, 52,221,171, 87,175,236,159,126,250,137,
-105,215,174,157,252,216,177, 99,143, 47, 94,188,184,108,207,158, 61, 65, 28,199, 9, 92,113,218, 32, 82,169, 84,223,159, 61,123,
-182,148,200,114, 68,237,218,181,113,248,240, 97,165, 74,165, 58, 0, 64, 92, 86, 58,109,144,201,100,178,189, 63,253,244,147,167,
-151,151, 23,178,179,179, 33, 18,137, 16, 24, 24,136,194,194, 66,100,102,100, 32,229,206, 29,144, 22, 11,150,127, 49,207, 75, 46,
-151,239,113,209,216,151,226,244,246,246,222,187, 99,193, 2,207,220, 83,167,240,199,252,249,176, 90,173,197, 67,174, 86,171, 21,
- 23, 39, 78,132,250,199, 31,177,121,206, 28, 79,111,111,239,189, 0,100, 21,112,214, 4, 28, 57, 39, 2,200,179, 45, 19, 1, 92,
-142,140,140,188,154,152,152,136, 78,157, 58, 97,247,238,221, 45,166, 79,159, 62,113,250,244,233, 19,119,239,222,221,162, 83,167,
- 78, 72, 76, 76, 68,100,100,228, 85,148,244,207,250,187,211,249,183,113, 50, 12, 83, 98, 97,217,191,222, 49,181,106,213,202,222,
-183,111, 31,134, 13, 27, 70, 74, 36,146,140,225,195,135, 75, 47, 92,184,192,217, 68,166,219,233, 52,153, 76, 48, 26,141,208,235,
-245,184,127,255,190,124,241,226,197, 29, 63,251,236,179, 6,167, 78,157, 10,157, 57,115,230,132,128,128,128,107, 65, 65, 65,117,
-158,112,222,173, 78,255,151, 3, 72,171,164,133,232,239,230,228,108,231, 35,198, 20,211,210,161,129,173, 44,111,121,247, 51,211,
-150, 86, 61,128,148,234,212,165,238,221,187,191,216,160, 65,131,160, 93, 55,125,144, 47,110, 12, 86,172, 2, 43, 86,129,241,107,
-131,100,201,171, 8, 15, 15, 15,242,244,244,108, 95,201,116,110,187,121,243,230,127,108, 61,229, 92, 0, 75, 99, 99, 99, 63, 39,
- 8,226,124,108,108,236, 60, 0, 75,109,219,231,223,186,117,171, 29,128, 29, 79, 41,157,207,196,243,206,115,254,179, 56, 43,208,
- 34, 1, 4, 65, 28, 38, 8,226,240, 39,159,124,210, 13,128,159,211,250, 43,142,199, 1,144,184,250,181, 47, 14,219, 3, 56,142,
-235,231,112, 94, 64, 21,147, 79,184, 88,254, 18, 90, 0, 16, 29, 29, 77, 68, 71, 71,219,119,252, 66, 16,196, 65, 0,191,136, 68,
-162, 86, 45, 91,182, 28,248,195, 15, 63,120, 5, 4,252,117,253,128,128, 0,236,217,179,199,171, 89,179,102, 3, 69, 34, 81, 43,
- 0,191, 40,149,202,131,229, 88, 97, 84, 19, 39, 78, 28, 60,122,244,104, 77,171, 86,173, 0,160, 32, 33, 33, 65,209,174, 93, 59,
- 61, 77,211, 4, 77,211, 68,187,118,237,244, 9, 9, 9, 10,138,162,180,109,218,180,241,232,209,163,199,195,169, 83,167,142,114,
- 33, 56, 28,241,198,162, 69,139,194,124,124,124,202, 83,194,208,106,181, 8, 10, 10,194,196,137, 19,131, 69, 34,209, 91,229,221,
- 45,161, 80, 56,105,209,162, 69,129, 42,149, 10,249,249,249, 8, 11, 11,131,197, 98, 65, 82, 82, 18, 76,122, 29, 40,173, 6,148,
-166, 0,234,123,119,161, 18, 9, 49,106, 64,116,144, 80, 40,156, 84,129,181,100,210, 55,177,177, 65,150,135, 15,113,127,247,110,
- 48,116,105,227, 15,109,181,226,198,198,141, 48,165,166, 98,225,184,113, 65, 18,137,100,210, 19,182,100, 45,225, 56, 78,206,113,
-156,156, 32,136,149,237,219,183,255, 86, 46,151, 79,140,139,139,235,125,226,196,137, 62,231,206,157,235, 74,211,180,136,166,105,
-209,249,243,231, 59,153, 76, 38,161, 84, 42,133, 80, 40,228,240,156, 66, 36, 18, 65, 44, 22, 67, 46,151,163, 99,199,142,247, 54,
-109,218, 68,133,133,133,137,246,238,221,235, 83,171, 86, 45,143,213,171, 87, 23,104,181,218, 69,238,242, 89,173, 86,152,205,102,
- 24,141, 70,152, 76, 38,156, 62,125,186,222,228,201,147,133, 38,147,137,233,223,191,127, 30, 69, 81,230,216,216, 88,165,175,175,
-239,180, 39,153,207,152, 24, 19,107,179, 60,221,178,137,150, 7,168,166,207,211,223,193, 9,192, 98,243,201,178,195,223,198,109,
-169,161, 91, 65, 3,208,217,132,150,217,233,249,104,238, 96,241,173, 16, 5, 5, 5, 27,190,249,230,155, 48, 82,170,194, 5, 75,
- 95,124,199,126,142, 19,222,171,145, 93,231, 35, 4,134, 53,192,136, 17, 35, 2, 57,142, 91, 93, 3,105,254, 10, 64,103, 0, 43,
-171,114,242, 19, 72,103, 29, 15, 15,143,221, 94, 94, 94, 23, 60, 60, 60,118,195, 54, 60, 91, 29, 68, 53, 64,207, 1, 77,200,212,
-168, 8,112, 3,154,144,169, 81, 13,248, 80, 3,207, 11,156,180,136, 35,212, 28,199, 69,115, 28, 23,189,112,225,194, 5, 14,239,
-119,251,186,220, 77,203, 88, 52,199,113,209, 37, 20, 82,145,192,170,182,209,205,197, 82,164, 41, 28,149,164, 67,230,138,103, 23,
- 6, 5, 5,197,199,199,199,123, 57, 51,102,100,100, 64,163,209, 96,246,236,217, 94,163, 71,143,126, 63, 53, 53, 53,166,130, 68,
- 72, 50, 51, 51, 91,143, 28, 57, 82,102,181, 90,243, 89,150, 37, 53, 26,141,208,219,219,155,177, 31,224,237,237,205, 20, 22, 22,
-138,244,122,189,128, 97, 24,243,232,209,163, 37,227,198,141,123, 25,128,160, 44,210,128,128,128,168,190,125,251,150, 57,116, 64,
- 81, 20,244,122, 61,244,122, 61,172, 86, 43, 58,118,236, 40,221,180,105, 83,175,236,236,236,117,101, 42, 14,169, 52, 42, 42, 42,
- 74,148,151,151, 7,111,111,111,164,164,164,224,193,131, 7, 48,235,116,176,234, 52,176,234,180,160,181, 26,112,154, 66,228,222,
-189,141,118, 77, 26,139,183, 75,165,189,245,122,253,178,178, 56,149, 74,101, 84,187, 49, 99,132, 30, 30, 30,232, 58,178,104,158,
-193,177, 38, 77,192, 49, 12, 88,134, 1, 67,211,232,157,148, 4,138,162, 64,146, 36,218,228,229, 9,149, 91,183, 70,169,213,234,
-165, 79,163,178, 75,165, 82,225,182,109,219,222,144, 72, 36,224, 56,142,176, 88, 44, 56,113,226,196,191,238,161,151, 72, 36,144,
-201,100,176, 90,173,168, 91,183,174,113,228,200,145,151,190,248,226,139,112,146, 36, 61,196, 98,241, 15,185,185,185, 11, 50, 50,
- 50,238,187,203, 71, 81, 20, 44, 22, 11, 44, 22, 11,140, 70, 35,238,221,187, 23, 92,175, 94, 61, 98,226,196,137,140,193, 96,168,
-191,106,213,170,228, 19, 39, 78, 40, 22, 45, 90,244, 26,128,247,158,116,126, 99, 98, 76, 77, 0, 52,137,143,151,137,109,150, 95,
-203, 63,140,147, 67,145,227, 59,226,101,241,137, 0,212, 53, 40,178, 36, 0,188,195,253,132,122,145, 0, 58, 0, 94, 54, 81,240,
- 26, 65, 16,237,154, 54,109,234,147,152,152,152,207,113,220, 21, 0,223, 1,200, 40,143,140,101, 89,130,101, 89,188,211,182, 0,
- 19,219, 11, 64, 81,133, 40, 44, 44, 68, 74, 74, 10, 18, 18, 18,240,243,207, 9, 85,125, 54,223,242,244,244,236, 37,147,201,234,
-210, 52, 77,234,116,186, 20,131,193,112,138,101,217, 13,168,130,143,218,223,149, 78, 59, 60, 60, 60, 22,207,156, 57,179,131,183,
-183, 55,126,255,253,247,250, 59,119,238, 92,172,215,235,171,229, 92, 47, 19,145,155,151,173, 88, 29, 26, 26,168,194,245,115,135,
- 66, 23,172,223,181, 25, 96,195,120,153,242,236,195, 73,139, 56,138,161, 95, 57,142,235, 71, 16,196, 97,103,161, 84, 41,179, 83,
- 53,207,175,192,162,229,252, 97,233,146, 66,171, 12, 5, 9,154,166,131, 29, 45, 89, 28,199, 33, 35, 35, 3,105,105,105, 80,171,
-213,240,241,241,129,213,106, 13,118,167,125,208,106,181,109,253,252,252, 12, 34,145,200,108, 52, 26,161, 80, 40, 88,145, 72,196,
-217,174, 67,216,102, 45, 50,102,179,153, 16, 10,133,148,151,151,151,167,217,108,110,140,114,124,201, 56,142,107,235,231,231,231,
-114,159,217,108,134, 78,167,131, 94,175,135, 78,167,131,217,108, 70, 80, 80, 16,104,154,110, 93,110,151,150,166,155, 7, 4, 4,
- 32, 61, 61, 29,114,185, 28,169,169,169,176,232,180,176,106,181,160,245, 26, 48,133,133, 96, 53, 26,176,122, 13, 40,139, 1,161,
-141,154,192, 62, 35,177,204,110,184,197,210,220,207,207, 15,122,253, 95,238,102,156, 77, 96,209, 52, 13,218,230, 28,109, 31, 78,
-244,247,247,135,125, 70,226, 19,130, 25,192,116,146, 36, 87, 74,165, 82,225,132, 9, 19,144,145,145, 81,162, 78, 76,152, 48,161,
-216, 39,171,115,231,206,231,101, 50, 25,173, 86,171, 97, 54,155, 69,207,235, 67, 79, 16, 4, 8,130, 40, 42, 35,154,134,191,191,
-191, 62, 39, 39,231,231,130,130,130, 55,170,194, 71, 81,148,125, 70, 23,140, 70, 35, 56,142,195,239,191,255, 14,153, 76, 38, 98,
- 24,230, 38, 77,211, 10,145, 72, 4,210,230,252,245,164, 96,155, 17,248, 37,128, 48,155,133,232, 45, 20, 57,156,167,185,104, 72,
-220,186,117,110,114, 86, 94,184,153, 98,236,150,166, 52, 84,109, 56,210, 21,186, 54, 86, 73,150,197,181, 11, 84,181,236,239,161,
- 87, 72, 4,122, 54,165,101,221,255, 45, 73,216, 57,122,212, 91, 94,115,231,206,173,227,239,239, 47, 75, 78, 78, 54,205,155, 55,
-175,222,182,109,219, 8, 20, 13,211,149,137, 71,143, 30,237,159, 57,115,166,111,223,190,125,235, 75,165, 82,162,176,176, 16,106,
-181, 26, 89, 89, 89,120,240,224, 1,119,253,250,245,123,102,179,121,119,101, 18, 25, 18, 18,178,233,141, 55,222, 24,253,210, 75,
- 47,137,236, 22, 82,189, 94,223,234,236,217,179, 3,142, 29, 59,214, 73,175,215, 87,186, 94, 62,126,252,120,247,172, 89,179, 60,
- 94,125,245,213,198, 82,169,148,172,137,116, 58,130, 36,201, 32, 79, 79, 79,156, 58,117, 10, 42,149, 10, 36, 73, 6, 85,183,190,
-154,172,108,104,173, 96, 63,152, 46, 46, 67,227,128, 58, 48, 89,217, 80, 94,162, 60, 63, 22,173, 50,222,245,109,236, 22,169, 10,
-196,146,113,198,140, 25, 51, 9,130, 56, 60, 99,198,140,153,174, 44, 90,182,191,140,227,113, 14,199,155,107, 90,108, 85, 42,208,
- 36,203,178, 72, 75, 75, 67,122,122, 58,210,210,210,144,155,155, 11,146, 36,193,113,156, 59,179,207, 56,130, 32,216,147, 39, 79,
-250, 92,186,116, 73,223,166, 77,155, 2,187,255, 11, 77,211, 4, 69, 81,132,205, 47,134, 72, 73, 73, 17, 95,184,112, 65,117,235,
-214,173, 32, 91,111,149,173,192, 20, 88,106,155, 93, 96, 57, 46, 38,147, 9, 50,153,204, 61,213, 97,123, 17,254,126,245,106,145,
-200,210,105,109, 67,134,133, 96, 52,133,224,244, 90, 72, 24, 10, 18,112, 32, 76, 6,183,239,159, 35,236, 34,203,106, 19, 90, 22,
-139, 5, 20, 69,129,101, 89,208,244, 83,241, 43, 95,219,162, 69,139,214,251,247,239, 31,155,150, 86,250, 93, 56,104,208, 32,188,
-247,222,123,152, 60,121,242,173,126,253,250, 93, 63,116,232, 16, 38, 77,154, 4,150,101, 91, 2, 40, 4,112,236,121,123,232,205,
-102,115,177, 5,202,100, 50,193,106,181, 2,229, 56,191, 87, 84, 55,237,101, 75,211,180,157,155,216,191,127, 31,206,159, 63, 79,
- 38, 36,220, 12,155, 48, 97,162,221,225,254, 73,103, 53, 21, 69, 51,247, 36,182,134,194,130, 34,255,167,178, 66, 42, 68,160,252,
- 33, 59,174, 60,206,234,160,197,250, 22,195, 62,252,240,195, 40, 20,205,112,190, 95, 77,139,214,171, 18,146,248,122, 74,115, 95,
-217,180, 22,126,122,137,144,208, 37,125, 61, 83,247, 32, 92,169, 15,170,173,176,132,213, 83,213, 90,176,224,139,144, 91,183,110,
-155,103,207,158,157, 56,124,248,240,192,105,211,166, 53,221,187,119,111, 39,147,201,244, 13,128,130,178,140, 46, 3, 6, 12,184,
- 18, 24, 24, 88,111,253,250,245,217,143, 31, 63,246,161, 40,202,195,106,181,178,122,189,254,129,209,104, 60,101,181, 90, 79, 1,
-184, 90,153,196,122,121,121,181, 24, 51,102,140,168,160,160, 0, 66,161, 16, 86,171, 21,217,217,217,232,208,161,131,224,224,193,
-131,205,170,114, 3,242,243,243,151,125,243,205, 55,103,118,236,216,209, 75,169, 84,190, 36,149, 74,131, 1, 48, 90,173, 54, 75,
-175,215,255, 81,149,116,150,104,231, 24, 38,235,234,213,171, 17, 74,165, 18,143, 30, 61, 2,195, 48, 89,213,173, 3, 50, 49,249,
-248,198,185,131,181,155,248,215,195,133, 75, 87, 32, 19,147,143,249, 80, 95,207, 61,236, 62, 84,112, 20, 80, 46, 4,210,165,184,
-184, 56,249,194,133, 11, 17, 23, 23,119,211,149, 69,203, 46,184,226,226,226,110,218,143,115, 56,254, 92, 53,210, 88,182, 69,171,
- 44, 5, 9, 20,205, 46, 84,171,213, 62, 42,149,170, 88, 96,165,167,167, 35, 61, 61, 29, 18,137, 4, 41, 41, 41,144, 72, 36, 25,
-238,116, 66,228,114,249,111,173, 90,181,122,225,254,253,251,226,121,243,230,213,190,122,245,170,178, 67,135, 14, 47,202,229,114,
-134,227, 56,152, 76, 38, 50, 49, 49,209,115,233,210,165,161,109,219,182,181,180,109,219,246,218,174, 93,187,140, 40, 39,254, 21,
- 65, 16,191,100,100,100,212,175, 91,183,174, 93,180,149, 16, 87,142,130, 11, 40, 26,242, 20, 10,133,215,202, 75,168, 80, 40,188,
-145,148,148,212, 83, 33,147,194,162,213,192,170,211,128,214,106,193,104, 11,193, 20, 22, 2,122, 13, 36, 52, 13, 17, 67, 65, 46,
-147, 33, 45, 53, 21, 66,161,240, 70,121,156, 18,137,228, 70, 86, 86, 86, 79,149, 74, 85,252, 18,165,104,186,104, 97, 24, 88,104,
-186,216,162, 37, 18,137,240,248,241, 99, 72, 36,146, 27, 79,186, 38,147, 36,201,216, 67, 56,148,145, 15, 4, 5, 5,177,237,218,
-181,195,164, 73,147,192, 48,140,173, 24,136,174, 0, 46,160,200,191,229,153,132, 43,113,107,119, 90, 55, 26,141,208,233,116,200,
-207,207, 23,202,229,242, 23, 66, 67, 67,175, 88, 44,150,221, 52, 77,111,126,240,224,129,166, 44, 78,155, 48, 43, 22, 93, 44,203,
-130,227, 56, 48, 12, 3,138,162, 32, 22,139,217,179,103,207, 97,233,242,197,136,223,188,141, 27, 48, 96, 0,113,240,224, 65,176,
- 44,155,250,132,179,111,177,137,150,242, 26, 13,231,144, 10, 31,161,252,144, 10,101,113, 58,246,254, 28,183, 17, 46,142, 41,133,
- 15, 63,252,240, 56,138,134, 12,115,108, 98,174, 58,156, 95, 22,124,247,133, 12, 52,163, 55,159,221,161,251,246,142, 70, 63,247,
-219, 21,191, 89, 36, 2,205,203, 93,130,154,215,175,247,130, 64,165,242, 33,215,109, 88,153,187,125,219,158,228, 71,143, 30,105,
-214,172, 89,211,254,133, 23, 94,240,254,227,143, 63, 66,203, 18, 90, 10,133,162,225, 91,111,189, 53, 38, 63, 63, 95, 28, 31, 31,
-191, 43, 35, 35,227, 55, 20,133,150,113,156, 65,221, 15,192, 22,155, 16, 13,178,181,115, 23, 0,204, 43,175,191, 70, 16, 4,126,
-250,233,167, 82,179, 3,217,234,169,115, 85,131, 6, 13,134,221,191,127,255,124, 86, 86,214, 16,231,157, 98,177,120,110,163, 70,
-141,122,223,188,121,243,115, 0, 71, 43, 67,108, 48, 24, 98,247,236,217,179, 68, 32, 16,212, 98, 24, 38,221,104, 52,198, 86,219,
-162, 69,177,227,226,214,237,220,104,180, 48,225,114,137,224,145,137, 98,223,230,117,200,243,107,205,178, 65,237, 96,141, 82,163,
-232, 59,130,142,235,127,216, 94, 70, 22,142,227,236,199,170, 29,172, 88, 22, 39, 43,152,171,125,234,106, 4, 75,231,202,106,227,
-202,178,104,125, 2,160, 45,128, 95,178,178,178, 86,142, 30, 61,122,233,246,237,219,189, 52, 26, 13,178,178,178,144,157,157, 13,
-161, 80, 8,165, 82,137,181,107,215, 26,179,178,178, 86, 58,158,131,210, 17,228, 1,192,228,239,239,255,219,182,109,219,130,191,
-254,250,107, 97, 76, 76, 76, 74,191,126,253, 26,175, 93,187,246,190, 88, 44,230, 24,134, 33,204,102, 51,241,206, 59,239, 68, 44,
- 95,190,252,161, 64, 32, 80, 12, 27, 54,140,240,240,240,248, 5,229,132, 13, 80,171,213, 39,191,255,254,251,193, 83,167, 78,149,
- 90, 44, 22,151,150, 44,251, 54,149, 74,133,139, 23, 47, 90,242,243,243, 79, 84, 96,197, 56,249,195,209, 35,157,255, 59,124,184,
-152,210,106, 64,105, 53,160, 53, 26, 48,218, 2, 16, 58, 13, 68, 12, 13,185,152, 69,112,152, 12,180,209, 19, 71,126,253,131, 50,
-155,205,229, 6, 54,212,104, 52, 39, 47,196,199,119,109, 91,167,142,240,226,148, 41,176, 82, 20, 94, 77, 74, 42, 22, 87, 86,171,
- 21, 7,154, 55, 7, 67, 16,104, 57,126, 60,238,210, 52,173,209,104, 78,254, 19, 31,134,235,215,175,103,143, 28, 57,242, 42,203,
-178,173, 43, 99,221,249,167,131,162,168, 82,214, 40,134, 97,138,172,142, 69,150, 3,201,145, 35, 71, 58, 39, 38, 38,138,255,252,
-243, 79,156, 63,127,190,229,246,237,219, 63, 9, 15, 15,111,254,232,209,163,204,138,196,155,171,160,191,176,249, 31,238,218,177,
- 27,239,190,251, 46,145,153,153,137,239,190,251, 14, 21, 5, 79,253, 59, 16, 19, 99, 98,227,227,101,181,225,228,247,228, 34,164,
-194,239,112, 51,164, 66, 89,156,166,152, 34, 43,153, 44,190, 40,216,168, 41,166,104, 56, 80, 22, 95,161,165, 12, 49,166, 24,141,
-205, 33, 62,163, 6, 56,245,160, 25,185,229,236, 14, 93,191,163,143,180,151, 51,140,243, 0, 28,135,137,225,238, 94,227,174,191,
-244,146,143, 63, 0,152, 77, 76,112,195,134, 13,187, 8,133, 66, 9, 0,120,122,122,190,228,231,231,183, 54, 55, 55,183,163,171,
- 50,141,142,142,110, 23, 24, 24,216,234,216,177, 99,127,100,100,100,220, 4,240,179,243, 65, 17, 17, 17,179,111,221,186,213, 70,
- 36, 18, 17, 21,212, 17, 0, 64,151, 46, 93, 94,144, 74,165,126, 71,239,120, 67, 35,110, 0, 78, 80, 8, 8,101, 96, 84, 45,144,
- 34,110,138,176,176, 43,126,249,249,249, 45, 11, 11, 11,255,168,100,209,119, 27, 60,120,240,230,248,248,248,176, 46, 93,186,112,
-215,174, 93, 35,157, 71, 17, 34, 34, 34,122, 93,190,124,185,245,219,111,191,189,126,231,206,157, 19, 81,114,166,109, 69, 72,177,
-197, 27,172, 49,156, 76,198, 41,128,169, 99,179,153,241, 10,229, 95,128,202,132, 92,168, 70,120,134,106, 37,177, 76, 3, 70, 25,
-219,219,218, 98, 98,181,165, 40,234,247,235,215,175, 31, 24, 54,108,152, 46, 55, 55, 23,126,126,126,168, 91,183, 46, 8,130,192,
-218,181,107,141, 15, 30, 60,216,107,139,165,213, 54, 61, 61,125,128, 77,108,185,130,118,213,170, 85, 59,183,110,221,170,186,122,
-245,170,128,166,105,101,227,198,141, 13,151, 46, 93,242, 20,137, 68,156, 88, 44,102,175, 94,189,170,136,136,136, 48, 17, 4, 33,
-253,241,199, 31,115,175, 92,185, 18, 62,125,250,244,111, 80,114,154,184, 51,118,204,159, 63, 63,237,254,253,251, 48,155,205,208,
-104, 52, 40, 44, 44, 44, 94, 10, 10, 10, 80, 88, 88, 8,145, 72,132,204,204, 76,236,219,183, 47,195, 22, 37,190, 60,203,198,154,
-213,107,215,169, 51, 30,165, 64,169,144,131,214, 20,128, 41,204, 5,180,133,144, 80, 86,120,136, 24,212,110, 32,135, 76,161, 68,
-150, 70,135,248, 75,191,102,218,162,196,151,109, 46,176, 88,214,188,183,124,121, 22, 45, 22,163,206,208,161,176,218,134, 10, 29,
-133, 22, 67, 16, 8,239,209, 3,164,183, 55, 22,236,221,155,101,139, 18,255, 68,193,178,172,192, 98,177,148,151, 15,176, 44,155,
-154,152,152,184, 19,192, 25,130, 32, 56,130, 32, 56, 20, 5,107,211, 61,203, 15, 50, 69, 81,152, 51,103, 14,196, 98, 49,230,204,
-153,131, 79, 63,253, 20, 75,151, 46,197,186,117,235,240,237,183,223,226,200,145, 35,245, 46, 92,184, 32, 62,119,238, 28, 23, 23,
- 23,151, 19, 17, 17, 33, 24, 63,126,188, 74, 46,151,127, 88, 30,103,108,108, 44,188,188,188, 16, 27, 27,139,197,139, 23, 99,211,
-166, 77, 56,112,224, 0, 46, 94,188, 8,129, 64,192,166,166, 62,134,201,100,226, 86,173, 90,149,118,224,192, 1,227,202,149, 43,
- 33, 20, 10,137,167,212, 72,124,104, 19, 84,142,150, 32,231,144, 10,185, 0, 86,160, 98,223,168,178, 56, 33,139,143,175,109, 19,
- 71,201, 14,130,232, 16,128,169, 40,127,122,181,157, 99, 34,128,224, 26,224,156, 37, 31,249,127,137,170,141,183,239, 93,206, 48,
-206, 2,240,131, 61, 79, 74,165, 82,190,127,255,247, 66, 0,216,187,103,159, 40, 41, 41,201,251,251,239,191,151, 5, 6, 6,226,
-219,111,191,149,201,229,242,192, 50, 56,153, 3, 7, 14,152, 37, 18,137,223,184,113,227,250,180,105,211,230, 3, 91, 71,180, 7,
-128,102, 40,154,189, 24,117,239,222,189, 4,127,127,255, 59, 39, 78,156,208,187, 83, 64, 90,173,246,155, 45, 91,182,212,205, 99,
-124,113, 84, 63, 24,241,236, 18, 28, 81,109, 70, 74,157, 79,161,168,245, 50,222,120,227,141, 90, 12,195,108,172,100,185,191, 49,
-104,208,160, 45,241,241,241, 97,227,198,141,203,188,118,237, 90, 22,128,120, 0,219, 28,151, 91,183,110,229,140, 30, 61, 58, 99,
-227,198,141, 33,195,134, 13, 91, 7, 96, 8,255,234,231,193,163,100, 95, 8, 21,205, 58,116,241,194, 45,254,159,157,157,189, 42,
- 63, 63,255,226,221,187,119,223,183, 88, 44, 33, 4, 65,112, 98,177, 56, 51, 43, 43,107,165, 67,192, 82, 87,126, 37, 61, 97,139,
-181, 65, 16, 4,197,113, 92,106,183,110,221, 62,236,209,163,199, 87,135, 15, 31, 54,117,237,218, 21,123,246,236,241,239,214,173,
-155,129,101, 89,238,232,209,163,254,189,123,247, 54,156, 57,115, 70,255,206, 59,239, 52,110,212,168,209,248,216,216, 88, 53, 65,
- 16,172, 43, 78,251,187,172,160,160, 96, 80,159, 62,125, 46,238,221,187, 87,169, 82,169, 64,211, 52, 12, 6, 3, 12, 6, 3, 56,
-142,131,183,183, 55,212,106, 53,230,205,155,167, 41, 44, 44, 28,232, 66,184, 57,115,154, 76, 38,211,144,137, 31, 76, 61,185,242,
-243, 57, 94,225,245,234, 33,247,182, 9,180,201, 0, 17, 71,162,246, 11,222, 16, 75,228,184,155,164,197, 71, 59,247,107,141, 38,
-211,235, 46,122,203,165, 56, 11, 11, 11,135,196,124,250,233,169,245,211,167,123,182, 10, 10,130, 64, 32,128,217,108, 6,195, 48,
- 16,137, 68,136,140,137,129, 56, 32, 0,179,119,238,212,107, 52,154, 33, 40,253, 41, 30,103,206,154,128, 35,231,196,235,215,175,
-143,110,210,164, 9, 38, 76,152,128, 65,131, 6,149, 56,240,251,239,191,199,186,117,235, 96, 54,155, 71, 3,184, 6, 96, 45,138,
-134, 58,224, 36,178,254,238,116,214, 56, 39,195, 48,249, 73, 73, 73,202, 37, 75,150, 16, 86,171, 21,159,127,254, 57,236,130,211,
- 94,175, 39, 77,154, 84,203,203,203, 11,159,125,246,153, 37, 39, 39,167,251,226,197,139, 79,111,219,182,205,255,155,111,190,121,
- 3, 64,172, 51, 39,203,178,217, 55,110,220,240, 90,191,126, 61, 73,211, 52,150, 45, 91, 86,106,120,114,236,216,177,176, 90, 41,
- 8, 4, 66,139,201,100,110, 38,151,203,147,253,252,252,228, 92, 73,231,174, 39,121, 63, 67, 81, 20,194,192,209,241,221,226,232,
-159,133,178, 67, 42, 84,134, 83, 45,139,143,239,106,138,137, 57, 99, 19, 68,137,182, 99,246,216, 77,250,149,224,180, 11,194,170,
-112,158,180, 45, 21,194,100, 50, 65,173, 86, 35, 39, 39, 7, 42,149, 10, 2,129,128, 40, 43,157,102,179,249,207,143, 62,250,232,
-250,198,141, 27,123, 94,190,124,185,255,185,115,231,186,157, 58,117,202,148,146,146, 66, 83, 20,197,133,132,132, 8, 59,118,236,
- 40,235,219,183,175,135, 84, 42, 37,103,205,154,149,243,197, 23, 95,248,163,164, 15,155,115,222, 5, 4, 65, 96, 90,103, 45, 98,
-187, 9, 96,177, 88, 81, 80, 80,128,180,180, 84, 36, 36, 36,224,242,229,219,224, 56,142,172, 68,185,251, 1,152,245,221,119,223,
-133, 74, 36, 18, 98,231,206,157,181,118,238,220, 89,161, 37,117,251,246,237,181,118,237,218, 53,215, 54,122,145,250, 44, 62,239,
- 60,231, 63,150,243, 89,134,115,100,120, 84, 40,180,108,237,124, 91,216, 62, 74, 74, 81,212, 47, 46, 66, 56,124, 2, 96,142,131,
- 21,172, 34,115,158,134,227,184,243, 61,123,246,156,212,163, 71,143,229,189,122,245,202,200,200,200,168,191,108,217,178, 48,154,
-166,173, 9, 9, 9,100,114,114,114,202,111,191,253,214,160, 81,163, 70,227,111,221,186,117,150, 32, 8,171, 27, 25, 76, 72, 78,
- 78,238,208,173, 91,183,125,227,199,143, 15,111,215,174,157, 68,165, 82, 65, 40, 20,226,254,253,251,248,227,143, 63, 44,187,118,
-237, 74, 45, 40, 40,168,204, 39,120,126,121,152,150, 22, 53,108,242,251,123,199, 15,234,239,255,159,198, 47, 72, 66, 66, 66, 0,
-163, 17,183, 31,101,226,202,237, 63,172,155,206, 95, 81,155,205,230, 33,112,255, 19, 60,191,252,118,247,110,207,238,211,167,239,
-157,251,223,255, 6, 33, 35, 67, 24, 18, 18, 2,137, 68,130, 7, 15, 30, 32,153,101,233, 69, 27, 54,100,217, 68,214,147,142, 10,
- 47, 5,176,132,101, 89, 33, 0,200,229,114,188,247,222,123,112,252,228,206,186,117,235, 96, 52, 26, 1, 64, 72, 16,196, 18, 0,
-155,159,117, 43,150, 29,121,121,121,179, 95,125,245,213, 56,161, 80, 88,102,212, 91, 31, 31, 31,104,181, 90,208, 52,205,164,165,
-165,221,246,241,241,129, 72, 36, 2,199,113, 46,159,163,220,220,220,217, 67,134, 12,153, 79,146,100, 89,150, 15, 40,149,202,148,
-211,167, 79, 55,124,251,237,183,201,255,253,239,127,247,199,141, 27, 39, 61,125,250, 52,195,113,220,190, 39,125, 15, 58,117,218,
- 1,172,143,121, 29,192,235, 64, 41,135,247, 52,219,182, 74,133, 84,232,212,105, 7,214,227, 47, 78,199, 97, 60,187, 32,178, 89,
-161,154,202,226,227,151,163,200,207,162, 92,238, 78, 59, 58, 97,125, 12,106,148,211, 29, 56,106, 95,189, 94, 15,134, 97,202,179,
-230,253,190,103,207,158,229,191,253,246, 91,192,164, 73,147,234,255,247,191,255, 85,118,235,214,205,211,241, 0,163,209,200, 30,
- 58,116, 72,191,110,221,186,194,243,231,207, 63, 28, 59,118,108,187,242,210,249,232,209,163, 35, 11, 22, 44,240,238,219,183,111,
- 35, 0,197,254, 89,106,181, 26, 41, 41, 41,248,243,207, 63, 83,172, 86,235,193, 74,100, 41, 23,192,220, 17, 35, 70, 44,217,186,
-117,107,173,113,227,198,101,238,218,181,235, 79, 20, 5, 44,118,134,106,208,160, 65,205,183,110,221, 26, 50,110,220,184, 76, 20,
-249,145,165,130, 7, 15, 30,118,116, 69,105, 63,173,114, 71, 38,182, 88, 44, 22,206,100, 50,113, 6,131,129,211,233,116, 28, 92,
-127, 5,254, 64,122,122, 58,151,154,154,202, 61,122,244,136,123,248,240, 33, 7,224, 91, 39,197,235,170,193,242,216,190,125,123,
-131,208,208,208,207, 21, 10,197,113,129, 64,160, 17, 8, 4, 26,169, 84,250,131,159,159,223,167,139, 22, 45, 10,229, 56, 78, 92,
-142,138, 46, 11, 66,145, 72,244,118, 96, 96,224, 1, 95, 95,223, 84, 31, 31,159,212,192,192,192, 3, 34,145,232, 93, 0,162, 10,
-148,121, 89,144, 9,133,194,143, 60, 60, 60, 78, 74,165,210,108,169, 84,154,237,225,225,113, 82, 40, 20,126,132,242, 3,169,150,
-203, 41,145, 72, 62, 10, 8, 8, 56,169, 84, 42,179,149, 74,101,118, 64, 64,192, 73,137, 68, 82, 29,206,234,244, 74,236, 66,203,
-192,217, 64, 16, 4,213,178,101,203,245,173, 91,183, 94,219,186,117,235,181, 45, 90,180,248,218,102,149,228,108,214, 22, 3,202,
- 14,222,248,119,166,243,169,113, 70, 70, 70,110,219,186,117, 43, 59,123,246,108, 77,163, 70,141,242,102,207,158,173,217,186,117,
- 43, 27, 25, 25,185,173,170,156, 65, 65, 65,117, 34, 35, 35,243, 54,110,220, 72, 39, 37, 37,113, 27, 55,110,164, 35, 35, 35,243,
-156, 34,195, 63,137,188, 19, 0, 34,108,214,159,131, 0,118,163,200,249, 61, 20, 0, 17, 99,138,225,108,179, 15,143, 3,232, 85,
- 70,217,187,203, 25,102,138,137,225,108, 62, 85, 39, 0, 36, 58,172,119, 65, 73,255,175, 39,193,233, 18,205,154, 53,187,203, 57,
-192, 98,177,112,106,181,154, 75, 74, 74,226,206,159, 63,207,133,133,133,221,117,131,211, 15,192, 59, 0, 14, 5, 7, 7,223,106,
-223,190,253,163, 14, 29, 58, 60,170, 83,167,206,125,145, 72,116, 25, 69, 17,222, 35,109,203, 18, 0,141, 42,224,108,175, 82,169,
- 22,132,133,133, 29,108,216,176,225,197,186,117,235, 94,246,245,245, 61, 44,147,201, 22,226,175,200,216,149,173,243,221, 6, 15,
- 30,156,162,211,233,152,151, 94,122,233,150,171,147,154, 52,105,114, 65,167,211, 49,195,135, 15, 79, 5, 16,253,111,120,222,121,
-206,167,194,249,220,193, 85, 84, 4, 59, 26,218, 4,211, 1,135,229, 19, 23,199,125,226,116,204, 22,219,185, 21, 22, 4,199,113,
- 2,142,227, 60, 56,142,243,230, 56,206,151,227, 56, 21,199,113,158, 28,199, 73, 43, 48,127,243, 21,251,239,227,156,104, 19, 80,
- 6,219,127,103, 84,180,255,185,190,159,161,161,161, 62,109,218,180,153,188,127,255,254,143,238,221,187,247,209,254,253,251, 63,
-106,211,166,205,228,208,208, 80,159,234,164, 51, 40, 40,168, 78,211,166, 77,191,106,210,164, 73,106,211,166, 77,191,114, 18, 89,
- 79, 50,239, 18,155,136,105, 98, 91,234,219,182, 17, 40,138,133,181,198, 38,108, 34,202,232,169, 85,134,211,206,119, 16, 64,111,
-219,114,208,182, 45,236, 41,112,150, 66,189,122,245,142, 53,111,222,252,110,139, 22, 45,146, 91,180,104,113,183, 89,179,102,119,
- 27, 55,110,124, 55, 34, 34,226,110,237,218,181,239,250,251,251, 31,171, 66, 25,249, 2, 8, 65,233,207,128, 61,237, 58,223, 53,
- 50, 50,242,138, 76, 38,115, 25, 27, 76, 40, 20,206,109,209,162,197, 13, 20,205,148,228,219, 79,158,147, 23, 90,162, 32,200, 0,
- 0, 0, 32, 0, 73, 68, 65, 84, 53, 32,180,248, 10,243,239,229,148,162,252,207,140, 84,180,159,191,159,207, 54,167,203,111,117,
-217,132, 76,125,155,192,145,212, 0,167, 35,159,189, 78, 69, 56,136,166,167,193,201,215, 37,158,147,231,228,133, 86,141, 11, 45,
- 33,127, 27,120, 56,193, 92,205,253, 60,158,241,118,161,140,237,174, 98, 98, 85,135,211, 21,223,189,167,204,201,131, 7, 15, 30,
- 53,213,118,118, 5,112,214,222, 43, 44, 75,149, 86,102, 54, 65, 85,148,237, 41,158,147,231,228, 57,121, 78,158,147,231,228, 57,
-255,117,156,118, 44, 47, 99,251,109,167,245,175,159, 81,225, 69,240, 67,135, 60, 39,207,201,115,242,156, 60, 39,207,201,115,254,
- 83, 56, 93, 97,252, 51, 42,178,186, 0,252,208, 33, 15, 30, 60,120,240,224,193,131, 71, 77,163,226, 56, 90,187,119,239, 22,216,
-255,143, 24, 49, 98, 44,195, 48,147,237,235, 2,129, 96,245,119,223,125,183,185,188, 43, 12, 29, 58,148, 41,143,211, 21, 42,186,
-142, 43,206,102,141,148, 19,252,188, 21,239, 23, 20, 26, 86,220, 79,103,206,155, 76,166,166,246,125, 50,153, 44,113,243,230,205,
-119,106, 58,157, 99,199,142,109,228,124,157,186, 97,162,174,190, 94,178,247,242, 10,116,203,110,222,213,125,205,215,177,167, 2,
-127, 0,209, 94, 50,241,128,102, 42,113,251, 63,115, 77,151,244, 86,230, 16,138,102,195,230, 63,143, 25, 14, 14, 14,110,172, 84,
- 42, 71, 1,104,102, 48, 24, 2, 21, 10, 69, 54,128, 4,141, 70,179, 45, 51, 51,243,182,187, 60, 93,234, 34, 5, 64,184,109,245,
-209,217,135,168,227,206,190,138,208, 43, 2, 38, 14,144, 18, 4,172, 39,146,255,114, 70,239,221, 0, 38,150, 43,189,189, 87, 3,
- 88, 56, 14, 98, 2, 48,159,184, 7,217,115, 84, 84, 74, 0, 81, 40, 10,225,112, 29, 69,225, 39, 12,252, 35,203,131,199,115, 5,
-231, 64,165,197,235,194, 50,196, 68,103,177,144,248,138, 3,167, 2, 56, 63,179,217, 44,146, 72, 36,176, 88, 44, 80, 40,228,107,
-222, 25, 55,246,115,144, 40,160,104,188,183,121,243,230, 42,127,233,186, 50,215, 1,240,147,243,249, 62, 74,249,252, 51,135, 62,
-246,233,220,111,209, 66,203,131,156, 88,173, 86, 75, 74,165, 82,152,205,102,120,123,123,119,152, 48,126,252, 75,164,136,179,136,
-197, 30,151,150, 47, 95,158, 89,213,116,126,248,225,135,193, 86,171,233, 21,150,101, 37, 22,139, 69,234,124, 29,111,133,199,162,
- 51,135, 62, 86,116,137, 94,248, 57,192, 11,173,167, 0, 73, 29, 31,143,179, 43, 70,116,109,210,190, 89, 67,176, 9,231, 96,178,
- 88, 7,156, 73,213, 13,248,244,114,250,212, 84,157,181, 53,106, 32, 96,229, 63, 8,130,250,245,235, 79, 10, 8, 8, 24,190, 97,
-195, 6,113,253,250,245, 33,147,201, 96, 52, 26, 67,238,221,187, 23, 50, 97,194,132, 46,114,185,124,231,253,251,247,215,192,189,
- 15,193,133,159,217,242,127, 0,128, 14,163,230,133,163,232, 99,209, 6,231,125, 93,199,204, 11, 7, 48, 29, 37, 63,140,156,129,
-162, 16, 10,174, 90, 29,201,225,173, 75, 49, 96,244, 71, 66, 0, 19,138, 19, 79, 2, 63,124,187, 18,125, 70,188, 95, 98, 59,193,
- 65,120,104,235, 82, 68,143,254,168,204,239, 40,246,110, 72, 80, 44,203,149,105,137, 39, 73,130, 62,126,151,115,245,129,225, 44,
- 20,197, 0, 43, 69,137,162, 15, 58,187, 60,190, 95, 99, 65,150,149, 98, 92, 6,156, 21,139, 4,217, 71,110, 51,165,206,141,105,
- 5,138, 98,138,218, 86,177, 16,204,129,251,222,103,102,205,154, 37,140,142,142,198,166, 77,155, 58,126,253,245,215,227,181, 90,
-237,143,182,251,150,204, 63,190, 60,120, 60,215,130,203,181,208, 18, 10,176,254,224,222,205, 13,178,178,115, 16,243,246, 52,236,
-216,177, 3,249,249,249,240,241,241,129, 68, 44, 22,173, 88,242,127,193, 74,165, 71,112,204,248,216,245, 0, 26, 87, 53, 53,149,
-188, 78, 67,231,243, 9,219,167,116,132, 2, 82, 36,145, 72,200,157, 59,119,162,160,160, 0, 42,149, 10, 18,137,136, 92,190,240,
- 19,185, 82,233, 41,127,107,226,140,142, 40,138,255, 83, 37, 88, 44,186,142,251,119,108, 86,170,213,106,140,121, 55, 22,206,215,
- 17,139,197,140,253,197,194,215,177,167,130, 89, 27,222, 27,221,228, 69, 47,192,122,243, 34, 68, 2, 1, 20,222, 62,136, 18, 10,
- 32, 32,208, 52,230,248,195,153, 0, 62,125, 94, 50, 91,191,126,253, 73, 67,135, 14, 29, 62,127,254,124, 49, 73, 22,133,156,211,
-235,245, 48, 26,141, 8, 13, 13,197,153, 51,103,196,179,103,207, 30,254,253,247,223,227,254,253,251,171, 42,203,127,243,230,205,
-186,225,225,225, 38, 0,232,223,220,203,121, 95, 29,251, 62, 0,240,242,242,170,144,207, 79,229, 97,190,121,243, 74, 51,251,121,
-147,122,132, 50,101,108, 55, 1, 80,148,199,197,178,156,240,196, 87, 19,202,220,255,246,252,237,244,245,221,231, 27,215,175, 95,
-223,232,184,221,211,211,179,172, 83,130,116, 58, 93,184,243, 70,251,241, 86,138, 9, 44,235,122,189,222, 91,231, 82,128, 81, 12,
-132,219,183,111, 7, 0,124,249,209, 72,193,198,159,115,132, 66, 97, 81, 83,187,100,201, 18,204,157, 59, 87,114,252,248,241,190,
- 91,183,110,237,123,224,192,129, 21,101, 9, 85, 30, 60,120, 60,147, 34,203,241,183,108,161, 69, 18,132,151,210,203, 19,175,191,
-241, 14,142, 29,251, 1,157, 59,119, 46,222, 87,175, 94, 61, 12, 29, 50, 16,223,109, 89, 14, 0, 94,213, 73, 81,117,175,147, 95,
-168,255,180,207,240,175,230, 61,202,212, 93, 62,124,248, 48, 58,117,234, 84,226,252, 55,134,189,142,111,191, 89,130,114,162,204,
-187, 5,130, 35,197, 94, 74, 15,140,136,121, 23,174,174, 51,126,204,160,195,189,135,174,236,153,149,171, 95,206,215,179, 39,143,
- 6,193,126,189,154, 55,105,140,252,125,107,240, 71,129, 9,199,210, 77,120, 43,234, 63,136,244,149,163, 19,205, 32,216, 67,212,
- 61, 83, 79, 61, 23, 66, 43, 56, 56,184,113, 64, 64, 64, 9,145,165,213,106,161,211,233,160,209,104,160,213,106, 65,146, 36, 98,
- 99, 99,197,103,207,158, 29, 30, 28, 28,124,202,141, 97,196, 71, 54, 75, 22, 32, 16,233,230,204,153, 99, 14, 12, 12, 52, 43, 20,
- 10, 78, 40,150,106,187,142,153,231, 5, 0,164, 80,172, 93,177, 98,133, 37, 52, 52,212, 36, 20, 10, 37,239,191,255, 62,233, 78,
-154,205,102, 51,231,200,105,177,152,139,183, 47, 90,180,200, 18, 20, 20,100, 86, 40, 20,156,213,234,190,209,241,198,131, 60, 72,
-197, 2, 72,197, 2,200, 36, 34,120,213,109, 3,105,254,159,160,105, 26,139, 23, 47,182, 6, 7, 7, 91, 20, 10, 5, 39,145, 72,
-196, 83,166, 76,169, 48,157, 99,199,142,229, 84, 42,149, 85,161, 80,136,231,206,157, 91, 42, 24,235,233,235,105,144, 75, 68, 80,
- 72,133,104, 88, 47, 12, 82,206,232,118, 90, 5,130,146,222, 8, 82,169, 20, 29, 59,118, 68,179,102,205,112,224,192,129,174,188,
-208,226,193,227,185, 64,153,159,219, 17, 2,192,225,195,135,187,160,232,131,136,136,142,142, 38,138,206,224, 48,125,210, 16,188,
- 53,102, 4, 24,134, 45,142,110, 74,144, 4, 38,190,217, 23, 44,235,206,136, 68,197, 83, 60,171,112,157, 98, 78,142, 32, 5, 0,
-208,160, 78, 8, 55,254,173,255,130, 97,217,191, 6, 74, 4,192, 59, 99,250, 20,109,171,129,116, 10,192, 96,218,132,215,224,234,
- 58,141, 27,212, 34,105,171, 9, 68,201,143, 61,254, 29, 31,219,228, 57, 93,160, 89,237,144, 8,202,104,132,201, 68, 33,254,118,
-158,241,100,154, 62,144, 84, 61, 84,175,124,189,157, 76,160, 78, 71, 29, 47, 73,195, 76, 61,245, 92,228, 93,169, 84,142,218,176,
- 97, 67, 41,145,149,149,149, 69,234,116, 58, 88,173, 86, 86,171,213,130, 97, 24,204,152, 49, 67, 52,123,246,236, 81,153,153,153,
-115,237,154,199, 21,167,205,239,106,250,205,155, 55,235,204,154, 53,203,218,189,123,247, 71,245,234,213,211, 11, 4, 2,132,132,
-132,172,140,138,138,242,157, 63,127,190,181,111,223,190, 15, 5, 2, 1, 26, 54,108,168,255,243,207, 63,235, 0,144,187,155,119,
- 71,206,205,167, 87,115, 0, 64, 16, 4,162,162,162, 82, 26, 54,108,168, 23, 8, 4,184,115,104, 17,231,238,253, 20, 9, 73, 52,
- 10,245,182, 53, 34, 4, 32,247, 44,246,196,139,138,138, 74,109,220,184,177,142, 36, 73,220,184,113, 35, 12,165, 63,107, 85,138,
- 83, 46,151, 83,111,188,241,198,163,219,183,111,187, 58, 30, 66, 1,137,118,141,109, 6,172,208,214, 64,234,133, 50,211, 41, 18,
-128,158, 61,105,164, 80, 37, 3,164, 94,254,102,141, 70, 3,165, 82, 89,100, 33,179, 90,241,251,239,191,163,125,251,246, 93,118,
-239,222,125,150,127,222,121, 78,158,243, 47,184,210, 34,207,160, 53,203,241, 67,247, 37,124,180,206, 56,103,138, 97,104,212, 11,
- 15,194,162,255, 27, 11,134, 97,193, 48, 12,104,219, 47,195, 48,160,172,214, 26, 73, 89,117,174,227,163,148,207,255, 97,231,123,
- 62,221, 7, 45,233, 17, 55,107,204, 73,134, 1, 88,150, 2, 69, 1, 12, 75,129,101, 24, 80, 84,205,184,230, 80, 44,139, 58, 97,
-193,136,155, 53, 6,206,215,217,246,221,238,254,167, 15,198, 42, 58, 71, 47,156,118, 39,197,176,152, 23,246, 79, 22, 50,177, 84,
-200, 9,101,176, 88,104,104, 45,172, 5,128,222, 68,177, 86,206,195, 95, 6, 0, 66,146,120,158,102,215, 54,171, 95,191,126, 9,
-145,181,116,233, 82,255,181,107,215,134, 2,192,144, 33, 67,210,122,244,232,145,147,148,148,132,144,144, 16, 34, 39, 39,167, 31,
-128,247,109,231, 78, 7,176,182, 12, 94,125,120,120,184, 41, 32, 32,192,108, 23, 68, 36, 73, 66, 40, 20, 34, 60, 60,220, 20, 24,
- 24,104,110,216,176,161, 94, 44, 22,131, 36, 73,216,133,158, 91,221, 60,130,128, 64, 32,128,157,211,217,218, 99,231,172, 12, 68,
- 66,178,116,243,230,192, 73,146,164,203,235,149, 89,135,100, 50, 14, 64,153,199, 11, 72,135,230, 81, 88,190,135, 64,252,239, 16,
- 1, 56,195,113, 28,174, 93,187,134,251,247,239, 67, 44, 22, 35, 56, 56, 24,115,231,206,133,217, 92,164,119,135, 14, 29,218, 5,
-192, 13,254, 9,230,193,163, 24,103,158, 65,129,229,108,213, 42,223, 71,235,240,225,195, 93,162,163,163,207,218, 5, 80,145,216,
-113, 33,126, 40, 26, 20,101, 5,106, 32, 16, 87,121,215, 97, 24,182,220,235,216,125,180, 88,150, 19,186, 20, 89, 44, 11,154,162,
-106,228,238,177, 12, 5,150,165,224,234, 58, 4, 65, 50,182, 6, 95,204, 63, 39, 79, 30,193,225,117, 72, 42,188, 30,206,211, 38,
-132,250, 73, 37,200, 49,162,254, 11, 77, 4,191, 27, 40, 92,188,158, 8,127, 79,229,115, 83, 46, 6,131, 33, 80, 38,147, 65,175,
-215, 23, 91,178,214,174, 93, 27,106,177, 88, 72, 0, 16, 10, 69, 97,106, 54, 84,198,176,128,183, 50, 3,249,249,133,126, 28,199,
- 17, 54,193,179, 4,192,102,148, 19,221, 95, 44, 22, 23, 11, 20, 71, 1, 36,149, 74,171, 36, 96,236,176,139, 51,177, 88,236,114,
-187,243,240, 90, 69, 16, 59, 10, 45,112, 69, 86, 45, 39,177, 37, 16, 8, 96,247,141,170, 8, 18,137,164, 56,239,174, 32, 20, 56,
- 92, 79, 80,121, 87, 76,171,213, 10,157, 78,135,130,130, 2,200,100, 69, 6, 51,142,227, 64, 16,196,251, 0, 62,224,159, 98, 30,
- 60, 92,107,145,103, 88,108,185, 22, 90, 40, 50,217, 17, 0, 64, 83, 86,151,226,103,247,161,139,120,148,169, 71,176,255, 47,224,
-202, 25,147,116,133,225,195,135,111, 9, 9, 9,105,103, 95,151,202, 61,253,198,191,247, 25,104,218, 10, 47, 57,137,183, 71,245,
- 41, 33,178,138, 44, 90,150, 50,191, 9,146, 95,168,255,180,207,208, 85,243,188,149,126,151,157,197, 79, 92,252,213,215,243, 53,
-230, 48,146,252, 21,249, 68, 8, 51,244,157,207,198, 58, 52,238,215,119,174,155, 51,213,109,123, 32, 65,138, 94,159,176,114, 60,
- 39,244,108,170, 32,181,231, 62, 30,243,159,253,142, 98,206,215,215,247,112,175,215, 87,244,204,202,227,125,180,158, 6,188,188,
- 85,100,216,203, 93,241,242,251, 95,225,244, 39, 31,115, 64, 62,252, 66, 66,201,110,147,190,128,231,203,253,113,229,237, 81, 44,
-144,247, 92,228, 85,161, 80,100, 27, 12,134, 16,163,209, 8,141, 70, 3,141, 70, 83, 82, 16,136, 68,196,248,119, 39,251,139,196,
- 18, 80, 86, 11,142,109,251,162, 66, 78,123, 8,135,254,205,189, 32, 16, 73,180, 9,245,235,175, 20, 10,133, 32, 73, 18,135,214,
-124,252,254,190,101,239,121, 1,192,245,195,107, 52, 35, 98, 87,175, 34, 73, 18,102,179, 89, 90,153,116, 63,126,252, 56,204,108,
- 54,155,108, 2,205, 46,252,240,224,193,131,218,102,179,217,232,184,221, 29,200, 21, 94,128,170, 30,160, 8, 44,101, 61,123,248,
-240, 97, 45,138,162, 12, 66,161, 16, 22,139,197, 45, 85, 68,146,164,248,198,141, 27, 97, 44,203,186, 60,190, 89, 68, 45, 32,184,
- 57, 32,241,118, 59,207,238, 68,132,182,137, 45, 14,149,108, 75,121,240,120,222, 45, 91,207,224, 51, 65,148,241,191, 88,104,117,
- 61,124,248, 48,231,216, 67,164, 41,202, 38,178,254, 18, 61, 12,195, 34, 93,109, 66, 82,210, 29,172, 88,177, 2, 23,175,124,228,
- 61,127,254,124,233,236,217,179,205,195,135, 15, 95,198,178,108, 11,146, 36,175,227,175,161,138,146, 86, 33,150,173,125,245,234,
-213,250,246,117,138,162,224,229,229, 5, 47, 47, 47, 52,110, 24, 86, 74,100, 49, 12, 3,107, 57, 67,135,118, 31, 45,130, 99, 57,
-138, 98,192,176,108,177,248,201,215,152,195, 14,158,186,214,192,225,240, 23,236,127, 58,182,105, 90,182, 24,156, 48,183, 56, 31,
- 59,215,205,153, 58,127,211, 38,105, 62, 19, 48,101,196,235,111, 69, 14, 29, 49, 10,111,188,246,106, 23,179,197,114, 64, 64,114,
- 44, 85,124, 61,144,224,224,236,163,197,227, 9, 33,185, 64, 79,137,164,114,120, 6,215,197, 29, 29, 35, 22, 8, 4,191,220, 43,
- 48,136, 73,129, 16,164, 80,140,132,124, 19,245, 28,101, 55, 33, 57, 57, 57,164,118,237,218,208,104, 52,160,105,154, 29, 50,100,
- 72,154, 80, 40, 10, 19,138, 68, 68,244,136,201,108,102,102, 58, 69,146, 2,112, 28,131, 87,135, 78, 32,164, 50,185,216,106,177,
-208, 40, 26, 58,116,101,205,114, 12,225,224, 21, 21, 21,229,107,159, 9,184,111,217,123, 94, 14,251,148, 47,189,244,146,175,227,
-172, 67, 55,173, 69,196,240,225,195,229,225,225,225, 4, 0,252,186,109,150,221,122, 70,244,239,223, 95, 22, 30, 94,228,135,255,
-227,154,247,220,230,244, 87,112, 64,225, 3,160,240, 97, 41, 75, 86,255,254,253,165,245,235,215,175,212,179,104,115,128, 47, 51,
-118,151,135,144, 6, 50,175,185,197, 21,211, 10, 84,168, 39,132,203, 94, 37, 33,241,244, 51,183,251,248,248,207,188,216,226,193,
-195, 45, 56,105,145,103, 10, 93,108, 2,177,171,237,183, 88,112, 9, 1,192,102,162, 35, 28,116, 22, 40,218, 90, 74,100, 49, 12,
- 3, 17, 97,198,138, 21, 43,240,193, 7, 31, 0,128,120,234,212,169,251,231,207,159, 63,152,101,217, 22, 28,199,117, 34, 8,162,
-188, 94,227,153,144,144,144, 44,142,227, 68, 36, 73,118, 90,179,102,141,111,223,190,125,225,229,229, 5,142,229, 74,137, 44,134,
- 97, 97,181, 90,202,252,204,173,143, 82, 62,255,135,221, 83,124,186, 15, 92,210,131, 97,217,147,118,145,197, 50, 12,192, 22,157,
-148,155,157,134, 19,199, 14, 96,253,186,245,249, 32,184, 91,224,192,218,196, 32,202, 16,131, 45, 46,252,154,216,169, 99,155,166,
-152,191,105,147,244,230,213,140,253,147, 63,156, 25, 57,116,196, 40,236,254,110, 27, 72,186,224,154,163,200, 98, 40, 22,133,249,
- 57,253,127,226,125,180,158, 22,124, 79,156, 60, 73,140, 26, 53,138,213,106,181, 16, 75, 36, 44, 69, 81,130, 87, 94,121,133,249,
-224,131, 15,200,204,204, 76,104,180, 58, 33, 0, 95, 60, 7,102, 45,141, 70,179,109,194,132, 9, 93,206,157, 59, 39, 38, 73, 18,
- 26,141, 6,221,186,117,203, 81,179,161,178,241,239, 78,246, 79, 79, 79,163,149,114,161, 89, 44, 22, 33, 59, 59,155,237,210,119,
-164,113,196,216, 15,106,125, 48, 43,110, 67,198,165,117,107,221,185,134,227, 76, 64,231,125, 27, 55,110,180,132,134,134,154,164,
- 82,169,100,204,152, 49,110,141, 31, 90, 44, 22,110,209,162, 69,102,231,217,133, 22,139,133, 91,177, 98,133, 37, 44, 44,204, 44,
-151,203, 57,138,170,216,239,147, 36, 9,250,237,249,219,105,154,166, 75, 88,177,236, 34,139, 98, 9,221, 87, 95,125,101, 13, 11,
- 11,179, 40, 20, 10, 78, 42,149,138,221, 73,231,228,201,147, 57, 31, 31, 31,171,135,135,135, 56, 54, 54,182, 90,179, 14, 41, 6,
-194,249,107,138,195, 59, 72,189,188,188,160,213,106,139,211, 26, 18, 18,194,139, 45, 30, 60, 92,160,148, 22,121, 54,173,112,238,
-197,209, 98, 1, 93, 86,118, 78,160,127, 80, 93,208, 52,109, 91, 40,208, 20,133, 41,239,140,192,178,117, 95, 1,128, 93,108, 69,
- 77,157, 58,117, 63,128, 10, 27,179,157, 59,119,206,155, 58,117,170, 50, 43, 43,235,248,150, 45, 91,124, 71,142, 28,137,233,211,
-167, 99,201,146, 37, 16, 73,100,240, 13,168, 93,124, 29,251,117,115,212,121,224,192,233,202,176,211, 89,139, 26, 41, 8,253, 2,
-234,128, 98, 40,176, 20, 5,138,162, 64, 8,138,178,118,226,216, 1,140,124,115, 50, 68, 82,165,207,234, 21,139,141,145, 47,135,
- 12,158, 61,110,156,217, 13, 35, 32,121,243,106,198,254,201, 31,196, 70,217, 69,214,222,109,235,110,125, 57, 99,224, 14,169, 68,
- 88,124, 29,138,101, 65,146, 2,222, 71,235, 41,137, 44,169, 84,186,231,232,209,163,119, 91,183,110, 77,232,245,122, 80, 20,133,
-156,156, 28,236,223,191, 63,129,227, 56,248,248,248,224,232,209,163,236,200,145, 35,247,152,205,230,215,159,117,177,149,153,153,
-121, 91, 46,151,239,156, 57,115,230,136, 25, 51,102,136, 88,150, 69, 82, 82, 18, 64, 16,156, 72, 44, 1, 73,146, 16,137,132, 40,
- 44,212,176, 10, 79, 85,134,149, 19, 40, 68, 98, 9, 72,129,184,188,105,194,143,108,193, 72, 65, 10,197, 90,251, 76, 64,177, 88,
-140, 43,187,151,106,186,142,153,167, 4, 0,177, 84,158,223,171, 87,175,148,166, 77,155,234,127,251,237,183, 58, 40, 61,235,208,
-249,249,164, 7,141,137, 21, 40,228, 50,125, 84, 84,212, 35, 59,231,195,147,171, 53,163, 38,206, 34, 8,129, 68, 31, 29, 29,157,
- 18, 25, 25,169, 23, 8, 4, 72, 60,176, 88, 51,104, 76,172,140, 40, 39,200,234,241,187,220,219,215,119,159,111,252,197, 23, 95,
- 80,255,207,222,117,199, 53,113,254,225,231, 46,155,189, 71, 16, 68, 69, 81, 20,112,139, 11,197, 58,235,108, 21, 23,110,235,174,
-179,117,214,129, 91,169, 27,181,206, 90,139,155,106, 85,212, 58,234, 66,197, 5,226, 96,168, 40, 32, 35,108, 8, 16,178,115,247,
-251,131,132, 6,100, 36,104,107,237, 47,207,231,147, 79,146,187,247,158,123,111, 63,247,125,191,163,111,223,190, 41, 26,127,177,
-164,164, 36,167,126,253,250,113,183,110,221,170,232,215,175, 95,170,151,151, 87, 49, 73,146,136,140,140,116,174,206, 82,165,129,
-145,145,145, 98,226,196,137,239,158, 63,127, 94,219,168,195,106,225,226,226, 2,138,162,208,173, 91, 55, 72, 36, 18,131,101,203,
- 0, 3,254,155,168,152, 71,171,234,204,240, 10,165,226,219, 41,179, 87,238, 4, 8, 83,173,187,192, 95,134, 37, 26,196,247,223,
-127,103, 2,192, 72, 35,182,230,206,157, 91, 99,153, 19, 45,145,213, 38, 32, 32, 0,139, 23, 47,198,230,205,155, 85, 63,254,248,
- 35, 35,254, 85,162,124,220,244, 21, 5, 21,214, 3, 26,116, 49,165,160,190,173,140, 47, 95, 40, 90,225,219,111,195,202,180,204,
-146, 59,227,166, 45, 45,187,123,169, 0, 20, 18,124, 21, 0,236,249,233, 39, 17,139,107,110, 50,116,196,104, 0,232,185,115, 91,
-208,153, 53, 56, 80,179,216,162, 9,143,111,231, 46,176,210,136,172, 93, 91,215, 62,183, 32, 50,131,103,126, 23,163,208, 94, 15,
- 0, 88,155,225,140,111,191, 13,189,179,242, 68,219, 13,231,217, 63, 7, 14,135,179,250,250,245,235, 38,222,222,222, 68,110,110,
- 46, 84,170,210, 35, 34,151,203, 33, 20, 10, 81, 84, 84, 4,169, 84,138,214,173, 91,147, 59,118,236, 48,153, 57,115,230,106,153,
- 76, 54,253,115,223,238,183,111,223,238, 58,119,238, 28,110,221,186, 53,124,209,162, 69, 44, 71, 71, 71,194,194, 34,147, 80,200,
-101, 0,104, 58, 59, 59,155, 50, 54,181, 20,216, 58, 56,191, 75,207,200,242, 80,200,101,160, 84,242, 42,189,205,213,233, 29,190,
-127,241,226, 69,189, 77,155, 54,201,180, 35, 1, 71, 44,216,185,163,117,235,214,214,193,193,193,178,254,253,251, 39,107,156,215,
-117,113,134,191,242, 6,179, 95,188,120,214,172, 34,167,223,228, 77, 7, 53,156,218,209,136, 3,190,219,123,176, 81,163, 70,214,
-158,158,158,201,213,241, 54,104,208, 64,204,231,243,101, 77,154, 52, 41,102,177, 88,165,150, 44,133,162,164, 65,131, 6,148,131,
-131,131,172,105,211,166,197,250, 58,237, 27, 25, 25,209, 26,171, 88,101,208, 39,234,144,197,128, 50, 32, 32,160, 44, 51,252,247,
-141, 26, 9, 70,143, 30,205,159, 55,111, 30, 14, 30, 60,136,187,119,239,190, 39,246,187,118,237,138,219,183,111,175,196,127, 40,
-177,174, 1, 6,252,159,161,250, 60, 90, 21,113,232, 80,200,159,208,242,105,170, 12,107,214,172,225,170, 45, 89, 61,231,204,153,
- 3,177, 88,108, 85, 73,179, 30, 80,231,218,168, 76,100, 5, 5, 5, 29,163,105,218, 25, 64,103,149,138,122,176,255,192,161,110,
- 85,173,111,232,208,161,239,113,210, 4,201, 32, 73,162,152,195,162,159,252,180,239,224,145,114,237, 75,157,223, 27,131,192,211,
-157,219,130,196, 0,122, 86, 20, 91,248,171,204, 72, 25,167, 6, 83,167, 77, 45, 19, 89, 59,183, 5, 93,245,108, 83,247,235,165,
-223,172,174, 84,156,173, 94, 49,197,132, 36,137,142, 21,124,180,222,227,252, 8, 48,112,254,133,110, 1, 1, 1,205,125,124,124,
- 72,109,145, 37,147,201,202, 18,119,106,156,197,211,210,210,208,181,107, 87,178,121,243,230, 94, 15, 31, 62,236,134,191,202, 57,
-125,174,219,174,122,251,246,237, 14, 71, 71,199,107,203,151, 47, 31,157,147,147,211, 47, 63,191,192, 38,236,208,106,244, 25, 58,
-141,232,218,119,164, 72, 70, 51,121,169,130,204, 38, 55, 47, 30,181,190,116, 98, 23,228, 50,217, 20, 0,113,248, 43,189, 67, 69,
-206, 18, 77, 26,135, 38, 77,154,136,180,133, 74,221,186,117, 37, 78, 78, 78, 82, 79, 79,207,178,233, 85, 68,243,189,183,237,250,
-114,170,253,191, 68, 53,237, 79,141,104,171,152, 54,194,216,216, 24, 26,241,165, 79, 63,181,163, 45, 43,189, 81,214, 28,117, 88,
-198,169, 78,239, 80, 78,167,133,132,132,244, 8, 9, 9,105, 3,224, 9, 74,107, 29, 42,128,210,161, 68, 45,167,249, 64,245,199,
-112,189, 27, 56,255, 95, 57, 63,103,116,197, 95,190, 89, 64,169,175,214,173, 42,133, 86, 77,208, 56,190, 3, 32,231,206,157,155,
- 47, 22,139,173, 70,143, 30, 93,237, 50, 25, 25, 25, 7, 15, 31, 62, 92, 78,100, 13, 30, 60,120,124,104,104,232,181,172,172,172,
- 90,109,149,149,185,209,154, 91,231, 23, 90,117,237,191, 97, 14,128, 31,171, 48,228, 81,158,109,248, 95,239,220, 22,116,166,130,
-216,250, 21,192,224,170, 84,105,175, 47, 7,225,232,161,157, 26,223, 46,163,231,143,211, 46, 13,143, 90, 85,105,180,162,165, 41,
-119,149,186, 31,243, 12, 62, 90,255, 12,216,108,182,223,162, 69,139,216, 34,145,232, 61,145, 85, 81,104, 21, 22, 22,226,233,211,
-167, 24, 55,110, 28, 55, 58, 58,218, 79, 46,151,223,248, 47,236,131,140,140,140,120,117, 50,210,217,154, 20, 14, 92,158, 17,123,
-228,132, 57,206,101, 81,135, 39,118, 65, 42, 17, 3, 0, 83,151,244, 14, 76, 38,147, 29, 29, 29,237,170,177, 90,201,229,114,174,
-102,250,227,199,143, 93, 53,185,181, 36, 18,137,206, 81,135,127, 23,231,179,103,207,156, 53,209,145,154,232, 66, 38,147,201,142,
-140,140,116,214,112, 74,165, 82,157,162, 14, 57, 28, 14, 59, 58, 58,218, 89,165, 82,125,180,168, 67,109, 97,140,210, 58,139,229,
-106, 45,170,125,203, 8,130, 32,104,195,176,161, 1, 6,124,246,168, 24, 41, 89,125, 81,233,154,160,113,124,215, 99, 17,166,139,
-139, 75,175, 17, 35, 70,148, 19, 89,254,254,254,170,211,167, 79,223,228,243,249,153, 36, 73,198,235,219,143, 50, 31, 45,188,247,
- 6, 9,146, 36,159,118,110,219, 20, 36, 73, 62, 93,250,205, 55,210, 53, 56, 80, 78,108,157, 61,115,178,119,106,126, 76,229,210,
- 12,128,141,125, 29, 4,140,255, 22, 1,227,191,181, 2,208, 9,168, 58, 90,177,186,126, 24,240,247,128, 32, 8,142,147,147,211,
-115,137, 68, 2,130, 32, 32,149, 74,203, 4, 86, 81, 81, 17,132, 66, 97,217,127,185, 92,142,236,236,108,212,173, 91, 23, 4, 65,
-252,167,253,232,228,114,185,114,209,202, 77,135, 25, 76,182,146,162,228,132, 92, 46,159,160,207,117,190,104,209, 34, 18,149,248,
- 94,205,156, 57,179,210,233,159,138,115,201,146, 37,149, 70, 9,206,156, 57,179,218,232,193,170,240,221,119,223,125,180,168, 67,
-221,111, 95, 6, 24, 96,192,127, 12,149,134,238,213, 74,104,145, 36,249,180,146,232, 66, 2, 0, 77,146,228,211, 74,178, 28, 40,
-223,189,123,183,210,210,210,114,138, 72, 36,250, 99,240,224,193,115,253,253,253, 85, 64,169,131,124,109,183, 40, 95, 40, 90,225,
- 55, 96,227,188,130, 98,105,112,197,121, 21, 45, 79, 26,177,181,107,123,208,238, 51,161,199,253, 51,210, 83,119, 87,181,109, 85,
- 9,170,170,162, 21,133,133,226,149,126, 3, 54,206,201, 47, 20, 27,124,180,254, 33,168, 84,170, 43, 70, 70, 70,132,166,152,178,
-182,245,170,176,176, 16, 37, 37, 37, 80,151,164, 1, 0, 20, 23, 23,195,194,194, 2, 42,149,138,254,143,237, 10, 41,128,249,106,
-107, 21, 0,204, 79,188,185, 67,251,220,126,166, 61,175, 26,107,150, 64,151, 2,209,149, 45, 87,221,188,191,129, 51,179,154, 2,
-209,213, 33, 83, 79,190, 76, 0, 96,179, 24, 89, 85, 21,143,102,179, 24, 89,213,248,237,235,249,222, 64,208, 0, 86, 26,174,108,
- 3, 12,248,124,223,255, 63,213,138,123, 24, 56, 13,156, 6,206,127,132,147,171,254,232, 58,207,176, 63, 13,156, 6, 78, 3,231,
-191,141,179, 50, 76,254, 76,132, 22, 93,201, 7, 52, 77,227,191, 84, 3,206, 0, 3,254,159, 33,173,229, 60, 3, 12, 48,192, 0,
- 3, 62, 28,239, 21,147,214,158, 81,149, 42,213, 39,154,160, 54,202,246,154,129,211,192,105,224, 52,112, 26, 56, 13,156, 6,206,
-255, 59,206,154,184,181,151,159, 12, 96,223,103, 34,182,222, 19, 89, 52,253,247,123,171, 24,204,170, 6, 78, 3,167,129,211,192,
-105,224, 52,112, 26, 56,107, 11,195,208,161, 1, 6, 24, 96,128, 1, 6, 24, 96,192,255, 57,244, 75, 88,106, 64, 37,168, 59,104,
- 41, 40, 44, 81,239,206, 32,164,156, 13,252,175,109,162,191,191, 63, 67,159,246,137,137,150,100, 20,248,155,205, 77,216, 3,138,
- 69,138,205, 84,212,138,224,154, 78, 68,219, 6,173,198, 24,243,140,167,203,100,178,250,166,102,102, 89,121,185,217,123,242,222,
- 61,219,165,213,198,252,193,131, 7,124, 31, 31,159,116, 0, 69, 90,111, 10, 6, 24, 96,192,199,132,101, 83, 23, 16,196, 4,128,
-254, 43,236,146,162, 99, 32,140, 59, 84,174,157,133,199,120,144, 68, 51,173, 41, 98,208,216,143,130,216,148, 26, 30, 56,150, 9,
- 9, 9,174, 13, 27, 54, 76, 6, 80, 80,113,237,149,204, 51, 92,231, 6,124,206,232,138,242, 9, 75,203,174,133, 15, 23, 90,141,
- 6,215,135,146, 28, 11, 26,163, 64, 32, 26,137,161, 67,106,197,227,246,117, 29, 80,204,118, 0, 90, 1,116, 43, 19, 35, 94, 75,
-177, 76,158, 69,209,244, 24,188, 57,249, 68,111,190,250,254,211, 80,117, 57,139,149, 72, 12,253, 73, 47, 62,138,254,225,209,237,
-211, 92, 75, 99, 2, 13, 91, 15, 94,128,242, 25,156,107, 11, 14, 0, 95,146, 36,155, 25, 27, 27,243, 75, 74, 74,178, 41,138, 74,
- 65,233,248,116,126, 45, 57, 73, 0, 19, 77, 77, 76,250,184,154,113, 90,189,203, 17,166, 21, 41, 84,225, 40, 77,232,154,255,177,
-206,168, 82,145,229,184,111,206, 72,159,113, 65,179,122,192,210,111,227,130, 18,160, 58,161, 69, 56, 55,238,120,118,248,136,161,
-126, 51, 38,143, 51,173, 99,103, 10, 65,142,200,230,167,131, 33,155, 66, 66,142,246,255,102,120,207, 62, 0,176,122,245,234,175,
- 92, 92, 92,234, 49, 24,140,196,101,203,150,253,186, 98,197, 10,154,168,186, 82, 57, 95,125, 14,107,110,248, 38, 0, 60, 1, 52,
- 0,240, 22,192, 11,148,207, 50, 94, 27,124, 22,156,117,234,212,113,162, 40,234, 27, 7, 7,135,126,153,153,153, 23, 72,146, 60,
-144,150,150,150,254, 41,239, 58, 52, 77,239, 37, 8, 98, 50, 77,211,251,244,248,158,162,207, 58,120, 60, 94,166, 68, 34,177, 87,
-255,206,146, 72, 36, 14,127,215,246,252,147,235,250,135,222,191, 39, 93,185,243,162,143,246,164, 94,157,155, 85,114, 71, 33,154,
- 93,185, 19,211,165,124, 59, 79, 85, 21,247, 64,130,166,105,172, 92,185,146, 88,181,106,213,120, 55, 55,183, 70, 36, 73,190, 92,
-190,124,121,185,212, 55, 21,231,105, 93,231, 6,177,101,192,231, 10,253,138, 74,215,136,166,254, 38,144,208,254, 0, 49,174,107,
-219,150,157,167,140, 25, 64,208, 12, 30, 70, 78, 90,168,212,155,203,117, 28, 23, 12,241, 26,239,102,141,231, 14, 29,208,131,108,
-227, 89, 15,124, 59, 11,128,100, 97,239,197, 36,155,224,160,101,187, 1,248,212,162,151, 43,222, 68, 28,179, 23, 20,168, 64, 16,
- 0, 65, 0, 36, 1, 20, 75, 40,244,250,106,236, 10, 0, 63,233,121, 87, 34, 45,141, 9,204, 61, 38, 1, 0,198, 71, 56, 40,245,
-236,236,236,198,207,158, 61,219,196,211,211,211,146,199,227,113, 36, 18,137, 67, 66, 66,130,221,178,101,203, 60,197, 98,241,121,
- 0,143,244,228,172,219,208,217,233,100,240,220,137,237,154, 55,112, 5, 75, 86, 12, 74, 42,114,121,149,240,186,195,212,221,167,
- 38,197,228, 73, 70,160, 22, 37, 19,114,114,114, 8, 0,176,181,181,165,203,139,172,246,227,182,206,235,133,185, 91,174,160, 68,
- 34, 59, 82, 29,135,117,189, 22,163,191,254,122,144,223,218, 31,102,154,166,229,202, 17,157, 40,134,181, 41, 27, 43,230, 79,227,
- 72,165,138, 14,187,127, 13,153,188,115,195,194,253, 42,149,234, 11, 0,109, 84, 42,213, 99, 0,191,174, 92,185,178,170,155,239,
- 42, 0, 75,212, 39,244, 81, 6,131,113,181, 91,183,110,245,191,249,230, 27,162,117,235,214,136,140,140,108,112,236,216,177, 30,
- 23, 46, 92, 72, 84,169, 84,207, 0,188,132,186,236,137, 14, 96, 1,104,204, 96, 48,188,255,205,156,124, 62,223, 72, 38,147,141,
-117,118,118,158,220,177, 99, 71,239, 1, 3, 6, 16,141, 27, 55, 70,124,124,124,235, 75,151, 46,173, 8, 15, 15,127,150,154,154,
-186,143,195,225, 28, 22, 8, 4,226,127,252, 57, 78, 16,147, 1, 56,169,117,242, 74, 29,190,211, 81,154, 75, 74,160,235, 58, 36,
- 18,137,189,198,217,148, 32, 8,251,191,115,123,244, 92, 87, 44, 65, 16,214,234,182,168,238,155, 36, 73, 40,149, 74,145, 74,165,
-114,171,129,179,177,250, 69, 74,103,173, 11,160,186, 68,208, 70, 0,208,171, 83,179, 60, 16,136, 41,179,104,189,255,146, 25, 83,
- 38,192,104, 52,187,114, 55,198,186,156, 21,172,226, 91,236,202,149,196,138, 21, 43, 16, 24, 24, 56, 0,128, 47, 69, 81,225, 30,
- 30, 30, 59,202, 81, 82, 84,217,188, 21, 43, 86,108,175,230, 58, 55,192,128,207, 5,126,208,167,168,116,149,239, 63,110, 67,186,
- 64,133,113,174, 54,246,254,179,190, 25,102,228,233,209, 16, 18,152, 34, 41, 71,133,139, 97,151, 0,224,132,126, 86,167, 97,109,
-152, 76,201,225,160,192,249, 77,124,219,121,226,121,154, 2,143,211, 84, 40, 73, 84,128, 65, 42,160,162,104,128,134,164,182, 91,
-157,154,175,196,157,151, 50,144, 4,192, 32, 1,146, 36,192, 32,107, 73, 70,201, 94,173, 62, 20,229,153,147, 73, 1,148,236,213,
- 7, 30,144,102,238,238,238,163, 87,173, 90,101,153,145,145, 97, 18, 25, 25, 9, 46,151, 11, 43, 43, 43, 6,159,207,119,218,178,
-101,139,120,214,172, 89,253,228,114,121, 18,128, 28, 29, 57, 61,250,182,241,190,183, 47,104,181,133,226,193, 37, 20, 28,255, 13,
- 12,146, 6,219,196, 20,245,141,140,112,233,235,134,214,254, 97,137,167, 31,102,138, 60, 0,164,213, 68, 22, 23, 23,199,144, 74,
-165, 35,204,205,205,219,179, 88, 44, 7,158, 85, 61, 42,157,217, 38, 55,155,104,240, 54,203,190,164,203,188, 30, 14,125, 54,207,
-233,134,185, 91,174, 96,219,177,251,191,180, 66,198,242,234,242,102, 27, 27,155, 78,153, 53,253, 27,211,212, 28, 57,214,156,206,
-193,161,219,133, 24,235,107,134,185, 95, 90, 32, 96,228,112,147, 83,191,133, 78, 1,176, 95,107,145,120, 15, 15, 15, 34, 46, 46,
-174,178,155,175, 21,128,133, 50,153,140,100,179,217, 4,143,199, 27,189,118,237, 90,249,200,145, 35, 83, 53, 13,124,125,125,225,
-235,235, 75, 20, 21, 21, 53,184,113,227, 70,131,144,144, 16,101, 68, 68, 68, 44,128,179, 85, 91, 44,140,222, 73, 36, 98, 23,158,
-145, 81,201, 79,187,119,111,238,210,165, 11,197,229,254,149,126,170, 54,156, 0, 96, 97, 97,177,223,222,222,158, 88,188,120,113,
-250,199,226,172, 87,175,222,149,118,237,218,117,235,213,171, 23,179, 83,167, 78,112,114,114, 42,155,103,107,107, 11, 95, 95, 95,
- 34, 37, 37,165,121,120,120,248,238, 43, 87,174,236,120,242,228,201,141,164,164,164, 94,255,176, 69,107,159, 90, 76, 8,244,108,
-255,217,131, 32, 8,211,189,123,247,218,107,106, 50, 42, 20, 10,168, 84,170,178,111,205,135,162, 40,168, 84, 42,172, 93,187, 86,
- 37, 18,137,116,217, 71, 34,173,183,102,205,135,170,236,155,195,225,216,106, 18,246,214,112,103,143,225,115, 11,154,154,152,152,
-184, 2,232, 11,187, 70, 11,203, 55, 40,125,127, 22,137, 68,201, 2,169,101, 12,128, 46,213,176, 89,174, 90,181,106,108, 96, 96,
-224, 32, 45, 43,173,247,208,161, 67, 43,150,189,242, 86,127,139, 8,130,184, 73,146,228,121, 0,135,240, 17,173,238, 6,252,183,
- 64,211,116, 91, 0,118, 90,147,100, 40, 29, 21,130,250, 57, 73, 0,176,169, 48, 93,187,157,230, 59, 91, 61,221, 78,189, 28,173,
-197,155, 77, 16,196,163, 90,118,241, 22,170,240,211, 98, 2, 64, 88, 88, 24,221,191,127,127, 66,243, 93,185, 40,242,191, 56,113,
-228,192, 62,253,186,119, 4,201,179,194,171, 44, 32,226, 29, 13, 38,169, 0, 9, 26, 15,238,222,160,193,164, 14, 87, 88,170,106,
-235, 73,189, 33,223,121,123,122,108, 60, 16, 52,155, 17,155,197,196,161,240, 18,200, 37,197,200,206,120,135,172,244,100, 8, 82,
-223, 34,237,221,219,103, 0,177, 66,103,206,247, 14, 12,160,162,212,239,128, 20, 42,179,232,233,206, 41, 23,197, 53,104,236,233,
-153,207, 81, 1,114, 81,156, 14,171,175,138,211,171, 81,163, 70, 35,127,248,225, 7,235, 23, 47, 94, 24,149,148,148, 72, 47, 93,
-186, 20,159,148,148,100,206,231,243,243,166, 77,155,214,200,201,201,201,124,240,224,193,156,227,199,143,127,133,242, 97,173, 85,
-113,122, 14,108,223, 50,226,224,142,173, 38,185,167,130, 33, 75,120,138,139, 2, 17,238,102,150,208, 13, 44,184,196,183,205,237,
- 96,202,101, 98,117, 39, 39,211,190,103, 18, 54, 42, 40, 42,160, 58,206,123,247,238,241,141,141,141,183,140, 26, 53,138, 63,115,
-230, 76,174,138,105,201, 12,141,200,181, 88,184, 59,194,169, 68, 42,103,140,236, 86, 15,243, 70,121, 99,222,182,235, 26,145, 53,
-185,126,253, 2, 42, 42,170,106, 78,133, 92, 94,223,217,222, 28,209, 73, 98, 28,186, 93,136, 63,127,112, 66,247,181,233, 24,220,
-138, 9,143,186,166, 80,202, 21,141,135, 14, 29,122, 88,253,214,254, 8,192, 87, 67,135, 14,109,194, 96, 48,174, 3,248,189,166,
- 99,196,227, 85, 94, 61,197,202,202, 10, 93,187,118,133,135,135, 7,179, 75,151, 46,222, 21, 4, 76, 57, 78,185, 92,198,167, 40,
- 26,102,102,102, 70, 54, 54, 54, 86,102,102,102,185,149, 61,168,244,225, 4, 0,107,107,235, 33, 93,187,118,101, 30, 59,118, 44,
- 39, 49, 49,241,193,200,145, 35,223,154,155,155,151,179,254,154,152,152,160, 81,163, 70, 88,182,108, 25,179, 79,159, 62, 53,114,
- 58, 56, 56,244, 12, 9, 9, 1, 65, 16,101, 15,237,247,140,197,174,174,112,116,116, 68,223,190,125,153, 67,134, 12,233,153,148,
-148, 84,171,235, 72, 15, 92,171,196,162,181,178,194,113,170,114,248,173,178,246, 58, 28,247, 44,141,117, 73,205,135, 15,184, 54,
-171, 29,238,228,241,120,101, 86,168, 74,214,245, 30, 39, 73,146, 88,186,116, 41, 8,130, 0,139,197, 2,155,205,174,244,219,207,
-207, 79,223,126,166, 16, 4, 65,178,217,236,133, 76, 38,243, 27,169, 84,234,204,227,241,210, 85, 42,213, 47, 82,169,116, 45, 0,
- 5, 77,211,150, 85,136,172, 74,105,239,132, 46, 0, 0, 32, 0, 73, 68, 65, 84, 57, 77, 76, 76, 92, 95,189,122,229, 94, 85, 71,
-164, 82, 41,188,189,189, 1, 41, 98,171,227, 76, 72, 72,112,117,115,115,107, 12, 64, 83,162,237, 54, 77,211, 93,180,254,107,227,
- 54, 77,211, 95,170,127,191,124,243,230,141,107,195,134, 13,243,255,169,243,211,192,249,239,227,172, 65,139,216, 17, 4, 17,166,
-117,173,246,215,252, 95,180,104,209,146,245,235,215,191, 32, 8, 34, 76,123,186,118, 59,237,111,245,253, 38,140,166,233,254,139,
- 23, 47,246,220,176, 97,195, 58, 77,219,191, 67, 36,234, 99,209, 50,207,150,152, 32,252,157, 57,152, 12, 21,152, 36, 1, 38, 3,
- 0, 77, 32, 57, 41, 1, 69,133, 5,119,144,120, 58, 81, 55, 75,150,127,167, 22, 45,188,130,142,110, 91, 64,254, 28, 94,130, 2,
-145, 4,113, 79,110,226,209,205,223, 51, 84, 74,213,239, 32,232,199, 0, 25,137,183, 84, 60, 16, 90,187, 26, 23, 4,205, 44, 21,
- 90,106,113, 85, 78,108,125, 50, 52,111,210,164,201,240,101,203,150,217, 70, 69, 69,241,132, 66, 97,209,209,163, 71,211,165, 82,
-105, 18,128,203,201,201,201, 77,182,111,223,206, 9, 10, 10,242,242,242,242,226,159, 60,121, 82, 86, 73, 57,163,247, 56,231,143,
- 11,136,248,102,214, 28, 94,236,201, 93,224,196, 70, 98,233,211, 28,213,159,130,146, 31, 0,108, 67, 74,113,167,108,137,242,234,
-214,174, 46,100, 61, 51, 54, 26, 90,114,252,226,242, 36,213, 90,178,140,141,141,183,132,132,132,184,182,109,219,150, 4,128,240,
-151, 74,238,194,221, 17, 78,151,215,119, 34, 58, 53,179, 65, 86,129, 20,179,119, 69,227, 82, 68,214, 31, 26,145, 85, 83, 39,205,
-204,204,178, 83,179, 10, 29,108, 76,121, 24,211,217, 20,221,215,166,195,191, 13, 23, 92, 54,129,248,196, 12, 52,116,171, 71, 68,
-223, 57,219, 70, 45,178,218, 10, 4, 2, 0,104, 3, 32, 49, 37, 37,133,239,227,227, 35,212,162,203, 7,176,145,195,225, 44, 37,
- 8,130,110,219,182,109,180,151,151, 87,177,149,149, 21,196, 98, 49,164, 82, 41,216,108, 54,196, 98, 49,146,147,147,241,224,193,
- 3, 88, 89, 89,233,117,160,138,139,139, 97,102,102, 6,138,162, 62,152, 83,165, 82, 17,123,246,236, 49,121,241,226,133, 73,104,
-104,168,195,220,185,115,115,155, 54,109,250,120,248,240,225,175,237,237,237,165, 79,159, 62,197,189,123,247,144,159,159,143,246,
-237,219,235,196, 41,147,201,192,100, 50, 33, 22,139,193,229,114,193,100, 50,161, 84, 42, 65, 81, 84,153,248, 42, 46, 46, 70, 94,
- 94, 30,216,108, 54,100, 50,217,167,120, 3,125,207, 66, 85,221,240, 91,109, 44, 90,218, 66, 77, 71,145, 85,147, 37,170,202,225,
-206,130,130, 2, 35, 75, 75,203,133, 0, 4, 53,173,139, 32, 8, 48, 24, 12,176,217,108, 16, 4,129, 46, 93,186, 96,226,196,137,
-104,213,170, 21, 18, 18, 18,112,252,248,113, 60,122,244, 8, 44, 22,171,172,189,206,227, 19,126,126, 12, 30,143,119,111,224,192,
-129,158, 63,252,240, 3,175, 94,189,122,136,141,141,173,187, 97,195,134,133,215,174, 93, 27, 36, 18,137,218,104,238,118,213, 91,
-233,213, 67,130,165,195,133,125,165, 82, 41, 98, 99, 99,245, 89,230, 61, 52,108,216, 48,153, 36,201,215, 20, 69,133, 3,240,166,
-105,186, 11, 65, 16,151, 80,234,151,168, 13, 17, 77,211, 95, 18, 4, 81, 8,224, 25, 73,146, 47, 41,138, 74, 54,216,109, 12,208,
-225,190,210,191,226,127,130, 32,194,214,175, 95,223,191, 50,113, 85,201,181, 89,110,250,134, 13, 27,214,105,253,255, 16,139,106,
- 87,148,119,134,247, 83, 91,185,254, 18, 90, 97, 97, 97,213, 43, 16, 10,131,195, 78, 31,187,223, 93, 14, 87,207,214,190, 90,214,
- 33, 26,145, 15,238, 1,160,127,209,169, 43,252,254, 70, 36,131,249,203,158,117, 51,201,189, 55, 75,144,146,158,133,123, 23,127,
- 65,182, 32,233, 16, 64,207, 69, 98,104,225, 7, 31,137,122,131,189,236,109,108, 45, 37,114, 26, 20, 13,224, 61,177,245, 73,208,
-170,113,227,198, 67, 34, 34, 34,108, 37, 18, 9,239,206,157, 59, 37, 33, 33, 33, 25,114,185,252, 38,128,187,234, 54, 81,217,217,
-217, 67,213,194,132,193,100, 50, 57,114,185,188, 58,223,133, 86,243,191, 25,123,103,227,158,131,188,215,207,163,177, 61,244, 34,
- 10, 74, 74, 84, 55,179,196, 95, 1,208, 40,250,235, 81, 57,226, 52, 26,180, 11,139, 36,192, 55, 97, 57,198,229, 73,120, 64,229,
- 67,178, 82,169,116,228,168, 81,163,248, 26,145, 5, 0, 57, 69, 10,102,137, 84,193,232,212,204, 6,173,187, 13, 69,228,141, 83,
- 56,121, 59, 13,110,118,198,183,235,155, 20,232,180, 71,179,179, 4,123,182, 6,239,221,186,113,229,124,206,188,190, 22,240,111,
-195, 2,143, 77,192,220,152,133,181, 59,246, 43,162, 30,220,126,202,231,243,195, 0,124, 37, 16, 8,192,231,243,139, 1,188,100,
- 48, 24,137, 42,149,170, 50,167,238,229, 0, 28, 14, 31, 62, 76, 42, 20,138,226,132,132, 4, 56, 58, 58,194,193,193, 1, 22, 22,
- 22,136,139,139,195,159,127,254,137,248,248,120, 80, 20,133, 22, 45, 90,232,117,176,114,115,115,241,244,233, 83,244,237,219,111,
-110,118,118,150,185,149,181,141,232, 78,248,237, 77,181,225,164, 40,138, 0, 0, 79, 79, 79,120,122,122,242,210,210,210,156,195,
-194,194,236,215,172, 89,243,206,213,213,245,168, 88, 44, 46,103, 57,208, 85,104,105,196,133, 70, 4,242,120, 60,176,217,108, 20,
- 22, 22, 34, 51, 51, 19, 69, 69,165, 65,155,150,150,150,159, 68,104, 85, 97,161,250,104,237,255,102,113,248,222,112,167,165,165,
-229, 40, 0, 11,117,220, 22, 40,149, 74,176,217,108,248,248,248, 32, 56, 56, 24,143, 30, 61,194,239,191,255,142,186,117,235, 98,
-220,184,113, 32, 73, 18, 47, 94,188,208,183,139, 84, 68, 68,196,194,175,190,250,202,243,240,225,195,188,228,228,100,196,199,199,
-195,210,210, 18,193,193,193,220,201,147, 39, 55,188,113,227,198,114,148, 6,191, 84, 15,173,232, 66,145, 17,127,152,183,183,247,
-123, 77, 28, 29, 29, 45, 46, 95,190,108, 95, 38,192, 42, 70, 36,190,143,130,229,203,151,111,245,240,240,216,166, 30, 46,244, 5,
- 96, 66,211,180, 95,104,104, 40, 1, 0,254,254,254, 52, 65, 16,154, 7,210,179, 83,167, 78,117,139,139,139,163, 3, 3, 3, 13,
- 62, 90, 6, 84,165, 69, 38,107,174,201,170, 4,148, 62, 66, 77,219,226,165,193,226,197,139, 61,215,175, 95,255,240, 3, 69,150,
-246, 27, 19,173, 17, 91,101, 15,211, 42,135, 12,203,108, 95, 36,223,209,222,198,122,209,184, 78,160, 40, 64,169, 2,148, 42, 26,
-162, 18, 49, 98,159, 63, 42, 1,143, 8,213,169, 59, 92, 78,208,154, 31,230, 52,136, 78, 37,145,158, 47,199,173,179,123,233,108,
- 65,210, 16, 36,158,154,240,113, 68,214, 48,111, 71, 7,251, 91,199,246,174, 38, 31,189,149, 65, 69,149,234, 44,138,162,203,126,
-127, 2, 56,218,217,217, 5,220,191,127,223,142,203,229,242, 94,189,122, 69,157, 58,117, 42, 95, 46,151, 95,211, 18, 89, 0,208,
-169, 77,155, 54, 74, 83, 83, 83,136, 68, 34,185, 92, 46,151, 84, 35,178,156,253, 90, 53,191,189,113,207, 65,158, 68, 38,131, 80,
- 44, 5,195,198,190,162,200, 2,128,142,221,220,235,212, 33,120,102,160, 1, 36, 21,202,211,171, 18, 89, 0,192,229,114,123,204,
-156, 57,179, 92, 93, 60, 91, 51,150,210,152,203, 82,221,141,201,161, 34,111,156, 66,248,139, 28,138,199,102,168,236,232,183, 13,
-116,221, 1, 5,169, 49,123,126, 63, 23,118,245,187,101, 65,197, 37,162, 34,184, 57, 25,161,184, 72,136,181,235, 55, 42, 34, 34,
-194,111, 46,156, 59,181,195,169, 83,167, 54,160,212, 25, 28, 0, 94,158, 58,117,106,236,178,101,203,126,197, 95,105, 30, 42, 34,
- 61, 32, 32, 32,181, 89,179,102, 66, 15, 15, 15, 97,110,110, 46, 98, 98, 98,144,159,159,143,237,219,183, 35, 54, 54, 22, 26,139,
-160, 78,190, 42,239, 11, 36,228,231,231,153,210, 52,141,252,188, 92,147, 31,126,248,193,162, 54,156, 42,149,170,220,181, 85,167,
- 78, 29, 76,155, 54,141, 93, 82, 82, 98,249,238,221, 59,115,237,121,186,114,202,100,178,178,140,195, 52, 77, 67, 38,147, 65, 40,
- 20, 66, 38,147,225,245,235,215,101, 34, 75,189,254, 79,102,209,210,252,230,241,120,153,154,115, 89, 51, 4,199,227,241,178,170,
-106,255, 33,208, 90, 23,173,254,173,175, 56,172,113,123,116, 60,238, 96,179,217,152, 56,113, 34, 30, 62,124,136,132,132, 4, 48,
- 24, 12,136, 68, 34,148,148,148,160,103,207,158,224,112, 56,250, 90,180,104, 54,155, 61,106,201,146, 37,188,196,196, 68,228,228,
-228,104,156,233,161, 82,169, 48,119,238, 92, 35, 46,151, 59, 74, 95,211,189, 64, 32,232,253,250,245,235,198, 21, 63, 25, 25, 25,
- 66,109,159,194,218, 34, 52, 52,148,240,247,247,167,253,253,253,105,141,224, 50,192,128,202, 80,133, 22,217, 87,149, 69,235, 99,
- 88,197, 52,150, 45,168, 3, 68,106, 1,141,200,234,170, 37,188, 8,141,133, 75,183,161, 67,183, 97, 45, 29,108,172,111, 28,222,
-181,202, 52,236, 57,129,212,148, 36,100, 11,146,209,166,131, 31, 98,159, 71,131, 82,168, 78,227,117,104,205,158,156,245,252,221,
- 61, 60,154, 78,239,218,193, 11, 65, 97,197,120, 21,121, 25, 5,217,130,157, 72, 58,117,250,163, 28, 33, 87,255,230, 14,246,214,
- 55,126,221,181,202,242, 82, 12,137,148,148, 36,156,253,117, 43,173,144, 75, 11, 80, 62,146, 75,239,183,102, 35, 74,198, 41, 46,
-200,132,172, 72, 5, 30, 89,194,211,115,144, 34, 3, 64,248,214,173, 91,187,183,111,223,158, 19, 16, 16,144,145,159,159,127, 22,
-192,125,173, 54,205,220,221,221,251, 6, 7, 7, 59,164,164,164,224,218,181,107, 25, 40, 13,253,175, 10,169,183,163,159,239,254,
-243,215,253,243,141, 26, 52,193,246, 37,223, 41, 67, 31,197, 12, 4,112, 73,171,141, 71, 15,111,247,176, 53,223,207, 32,169,168,
- 63,240, 52, 57, 19,111,133,210, 63,171, 34,204,201,201, 33, 74, 74, 74, 92, 45, 45, 45,181, 79, 72,240, 77, 68,210, 5,195,220,
-211,123, 46,188,227, 36,145,171,192,101,145,244,236, 65,174,233, 15,207,134,218,228, 72,114, 8, 77, 52, 98, 77,152, 52,188,199,
-160, 93, 33,103,198,132,133, 93,152, 46,151, 74,188,154, 52,105, 76, 63,142,184,241,116,225,220,169,125,106,121,196, 77, 31, 62,
-124, 72, 50, 24,140,114, 2, 93,219, 66,164,175,165, 72, 31,232,202, 89, 81,104,105,160, 84, 42,137,218,114, 74,165,210, 74, 75,
- 59, 84,230,171, 69, 81,212,223,178,253,250, 88,168,180,135, 12, 53,254,116, 18,137,196, 94,237,179,229,240, 49, 45, 90, 31, 18,
-137, 88,221,240,165, 62,253, 35, 73, 18, 20, 69,129,205,102,163, 69,139, 22, 8, 11, 11,131,181,181, 53,204,205,205, 97,110,110,
- 14, 35, 35, 35,216,216,216,148, 9, 45,146,212, 57, 74,135,150, 74,165,117,235,214,173,139,215,175, 95,131,199,227,149,125,184,
- 92, 46, 60, 61, 61, 33, 18,137,234,224, 83,218,238, 13, 48,224,239,189,175,132,105,139, 37,130, 32,194, 22, 45, 90,180,164,182,
-124,139, 22, 45, 90, 82,153,133,235, 3, 5, 87, 57,235, 22, 83, 91, 65, 86,170, 36,213, 34,235,208,206,149,230,103,158, 0,169,
-169,137,184,122,114, 71,145, 66, 46,203,167, 40,133,235,219,248,104,128,196, 47, 58,117,129,164,219, 13,234,219,141,184,250, 66,
-134,194,130,108,188,124,124, 57, 9, 98,206,226,143, 38,178, 28,108,111, 28,222,181,210,242,252,115, 2, 41, 41, 73,184,116,108,
-123,161, 66, 46,239,129,196,208,199, 31, 66, 61,138,205, 30,196,118,121,215,255, 27,223,116,168, 8, 21, 70,197,198,125,153,149,
-129, 65,130, 59,213, 71,134,105, 35, 59, 59,251,236,214,173, 91,137, 31,127,252,177,171, 68, 34,249, 13,128,182,137,210,203,205,
-205,109,196,190,125,251,172, 83, 82, 82, 88,119,238,220, 17,221,184,113,131, 6,112,190, 6,139,203,130,158, 19,166, 49, 90,213,
-171, 51, 51, 42, 41,109, 32,128, 63,180,102,123,246,111,221,236,238,193,245,203,205, 20,119, 67, 81, 44, 72,193,226,187,169,133,
- 0,116,222,223, 10,133, 2, 66,161, 16,138,226, 92,101, 27,190, 72, 24, 56,212, 94,154,153, 47, 97,178,168, 18,165,135,121,150,
-244, 70,238, 91,134,177,177,177, 94,251,114,215,250,249, 33, 0, 66,134, 14, 29,122,248, 89,196,133, 54,124, 62,255,130,135,135,
- 7, 1, 0, 85, 68, 24, 86,133, 85, 0,230,118,236,216,145,240,241,241,121,176,109,219,182, 43,213,137,149,218, 88,180,106,130,
-174,156, 20, 69,145, 85,236, 95,162,182,156,218, 22,173,154,132,214,167,180,104, 85, 38, 90,180, 69,162,182, 16,250, 55, 68, 29,
- 86, 39,166,244,233,159,198, 79,142,205,102, 35, 58, 58, 26, 46, 46, 46,144,203,229, 48, 51, 51,131,153,153, 25, 76, 77, 77, 81,
- 84, 84, 4, 22,139, 5, 61,183,153,226,241,120,239, 98, 98, 98, 26,219,217,217, 65,165, 82,149, 19, 91,175, 94,189,130,137,137,
- 73,154,190, 22, 45, 62,159,127, 89, 29,117, 88, 14,142,142,142, 22, 31, 99,191,106, 91,178,252,253,253, 13, 67,132, 6, 84,107,
-205,170,194,170,149, 93,193, 18, 37,211,250,159,141,210, 28,110,253,213,191, 81,201,111, 89, 37,211,114,215,175, 95,127, 67,203,
-191, 43,251, 3, 55, 65,147,226,161, 92,132, 11,179, 38, 75,150,189,181,213,141, 3,219, 3,205, 79, 70, 2,105, 41,137,184,117,
- 58, 88,168, 84,201,191, 0, 69, 11, 34,174,157, 14, 5,129, 18,188, 13,189,165,219, 45, 2,173, 90, 53,117,197,239, 47, 20,200,
- 78,125, 5,154,166, 14, 33, 43,164,228,131,143,142,219,224, 22,246,214,182, 55, 14, 5, 7, 90,156,137, 38,144,154,146,136,171,
- 39,131, 11,149,138,146,238, 72, 60, 29, 89, 91,218,137,128, 21,195,132,183,123,136, 95,171, 97,174,110,206,160,104, 5, 40, 54,
-141,193, 11,108,153, 47,163, 74,126, 15,231, 9, 79, 82,197,212,244,180,251,186, 57,208, 21, 23, 23,255, 14,224, 49,202,167, 87,
-104,222,168, 81,163, 97,187,119,239,182, 75, 77, 77,229, 69, 69, 69,137,247,238,221,155, 69, 81,212, 25, 0,186, 12,165,126, 23,
-149,148,118, 0,229,243,229, 52,159, 63, 33, 32, 34, 96,252, 55,188,196,107, 33,176, 74,140,197,247,119,211, 85, 47,243,101, 35,
-213,214,181, 74, 97,107,107, 75,231,228,228, 36, 23, 20, 20, 52, 54, 49, 49, 65,110,110, 46,242,242,242, 32, 20, 10, 33, 45,204,
- 83,218,168, 10, 68,132, 50, 15, 44, 22, 11, 89, 41, 10,168, 84,170, 12, 93,173, 89, 0,172, 86,173, 90, 53,137,162, 40, 77, 70,
-196,114,209,133, 90,237, 52,231, 67,227,161, 67,135, 30,214,138, 58,212,118,134,215,164,119, 32,212,233, 29,218,255,241,199, 31,
-113,125,250,244, 73,173, 76,172,112,185, 92,189, 29,165,171,138, 98,172, 13,103, 85, 22,173,138,211,245,225,212, 12, 95,106,156,
-224, 43, 78,215,128,193, 96,128,162, 40,232, 16, 84,241,183,138, 22,237,232,192,218,136,156, 10,199,166,218,196,161,181,140, 68,
-252,168, 22, 45,205,177, 96,179,217, 56,119,238, 28,198,143, 31, 15,149, 74, 5, 99, 99, 99,152,154,154,194,196,196, 4,167, 79,
-159,134, 38,253,131, 62,250, 85,161, 80, 28, 89,191,126,253,146, 61,123,246, 24,209, 52, 13, 14,135, 83, 38,180, 2, 3, 3,197,
-114,185,252,136, 78, 66, 75,147,241,157,162, 99, 76, 76,148,213, 70, 29, 86,182, 76, 21,254, 90,150,171, 86,173, 26, 75, 81,212,
- 32, 84, 72,225, 80,161, 93,185,212, 15,134,244, 14, 6,232,112, 63,121,244, 47,238,158, 70, 96, 17, 90,150,172, 50,193, 69, 86,
- 39, 94,236,172, 44,111,236,223, 30,104,126,244, 17,129,196,183,111,113,243,183, 29,165, 34,235,205,201, 39, 72, 14,205, 68, 98,
-104,103,188, 13,237,173,243,219, 19, 65,180,114,178,183, 68,158,136, 66, 97,206, 59,128, 70,212,199, 16, 89,118, 86,118, 55,126,
- 14, 14,180, 56,245,132, 68, 98, 98, 34,174,158,220, 33, 84, 42, 37, 95,124,136,200, 26,197,102, 15,106,228,238,156,176,116,210,
-160, 97, 62, 13, 29, 97,243, 46, 14,231,199, 13,195,234,227, 95,195,204,142,129,118,125,205, 48,113,173,227, 48,190, 39,247, 53,
-191, 51, 6,233, 65,173, 45,178, 90,213,175, 95,127,216,253,251,247,109,189,189,189,121,241,241,241,146,189,123,247,102,137,197,
-226, 43, 0,162,245,224,212, 22, 89,173, 22, 77, 30, 23,177,113,255, 97, 30,201,230, 32,232,200,121,204,186,157,170,186,144, 92,
- 56, 20,229,135, 21, 43,133, 84, 42,189, 22, 28, 28, 44, 37, 73, 18,121,121,121,200,201,201, 65, 86, 86, 86,217,119, 65, 65, 1,
- 24, 12, 6,174, 95,191, 46, 43, 44, 44,188,175,107, 7,239,221,187, 87, 63, 45, 45,205, 67, 32, 16,180, 81,127,226, 81, 26, 93,
-104,170, 53,173,141, 64, 32,232, 10,224,145,102,122,106,106,106,189, 7, 15, 30,240,107,226, 55, 51, 51, 3,155,205, 46,103,209,
-226,114,185,112,112,112,128, 82,169,196,137, 19, 39, 0, 32,175, 58, 14, 54,155, 35, 32, 73, 2, 20, 77, 73,121, 60, 30,197,231,
-243, 43, 21, 88,250,112,170,145,250,229,151, 95, 74, 34, 35, 35, 43,181,104,213,134,147,166,233,146, 94,189,122, 33, 61, 61, 29,
- 60, 30,175,236, 97,173, 17, 84, 36, 73,130,203,229, 34, 35, 35, 3, 83,166, 76, 1, 77,211, 37,255,244,157, 71,219,167, 73, 45,
-134, 8, 0,132, 90, 8,189,231,167,165,171, 15,148,102,104,144,166,105,104, 4, 87,133,249,101,235,210, 37,123,123, 5,159,174,
-201, 5, 5, 5, 27, 75,187, 67,239,173,240,189, 79,143,135, 66,153,208,138,141,141,197,225,195,135, 81, 80, 80, 0, 14,135,131,
-252,252,124, 28, 60,120, 16, 49, 49, 49,224,112, 56,208,236, 11, 93,245,155,143,143,207,198,240,240,240,152,145, 35, 71,138,163,
-163,163, 33, 22,139, 17, 29, 29,141,222,189,123, 75,238,222,189,155, 32, 22,139, 87, 65,151,161, 67, 77,198,119,117,121, 29,169,
- 84,138,168,168,168, 74, 63, 85, 45, 83, 17, 9, 9, 9,174, 42,149,170, 49, 77,211,190, 52, 77,155, 67,157,194, 65,253, 95,251,
-243,165,122,158, 57, 77,211,190, 42,149,170, 81, 66, 66,130,171, 65, 78, 24,240,153,226,150,150,216,162,181, 68,214,173,234, 45,
- 90, 20, 25,124, 96,199, 74,243, 35, 15, 73,164, 36, 39,224,241,197,221, 66, 21,165,248, 66,207,114, 56, 61,160,149,107,131,103,
-100,226, 69, 17,165,225,204,133, 57, 41, 0,205,168,141,208, 42,199, 9,138, 12, 62,184, 35,208,226,216, 99, 2,233, 41,111,112,
-247,236, 46,161, 82, 41,237,142,183,161, 81,181,225, 28,197,102, 47, 99, 49,136,165,189, 58,181,100,119,110,233, 14,147,172, 36,
-100,164,166,227, 68,108,118, 94, 66,190,244,155,187,132, 28,201,111,164, 7,250, 78,178,182,182,114,100,161,255, 84, 27,235,251,
-231, 11,127, 39, 88, 34, 57, 45,167,215, 11,238,150,149,165, 40,223,207,247,225,104,102,102, 54,242,241,227,199,230, 60, 30,207,
-232,241,227,199,212,222,189,123,115,197, 98,241, 69, 0, 17, 58,109,251,251,112,110,235,238,118,107,221,174,253,188, 98, 81, 9,
- 68, 50, 57,184, 14,124,213,153,136,231, 67, 80,117, 2,204,114,156, 92, 46,247,216,177, 99,199,250,118,233,210,197,213,203,203,
-139,204,203,203, 67,113,113,113,153,115,181,157,157, 29, 98, 99, 99,169,196,196,196,116, 46,151,123, 92,215,126,118,236,216, 49,
-145, 36,201,120,245, 48, 90, 60, 42, 68, 23,106, 53,109, 44, 16, 8,218,242,249,252, 91, 0,140,181,162, 14,181, 57, 53,233, 29,
-150, 0, 32, 9,130,120, 20, 29, 29, 93,220,167, 79, 31, 24, 25, 25, 65, 36, 18,161,110,221,186, 80, 42,149,184,120,241, 34, 34,
- 35, 35, 69, 20, 69,221,170, 68,188,150,235,167, 68, 34,174, 11,128, 20,151,148,180, 24, 59,118,108,215,121,243,230,149, 11, 73,
-183,183,183,135,181,181,181, 94,156, 0,144,151,151,215,244,143, 63,254,152, 19, 29, 29,253, 93,223,190,125, 45,150, 44, 89,194,
-173, 95,191, 62, 84, 42, 21, 89, 91,206,252,252,124,139,168,168,168, 77,157, 59,119,158,209,167, 79, 31,230,186,117,235, 96, 97,
- 97, 1,149, 74, 5, 35, 35, 35, 20, 22, 22, 98,213,170, 85,184,115,231,142,146,166,233, 93, 66,161,240,123, 61,207, 37,124,232,
-181, 89,149, 5,168,170,148, 12, 85,180,255,219,251, 89,193,167, 11,234, 20, 14, 11,171,200, 96, 15, 93,207,121,141,208, 98, 48,
- 24, 72, 74, 74,194,222,189,123,223,203,163,165, 73,255, 80, 5,119,101,219, 78,223,188,121, 83, 69, 16, 68,135,199,143, 31, 47,
- 28, 51,102,204, 55, 34,145,200,217,196,196, 36, 93,161, 80,252, 34, 22,139,215,162,212, 31,149,173,207, 61, 68, 36, 18, 37, 87,
- 22,117, 88,177, 13, 96, 89, 45,103,133,244, 14,229, 82, 56, 84, 88,166, 92,234,135, 74,210, 59,252,237,199,221,192,249,175,228,
-252,220,197, 86,213, 9, 75,223, 67,171,201, 44,150, 88,225, 29,158, 64,124,136,200,122,223, 90, 34, 41, 73, 88,126,236, 93, 75,
-153, 84, 2,145, 48,243, 37,146, 78,100,125,208,102,169,251,121, 59,129, 64, 82,226, 27, 60, 12,219, 85,218,207,183,161,181,238,
- 39, 1, 44,254,233, 82, 40,155,176,176,198,211, 57,227,145, 94, 32,194,165,183,249, 39,233, 18,233,244, 35, 64, 62,238, 0,164,
- 82, 26,126,240,135,140,221,190,131, 45,134,217,214, 97, 97,203,252, 95,192, 91,100,195,110,215,189,139, 62, 53, 16, 51,120, 60,
- 94,248,246,237,219,123,248,250,250,114,135, 14, 29, 90,153,131,188,190, 72,125,244,234,205, 79, 23,246,108,158,111,227,221, 30,
- 59,151, 45, 80, 29,139,120, 94, 49, 10,177, 90,120,120,120,168,238,221,187, 55,111,202,148, 41, 91,122,244,232,225, 52,112,224,
- 64, 78,221,186,117,193,229,114,241,230,205, 27,132,135,135,203,222,190,125,155, 94, 82, 82, 50,175,121,243,230,250,228, 56,203,
- 95,190,124,249, 70,245, 58, 8,245,112, 97, 27,168,163, 11, 53,141,212, 73, 75,219, 0, 48, 14, 12, 12, 28, 3, 0, 85,132,125,
- 47, 7,176, 7, 0,147,166,233,140,144,144,144, 14,103,207,158,237, 48,119,238, 92,118,223,190,125,113,255,254,125, 92,189,122,
- 85, 46,151,203, 35,212,194, 85,215, 82, 57, 20,128, 40,165, 82,249, 60, 40, 40,168, 3,131,193, 88,174,153, 17, 19, 19,131, 67,
-135, 14,213,134, 83, 9, 96, 83,102,102,230, 79, 33, 33, 33,203,175, 93,187, 54, 97,236,216,177,230, 10,133, 2,177,177,177,248,
-249,231,159,107,197, 41, 20, 10,231,216,218,218, 46,189,120,241,226, 47, 87,174, 92,249,106,244,232,209,228,172, 89,179, 16, 28,
- 28,140,223,126,251,141, 82,169, 84,103, 89, 44,214,216,156,156, 28,209,167,184,235,168,135,225,210,245,172,117, 88, 35,239,135,
- 12, 13,234, 8,193,135, 18,104,182,195,207,207,175,204,202,168,177,194,105,183, 33, 8, 66,239,161, 67, 0,150, 52, 77, 83, 0,
-118,161,180,190,168,118, 86,120, 6,254,202, 28,175, 43, 99, 51,129,212, 50, 6, 82,196, 86, 95, 84,218, 18,160,209,172, 6,182,
-130,229,203,151,111, 93,177, 98,197,214,138, 41, 28,180, 27, 85, 76,253,176,114,229, 74, 24,210, 59, 24,240, 95, 69,229, 66, 43,
-106,159, 66,209, 96,200,146,237,235, 22,172, 80, 42,100, 66, 26,114,127,188, 57, 29,253,161, 43,163, 41,122,209,245,163,129,193,
-160,145, 79,171,148, 11, 63,184,247,127, 83, 63, 9, 11,107, 20,173,154,134,223, 94,164,211, 25, 34,197,215, 71,228,242,114,214,
-160, 82,159, 44,106,248, 13, 73,254, 9, 43, 39,214,153, 57, 95,216, 16, 23,242,198,232,189,158,172,172,172,115, 91,183,110, 37,
- 55,111,222,220,181,164,164,164,162,131,124,109,177, 96,192,204, 69,140,118,141, 92,103, 62,124,157, 60, 8, 58, 12, 23, 86, 68,
-199,142, 29, 5,113,113,113, 1, 87,174, 92, 25,121,251,246,237, 30, 34,145,200,149, 32, 8, 24, 27, 27, 39, 75,165,210,107, 92,
- 46,247,152,158, 34, 11, 0,176, 98,197, 10,122,229,202,149, 68, 92, 92, 28,205, 96, 48,254, 4,144,200, 96, 48,146,180,157,224,
-181,167,107,150, 9, 12, 12,212,229,129,120,187,184,184, 56,114,213,170, 85, 93, 86,173, 90,213, 66,109, 21,186,141,191,124,190,
-244,133, 2,192,109, 54,155,147, 78, 16,132, 51,155,195, 21,221,187,119,239,218, 7,114,150,200,229,242,133, 41, 41, 41, 91,182,
-108,217,178,214,196,196,164,109, 76, 76,204,159, 31,194,169, 22, 81, 67,172,173,173,157, 14, 31, 62,124,234,224,193,131,237,153,
- 76,230,125,130, 32,134, 10,133,194, 79, 90, 84, 90, 93, 32,122,165, 30,181, 14,117,226,253,216, 73, 74,255, 14,225,166, 82,169,
-138,151, 46, 93,154, 85, 81,120, 85,180, 94,105,254,171, 83,185,232,178, 79,245,137,162,172, 65,184, 16,197, 0, 80, 90,187,176,
-180,172,142,174, 69,165, 1,136,107,186,206, 73,146, 60, 11,224, 37, 73,146,175, 43, 6,186,104,207, 91,185,114,101, 77,215,185,
- 1, 6,124,214,208,225,206, 22, 72, 2,129,181,245,164,253, 7,205,149, 31,167,159, 1,108,246, 74, 18,152, 15,128,160,129, 45,
- 71,228,242, 31,170, 91,208,177, 35,214,210, 4,230,170,119,230,186,140,187, 88, 83,139,109,175, 3, 29,234, 15,234,201,217, 4,
-213, 23,148,125,143,211,223,223,159, 81,197,195,188, 92, 81,233,170, 16, 26, 90,150,197,191,170,126,106,159,111,102, 15, 30, 60,
-112,242,241,241, 17,160,188,211,127,101,211,105, 61,183,157, 1, 64,245,145,247,231,103,193,233,230,230,198,121,243,230,141,236,
-223,117,109, 26, 56,255,149,156,150, 77, 93, 64, 96, 18,180,115, 7, 85,107,209,210, 18,104, 52,253, 51, 10, 98, 83,170,232,167,
-230, 58,183, 76, 72, 72,112,109,216,176, 97, 50,128,130, 10,253,168,108, 30,109, 56, 70,255,247,156,149, 97, 50,202,151,162,251,
-172, 80, 89,116, 56,254,134, 3, 97,224, 52,112, 26, 56, 13,156, 6, 78, 3,167,129,211,192, 89, 91,161,245,217,130,166,105,144,
- 48,192, 0, 3, 12, 48,192, 0, 3, 12, 48,224,111, 1, 81,141, 42,213,199, 36, 88, 27,101,123,205,192,105,224, 52,112, 26, 56,
- 13,156, 6, 78, 3,231,255, 29,103, 77,220,218,203,127,174, 67,135,147, 1,236, 51, 12, 29, 26, 56, 13,156, 6, 78, 3,167,129,
-211,192,105,224,252,183,112, 86, 37, 88, 62, 91,208, 52,173, 99,173, 67, 3, 12, 48,192, 0, 3, 12, 48,224, 95,129, 30,238,224,
- 51, 85, 32,255,120,163, 83, 16, 85,141,232,227,134, 58, 0,240,177,248,254, 79,193, 7,208, 79,235,255, 5,168, 35,227, 13, 66,
-235,243, 69, 35, 0, 75, 0,104,215, 34,123, 8, 96,125,133,118, 71, 1,104, 23, 36, 20,161,180, 78,224,107,125, 86, 70,146,228,
-250, 46, 93,186, 76,191,115,231,206,102,165, 82,185,170, 22,253,117,229,243,249, 27, 9,130,104, 13,128, 69, 16,196,155,204,204,
-204,245, 74,165,242, 67,162, 86, 26, 56, 58, 58,110, 0,208,146, 36, 73, 22, 65, 16, 9,153,153,153,107,148, 74,229,205, 15,224,
- 52,115,112,112,232, 68,211,180, 35, 0, 6,139,197,202, 77, 75, 75,123,128, 90,230, 86,242, 15,140,101, 23,138,148, 44, 0, 48,
- 55, 97, 42, 66, 3,155,202,117,157,102, 56,197, 13, 48,224,255, 27,116,105,100,114, 57,244,118,195, 90, 90,137,239, 85, 0,209,
-171, 62,118, 92, 78,196,247, 85, 45, 79, 84, 18,213, 92,145,179,183, 27,214,170,232, 82,142, 94,110,216,116,249, 13,170,141,180,
-215,133, 83,131,125, 0, 57, 89,135, 42, 5,132,110,209,215,255,118,244, 67,249, 33,206,178, 33,207,106,133,214,112,119,240, 85,
- 76, 48, 67, 99,161, 9,227, 53, 3,208, 66,253,144,127,141,210, 92, 69, 69, 31,216,185,207,133,243,223,134,229, 52, 77, 7,148,
- 59, 89, 43,201, 67,244,197, 23, 95, 12,188,114,229,138,177,166,222, 29, 69, 81, 48, 50, 50, 82, 2, 24,167,199,186,236,135, 15,
- 31,190,232,192,129, 3, 24, 54,108,216,210,176,176,176,173, 0,138,117, 93,216,202,202,202,223,210,210, 50,120,255,254,253,118,
-237,219,119, 32, 56, 28, 14,222,188, 73,112,158, 50,101,138, 87, 92, 92,220,217,172,172,172,111,244,221,120,107,107,235, 81,150,
-150,150, 91,246,238,221,107,219,185,115,103, 16, 4,129,200,200, 72,231, 57,115,230,180,120,247,238,221,241,204,204,204, 25,250,
-114,218,216,216,184, 91, 88, 88,116,219,185,115,167, 81,167, 78,157,192,227,241, 16, 29, 29,109, 58,117,234, 84,199,180,180,180,
-216,204,204,204, 91,250,138,172,103,145,231,191, 82,202,165, 65, 0,192,100,115, 23,180,223, 18,113,254,217,141,243, 3,106,154,
-230, 31, 24,251,187, 65,108, 25, 96,128, 1,218, 24,229, 4, 71,154,198,252, 43, 63, 47, 35, 1,160,215,132,213,179, 70, 57, 97,
-243,145,244,170,107,216,234,201,247,253,216, 58, 8, 62,156,134,204, 15,233,231, 62,128,156,195,100,206,106,231,227, 99,251,237,
-221,187, 9,114,224,151,255,147, 67, 84,233, 48,103,149, 66,107, 72, 83,172, 82,150, 90, 76,136, 62, 13,113,252,106, 34, 35,252,
-139, 47,190,104, 56,113,226, 68,162, 85,171, 86,136,140,140,116, 63,126,252,120,191, 11, 23, 46, 36,168, 84,170, 72, 0, 47,160,
-123, 86,107, 22, 0, 79, 6,131,209,250, 95,206,249,111,134,137, 90, 92,101,226,175, 68,167,239, 37, 60,189,126,253,250, 57, 38,
-147,169,177,104,181, 19,137, 68, 14, 21,172, 96,186,160,158, 66,161, 64,124,124, 60, 72,146,100, 1,168,143,247, 75,106, 84, 5,
-103, 99, 99,227,221, 17, 15, 35,109, 8,166, 17,242, 37, 0, 36,114,112, 76, 29,112,224, 80,136,245,188,217, 51,134,220,188,121,
- 51,188,168,168,232, 87, 61,250, 83,223,196,196,100,235,211,167, 79,109,140,141,141, 65, 81, 20,138,138,138,224,232,232,136,253,
-251,247, 91,206,155, 55, 47,160,176,176,240,166, 68, 34,249, 77, 31,113,110, 97, 97,209,237,249,243,231, 70,154,130,210, 50,153,
- 12,206,206,206, 56,122,244, 40,119,214,172, 89, 77, 11, 10, 10, 82,101, 50,217, 91, 93, 9, 11, 69, 74,150, 82, 46, 13, 58,188,
- 43,208, 5, 0,198,206, 8, 12,226, 20,153, 95,212,101, 90,161, 72,121, 1,128, 65,104, 25,240, 79,163,181,173,173,109,104, 78,
- 78,206, 45, 0,223,224,227, 88, 26,220,121, 60, 94,115,138,162, 28, 73,146, 4,131,193,200, 16,137, 68, 79, 1,188,170, 45,161,
-141,155,223, 0,112,141,199,131,166, 90,144, 0, 8,146,140, 86,201, 75, 14,229,190,186,121,254,131, 56, 57, 70, 19, 0,186, 5,
- 9, 80, 4, 73, 62,165,148, 37,251,115,226,111, 94,250,183, 28,156,251, 66, 52,118,115,212,189, 48,230,199,224, 27,209, 0,124,
-146, 2,121, 52, 73,247, 97,197,153, 64,223,217,179,103, 59,206,152, 62,157, 24, 63,110, 92,163, 91,119,238, 16, 93,245,169, 86,
-240,121,162, 74,135,253, 74,133,150,127, 83, 88,209,192,194,227,193, 75, 72, 38,131, 65,140,156,189, 62,224,224,174, 77,100,207,
- 1, 67,203,134, 79,124,125,125,225,235,235, 75, 4, 5, 5, 53,250,243,207, 63, 27, 29, 61,122, 84, 25, 17, 17,241, 20,192,137,
-170, 86,214,219, 13, 98, 10,224,177, 89, 76,209,200,101,191,238,245,241,241, 1,151,203,197,135,112, 2, 64,207,134,228, 91,150,
-117,131,167, 35,103, 46, 79,110,223,190, 35,253, 49, 56, 63, 35, 60, 4,202,138, 90, 91,185,184,184,116, 82, 42,149, 60, 0, 96,
- 50,153,146,148,148,148,153, 40,173, 13, 8, 0,103, 41,138, 26,168, 7, 55, 9, 96,197,192,129, 3,151,126,251,237,183,168, 91,
-183, 46,102,205,154, 5,133, 66, 17,121,233,210,165,229, 0, 54,160,134,139,199,222,222,126,249,238,221,187,173,153, 28, 19,180,
- 90,152, 8, 65,129, 18, 0, 96,202, 5,206, 77,163, 49,107,214, 44,243,199,143, 31,175,209, 71,104,217,219,219,175,218,191,127,
-191,181,177,177, 49,104,154, 46,171,197, 88, 92, 92,140,226,226, 98,204,152, 49,195, 60, 54, 54,118,163, 62, 66,203,193,193,161,
-211,206,157, 59,141,120, 60, 30,138,139,139,217,114,185,156, 40, 42, 42, 66, 73, 73, 9, 45,147,201,228, 51,103,206,228,190,120,
-241,194, 79, 32, 16,188,133, 1,255, 22, 48, 0,124,205, 98,177, 6, 55,108,216,176,205,235,215,175,159, 40,149,202,211, 0, 78,
-127,132,151,169,238, 78, 78, 78,107,211,211,211,119, 2, 8,249,127,217,161, 14, 14, 14,167,239,221,187,231,178,123,247,238,113,
-155, 55,111,190, 8,224,183, 15,160, 99,179,217,236, 33, 93,187,118,117, 25, 59,118, 44,199,193,193, 1, 82,169, 20,137,137,137,
-230, 39, 79,158,116,141,142,142, 78, 85, 87,196,208,249,133,194,198,189,163, 41,152,230,199, 59,116,236,212,121,216,144,175,205,
- 28,108, 44, 32,150,169,240, 58, 89, 80,247,143,139,231,186,198,177,141,238,201,229,194, 17,185,175,238, 21,235,203,217,173, 91,
-247,206, 61,186,119, 55,179,176,180,128, 80, 36,199,155,164, 52,215, 27, 87,207,251, 50,153, 70,183, 41, 66, 49, 58,235,249,213,
-146, 79,121,108,102, 1, 76, 17,207,166,121,139,142,173, 30,247,154,184,166, 13, 77,211, 32,105,236,168,104,205,154, 5, 48,119,
-148,150,253,210,139, 15, 52, 77, 19, 4, 54,105, 91,179,122,187, 97, 45, 77,227,123,144, 32,122,215, 48, 76,169, 65, 47,128,107,
-105,109,237, 51,117,242,100,162,168,176, 16,209,209,209, 37, 21, 69,214,214, 58, 96,223, 38, 81,239,108, 74,237,197,246,191,212,
-154, 85,233,208,161,206,121,180,140,141,141, 43,157,110, 97, 97,129,110,221,186, 97,253,250,245, 76, 0,173, 43,204, 46, 95,100,
- 21,224,134,237, 89, 12, 11, 19, 46, 89,183,110, 93, 51,115,115,243, 15,230, 4, 0,208, 84,253,142,117,233, 47, 31,253,186,100,
-220,181,163, 91, 60, 69, 69, 5,172,138, 77, 76, 77, 77,209,184,113, 99, 44, 93,186, 84, 55,206, 15,199, 63,202,233,232,232,216,
-196,215,215,183,245,245, 91,183, 44,211,211,211,185,233,233,233,220, 43,215,175, 91,118,232,208,161,181,163,163, 99,147,178, 93,
-245,126,168,105,117,253, 92,189,107,215,174,229,103,207,158, 37,125,125,125, 97,101,101,133,110,221,186,225,226,197,139,204,205,
-155, 55,175, 3,176,180,166,126,146, 36,217,217,215,215,151, 0, 77, 35, 67,168,196,131,245, 77, 16,189,201, 3, 69, 18, 26,121,
-194, 66,136,197, 18, 24, 27, 27,243, 80, 58,220,171,235,182,119,236,208,161, 3, 1,160, 76, 92, 21, 21,149,126,138,139, 69,144,
-201,228,224,114,185,102, 0,120,186,114,210, 52,237,216,169, 83, 39, 0,128, 92, 46, 47,123,195, 43, 40, 40, 32,132, 66, 33,100,
- 50, 25, 88, 44, 22, 27, 53,251, 53,150,113,154,155, 48, 21, 76, 54,119,193,216, 25,129, 41, 99,103, 4,166, 48,217,220, 5, 50,
-179, 66,149, 46,211,204, 77,152,138, 79,124,126,218,145, 36,249,179,155,155, 91, 44, 73,146,135, 1, 56,126, 32,103, 91, 0,235,
-140,140,140,174,121,120,120,164, 24, 27, 27, 95, 87, 11,245, 14,181,228,228, 24, 27, 27, 95, 95,183,110,221,169, 39, 79,158, 12,
-251,243,207, 63,235, 63,123,246,108, 72, 80, 80,208,113, 83, 83,211,112,148,247, 75,212,251,218,172, 95,191,254,193, 7, 15, 30,
-180,237,216,177,227, 1, 0,220,143,116,189, 51, 0,180,132, 78, 21, 57, 62,201,113,119,106,213,170,149, 11,143,199, 67,143, 30,
- 61, 0,192,239, 67, 56,217,108,246,144,165, 75,151,186, 45, 91,182,140, 35, 16, 8,112,253,250,117, 60,124,248, 16, 74,165, 18,
-211,166, 77,227,142, 29, 59,182,129,153,153,217, 16,189,250,201, 52, 63, 62,123,206,220, 62,243,103, 77, 50,123,250, 78,142, 67,
-215,222,225,247, 8, 1,178, 74, 56, 24, 48,100,172, 69,239, 65,195,123,115,184, 22,199,245,229, 92,180,112, 97,159,201, 19, 2,
-204, 98, 4, 20,206,221,207,192,253,120, 33,148, 44, 75,244, 29,242,141, 85,139, 78,125,250, 49,193,250,229, 83, 31,163,253, 64,
-251,217,179,103,219, 45,216,116,228,174, 83,219,175,119,100,231,195, 87, 91,248,184, 3,150,214, 38, 38, 95,199,119,237, 58,201,
-168,180, 94,108,181,156,229,248, 90, 15, 10,206,202, 71, 23,109,255,172, 46,214,104,164, 30, 86,100, 92,249,121, 25, 73, 19,152,
- 53,202,169,220,125,160,210,126,222, 4,134,205,158, 59,151,101, 97,101,133, 93,187,118, 65, 42, 18,149,243,153,237,238,130, 62,
-215,140,153,169, 13, 60,156, 99,187,185, 18,225,255,193,247,149,201, 85, 90,180,194,194,194,232,254,253,251, 19, 0, 16, 26,139,
-252, 33, 77,177,113,248,183,235,150, 18, 36, 65,215,243,236, 24, 83,199,173,153,200,198,198, 6, 37, 37, 37,144, 74,165, 96,179,
-217,144, 72, 36,120,247,238, 29,238,223,191, 15, 43, 43, 43,189,122, 82, 88, 88, 8, 83, 83, 83,152,154,154,126, 20,206,197,227,
-122,112,223,164,100,115, 47,223,191,217,117,251,244,223,218,187,181,244,123,214,125,248,172,231,230,118, 78,146,103,207,158,225,
-222,189,123,200,207,207,135,143,143,207,127,229, 96, 62, 84,251,100, 61, 4, 96,213,176, 97, 67,231,203,215,110, 91, 21, 75, 40,
-243,164, 76, 5,139,162, 40, 24, 27,243,149, 39, 66,207, 9,135, 13, 25, 64,100,100,100,100, 1,120,168, 22,183, 53,213, 84,228,
- 1,104,226,239,239,191,104,250,244,233, 72, 72, 72,192,164, 73,147,196, 15, 31,100,113,178,147, 0, 0, 32, 0, 73, 68, 65, 84,
- 62,204,237,216,177,163,205,254,253,251,141,230,205,155,135, 91,183,110,173, 8, 11, 11, 59, 3, 32, 17, 64,165,181,218,104,154,
-102,179,217,108, 40,213,178, 65,174,162,202,244,125, 97, 97, 33,104,113, 62,216,108, 54, 3,128, 29,116,244,163,163, 40,138,205,
- 98,177,202, 68,214,187,204, 66,188,203, 42, 65, 97,177, 12, 98,177, 18, 50, 49, 13,134,177, 13, 19, 72,114, 0,144,164,171,117,
-132,199,227, 65,169, 84,162,168,168,180, 27, 26, 75,153, 76, 38,131, 80, 40, 4,131,193, 48, 5, 96, 14, 32, 79, 23, 66,181,147,
-251,239,234, 97, 64, 60, 58, 50,208,246,245,133,197,229,166,153,155, 48, 21,161,243,154, 50,108,156, 91,220,105, 57,236, 23,143,
-178,105,159,214, 63,139,107,103,103,119,227,212,169, 83, 77, 27, 53,106,132,196,196, 68,143,161, 67,135,250, 8, 4,130,150,208,
-191, 38,163, 49, 73,146, 27,199,142, 29, 59,125,228,200,145,132,187,187, 59,152, 76, 38,148, 74,165,115, 66, 66, 66,183,147, 39,
- 79, 46, 60,120,240,224,126,149, 74,245, 29,116,247,251, 35, 57, 28,206,137,189,123,247,118,241,241,241,193,225,195,135,241,240,
-225, 67,170,109,219,182,228,152, 49, 99,224,234,234,234, 51,102,204,152,223,165, 82,105,223, 90, 90,182, 92, 59,116,232,224,194,
- 96, 48,208,177, 99, 71,246,189,123,247, 90, 1,184,247,129,251,212,212,217,217,249,150,159,159, 95,203,107,215,174, 69,101,100,
-100,248,233,177,189, 0, 48,200,201,201, 41,200,194,194,194, 74,143,123,108, 73, 90, 90,218,247, 0, 66,117, 92,164,125,235,214,
-173,145,156,156,140, 38, 77,154,128,205,102,119,144,203,229, 83, 0,244, 1,240, 3,128, 88, 61,250,235,222,189,123,119, 23, 63,
- 63, 63, 34, 52, 52,180,204, 63,148, 36, 73, 40,149, 74,176,217,108,180,111,223,158,140,140,140,172,243,232,209, 35,119,232, 48,
-140,104,227,230, 55,160, 99,231,174,157,187,248, 52, 39, 55,135,190,134,138, 82,129, 65, 40,193, 36, 40, 80, 10, 46,184,108, 6,
-220, 61,219, 48,226, 95, 60,245,145, 73,229, 3,114, 95, 93, 59,175, 11,103,159, 94, 61,125,155, 54,113, 39,183,255,254, 6, 5,
-105,177,170,180,184,219, 57, 36,131, 68,211,214, 95,216,186, 55,107,201,104,233,227,199, 74, 79,124,209, 77, 34,233,210, 35, 63,
-225,246,181, 79,113, 65,174, 4, 24,206,117,108,191,238,223,211,143, 45, 72, 79, 23,157, 12, 61,255,188, 68,129,251, 0,112, 11,
- 32,250, 2,205,189,219,181,235,186,127,195, 6, 27, 62,159,207, 26, 61,114,164,114, 95, 84, 84, 20,170, 24,250, 93, 9, 48,108,
- 29, 29,123, 76,157, 58,149, 33, 72, 79,167, 79,158,190,240, 76,195,135,210,183, 20,239,230,206, 30,253, 33,138,215,107,152,114,
- 0,192,113,112,116,108, 58,101,202, 20,100,164,167,227,112, 72, 72,177, 4,136,208, 88,177,206, 49,176,179,153,155,227,248, 5,
-223, 12, 36, 92,248,182,152,186, 98, 95,135,110,242, 44, 55, 8,254, 58,254,218, 90,228, 51, 22, 89,147, 43, 21, 90, 21,241, 91,
- 44,150,155,177, 81,255,228,201, 99,100,118,145, 92,148,144,144, 0, 91, 91, 91,240,249,124, 88, 88, 88, 32, 38, 38, 6,215,175,
- 95,199,203,151, 47, 65, 81, 20, 90,180,104,161, 87,111,114,114,114,240,244,233, 83, 88, 89, 89,125, 52, 78, 55, 23, 59,124,235,
- 98,199,206,204, 45,100, 95,123,248,210,103,223,226, 33,205, 72,143, 33, 7,181,139,196,202,100, 50,252, 71, 80, 22, 93,232,226,
-226,210,233,208,161, 67,108,169, 18,102,238, 83, 34,126, 20, 73, 84, 38, 0, 96,194, 99,136, 34,131, 26,127,183,122,245,106,209,
-132, 9, 19, 60, 82, 82, 82,214,235, 96,235, 95,219,189,123,247,249, 52, 77,179,102,207,158, 13, 0, 24, 59,118,108,225,253,251,
-247,221, 1,100, 93,191,126,221,105,226,196,137,175,110,220,184, 97, 60,119,238, 92,134, 82,169,140, 97, 50,153,116, 88, 88,216,
- 42, 0,129,239, 61, 17, 73,242,113, 84, 84, 84, 61, 39,215,198,112,181, 33,225,187,244,101,233, 13,206,152, 66,106,210, 27,196,
- 61,123, 8, 71, 71, 71, 11, 62,159, 31,155,154,154, 42, 79, 75, 75, 91, 40, 18,137,118,215,208,199,232,200,200, 72,190,171,171,
- 43,138,139,139,145,154, 93,130, 89,167,141, 81, 40, 46, 53, 98,176, 32, 70, 75,151,198,102, 70,164,236, 97, 86, 86,150, 92, 38,
-147, 45, 19, 10,133,135,170,227,100,177, 88,185,207,158, 61, 51,173, 91,183, 46, 36, 18, 9,157,151,151, 71,136, 68, 34, 20, 21,
- 21, 17, 23, 46, 92,248, 74, 32, 16,180,173, 95,191, 62,225,236,236,188, 74, 32, 16,136,211,210,210, 38,233, 50, 52,169, 22, 76,
- 42, 38,147,185,121,242,228,201,195,206,156, 57,243, 56, 52,176,233, 32,173,225, 18, 11, 79, 79,207,203,205,155, 55,115, 10,217,
-228,189, 3,192,143,255,130,115,107,252,146, 37, 75,154, 90, 91, 91, 99,234,212,169, 88,185,114, 37,150, 47, 95,222,104,234,212,
-169,147, 1,108,213,131,199,200,209,209,241,209,246,237,219, 61, 58,117,234,132,139, 23, 47,226,216,177, 99,120,251,246,173,178,
-126,253,250, 76, 31, 31, 31,172, 88,177, 2,189,123,247,158, 52,115,230,204,174,233,233,233,173,116, 20, 31, 19, 86,172, 88, 49,
-168,115,231,206, 24, 55,110,156,244,230,205,155,195, 0, 92,185,122,245,234, 23,183,110,221, 10, 61,114,228,136,209,186,117,235,
-122,204,155, 55,111, 42,128,224, 90,108,255, 87, 93,186,148,214, 80,238,220,185, 51,130,130,130,122,127,160,208,226,216,216,216,
- 92, 56,124,248,112,203,198,141, 27, 99,244,232,209,173,134, 13, 27,118, 33, 63, 63,191, 39, 0,157,110, 72,117,234,212,217,120,
-246,236,217,134, 85,141, 44, 84, 6,169, 84,106,253,245,215, 95,111, 72, 74, 74,210, 75,104, 29, 61,122, 20,223,127,255, 61, 90,
-180,104,209,188,125,251,246,123,166, 76,153, 2,127,127,255,238, 49, 49, 49, 14, 40,141, 90,174, 17, 60, 30,175,249,136, 17, 35,
- 56, 15, 30, 60, 0, 0,120,122,122,162,101,203,150, 72, 78, 78,198,227,199,143, 33,149, 74,225,224,224,128,193,131, 7,243,146,
-146,146,154,231,228,228,212, 40,180, 72,174,241,248, 65,253,251,154,157,187, 47,128,138, 82,162, 77, 67,115,248,120,216, 35, 62,
-181, 16,145,177,169, 80,201,216, 48,183,182, 65,135,174,189,172, 51,210,222,142,207, 5,106,246,215,226, 26,143, 31, 60,168,159,
-233,185,136,116, 20,164,199,209,175, 31,158,185,174,144,136, 38, 1,192,227, 63,143,239,113,180, 49,234,233,222,186, 13,195,175,
-231, 64,171,211,199, 50,198,231,255, 51,181,253,222,195, 45, 23,236,117,101,229,140, 93, 16,224, 75,179,172,156, 31,154, 41, 20,
- 59, 53,243,122, 3,189, 22, 46, 89,210,254,155,201,147,121, 20, 69,225,200,175,191, 22, 62,141,138,138,159, 12, 80, 83,170,224,
-219, 9,184, 14, 27, 52,136,107,102,110,142, 57,179,102,193, 76,161,184, 81,182, 75,128,238,115,230,207,239, 52, 99,198, 12,163,
- 61,171,166, 63,238, 61,113, 77,107,138,166, 9,205, 48,229,209,234, 77,113,109, 39, 14, 26, 4, 51,115,115,204,158, 61, 27,132,
- 92,126,185, 76, 64, 49,113, 99,194, 87,190, 62, 1, 3, 58,131, 0,129, 99, 97,119,240, 58, 57,251,217, 13, 1,222,124,174,170,
-170, 2,170,244,209,170,118,232,176, 72,142,204,238,253,134, 8,220,221,221,139, 26, 53,106, 84,148,155,155,139,231,207,159, 35,
- 63, 63, 31,193,193,193,136,139,139, 3, 69, 81,181, 22, 48, 20, 69,225, 99,115, 2,128,131,141, 57, 70,247,109,199,148, 74, 68,
-188,236,236,236,114,195, 71,255, 33,161, 85, 6,165, 82,201,171, 95,191, 62, 72,128, 16,150, 40, 76, 51,142,118, 33, 50,142,118,
- 33,132, 37, 10, 83,153, 76, 70,154,154,154, 66, 42,149,242,116,160, 98,125,249,229,151,243,207,156, 57,195, 90,187,118, 45,188,
-188,188, 32,151,203,113,255,254,253, 84, 0, 89,234, 54,233,183,111,223, 78,215, 8,225,245,235,215,227,244,233,211, 68,143, 30,
- 61, 22, 86,118, 62, 9, 4,130,141, 83,166, 76,201, 43, 41,202,195,222,225, 98,132,142,206,198,207,131,222, 98,164,205, 41,228,
-101,190,195,190,125,251,112,245,234, 53,226,202,149,171,236,155, 55,111,154,244,235,215,111, 71,157, 58,117,194,170,235,100,122,
-122,250,218, 25, 51,102, 20, 20, 21, 21,161,168,168, 8, 98,177, 4,121, 34,224,217,150,166,120,182,165, 41, 36,148, 17,118,237,
-220, 77, 62,123,246,204,246,237,219,183, 78, 3, 6, 12,216,194,231,243, 15, 86,199,153,150,150,246,224,219,111,191,149, 20, 22,
- 22, 66, 38,147,201, 85, 42,149, 76, 44, 22, 43,142, 31, 63, 62,215,198,198,166,195,197,139, 23, 89, 87,175, 94, 99,222,188,121,
-139,125,253,250,117,139,110,221,186,157,112,112,112,248, 69, 23, 75, 25,131,193,216, 22, 18, 18, 50,126,215,174, 93, 14, 62, 62,
- 62,205, 42, 12, 69,241,123,246,236, 89,239,215, 95,127,173, 19, 20, 20,180, 16,165, 1, 40,159, 20,182,182,182, 51, 7, 13, 26,
-132, 93,187,118,225,252,249,243,243,118,236,216,129, 47,191,252, 18, 78, 78, 78,223, 66,247, 97, 47, 0,248,113,235,214,173, 30,
- 30, 30, 30, 24, 59,118,172,108,210,164, 73,223, 29, 58,116,168,126,120,120, 56,251,151, 95,126,169, 55,117,234,212,217, 1, 1,
- 1,146, 6, 13, 26, 32, 56, 56,184, 33, 73,146,219,116,186,190, 29, 28,230,142, 28, 57, 18,155, 54,109,194,205,155, 55,135,160,
-244,129, 42, 3,112,233,238,221,187, 3,214,173, 91,135, 33, 67,134,192,217,217,121,118,109, 44, 79, 77,155, 54, 93,214,167, 79,
- 31,132,135,135,163, 85,171, 86,232,208,161,195, 60, 0,182,181,220,157,164,169,169,233,137, 67,135, 14,249,214,171, 87, 15,107,
-214,172,129,155,155, 27, 14, 30, 60,232,107, 98, 98,114, 2, 58,186,111, 88, 88, 88,152, 26, 27, 27, 99,225,194,133,244,144, 33,
- 67,242,106,250,204,155, 55,143,230,114,185,176,178,178,210, 53,240,197,136,199,227,117,244,242,242,194,253,251,247,113,245,234,
- 85, 44, 93,186, 20,115,231,206, 69,118,118, 54, 70,140, 24, 97, 12,192, 95,143,237,182,183,179,179, 67, 97, 97,105, 93,120, 47,
- 47, 47, 60,121,242, 4,217,217,217,112,118,118, 70, 70, 70, 6,108,108,108,208,184,113, 99, 80, 20,101,175, 27, 37,237,101,107,
-109,129,172,124, 41,152, 80,162,181,187, 45,110, 60,207,197,187,108, 25,236,109, 44,145,145,149,141, 58, 54, 60,184,184,212, 5,
- 77, 83, 94, 58, 41, 96, 6,217,154,203, 51, 66, 94,145, 28,105,177, 55,115,229, 42,233,148,130,196,187, 41, 5,137,119, 83,228,
- 82,201,148,199,119,174,230,214,115, 48,130,139,139, 11, 8,154,106,247, 41,174,199,161,117,225, 98, 98,196, 28,123,245,231,101,
- 68,216,254,197,132, 52,247, 93,219, 62, 14,165,150,101, 59,160,254,208, 17, 35, 58,126,247,221,119,188,204,204, 76, 42, 96,248,
-240,188,181,129,129,215,254,168,225,197,160, 24,104,212,179,103, 79,144, 0,254,184,114, 69,148, 1,164, 2,128, 3,224, 50,240,
-235,175,187, 44, 89,180,200, 40, 39, 55,151,186,159, 80,124, 46, 46,139, 30,108,173, 66,125, 93,252,179, 84,128,183,134,247,242,
-229,203,180, 24,120, 12, 0,126, 46,248,182, 87, 39, 79,159, 49,131,186, 64,144,149,143,217,107,127,198,158,147,183, 46, 91, 40,
-232, 47,254, 67,143,226,201,181, 18, 90,234,161,159,247,166,149,148,188, 63,122,240,161, 2,230,239,224,172, 12,255, 69,161,165,
-129, 66, 81, 58, 74, 34, 83, 80,144, 41, 40,205, 91, 45,196, 98,177,206, 20,151, 47, 95, 62, 60,107,214, 44,108,217,178, 5,175,
- 94,189, 2,155,205,134,151,151, 23, 31,128,169,230,158,223,186,117,107,123,146, 36, 17, 31, 31,143,205,155, 55, 99,194,132, 9,
-244,189,123,247, 14,162,242,124, 41, 79,242,242,242,118, 78,153, 52,161, 32, 63,243, 29, 20,226,124,100,165,189,129, 84, 84,128,
- 53,235, 55,162, 68,193, 68,134, 80,142, 12,161, 28, 36,215, 26,123,246, 31, 98, 52,109,218,180, 15,131,193,232, 95, 77, 63,239,
-103,102,102,238,159, 54,109, 90, 65, 70, 70, 70,217,246,201, 20, 52,100,138,242,231,171,177,177, 49,182,109,219,102,225,238,238,
- 62,136,201,100,118,171,134, 83,144,146,146, 18, 55,109,218, 52, 89,102,102, 38,132, 66, 33,206,157, 59, 55,160, 94,189,122, 86,
- 27,126,220, 66,136,228, 76,100, 20,200,145, 81, 32, 7,199,212, 30, 39, 66,207, 48, 26, 55,110, 28,192,100, 50, 59,212, 36,178,
-142, 28, 57, 50,102,248,240,225,102, 63,254,248, 99,222,217,179,103,119, 1,208, 62, 32,241,219,182,109, 59,121,226,196,137,162,
-249,243,231, 91, 7, 5, 5,205,251,196, 98,171,219,240,225,195,155, 80, 20,133, 83,167, 78, 61, 3,176,245,204,153, 51,143,164,
- 82, 41, 70,140, 24, 81, 95, 61,140,164, 11,218, 6, 4, 4, 76,247,245,245,197,156, 57,115,228,215,174, 93,107, 13, 96, 11, 74,
-135,114,105, 0,201, 0,118,220,186,117,171,197,204,153, 51,165,237,218,181,195,184,113,227, 38, 0,240,173,129,183,227,200,145,
- 35, 61, 40,138,194,241,227,199,159, 2,184, 88, 97,254,245,208,208,208,251, 50,153, 12,163, 70,141,106, 0, 64,159, 27, 57,155,
-203,229,158, 90,189,122,181,101, 90, 90, 26,198,140, 25, 35,141,143,143, 71, 96, 96,160,145,133,133,197, 69,173,107, 64,103,112,
-185,220,125, 63,253,244,211, 32,111,111,111, 76,155, 54, 77,182,123,247,238, 89,211,167, 79,151,181,110,221, 26,187,118,237, 26,
-196,225,112,244, 42, 45,146,158,158, 94, 16, 27, 27,107, 83,211, 39, 53, 53, 85,215,240,124, 99, 83, 83,211, 8, 79, 79,207, 66,
- 47, 47,175, 54, 74,165, 18, 49, 49, 49,111, 14, 31, 62, 76,121,121,121, 97,231,206,157, 8, 10, 10, 66,255,254,253,193, 96, 48,
-116, 22, 90, 12, 6, 3,114,185, 28,198,198,198, 96, 50,153,120,243,230,141, 38,181, 12,216,108, 54, 0,192,196,196, 4, 70, 70,
- 70, 32, 73, 82,167,104, 52,130, 0, 93, 88,162, 0,139, 69,130, 73, 82,136, 75, 22, 66,174,160,192, 99, 51,192, 98, 18, 0, 77,
-193,210,132, 5, 30,135, 1,146, 32, 40, 29, 57, 33, 20,201,193, 97,147, 96,177, 57, 4,169, 84, 25,149, 61, 28,153, 42, 35, 35,
- 35, 14, 97,107,206, 5,143,253, 47, 42, 11, 76,148, 58,150,143, 7, 88, 38,117,235, 14,219,180,121, 51,167,176,184, 24, 67,134,
- 12,201, 75,122,244, 40, 68, 12, 60,234, 90, 67,144, 18,201,100,186,251,117,237,138,200,168, 40, 20,229,231,191, 6, 74,157,227,
- 57, 78, 78,195,183,109,219,198, 17, 75, 36, 24, 50,120,112,193,171, 59,119,142,164, 20, 35,236,120,114,169, 16,171,241,184,179,
-217,142, 26, 94, 97,126,126, 62, 80,154, 66,194,193,206,116,195,140,128,222, 40, 42,145, 96,193,198, 16, 42, 42, 78,240,109,120,
- 42,250,157, 73,135,240, 63,246, 24,158, 92,225, 3, 64,135,132,165, 26,235, 82, 77, 98, 69, 42,149,126,116, 1,244,161,156,149,
-137,196, 15,229,252, 55,130,201,100, 74, 94,190,124,201, 49,183,113,162,108,204, 88,249,245, 38,220,177, 0, 0,107, 83,166, 80,
-174, 82, 80,233,233,233,224,114,185, 18, 29,135, 27, 38,237,219,183,111, 13,128,102, 76, 38, 51,236,208,161, 67, 68, 72, 72,136,
-213,200,145, 35, 19, 98, 99, 99,211, 60, 61, 61, 93, 15, 29, 58,100, 14, 0, 59,118,236,160, 79,156, 56,209, 27,165, 41, 51,170,
-204,227,146,153,153, 25,152,155,155,123,111,198,140, 25,193, 28, 14,199,202,196,196,196, 38, 60, 60,156,144,200,105,180, 93,146,
- 92, 22,137,104,110, 68,226,246, 98,115, 76,158, 60,153, 17, 27, 27,187, 62, 45, 45, 45,172, 26,206,133, 5, 5, 5,225,175, 94,
-189,218, 98,225,220,210,206,196,117,137,133,207,226,120, 0,128,171, 45, 11,164,250,190, 88, 80, 80,128,236,236,108, 76,159, 62,
-221, 42, 33, 33, 97, 97, 90, 90,218,141,106,172, 90,183,114,114,114, 82, 95,188,120,225,199, 98,177, 56, 38, 38, 38,109, 35, 34,
- 34, 8,137,140, 66,243,133,201,200, 43, 46,237,167,181, 41, 19,143, 87, 59,224,219,111,191,101,190,126,253,122,163, 64, 32,232,
- 92,233,205,140, 36,131,180, 69,214,130, 5, 11,162, 1, 52, 0, 80,110,104, 84,165, 82, 17,163, 70,141,122, 14,192,107,254,252,
-249,214, 52, 77,207, 91,184,112, 97, 30,128,189,255,244,185,100,110,110,190, 97,202,148, 41, 56,113,226, 4,242,243,243,183, 1,
- 64, 97, 97,225,214,163, 71,143, 30,159, 52,105, 18,126,253,245,215, 13,217,217,217,127,160,230, 80,237, 47, 71,140, 24,129, 75,
-151, 46,225,207, 63,255, 92, 6, 32,166,138,118,175,194,195,195, 23,158, 61,123,118,251,200,145, 35,241,243,207, 63,247, 1, 80,
-157,131,108,207,222,189,123,227,226,197,139,200,205,205,221, 85, 89,131,130,130,130,221,231,206,157,107,223,187,119,111,172, 95,
-191,190, 39,128,235, 58,108,186,135,133,133,197,161,237,219,183,183,245,246,246, 70, 64, 64,128, 68, 46,151,247,153, 63,127,254,
-249, 99,199,142,153, 29, 62,124,184,205,228,201,147, 31,168,115,190,221,215,201,148, 69,146,235, 54,111,222, 60,209,207,207, 15,
-243,230,205, 83, 94,190,124,121, 32,128, 43,127,252,241, 71,194,130, 5, 11, 46,108,222,188,153,177,105,211,166,137,179,103,207,
-206,166, 40,234, 83,137,235,213, 59,118,236,104,223,171, 87, 47,188,121,243, 6,247,239,223,135, 92, 46,255, 53, 34, 34,226,118,
-163, 70,141, 86,203,100,178,243, 38, 38, 38, 99,205,204,204, 60, 91,182,108,249,197,227,199,143,141,161,155,159, 94,102, 98, 98,
-162,165,133,133, 5,148, 74, 37,158, 61,123,134,186,117,235, 66, 46,151,227,237,219,183,240,246,246, 6,155,205, 70,102,102, 38,
-180,172,229, 53,136, 34,242, 89, 66, 82,122, 3,107, 51, 19, 64,197,195,147,248, 84,216,217, 90, 65, 69,144,200,200, 16,160,101,
- 19,103, 16, 4,129,130,220, 12, 16, 4,241, 92, 23, 78, 21, 77, 69,190, 75,207,170, 99, 99,198,133,119,251, 94, 54, 17,127,100,
-135,152, 55,232, 52,153,201, 32, 24, 28,174,233,222,137,227,198,217, 82, 20,141,130,220, 76, 48, 73,242,225,167, 56, 64,167,222,
- 33,165,171, 27,239, 73,175,137,107, 90, 18, 52,104,177, 28,135,127,206, 68,190, 49,208,114,199, 15, 63, 88,218,216,218, 34, 32,
- 32,128,202, 77, 75,187, 86,162, 99, 98,229, 6,141, 26, 57,152,154,153,225,238,221,187, 96,148,250,216,226, 32,224, 17,180, 96,
-129,141,189,163, 35, 38, 76,156, 72,101,190,123,119, 93, 12,164,235,211,215, 6,110,110, 44, 13, 47,169,230, 21, 48, 48,107,254,
- 64, 95,174,137, 17, 23,235,246,156, 65, 74,142,232,120,132, 0,123,254,163,246,142,125,213, 90,180,170,114, 62, 43,117,170, 54,
-174, 86,172,240,120,188, 50,107,138, 30,111,122, 31,157,179, 38,252, 29,156,159, 16,139, 1,156, 5,176, 56, 37, 37, 37,110,226,
-196,137,114,165, 92, 90,116,111, 77,131, 69, 81,235,235, 77,139, 8,228, 79,251,125,150,197,162, 18, 97, 94,209,142, 29, 59, 20,
- 41, 41, 41,113,218,203,212,192,253, 14,192,197, 95,126,249,101,247,169, 83,167,224,229,229,133,152,152, 24,123,145, 72,212,234,
-249,243,231,214, 30, 30, 30, 8, 9, 9,193,137, 19, 39,182, 0,184, 90,157,200,210, 64,169, 84, 94,203,200,200,104,156,156,156,
-220,208,210,210, 82, 97,105,105,137,138,145,136,133, 98, 10,185, 5, 66, 88, 91,219,192,220,220,188,190, 14,226,252, 98, 70, 70,
-134, 59,101,213,164,139,123,206, 54, 97,228, 58, 23, 68,174,115,193,197,133, 78,224, 91,114,144,159,159,143,236,236,108,100,103,
-103,131, 32, 8, 40, 20,138,166, 58,112,190, 21, 8, 4, 7,222,189,123,119,214,193,193, 1,102,102,102,160, 1,100, 20, 40, 16,
-189,201, 3,209,155, 60,144, 81,160, 64, 97, 81, 17,234,213,171, 7, 51, 51,179,170,134, 40,200, 58,117,234,244, 29, 62,124,184,
- 25, 0,168, 5, 84,119,154,166,167, 85,242,153,170, 84, 42, 59,105,218,126,255,253,247,214, 0,122,255,195,231, 19, 3,192,140,
- 73,147, 38,181,225,241,120,216,185,115,231, 91, 0, 71, 52,247,250,221,187,119,199, 3,192,172, 89,179, 60, 1,204, 67, 21,153,
-160,203, 76, 67,108,118,235,166, 77,155, 34, 34, 34, 2, 0,206,212,176,238,208,123,247,238,161, 81,163, 70,224,241,120,109,107,
-104, 91,223,197,197, 5,241,241,241, 0,240,164,138, 54, 79,226,227,227, 75,135,123, 8,162,190, 14,219, 62,168, 87,175, 94,207,
-110,220,184,209,182, 99,199,142,152, 56,113,162,236,193,131, 7,125, 1,220,126,242,228, 73,183, 81,163, 70,137,220,221,221,113,
-235,214, 45,143, 81,163, 70,221, 35, 73,114,141, 14,156, 19, 86,173, 90,181,248,171,175,190,194,170, 85,171,232,147, 39, 79, 6,
- 0,184,162,158,119,249,248,241,227, 99,214,174, 93, 75, 15, 30, 60, 24, 43, 87,174, 92, 12, 96, 90,117,100, 34,145, 72,168, 82,
-169, 32, 18,137,116, 50,201,235,218,222,214,214,246,203, 94,189,122, 97,233,210,165,168, 83,167, 14,206,159, 63, 79, 3, 8, 3,
- 16, 46,147,201,186, 0,216, 44, 18,137,126,143,136,136, 64,207,158, 61,217, 40, 95, 98,164,186,245, 63, 59,122,244,168,212,194,
-194, 2,174,174,174,104,208,160, 1, 50, 50, 50,144,148,148, 4,111,111,111,180,110,221, 26, 74,165, 18, 7, 14, 28,144, 20, 21,
- 21,233,148,147, 79, 41, 19, 29,190,122,225,180,208,198,140, 11,103,123, 11,212,171, 99,141,226,130, 28,100,103,164,163,117,211,
-186,232,218,186, 30,114,132, 50, 92, 14, 59,157, 95, 84, 84,114, 88, 39, 19,190,180,228,208,181, 63,206, 11,173,204,216,104,220,
-196, 19,163, 38,206,106,217,178,149,207,213,118,237, 58, 93,254,113,195,186,230,221, 59, 52, 37, 82,115, 36,184, 20,118, 38, 95,
- 88, 88,120,232, 83,220,232, 87, 2, 12,137,133,251,237, 93,103, 35, 15, 52,235, 51,233, 64, 92, 42,182, 1,128,130,193,240,232,
-251,229,151, 72, 77, 77,197,233, 83,167, 4, 37,192, 83, 93,249,140,140,140, 72, 0, 16, 10,133,224,170,253,238,148, 64,147,126,
-253,250, 33, 59, 39, 7, 71,143, 28,201,190, 4, 68,233,211,207, 1, 0,199,216,168,212, 32, 40, 20, 10, 65, 0,133, 0, 64, 48,
-209,183,157, 87, 35,100,231, 21,226,198,195,184,226,122, 98, 76,175,142,231, 51,118,132,175,157,143, 22,128,156,121,243,230,129,
-203,229,130,207,231,151,137, 35,141, 88,225,112, 56,224,243,249, 80, 42,149, 56,126,252, 56, 0,228, 84,251,134, 7, 72, 7, 78,
- 91, 79, 73, 21,116, 9,139,197,250, 40,156,234, 55, 71,233,144, 5, 63, 83,127,220,171, 60, 40,166, 54,156,159, 1,218,169,115,
- 98,181, 3,144,159,148,148,148, 58,108,200, 64, 97,114,194,139, 12, 81, 65,186,160, 48, 55, 69,144,242,246,121,198,146,133,243,
-132,169,169,169, 41, 40,205,165,213, 46, 61, 61, 93,179,140, 46,152, 55,108,216,176,159, 38, 77,154, 68, 71, 71, 71, 3, 0, 34,
- 35, 35, 49,110,220, 56,122,204,152, 49,219, 0, 44,170, 69,191, 69, 98,177,184,156, 53, 68,174,162,202,134,252, 10, 11, 11,145,
-158,158, 14,153, 76,166,179, 34,126,117,121,211,203,188,164,199, 10, 79, 87, 19,120,186,154,192,195,197, 24,132,178,184, 76,100,
-101,103,103,107,222,156, 37,122,244,179, 80, 42,149,150,235,167,246,208,100, 97, 97, 33, 50, 50, 50,160, 82,169,170,122,144, 81,
-105,105,105,151, 79,156, 56, 81, 4, 0, 63,254,248, 99, 30, 65, 16,127, 18, 4,241, 83, 37,159, 61, 76, 38,243,174,166,237,166,
- 77,155,242,240,254,144,216,223,137,175,188,189,189,243, 23, 47, 94,188,115,246,236,217,216,179,103, 15, 4, 2,193, 34,252,149,
-139,135,202,201,201, 89,176,107,215, 46,140, 31, 63, 30,203,151, 47,223,212,170, 85,171, 66, 0,163,170, 34,180,179,179,115,102,
- 50,153,136,138,138, 42, 4,240,166,134,245,103, 68, 69, 69,101, 18, 4, 1, 62,159,239, 86, 93, 67,107,107,235,134,102,102,102,
- 72, 75, 75, 3,212,111,204,149, 32, 41, 61, 61,157,230,112, 56,112,114,114,106, 84,211,198, 91, 89, 89, 45, 56,112,224, 0,243,
-197,139, 23,232,222,189,123,234,173, 91,183,122, 2,208,132,164, 71, 69, 70, 70,250,118,235,214,237,229,213,171, 87,177,113,227,
- 70,162, 69,139, 22,211,106,226,116,117,117,157, 58, 97,194, 4, 4, 7, 7, 99,239,222,189,211, 0,156,170,208,228,216,174, 93,
-187,102,237,221,187, 23, 19, 39, 78, 68,253,250,245, 71, 85,199,151,156,156,188,208,207,207, 47,242,213,171, 87, 58, 85, 60,208,
-177,125, 55, 31, 31,159,134, 98,177, 24,135, 14, 29,122,211,176, 97,195, 71,167, 78,157,154,135,247, 31,216,191,159, 62,125, 26,
-163, 71,143, 70,139, 22, 45, 14, 1, 24,169,203,101, 25, 27, 27,155,114,253,250,117,138,205,102,227,127,236,157,119,120, 20, 85,
-219,198,239,217,222,119,211, 59, 9,161,165,210, 2,132, 94, 2, 33, 8,132, 80, 68, 17, 65, 84, 20,145, 34, 10, 40, 22,192, 6,
-130,116, 65,164,136,133, 23, 1, 65,145, 22,154,128,130,116, 18, 32, 36,144, 4, 72,175,155, 94, 54,219,119,230,124,127,144, 96,
-136, 41,187, 9,126,130,206,239,186,230,218,228,204,206,189,103,218,217,123,159,115,206, 51, 62, 62, 62,136,140,140,196,243,207,
- 63,143,206,157, 59,195,100, 50, 97,223,190,125, 76,124,124,124,182,209,104,180, 42,151, 82,241,157,223, 15,165,165, 37,159,191,
-118,249,172,153,199,229,192,219,221, 1, 99,195,187,226,149,241,125,209, 45,192, 19, 25, 5, 58,156, 62,253,171, 57, 45, 45,229,
-162, 53, 51, 14,107, 52, 19,111,197, 93, 72,184,118,206,194,231, 81, 8,240,239,128,133,239,191, 99,191,244,195, 5,118, 29,218,
-122, 35, 46,181, 28,191,158, 56,106,206,205,206,250,237,159,154,113,120, 6, 16,200, 69,148,140,203,225,128,230,136,170,184,213,
- 19,105, 58, 6, 5,249,185,186,185, 33, 58, 58, 26, 28, 27,102,132,158, 1, 4,114,249,253, 94,112,141, 70,131, 26,189,118,254,
-254,254,222, 62, 62, 56, 18, 29, 13, 46,195,220, 30,104, 99,130,209,164,251,221,208, 15,116, 41, 64, 63,163, 21, 20,237, 90,185,
-248,219,171,100,184, 28,119, 23, 6, 51,185,242, 67, 41,254,209,124,100,127, 35,211,208,204,174,195,149,155, 55,111, 14,221,182,
-109,219,208,185,115,231,202,167, 76,153, 2,177, 88, 12,173, 86, 11, 47, 47, 47,208, 52,141, 99,199,142, 33, 38, 38, 70,195, 48,
-204,175,248,107,218,128,112,212,154,165,113, 60, 5,146,251,126, 75, 27,122,224,153,103, 30,137, 38, 0,200,239, 50,202,226,214,
-198, 29,235,247,158, 27,183,243,248, 53,234,205,137, 3, 57,221,252, 91, 1, 0, 92, 93, 93,161, 84, 42,109,214,124, 4,252,237,
-154,181,187,117,243,243,243,147,242,243,243, 11, 94,125,245,213,128,154,129,239, 34,145, 72, 95, 29,201, 42,173,111, 27, 43,234,
-105, 2, 48, 99,219,182,109, 7,203,203,203,143,191,253,246,219, 88,186,116, 41, 14, 29, 58,212, 31,192,249,102,238, 59, 93, 90,
- 90, 90,118,229,202, 21,215,246,129, 33,104,227,194,199,128, 69,119, 64, 8,129,163,148,160,178,172, 4,215,175, 95, 67,101,101,
-229,101, 91,234,105, 50,153,202, 10, 10, 10,156, 92, 92, 92, 80, 82, 82,130,162,162,162, 7, 38,171,180,180, 20, 37, 37, 37,132,
-162,254,146,179,165, 49,205,170,130,130, 2,109, 98, 98,162,208,181, 85,123,180,117, 17,160,231,251, 73, 0, 33,240,118,224,160,
-178,162, 12, 23, 47, 94, 68,121,121,249,239, 13,105, 50, 12, 51,111,210,164, 73, 92, 0, 47,188,253,246,219, 14, 0,186,188,243,
-206, 59,191,162,206,204, 66, 30,143,183,118,199,142, 29, 29,107,186, 24, 23, 44, 88,176, 6,192,182,255,175,107,201,209,209,113,
- 94,116,116,180,194,100, 50, 97,253,250,245, 88,179,102,205, 55,248,107,162,202,232, 47,191,252,114, 35,135,195,153, 57,107,214,
- 44,188,246,218,107,210,238,221,187,207,205,203,203,251,161, 62,205,156,156,156,133,221,186,117, 91, 92, 80, 80,240,153, 85,102,
-249,206,157,105,221,186,117, 91, 88, 80, 80,176,162,177,115, 36,147,201,100, 52, 77, 35, 45, 45,173, 20,104,112,124,135, 62, 45,
- 45, 45,135,166,105, 47,169, 84,234,208,212,245, 89, 90, 90,250, 89,247,238,221, 63, 82,171,213, 39, 0, 44,169,199,144,223,200,
-203,203, 11,158, 51,103,206,236,229,203,151,143,203,207,207,223,221,148,102, 70, 70,198,103, 97, 97, 97,139,146,147,147,191, 71,
-195, 93,192, 95,126,252,241,199,166, 29, 59,118,188,158,150,150,182,172, 9,205,195, 69, 69, 69,135,109, 56,191, 13,189,255,129,
- 38,151,203,125,103,249,242,229,156,205,155, 55,131, 16,178,138,166,233,134,234, 25,183,127,255,254,237,125,251,246,157,178,119,
-239, 94,113,112,112,240,107, 6,131, 97, 87, 83,215,167, 86,171,221,183,119,239,222,113,113,113,113, 94, 83,166, 76, 17,251,249,
-249,193,100, 50, 33, 47, 47, 15,155, 55,111,214,199,199,199,103,151,149,149,237,179,165, 13,177, 24, 43, 38, 94, 56,125, 96, 87,
-250,157,248,222,131,158, 26,109,111, 52,121, 65, 84,204, 69, 89,113, 62,142, 29,222, 87,154,150,150,114, 81,171, 45,155,104,139,
-166,201, 80,254,220,197,223, 14,238,206, 78, 75,236, 53, 32,108,132,189,222,232, 3,145,128,131, 98,117, 14,142, 69, 31, 40, 73,
- 75, 75,253, 67,111, 54,188,248, 79,181,243, 92, 95, 44,225,230,199,188, 58,125, 84, 87, 72,236,189,174,243,129,245,125, 1,137,
-147,171,171,160,250,222,129,252,254,152, 71,171, 52,213,128,176,125,117, 47,149, 86,171, 5, 31, 48,190, 4,240,157,157,157, 37,
- 0,144,156,156, 12,233,253, 94, 13,155,234,169, 1,100,210, 90,186, 28, 64, 91,204,131,103, 59,165,140, 2,128,236,252, 98, 24,
-205,141,126,111, 60,233,108,173,101,184,182, 54, 71, 64, 0, 32, 92, 46,151, 47, 93,188,120,241,170,203,151, 47,175,138,140,140,
- 92, 37, 18,137,150, 86, 31,108, 65, 35, 39,226,255, 77,179,135, 7, 28,194,218, 82,103, 35,218, 81,204,244,254,246,244,139, 61,
-101,198,193,131, 7,111,108, 97, 61, 91,114,179,252,157,154, 7,204,102, 51,193,253,110,187, 3,104,184, 75,240,189, 90,235,243,
- 51, 51, 51, 73,245,223,182,212,211,105,194,132, 9, 76,101,101, 37,121,246,217,103, 9,154,126,132, 79,163,154, 34,145, 40,108,
-192,128, 1,102,117, 97, 9, 73, 74,205, 33,151, 98,111,145,227,167, 47,144,221,251,162,201,134,141, 91, 72,231,206,157,141, 0,
-124,108,209,228,241,120,131,195,194,194,138,213,106, 53, 73, 76, 76, 36,103,207,158, 37, 63,253,244, 19,217,178,101, 11,217,180,
-105, 19,105,213,170,149, 26,128,171, 45,154, 18,137,100,244,240,225,195,205,101, 21, 90,146,150, 83, 76,110, 38,166,145,243, 87,
-110,146, 99,167,207,147, 31,118,237, 37, 65, 65, 65,122, 43, 52,185, 92, 46,119,195,238,221,187, 43, 8, 33,100,244,232,209,217,
-120, 56,145,106,155,121,243,230, 21, 16, 66,200,138, 21, 43,138, 81,255, 64,248,191,251, 90,122,202,211,211, 51, 73, 32, 16, 68,
- 3,120,161,137,237,158,227,241,120,135,220,220,220,174, 2, 24,251, 15,220, 71,145, 46, 46, 46,151, 0, 52,245,132,131,154,247,
-141,249,151,220,239,127,135,230, 96, 30,143,119, 22,104,252, 33,194,181,218,235, 79,185, 92,238, 17, 0, 67,108,172,103, 7, 39,
- 39,167,103,237,237,237,223,180,183,183,127,211,197,197,229, 89,161, 80,216,161, 37,251,238,216, 33,124,148,119, 72,212,254, 86,
- 93, 70,102,120,119,141,204,240,237, 54,122,191, 99,135,240, 81, 45,213,244,233, 54,250,128,119,215,200, 76,239,174,163,210,219,
-244, 24,189,223,201, 63,124,248, 63,121,142, 94,240,132,199,208, 54,176,144,179,139, 8, 57,187,136,132,183, 1,211,219, 14, 65,
-161,128, 98, 88,120,248,106, 66,211,171,199,141, 25,179,186, 61,224, 72, 0,110,221,165, 62,205, 16, 64,249, 96,219,209,163, 87,
-183, 5,156,134, 2,210,129,253,251,175, 34, 52,189,122,210,115,207,173,246, 6,220,234,211,107, 72,147, 0, 92, 79,192,163,182,
-174, 19,208,110,188, 47,130,223, 27,229, 75,200,217, 69,228,227,103,252, 72, 55, 87,188,208,132,102, 67,145,162, 39, 54,162, 85,
-223, 88,241,166,144, 85, 55,174,203,170, 95,101,143,224, 34,124,228,154,189,220,225, 23,222,142, 74, 28,225,207, 43,193,253, 41,
-201,178,127, 97, 35,249,189,209,104, 36,122,189,158,104,181, 90,162,209,104,234, 26,168, 7,134, 44, 55, 55,151,100,103,103,147,
-204,204, 76,146,158,158, 78,240,231,216, 27,171,235,169, 84, 42,183, 61,243,204, 51, 52,159,207,223,240, 40,246,221,193,193, 97,
- 89,207,158, 61, 77, 95,124,241, 5,217,191,127, 63,249,250,235,175,201,172, 89,179, 72,199,142, 29, 13,118,118,118, 19,155,163,
-233,230,230,182,208,223,223,191,248,155,111,190, 33, 63,252,240, 3, 89,183,110, 29,249,224,131, 15,104, 47, 47,175,124,133, 66,
- 49,172, 57,154, 46, 46, 46, 91,251,245,235,103,218,186,117, 43,249,245,215, 95,201,206,157, 59,201,188,121,243, 72, 64, 64,128,
- 65, 38,147, 61,109,165, 38,151,199,227,173,158, 62,125,122,190,135,135, 71,116,157,117,210,160,160,160,171,147, 38, 77,202, 5,
-176,224, 95,116,125,178,154,172, 38,171,249, 55, 24,173,231, 61,224, 73, 0,174, 84, 32,120,110, 96,255,254,171, 4,192,115,182,
-154, 34, 49,151, 59,190,111,207,158,171, 4,192,196,154,247,138,185,220,241, 3,251,247, 95,197,231,114, 39, 55,164,215,152, 38,
- 1,184, 2, 30,111, 65,223,222,189, 87,243,128,247,107,202, 6,183,161,110,207,123,170, 21,233,239, 67,221,157,236, 2,233,191,
-216,104,213, 75,115,140,214,131, 0,194,223,112, 17, 62, 41,154,143,203, 77,221,190,218, 48, 29,176, 33,162,117, 0,247,159,162,
-222,190,153,245,148, 60,226,125,239,228,228,228,116,180,125,251,246,133,173, 91,183,206,181,183,183,223, 5,192,171,133,154,193,
-110,110,110,255,115,117,117,189,227,238,238, 30,231,228,228,180, 22,247,179,206, 55, 91,147,207,231,247,116,117,117,253,221,215,
-215,183,204,199,199, 71,237,228,228,180,187,158, 72,150, 53,154,238,168,191, 81, 17, 84,175, 99,191,116, 88, 77, 86,147,213,124,
-200,192, 68,180,197,242,161,109, 96, 25,218, 6,116,132, 47,214,214, 54, 40,145,128,164,185,166,232, 69, 64, 84,247,253, 77,233,
- 53,165, 73, 0,110, 31, 64, 94,119,155, 17, 94, 8,178, 82,243, 73,143,104,213,180,243, 15, 69,180,120,205, 20,180,252, 13,149,
-124, 82, 52, 31, 23,238,162,145,193,200,181, 88,246, 8, 63, 83,247,136,247,225,102, 81, 81,209,240,162,162, 71, 58, 55, 33, 33,
- 63, 63,255,133, 71, 41,104, 54,155, 47,171,213,234, 65,143, 64,170,161,169,215, 38, 88, 57, 45,155,133,133,229,191, 3, 5,208,
- 72,193,187,225, 29,176,158, 71,131,115, 44, 21, 57,117,166,228,233,168,230,104,222,135,254,190,158, 54,158,106,110, 61,255, 68,
-243, 23,141,108,220,162,254, 59,167, 45, 15,247,199,104, 89,159, 71,139,133,133,133,133,133,133,229,159,227,228, 29,246,135,216,
- 19, 64, 52, 30,142,190, 69,215, 50,162, 13,134, 62,109,153, 73,209,156,240,233, 73, 86,147,213,100, 53, 89, 77, 86,147,213,100,
- 53,255,115,154, 53, 52,244,236,212,164, 58,255, 55,107, 22,223,227, 64, 75,198,104,253,157, 6,140,213,100, 53, 89, 77, 86,147,
-213,100, 53, 89,205,255,158,230,147, 76,131,179, 14,217,174, 67, 22, 22, 22, 22, 22, 22, 22,150,150,209, 96,212,141, 53, 90, 44,
- 44, 44, 44, 44, 44, 44, 44, 45,195, 29,247, 31, 81, 21,141, 63, 31, 85,181, 21,104,250, 17, 60, 15,177,124,249,114, 78,251,246,
-237,229, 66,161,176, 99, 74, 74, 10,103,198,140, 25, 45,158, 72,176,106,237, 6,142,143,143,143, 28, 64,199,226,210, 74,206,203,
-175,188, 77,177,231,139,133,133,133,133,133,133,229, 9, 98,100,181,177,170,121,125, 16,225,178, 41,162,181,100,201, 18,152,205,
-102, 25,128, 9,193,193,193,159,234,245,122,253,158, 61,123,168,234,108,225,205,226,253, 5,243, 96, 50,153,100, 0, 38,184, 56,
-217,125, 74,211,180,126,239,161,115,212, 51,163,250, 17,246,188,177,176,176,176,176,176,176, 60, 33, 76,171,243,186,213,102,163,
-197,227,241,184, 28, 14,167,173,217,108, 30, 46, 22,139, 79,232,245,250,179, 45, 49, 89, 53,154, 20,135,211,214, 98, 54, 15, 23,
-137,196, 39,180,218,170,179,172,201, 98, 97, 97, 97, 97, 97, 97,121,130,176,110,102,228,225,195,135, 27, 52, 56, 66,161,144, 19,
- 28, 28,220,207,199,199,231,124, 96, 96,160,209,203,203,235, 39,169, 84, 42,107, 97,197, 56,237,253, 2,250,121,184,187,158,239,
-218,214,221,232,226,226,242, 19,159,207,151,177,231,139,133,133,133,133,133,229,191, 73, 99, 94,228, 49,166,102,166,225, 67, 79,
-249, 32,132,216, 52, 70,171,139, 90,173,222, 56,102,204,152, 94,115,230,204, 17,112,185,220, 86, 50,153,172,163,147,147,211, 67,
- 81,177,151, 94,122,137,178, 73, 51, 63,111,227,210,241, 93,122,157,127,191,135,128,207, 69, 43,153, 76,214, 81,169, 84, 62,164,
-233, 61, 87, 77, 0, 0, 32, 0, 73, 68, 65, 84, 57,233,229,215,216,113, 91, 44, 44, 44, 44, 44, 44, 44,143, 43, 53,227,178, 70,
-214, 50, 93, 0,154,232, 58,236,209,163,135, 40, 43, 43,171,171, 78,167,115, 17, 8, 4, 11,162,162,162,130,199,141, 27,135,235,
-215,175,211,193,193,193, 30,197,197,197,179, 75, 75, 75, 79, 86, 85, 85, 93,103, 24, 38, 88, 36, 18,157,222,181,107,151, 28,192,
-157,134, 52, 59,117,233, 46,202,202, 72,125,160, 57,125,252,224,224, 23,230, 14, 7,115,116, 61, 61,184,179,183, 71, 70,145,118,
-118, 65,113,249, 73,109,149,230, 58,205,144, 96,145, 72,116,250,135,111,183, 52,170,201,194,194,194,194,194,194,194,242, 15, 82,
- 99,172,162, 81,231,145,106, 60,224,126,152, 46, 50, 50,242,161,168,145, 80, 40,252, 42, 57, 57,185,175,131,131, 67, 91, 62,159,
- 79, 63,247,220,115,162, 73,147, 38,161,176,176,144,209,104, 52,220,144,144, 16,215,171, 87,175, 14,183, 88, 44,253,237,236,236,
-180,101,101,101, 78, 6,131,225, 46,128,217,141, 84,228,171, 59, 73,241,125, 29,237, 29,218, 10,249, 92,122,214,212, 73,162,247,
- 23, 60, 5,202, 16,203,208, 5,197,220, 79,187,217,185,174,189, 80, 53, 60,217, 68,247,175, 82,137,181,249,229, 6,107, 52, 89,
- 88, 88, 88, 88, 88, 88,158,112,234,243, 34, 79, 16, 77,230,209, 26, 84,221, 39, 90,251,193,185,219,157,157,157,221,228,114,121,
-224,180,105,211, 56, 78, 78, 78,136,137,137, 97,170,170,170, 56,124, 62, 31,124, 62,159, 59,120,240, 96,185,197, 98,145, 30, 57,
-114,132,186,119,239, 94,161,217,108,254,180,184,184,248,106, 35, 21,217,222,206, 78,228, 38,177, 19, 6, 30,122,123, 0,199,185,
-125, 49,112,252, 99,134,104, 10, 56, 60,134,192, 73,198,112, 87,247,167,228,249, 42, 95,233,172,221,133,212, 31,247,202, 10,205,
-102,243,167,149,149,149, 87,217, 75,144,133,133,133,133,133,229, 95, 77,125, 94,228, 73,161,118, 30,173,135, 34, 90, 13, 58, 71,
- 87, 87, 87, 74,175,215,187,249,250,250, 78,115,118,118,158, 44,149, 74, 93, 7, 12, 24, 32,161,105, 26,132, 16,168, 84, 42,166,
-117,235,214,204,174, 93,187, 44,231,206,157,203,126,227,141, 55,198,204,156, 57,243,246,136, 17, 35, 56, 71,142, 28, 97,234,211,
-180,179,119,160, 44,218, 10, 55,239,182,129,211, 58, 57,147,201,190, 42,147,235,162, 40,169,132,151, 86, 4,226,196, 3, 92,124,
- 25, 78,199, 8,102,217,234, 19,150,175, 79,166,102,191,179,104,217,152,215,167, 78,184, 29, 30, 49,130,115,242, 68,253,154, 44,
- 44, 44, 44, 44, 44, 44, 44,255, 48,211,112, 63,170, 85,243, 10,224,254, 96,248, 6,141, 86,223,190,125,169,132,132, 4,202,199,
-199, 71, 90, 92, 92, 28, 4, 96,237,252,249,243, 67, 9, 33,180, 68, 34,225, 74, 36, 18,250,183,223,126,211,254,252,243,207,231,
-204,102,243, 11, 70,163,177,212,215,215,151, 74, 75, 75,107,112,182, 64,143, 94,189,169, 91,113,215, 41,111,159,182,210,226, 34,
-117, 16, 5,178, 54,231,125,143, 80,190,166,148,134,135, 51, 23, 10, 23,122,213,190, 82,237,251,191,220, 56,103, 54,155, 94, 0,
- 80,234,229,225, 78,101,231,230,177,233, 30, 88, 88, 88, 88, 88, 88, 88, 30,103,163, 85,151,173,141, 62,235,240,252,249,243, 4,
- 0,201,201,201,161,205,102,179,114,224,192,129,246, 92, 46, 23,142,142,142, 92,173, 86,203, 84, 85, 85,113,157,156,156,114,249,
-124,254, 15, 85, 85, 85,165, 99,198,140,161,246,239,223,223,168, 33,186,122,233, 34, 1, 64,178,179,179,104,198,172, 87,206,232,
-215,218,158,103, 49,129, 9,233,203,213, 84, 82,140, 92,151,198, 13,112, 23,229, 10, 4,252, 31,204,102, 83,233,216,200,145,212,
- 47,135,163, 89,147,197,194,194,194,194,194,194,242, 56,211,224, 24,173, 38,211, 59,104,181, 90,123,129, 64, 16, 30, 26, 26,218,
-186,170,170,138, 89,178,100, 73,214, 23, 95,124,177,227,238,221,187,102, 59, 59,187,182, 18,137,228,205, 9, 19, 38, 56,237,223,
-191,159,244,239,223,191,110,132,172,222,167,123,235,116, 26,123,145,128, 31,254,102, 79, 69,235, 44,147, 61, 19,248,230,149,172,
-129,139, 47,236,248, 37,129,103,238,228,160,107,235, 32,164,222,156, 48,225, 89,167, 95, 14, 71,147,222,189,123, 89,165,217, 66,
- 88, 77, 86,147,213,100, 53, 89, 77, 86,147,213,252,103, 53,159,116,166,161, 78,106, 7,192,138,204,240, 34,145,104,128,183,183,
-119,191,132,132, 4,250,226,197,139,229, 28, 14,103,211,136, 17, 35,126,218,183,111, 95, 79, 7, 7, 7,151, 86,173, 90,185,158,
- 58,117, 42, 12,192,158, 63,254,248,195,170,232,147, 68, 36, 24,208,213, 75,213,111,235, 13, 66,127, 27,115,167,156,230,138, 54,
- 13,126,250,233,159,222,216,177,179,167,135,147,194,165,171,187,210,245,200,145, 99, 97, 0,246, 92,188,120,137,141,104,177,176,
-176,176,176,176,176, 60,238, 38,107,107,125,255, 55, 26,209, 18, 10,133,158, 92, 46, 55, 40, 59, 59, 59,227,200,145, 35, 9, 61,
-122,244, 24,158,145,145,177,156, 16,146, 46,149, 74,167,101,101,101,221,201,202,202, 50,234,116,186,233, 54, 84,198, 19, 28, 65,
- 80, 76,174, 46,227,243, 83,183, 18, 58,245, 30, 54, 60, 63, 63,119, 57, 77, 72,186, 80,170,156,150,156, 89,120,231, 82,129,193,
-168,215,219,164,201,194,194,194,194,194,194,194,242,216,209, 84, 68,203, 68,211,244, 74,131,193, 96,255,203, 47,191,228, 68, 68,
- 68, 24, 0,224,171,175,190, 98,166, 78,157,122, 46, 37, 37,101,200,237,219,183,135,187,185,185,157, 6, 64,165,166,166, 90, 19,
-125, 50, 49, 12,189,210,104, 52,216,159,250, 45, 54,103, 64,191, 78, 6, 0,216,252,229,122,230,185,105,115,206,165, 36, 38, 12,
- 73,142,191, 54,220,205,205,237, 52,109,225, 81,121,249,233,108, 68,139,133,133,133,133,133,133,229,113,166,102,198, 97,237,255,
-155, 54, 90, 70,163,177,208,104, 52, 2, 64,105, 68, 68,196, 67,235,190,249,230, 27, 2,160, 10,192,222,226,226, 98, 91, 42, 83,
-168,211,233, 0,160,116, 64,191, 78, 15,173,216,189,245,139, 7,154,154,202, 10,246,180,177,176,176,176,176,176,176, 60, 73,102,
-235, 47,112,216,227,194,194,194,194,194,194,194,194,210, 34,166, 53,244, 63,133,134,103, 14,156,180,225, 3,154, 51,251,224, 36,
-171,201,106,178,154,172, 38,171,201,106,178,154,255, 57,205,166,180, 79,226,201,163,222,193,240,132,252,253,163,159,216,169,175,
-172, 38,171,201,106,178,154,172, 38,171,201,106,254,219,113,199,195,233, 29,220,129,251,153,225,121,236,177, 97, 97,121,178, 33,
-123,193, 69,169,191, 47, 8,241, 0, 87,152,135,188,155, 41,212, 71, 96, 90,172,169, 14,242,129,196,236, 10,139,184, 16,234,184,
-212,150,106,178,176,176,252,251,112,235, 51, 99, 44,197,225,110,162, 8, 3,157, 58, 81, 36,208,165, 75, 11,242, 50,254,139,222,
- 34, 15, 13,140,209, 98,141, 22, 11,203,147, 78, 97,128, 31,120, 88, 6, 14,220, 65, 76,247,224, 28,180, 12,184, 21,223, 98, 77,
- 1,179, 4, 52,199, 11,196,148, 12, 23,255,229, 64,210, 45,246, 96,255,251,152, 61,235,117,114, 59,254, 50, 50, 51,115,209,182,
-157, 59,252, 2,250,224,139,245, 27, 41,246,200,176, 88,247,171,140,218, 26, 62,106,146,131, 68,170, 0, 0, 48, 22, 51,190,153,
-219,245, 87,139,197,178, 29,192,126, 0,186,255,250, 33,250,127, 31, 12,207,231,243,213, 0, 24,177, 88,188, 15,213,161, 53, 22,
-150,191, 9,247,234,235,140,169,190,238,108, 65,206,227,241, 22, 75,165,210,223, 68, 34, 81,129, 72, 36, 42,144,201,100,191,241,
-120,188,197, 0,228,143, 77, 27,247,191,142, 82,112,232,225, 70, 51,227,121,236,102,153,139,214, 64,251,129, 99, 25, 65,190,233,
- 32,111,145, 38,143,138,208,155, 24,239, 31,174,104, 93,171,140,150, 64, 16,180, 72,179, 22,118, 2,129,224, 24, 0, 39,246,242,
-124, 60,200, 72,141,199,145,195,171,177,228,147, 41,248,110,235,116, 36,221,190,212, 34,189, 64,160,123,119, 30,111,126, 0, 48,
- 24, 0,107,216,254,237, 80,100,218,201, 67, 63, 20, 30,218,245,101,225,143,171,167,147, 3,203, 34,177,126,253,250,240, 41, 83,
-166,252,224,237,237, 93, 8,224, 25,214,104,253, 63, 99, 54,155, 93,138,138,138,168,237,219,183, 71,169, 84,170,123, 60, 30,239,
- 61, 0,130,255,202, 1,151,203,229, 23,148, 74,165, 90,165, 82,169,149, 74,229,181,166,202,255,165,248, 57, 59, 59,103, 56, 56,
- 56, 36,215, 46,116,238, 60,182, 79,251,190, 47,124,232, 24, 52,122, 96, 11,245, 5, 60, 30,239, 61,149, 74,117,111,251,246,237,
- 81, 57, 57, 57,148,217,108,118,177, 97,251, 1,246,246,246,183, 47, 95,190,188,168,168,168,104, 96,214,165,111,156,243, 47,111,
-113,206,248,125,245,160,152, 35, 27, 22,217,217,169,110, 1, 24,240, 88, 28, 73, 61,227, 10, 14, 55, 44, 33, 79, 43,205,171, 48,
-187,198,166,107, 21, 0,119, 16,140, 45,248, 17, 83,206,184, 2,100,240,141,108,157,236, 66,137,179,235, 31, 41, 6, 37, 56,156,
- 48,232, 41,183, 22, 55, 56, 28,206,235, 12,195, 12, 21, 8, 4,111,178,223, 80,143, 7, 34,145, 0, 32, 4,114,153, 24, 0, 1,
-167,133,214, 72,200,225,244,189, 16, 21,181,100, 65,231,206,179, 3,128, 81, 13,152, 45, 10,192, 27, 1, 1, 1, 71, 1, 60,247,
- 8,119,231,115,127,127,255, 28, 0,115, 30, 85,187,212,173, 91,183, 62, 97, 97, 97, 31,118,237,218,117,224,163,210,252, 55,145,
-127,225,171, 95,242,206,109,112,201, 61,191,209,165, 44,245,236, 27,238,174,246, 76,106,106, 42, 70,142, 28,137, 47,191,252, 82,
- 26, 28, 28,188, 3,128,199,127,224, 86, 10,169,249,129,143, 90, 99,180,108, 50, 90,227,125,209,119, 98, 27,156,121,214, 23,149,
- 19,218, 64, 51,185, 13,206, 61,237,139,193,205,169,141,163,163, 35, 6, 12, 24,192,205,201,201,145,204,155, 55,239, 67,177, 88,
-156, 6, 96, 88,115,180, 36, 18, 73,140, 84, 42,205,226,241,120, 15,213, 69, 42,149,198,200,100,178, 44, 30,143, 55,164,118,185,
- 66,161,184,160, 84, 42,213, 10,133,226, 90, 3, 70, 40, 70,169, 84,170,229,114,121, 76,237,114, 30,143, 55, 68, 46,151,103, 43,
- 20,138,186,229,131, 21, 10, 69, 86,221,242,134,224,243,249, 94, 89, 89, 89, 46,217,217,217, 46, 66,161,208,181,118,121,102,102,
-166, 75, 86, 86,214, 67,229,182,192,227,241, 6,203,100,178, 44,169, 84, 26, 83, 95,121,221,125,106,136, 90,199,110,176, 53,229,
-182, 54, 60, 17, 17, 17,231,242,242,242,188,237,236,236,236,106,175,112, 80,217, 13,251,223, 55, 27,231,142, 30, 17,241,186,115,
-224,152, 78,205,212, 31, 38, 22,139,211,230,205,155,247, 97, 78, 78,142,164,119,239,222, 92, 14,199,166,223, 19,225,163, 71,143,
- 62,160, 86,171, 61,187,116,233,194,181, 88, 44, 72, 56,184, 24,210,184, 55, 33, 78,219,140, 86,146, 66,222,189, 95,151,123, 69,
- 12,234,126, 0,255,240, 96, 80,178, 55, 80, 0,138, 25,192, 16,226,124, 59, 71,239, 60, 50,234, 25,222,245, 44,157,179,153,166,
- 29, 0,238, 32,242,157,143,168, 89,154, 60,115,127,134, 16,215, 83,233,124,231,176,103,103,115, 79,167,243,156,205, 52,237, 8,
- 14, 6, 54, 71,179,246,229,207,229,114,231,174, 94,189,154, 3, 96, 22, 0,225,127,201,208,132,122,192,115,112, 59,238,149, 16,
-119,244,125,132,178,193,213,247,187, 95, 75,133,182,125,119, 20, 83, 95,219,138, 14, 1,189, 90,164, 99,100,152,164,221,169,169,
-199, 39,183,107, 23,185,160,115,231,151,234, 49, 91, 20,128, 5,203,151, 47,127, 33, 33, 33,193,185, 77,155, 54,175, 61,162, 31,
-253,235,150, 47, 95,254, 78, 66, 66,130,135,175,175,239,199, 54,106, 54,216, 46,217,219,219, 15,219,182,109,219,220,145, 35, 71,
-190,222,173, 91,183, 78,143, 66,243, 95,204,151, 55,110,220,240, 94,189,122,245,187, 83,167, 78,173, 0,128, 33, 67,134, 8, 0,
-244,110,113,123, 71,136,144, 16, 18, 70, 8, 25, 73, 8, 25, 66, 8, 9,173,254,187, 71,245, 50,146, 16, 18, 94,231,181, 71,245,
-182, 53,235,123, 54,160, 49,178,238,118,181,182,169,251,255, 67,127,215, 99,180, 70,226,254, 88,173,145, 15,237,192,225,195,135,
- 73,237,215,186, 76,240,197, 71,179,251,120,106,111, 31,218, 73, 52, 89,169,164, 52,241, 58,185,190,245, 51, 50,187,135,179,246,
-249, 54,248,220,246,227, 69,200,249,243,231, 73, 66, 66, 2,209,104, 52,228,206,157, 59,164,103,207,158, 58,169, 84,122, 10,128,
-175, 45, 98, 10,133, 66,125,234,212, 41, 18, 17, 17, 81, 46,151,203, 87,213,220, 92, 74,165, 82,125,254,252,121, 18, 17, 17, 81,
-174, 80, 40,214, 1,224, 2,192,211, 79, 63, 93, 64, 8, 33,206,206,206,185,245,233,141, 30, 61,186,148, 16, 66, 84, 42, 85, 77,
- 87, 19, 87,161, 80,172,155, 57,115,166,230,234,213,171,196,222,222,190,166,156,163, 84, 42, 87,205,154, 53, 75, 19, 27, 27, 91,
-187,188, 81, 28, 28, 28,178,104,154, 38,135, 14, 29, 34, 46, 46, 46,185,181,110,230, 44,154,166,201,129, 3, 7, 26,172, 91, 99,
-129, 2,185, 92,190,114,242,228,201,149,233,233,233,196,209,209, 81, 93,171,124,213,148, 41, 83, 42, 51, 51, 51,137,147,147,147,
- 85,117,116,116,116, 84, 95,184,112,129,140, 27, 55,174,162,246, 49,117,116,116, 84, 95,188,120,177,166,124,165, 53, 13,153,135,
-135,199,107, 46, 46, 46,185, 46, 46, 46,185,118,118,118, 75,221,221,221,243, 11, 11, 11, 9, 33,132,180,109,219,182,160,118, 36,
-203, 37, 56,234,173,205,123, 47, 94, 62, 27, 95, 92,216,121,232,235, 43, 85,157, 71,171,108, 56, 6,190, 82,169,244,212,192,129,
- 3,117, 89, 89, 89,164,170,170,138,196,197,197,145,243,231,207,147,187,119,239, 18, 0,214,204,177, 85,200,229,242, 28,131,193,
-192, 24, 12, 6,166,176,176,144, 46, 40, 40,160, 19, 87,185, 19,242, 45,255,193, 82,118, 96, 20,201, 63,187,140, 81,202,165,217,
- 0, 20,255,152,209,218, 24,228, 69,182,248,239,190,181,216, 59,241,236,242,167,204, 36,253, 52,217,249,146,179,249,204, 91,158,
-247,200,166,128,159,201,150,192, 86,205,210,220, 20,184, 51,238, 3,239,164, 13, 31,191, 97,206,200,200, 32,243,167, 60,101, 57,
- 49,219, 51,133,108, 14,216,219, 28,205, 90, 76, 28, 59,118,172, 38, 51, 51,147, 4, 5, 5, 85,113,185,220,169,255, 37,147, 21,
-238, 39,204,137,251, 97, 62, 51, 42, 88, 90,252,136,204, 86,176,139,139, 75,209,247,223,127, 79, 20, 10, 69, 65,115,205,214,248,
- 49,131,136,174,252, 20, 25, 19, 25,218,232, 61,242,236,179,207,146,176,176, 48, 50,123,246,236,166,238, 37, 42, 0,136,218,222,
-185,243, 1,102,252,120,122,123,231,206, 7, 2,128,168,106,131, 69, 1,120,119,197,138, 21,177,102,179, 57,246,187,239,190,139,
-141,138,138,138, 5, 48,191,133,199,226,139,207, 63,255,156,152,205,102,242,221,119,223,145,168,168, 40, 2, 96,125, 75,218,165,
-154, 72, 86, 72, 72,200, 91,251,247,239,191,156,148,148, 84, 24, 25, 25,185,178,115,231,206,170,230,106, 62,142,200,229,242,246,
-157, 58,117,218, 17, 20, 20,148,217,165, 75, 23, 99, 96, 96,160,222,207,207, 47, 61, 56, 56,248,123,145, 72,228,219, 76,217, 94,
-125,251,246,165,207,156, 57, 67,198,142, 29, 75,106,153,144, 70,105,204,139, 16, 66, 66,223,125,247,221,247, 0,144,119,223,125,
-247, 61, 66,200,200,106, 63, 49,178,246,223,117, 95,107,204, 83,205,255,245,105,212, 44,245,105,214,247, 25,117, 62, 7, 13, 68,
-178,166, 85,215,251,207,157, 59,124,248,240,192,195,135, 15,159,169,187,115,207,180, 65,159,217,125, 60,117,186,194, 60, 18,255,
-217,155,228,183, 48, 47,114,126,144, 27, 73,158, 59,150,228,253,176,142,204,232,106,175, 29,223, 6, 97,182, 26,173,216,216, 88,
- 18, 27, 27, 75,174, 93,187, 70,210,210,210, 72,121,121, 57,249,241,199, 31,105, 71, 71, 71,157, 72, 36, 90, 14, 64, 98,141,152,
- 82,169, 84, 19, 66,136,193, 96, 32, 75,151, 46,213, 87, 71,170, 92, 85, 42,149,154, 16, 66,202,202,202,200,242,229,203,245, 42,
-149, 42, 14,128,135,147,147, 83, 86,106,106, 42,113,117,117,173,215,204,216,219,219,171,147,146,146,106,140,147,167,189,189,125,
-252,193,131, 7, 77,132, 16,146,157,157, 77, 28, 28, 28,212, 0, 92, 29, 29, 29,175, 31, 62,124,216, 68, 8, 33,185,185,185, 53,
-229, 86, 25, 45,157, 78, 71, 78,156, 56,241, 80, 29,106,202,143, 30, 61,250,144, 1,179, 2, 87,149, 74, 21,251,227,143, 63, 26,
-105,154, 38,241,241,241, 53, 38,209,213,206,206,238,218,222,189,123,141, 52, 77,147,196,196, 68,171,205, 96,235,214,173, 11, 8,
- 33,196, 98,177,144,205,155, 55, 27,106,142,105, 77,185,209,104, 36, 95,125,245,149, 65,169, 84,198, 2,104, 52,250,230,228,228,
-148,107, 52, 26, 73, 89, 89, 25,233,217,179,167,230,252,249,243,164,162,162,130, 16, 66, 72,235,214,173, 11, 0,192,127,224,212,
- 79, 47,223,209, 84,188,252,206,198, 61,190,161,207,127,118,252, 74, 78,246,182,253, 49,177, 78,193,163,159,178, 38,168, 41, 18,
-137,150,187,187,187,235,255,248,227, 15,218,100, 50,145,204,204, 76,114,237,218,181, 7,215,216,205,155, 55,173, 50, 90, 60, 30,
-111,241,229,203,151, 77, 52, 77, 51, 69, 69, 69,116, 65, 65, 1, 93, 80, 80, 96,169,107,180,200,183,124, 82,116,244, 85, 18,189,
-117,142, 81, 32, 16, 44,254,103,162, 89,224,146, 45,254,163,201, 22,255,216,239, 39, 59, 21, 85, 94,219, 69,200,175,115, 72,202,
-167,109,200,226,167, 20,149,204, 22,255, 88,178, 37, 96, 60,249,104, 32,207, 38,205,173,129,163,200, 22,255,216,207,159,241, 41,
-190, 30,123,149,156, 57,115,134,124,181,110, 5,153, 29,238, 89,197,108,241,143, 37,155, 2,199,217,162, 89, 27,145, 72,116,231,
-220,185,115,228,236,217,179,228,227,143, 63, 38, 82,169, 52,243, 81, 68,245,200, 38, 63, 31,242,181,223, 64,242, 77, 7,119,242,
-251,192,199,110,130, 79,168, 7, 60,135,250, 9,179,139,174,239, 39,164,228, 46,201, 95, 21, 68,158,242,231,183,212,108, 5,187,
-184,184, 20,166,167,167,147,252,252,124,178,102,205, 26,162, 84, 42,155,101,182,198,143, 25, 68,116,101, 39, 27, 53, 90,163, 71,
-143, 38,107,215,174, 37,102,179,153,244,234,213,203,154, 31, 45,127, 49, 91,254,192,104, 0,239,173, 92,185,242,129,201,218,184,
-113, 99,236,205,155, 55, 99,189,189,189,143,180,224, 88,172, 95,185,114,229, 3,147,181,113,227, 70,114,243,230, 77,226,227,227,
-147,213,146,118,105,232,208,161,159,166,165,165, 85, 44, 92,184,112,207,128, 1, 3, 62,187,126,253,122,118,116,116,116,108, 72,
- 72,200, 83,205,213,124, 4, 81, 29, 94,117,100, 71, 72, 8,225, 19, 66,106,204, 43, 15, 0,191, 38,160, 96, 13,147, 39, 79,150,
-246,233,211, 39,118,210,164, 73,218,239,191,255,158,164,167,167,147,184,184, 56,178,114,229, 74,242,225,135, 31,146,111,191,253,
-150,140, 27, 55,174,170,103,207,158,151,199,143, 31, 47,182,161,154, 65,190,190,190,229, 7, 14, 28, 32, 59,119,238, 36, 2,129,
- 32,218,218, 13, 27,243, 34, 13,153,169,134, 12, 86,221,117,141, 24,177, 70, 13,155, 21,159,247,192, 84, 53,112,206, 30,138, 72,
-252, 30, 25, 25, 57,240, 47, 95, 62, 4,159, 76,155,247,169, 56,237,251, 53, 80,255,248, 37,184,101,106,240, 43,139, 97, 56, 23,
- 13,243,185,131,120,161,119,111,137,132,162,150,216,122,193, 8,133, 66, 8,133, 66, 8, 4, 2,104,181, 90,228,230,230,162, 95,
-191,126,156,107,215,174,137, 95,123,237,181, 57, 18,137, 36, 19,192,152, 38,239,102,234,126, 68,250,194,133, 11,120,245,213, 87,
- 69, 59,118,236,232,226,236,236,124,131,166,105, 33, 0, 36, 38, 38, 98,194,132, 9,162, 93,187,118,117,244,240,240,184,102, 50,
-153,164, 34,145, 8, 92, 46,183, 65, 61,161, 80, 8,179,217, 44,234,208,161, 67,220,141, 27, 55,130, 35, 35, 35,249, 25, 25, 25,
- 72, 77, 77,133,217,108, 22,250,249,249,221,188,118,237, 90,151,145, 35, 71,242,179,178,178,144,145,145,241,160, 30,214,212,215,
-104, 52, 66, 36, 18,161,118,151, 22, 69, 81, 48, 24, 12, 16, 10,133, 86,107,241,120,188,193, 1, 1, 1, 55,111,220,184, 17, 50,
-122,244,104,193,213,171, 87,145,157,157, 13,154,166,133,129,129,129, 55,111,220,184,209, 53, 42, 42, 74, 16, 23, 23, 7,181, 90,
- 13,107,187,208,106,222,119,227,198, 13, 76,154, 52, 73,120,236,216,177,174,238,238,238,113, 22,139, 69, 8, 0, 55,111,222,196,
-132, 9, 19,132,199,143, 31, 15,105,213,170, 85, 92, 19, 93,137, 92, 0, 48,155,205,120,237,181,215,100, 74,165, 18, 89, 89, 89,
- 96, 24, 6, 52, 77, 3, 0,138, 75,139,111,222,184, 25,159,248,194,196,103, 6,234, 76, 6,195,197, 43, 49,183,219,182,246,241,
-162, 40,210,186,137,170,142,145,201,100,153,171, 86,173,122, 43, 61, 61, 93, 20, 16, 16,192, 73, 73, 73, 65,101,101, 37, 4, 2,
-193,131,107,204,218,253, 22, 10,133,131,130,130,130,120,122,189, 30, 12,195, 0, 0,225,112,234, 31,177, 34, 46, 59,135, 64, 87,
- 11, 95, 34,145, 12,250, 71,190,189, 43,130, 28,193, 96,104, 70,161, 81, 36,178,243, 82,200,221,253,128,204,179,104,227, 44, 2,
-151,195, 21, 95, 77,213,202, 0, 50, 20,222, 69,142,182,105, 50, 67, 83, 11,140, 34,179, 67, 71,185,135,151, 55,138,139,139,209,
-170,109, 0,244, 66,103,225,133,187, 85,114, 80, 54,106,254, 73,255, 14, 29, 58,184,181,111,223, 30, 69, 69, 69, 8, 9, 9,129,
-189,189,189, 61,128,161,205,254,210,249,206, 71,132, 10,244, 5, 56,171, 64, 83, 31,195,204, 91,134,187,133, 33,100, 75, 8,255,
-113, 50, 89, 74,185,240,210,174,221, 63,122, 58,122, 7, 2,209, 47,195,213, 78,132,111, 94, 15,113,112, 86,137, 14, 52,211,108,
- 5,187,186,186,158,190,124,249,178,147, 88, 44,198,181,107,215, 16, 20, 20,132, 53,107,214, 56,219,219,219,159,109, 94,100,139,
-128, 80, 13,155,172, 1, 3, 6, 96,214,172, 89,216,177, 99, 7, 28, 28, 28, 48,105,210,164,166,204, 22, 73, 4, 14,125, 30, 23,
-247,221,142,123,247, 14, 79,110,215, 46,114,146,159,223,210,233,207, 61, 55,245,141, 55,222,192,138, 21, 43,112,224,192, 1,244,
-237,219, 23,211,166, 77, 51,103,102,102,110,111,110, 87,213,170, 85,171,102,207,153, 51,167,174,166, 41, 35, 35,227,243, 22,181,
- 75,197,197, 55,227,226,226, 18, 39, 78,156, 56, 80,175,215, 27,174, 92,185,114,219,215,215,215, 11, 64,235,230,106,182,192, 96,
- 81,132, 16, 49, 0,105,245, 34, 3, 32,221,181,107,151,106,244,232,209,202,234, 50, 73,245,210,100,247,126, 80, 80,144,215,157,
- 59,119,114,230,206,157, 27,178, 99,199, 14,137, 84, 42, 69, 89, 89, 25,190,254,250,107,188,247,222,123,160, 40, 10,132, 16,124,
-251,237,183,210,151, 94,122, 41,244,222,189,123, 57, 62, 62, 62,214, 12,105, 17,201,229,242,189, 75,151, 46, 85, 50, 12,131, 5,
- 11, 22, 20,153, 76,166, 89,213,235, 22,218,217,217, 93,194,125,195,221, 24,245,122,145, 90,223,149,135,235, 28,155,200,186,101,
-117,215, 17, 66, 34, 27,211,176,241, 92,212,247,121,209,141,153,173,218,223, 64,131,234,117,145, 64,103, 55, 95,127,148,255,186,
- 23, 18, 30, 5, 9,183,122,225, 81,224,164,220, 68, 43, 49, 31,102, 66,130,155,107,180,106, 22, 62,159, 15,173, 86, 11,154,166,
-241,222,123,239,137, 78,156, 56,225,200,225,112,126,110, 74,167,182, 97, 74, 78, 78, 70, 96, 96, 32,117,232,208, 33,215, 89,179,
-102, 73,106, 62,167,188,188, 28,237,219,183,167,142, 30, 61,234,242,193, 7, 31,200, 27, 51, 51, 20, 69, 65, 32, 16, 96,206,156,
- 57,146, 43, 87,174, 56,120,120,120, 32, 37, 37, 5, 37, 37, 37,144,203,229,152, 51,103,142,228,242,229,203,206, 30, 30, 30, 72,
- 79, 79, 71,121,121, 57,228,114,185,205, 70, 75, 32, 16, 60,180, 13, 69, 81, 48,153, 76, 54, 25, 3,149, 74,181, 51, 54, 54,214,
- 89,165, 82, 33, 46, 46, 14, 22,139, 5, 42,149, 10,179,103,207,150,196,198,198, 58,219,217,217, 33, 49, 49, 17,132, 16, 40,149,
- 74,155,234, 8, 0, 12,195, 32, 49, 49, 17,173, 91,183,198,217,179,103, 93,166, 79,159, 46,174, 41,191,123,247, 46,188,188,188,
-112,246,236, 89, 23,153, 76,182,179, 33, 45,134, 97,144,151,151,135,132,132, 4,164,164,164,160,176,176, 16, 69, 69, 69,168,172,
-172,132,197, 98, 1, 0, 72, 43, 43,162,119,237, 57,116, 67, 34,145, 72,131,252, 58,120,223,140,191, 85, 32,145, 72,164, 62,222,
-222,126,192, 71,156, 70, 12,225,207, 25, 25, 25,142, 47,189,244,146, 32, 63, 63, 31,165,165,165,224,241,120,127,185,182,132, 66,
-235,134, 2, 89, 44,150, 64,177, 88, 76,153, 76,166, 7, 17, 48,161, 80,136,183,118,106, 17,180, 24, 15, 45,207,173, 43, 0,161,
-205, 48, 26,141,129,255,239,209, 44,128, 2,101,236, 0,138, 10,185,148, 82,229,208, 63,114,162, 0,169,199, 0,198, 12,112,120,
- 24,212,217,139,119,224,102,149, 43, 8, 58,195,128, 0, 66,154,158,249, 69, 0, 10, 48,181, 7,168,238, 39,238, 88, 28,251,142,
-125, 93,144,147,147, 3,129, 64, 0,145, 72,132,144,193, 79,243,118,221, 48,187,129, 66, 23,152,224,111,141,230, 67, 97, 71,137,
-100,209,135, 31,126, 40,171,173, 57,117,234, 84,153, 74,165,250,176,217, 38,171, 74,218, 27, 22, 50, 39, 33, 71,219,122,105,116,
-126,224,189, 2,157, 63, 8,153, 11,152,187, 62, 2,179, 53, 72, 36, 18,165, 2,232,215, 34,147,165, 16, 94,220,189,251, 71, 79,
-135, 86,247, 77, 22, 44,122,128, 47,129,155,179, 29,190,121, 43,204,193,217, 78, 98,171,217, 10,118,117,117, 61,117,233,210, 37,
- 39,177, 88,140,216,216, 88, 8, 4, 2,136,197, 98,116,234,212, 9, 91,182,108,113,118,112,112,176,217,108, 17,144,122, 99,190,
- 99,198,140, 33, 3, 6, 12,192,204,153, 51,177,125,251,118, 24,141, 70, 44, 93,186, 20, 25, 25, 25, 86,201, 38, 2,135,150,199,
-197,125,191, 44, 33, 33,249,221,224,224,128, 49, 50,153,195,204, 73,147, 84, 31,124,240,193,225,131, 7, 15,126, 55,114,228,200,
-162, 43, 87,174,172, 5,176,215,198,195, 75, 1,216,184,122,245,234,153, 53,198,237,131, 15, 62,248,246,224,193,131,203, 70,142,
- 28,153,119,229,202,149,185, 0, 54,182,164, 93, 98, 24, 38,250,231,159,127,190, 33,145, 72,164,254,254,254,222,241,241,241, 5,
- 18,137, 68,234,237,237,237, 55,112,224, 64, 78,115, 52,155,131,139,139,203,144, 75,151, 46, 5,225,254,164, 49, 81,141,209,138,
-143,143,183,171,168,168,176,147,203,229,118,238,238,238,138, 26,179, 53,118,236, 88, 59, 30,143,215,232,117,171,209,104, 14, 46,
- 92,184, 80, 53,118,236,216,154,255,113,238,220, 57,108,223,190, 29, 50,153,236,161,247, 70, 69, 69,225,213, 87, 95,181, 55, 26,
-141, 63, 91, 81,221, 41,175,189,246,154,191,171,171, 43, 22, 45, 90,100,200,201,201, 25, 2, 32, 3,128, 42, 60, 60,252,211,248,
-248,248,158,161,161,161,123, 0,116,107,236,222,171,207,139,212, 54, 58,214,148, 53,247,253,214,154,173, 58, 69, 13,230,208,122,
-200,104, 69, 70, 70,158, 65, 3, 51,169, 76, 37,106,136, 64, 67,194,165, 32,229,214, 50, 91, 96,192, 43, 47, 0,213,140, 89, 42,
-245,125, 25, 10,133, 66,112,185, 92, 24,141, 70, 88,251,160,234, 26, 83,160, 84, 42, 33,151,203,161,211,233, 96,177, 88, 32, 22,
-139,107,204, 8,148, 74, 37,248,124, 62,248,124, 62,196, 98,241, 95,162, 73,117,163, 57, 2,129, 0, 50,153, 12,121,121,121,200,
-200,200, 0,195, 48,144,203,229,144,201,100, 16, 10,133,200,205,205, 69,110,110, 46, 8, 33,144,201,100,144,201,100,176,101,192,
- 53, 77,211,245,126,249,155,205,102,155, 34, 90, 22,139, 5,183,111,223, 70,102,102, 38,196, 98,241,131,125, 21,137, 68,184,123,
-247, 46,242,243,243, 33,149, 74,161, 84, 42,161, 82,169,172,214,173,217, 23,133, 66, 1,137, 68,130,210,210, 82,104,181,218, 7,
-199, 84,169, 84, 66, 38,147,161,188,188, 28, 5, 5, 5,141,238, 59, 77,211,200,205,205, 69, 97, 97, 33,178,178,178, 80, 84, 84,
-244,160, 1,170,142, 26,181, 44,176, 83, 81,129,226,226,226, 7,145,200,134, 22,107, 96, 24, 6,149,149,149,184,116,233, 18,197,
- 48, 12,202,202,202,152,194,252,124,122, 70,174, 16, 7, 62,218, 68,126, 60,118, 93,191,235, 72,172,110,223,169, 4,221,198,125,
- 55,117,226,158, 31, 91,240, 79,240, 85,176, 10,102,126, 68,145,198, 44, 42, 52, 9, 84,174,193,225, 64,234, 81,128,195, 3,196,
-246,232,213,177, 13, 50, 74,105, 89,146,218, 40, 6,133, 97,216,232,103,111,149, 38,205, 31, 90, 88,105, 22,165,155,156,149,129,
-157,187, 65,173, 86, 67, 36, 18, 65, 36, 18,161,123,223,112,164, 22,211,210, 91, 57, 58, 41, 8, 34,172,210,252,147,182,114,185,
-188,119,191,126,253,168,218,154, 35, 70,140, 0, 69, 81,157, 0, 4,216,212,200,173,111, 43,132, 73,218, 11, 60, 50,231, 86,158,
-214,227, 64,188,222,111,212,152,167, 29,190, 56, 89, 16,120, 59,223,224, 11, 98,158, 7, 98,234,214, 2,179, 53, 80,161, 80, 28,
-222,176, 97,131,175, 88, 44, 62, 10,160,127,115, 68,228, 18,238,230, 69, 51, 39,122,218,215,152, 44,179, 22,224, 73, 0,190, 4,
-224, 73,224,230,226,132, 37,175, 14,117,144,138,249,251,108, 48,172,187, 54,110,220,232, 92,215,100,213, 44, 33, 33, 33, 88,188,
-120,177,179,131,131,195, 78,107,244, 86,173, 92, 65,202,202,203, 1, 2, 84, 84,104,176,106,229,138,210,154,117, 99,199,142, 37,
-253,251,247,199,204,153, 51,177,108,217, 50, 28, 57,114, 4,189,122,245,194,180,105,211, 16, 26, 26,218,148,116,132, 74,165,218,
- 17, 30, 30,126, 41, 87,161,120, 53,175, 91, 55,225, 41,149,170,124, 72,121,185,202, 39, 62,222,228, 15,220, 4,240, 85,118,118,
-246, 83, 54,152,172,231,148, 74,101,236,144, 33, 67, 76, 10,133, 34,115,205,154, 53, 51,102,205,154,133, 21, 43, 86, 96,225,194,
-133, 95, 3,120, 5,192,251,217,217,217, 30,141,153,172,191,171, 93,250,187,218, 58,154,166,179,246,238,221, 27,106, 50,153,188,
-170,187, 7, 69,101,101,101,202,146,146, 18,133,201,100,146, 49, 12, 35,179,179,179,147, 3,144,190,240,194, 11,188, 91,183,110,
- 5, 90, 44,150,156,198, 52,243,243,243,159, 95,176, 96, 65, 81, 81, 81, 17, 0,160, 83,167, 78, 40, 43, 43,195,252,249,243,241,
-230,155,247, 39, 4,119,237,218, 21,132, 16,168,213,106,172, 90,181, 74,157,159,159,255,162, 21,213,109,215,161, 67, 7,196,199,
-199,227,246,237,219, 39, 1, 48,184, 63,142,181,252,250,245,235, 55, 10, 11, 11,177,115,231, 78,129,167,167,231, 65, 52,144,226,
-165, 49, 47,210, 28, 40,138,138,110,206,118, 53,145,171,250, 34, 98, 13,208,120, 68, 43, 50, 50,146,170,253,250, 80,196,136, 66,
- 92,102,204, 89, 56, 4,119,123, 40,154, 37,229, 82,144, 40, 85, 72,205,202,128, 0, 84,194,163, 50, 90,165,165,165,152, 49, 99,
-134,238,249,231,159, 47,102, 24,230,105,107, 77,129, 74,165,130, 74,165,194,173, 91,183,200,184,113,227,212,107,214,172,209,213,
- 54, 90,201,201,201, 36, 34, 34,162,224,195, 15, 63,212, 52,102,180,106, 34, 90,203,151, 47,215, 13, 26, 52,168, 48, 33, 33,129,
-212,152, 41,185, 92,142, 85,171, 86,233,194,194,194,212, 87,175, 94, 37, 53,101,182, 68,180, 56, 28,206, 3,163, 85,123, 27, 14,
-135, 3,134, 97,108, 50, 90, 85, 85, 85,207,143, 28, 57, 82,157,152,152, 72,106,246, 83,165, 82, 97,205,154, 53,186,161, 67,135,
-170, 19, 18, 18, 72, 77,153, 82,169,180,218, 12,214,124,190, 66,161,128, 82,169,196,173, 91,183, 72, 68, 68,132,122,253,250,245,
-250,218,229,183,111,223, 38, 81, 81, 81,234,202,202,202,231, 27, 51, 47, 53,221,121, 22,139, 5,122,189, 30, 69, 69, 69,200,202,
-202,122, 16, 78,215,201,148, 79, 77,124,118, 84, 23,157, 78,167,189,149,124, 39,179, 83,199, 32, 23,157, 78,167,205,200,204, 76,
- 6, 62, 98, 26,209,126, 58, 56, 56,184,120,198,140, 25,186,210,210,210, 22, 27, 45,161, 80,152,200,227,241, 72,255,254,253,137,
-209,104, 36, 89, 89, 89,230,162,210, 82, 75,192,103,159,145,132,183,222,162, 36, 49, 49, 34,185, 92, 78, 85,107,114, 82, 82, 82,
- 24,137, 68,146,248,255,110,180, 56,140, 27, 40,210,239,143, 59, 26,187,161,163, 38, 8,169,252, 43,128, 73, 3,136,236, 1,145,
- 61,120, 50, 71, 12,239,223,149,251,253,165, 10, 55, 16,166, 15, 4, 34,175, 38, 53,249,196, 21, 96,250,255,154,172,183,239, 55,
-126,182,176,164,164, 4, 92, 46,247,129, 41,146,202,100, 24, 50,230, 5,206,183, 87, 12,110, 0,233, 11,138,235,101,195,189,254,
-206,162, 69,139, 4,165,165,165,224,112, 56,127,106, 74,165,152, 62,125,186, 72,169, 84, 46,180,186,241,219, 27, 40, 0, 95,212,
- 11, 32,111, 38,229,235, 61, 14,222,212,249,207, 91,254,141, 36,184,107, 40, 94, 27,228, 34, 89, 30, 93, 16,124, 35, 75,215, 6,
-160,223,130,197,216,189, 25,102,171,191, 66,161,136,142,137,137,145,142, 24, 49, 2,171, 86,173,146, 73, 36,146,163,205,105,248,
-171, 52,244,172, 79,214,255, 79, 29,183,118, 24, 96,170,186,111,176,106, 45, 5, 26, 6,139,191, 57, 93,110, 54,147,137,214,106,
-234,116,186, 41,175,188,242, 74,241,190,125,251,254, 98,178,196, 98, 49,210,210,210,176,116,233,210,146,146,146,146, 38,191, 20,
-215,172, 94, 21, 27,127,227, 55,124,251,245, 39, 0, 8, 54,172,121, 29, 23,255,216,109, 55,104,224, 0,210,186,117,107, 18, 26,
- 26,138, 25, 51,102, 96,201,146, 37, 72, 74, 74,130,147,147, 19, 94,127,253,117, 12, 28, 56, 16,171, 87,175,110,172,145,138,152,
- 53,107,214,210,236,236,108,255, 95,127,253,149, 87, 88, 88,232,178,122,219,182,242,159,202,203, 75,150,197,199, 39,189,223,177,
- 99,135,119, 59,119,126,177,145,212, 15,245,154,172,153, 51,103,238,202,206,206, 14, 57,121,242, 36,191,176,176,208,107,230,204,
-153, 88,185,114, 37, 22, 46, 92,184, 5,192,107,176,110,194,139,213,237, 18,151,203,125,234,233,167,159,238,162,211,233,180, 73,
- 73, 73,153, 29, 59,118,116,209,233,116,218,204,204,204,228, 51,103,206, 48,205,209,108, 14,197,197,197,247,118,238,220,153, 60,
-123,246,236,144,236,236,236, 64, 0,142,149,149,149,178,202,202, 74,145,209,104,148,216,219,219,219,119,237,218,213,105,218,180,
-105,242,235,215,175, 7,102,103,103,107,170,163, 72, 13, 98, 50,153,146, 74, 75, 75, 35,135, 13, 27, 86, 86, 90, 90,138,206,157,
- 59, 99,212,168, 81,112,115,115,131,135,135, 7, 70,143, 30, 13, 63, 63, 63, 20, 23, 23, 99,226,196,137, 37,133,133,133,195, 0,
-164, 88, 81,221,123,249,249,249,232,211,167, 15, 62,249,228,147,200,103,158,121, 38,161,127,255,254, 21, 29, 59,118,212,122,121,
-121, 5,124,241,197, 23,240,244,244,196,222,189,123,221, 69, 34,209,206,122, 76, 86,131, 94, 4, 64, 97,181,225, 49,214,121, 45,
-108, 98,157,181,219,214,251,183, 21,239,171,107,182,106, 47,127,233, 58,172,255,132, 0,139,183,239,253, 94, 47,244,110, 15,149,
-127, 23, 72,197, 98, 72,132, 66, 72,236, 29, 97, 96, 24,108, 75,203,215, 86, 17,178,208,214,139,167,238, 23, 33, 69, 81,248,242,
-203, 47, 45,189,123,247,214,159, 62,125,122,131, 78,167,243,198,253,172,178, 86,155,130,245,235,215,107,231,204,153,115,163,160,
-160,160,139, 88, 44, 54,214,148,111,216,176, 65,251,194, 11, 47,196,103,103,103,135, 72,165, 82,109, 67,227,179,106, 27, 45,145,
- 72,100, 40, 40, 40, 8,157, 58,117,106,226, 87, 95,125, 85, 37,149, 74, 33,147,201, 32, 18,137,140, 5, 5, 5, 93,102,204,152,
-113, 99,229,202,149, 90,137, 68, 2,153, 76,102, 83,183, 28, 33,228, 47,134,170,118,185,181, 88, 44,150,211, 5, 5, 5, 93,230,
-204,153,115,253,139, 47,190,168,170, 49, 64,181,235,184,122,245,106,173, 92, 46,183, 41,162, 85,243, 62,153, 76,134,117,235,214,
-105,103,207,158,125,163,160,160,160,139, 72, 36, 50,214, 42,175,154, 53,107,214,245,130,130,130, 46, 22,139,229,116, 35,191,198,
-232,138,138, 10,240,120, 60,196,199,199, 27, 4, 2, 1, 56, 28, 14,238,222,189,251,160,241,113,112,112, 8,234,210,169, 99,192,
-255,118,237, 61, 35, 17,136, 68,189, 67,187, 7,166,164,103,100, 19, 66,165, 55, 81,213,253, 58,157,206,251,244,233,211, 27,122,
-247,238,173,255,242,203, 47, 45, 13, 69,182,172,193, 96, 48,156,185,118,237,154, 89, 44, 22, 83,121,121,121, 22, 46,151, 11,154,
-166,137, 33, 52,212,208,233,139, 47,200,173,119,223,165,148, 50, 25, 79, 32, 16, 64, 42,149, 82,199,142, 29, 51,106,181,218, 51,
-255,255, 70, 11, 82, 80,144,220, 41, 48, 40,196,127, 29,166,161, 0, 0, 32, 0, 73, 68, 65, 84, 28, 11,133,228,253,247, 77,150,
-216, 14, 16,219, 3, 98,123,120,122,122,225, 74,154, 86, 1, 14,132,160,173,200, 33, 70,136, 12, 20,164,241,106, 40,248, 66, 9,
-149,159,159,255,192, 16,213, 44,190,237, 3,113, 45, 67, 35, 7, 69, 68,224,194,150, 20, 36,145,142,142,142,188,188,188,188,191,
-104, 6, 5, 5,113,205,102,179,245,169, 93,114,105,119,128,153,153,156,175,119,255,229, 70,149,255, 91,203,190,149, 72,232, 50,
- 32,102, 61,130,219,122,224,173,241, 93,133, 31, 28, 44, 12,190,154,174,109, 11, 46,121, 13,140,198,217,134,122,246, 83, 40, 20,
- 71,175, 94,189, 42, 85, 40, 20, 72, 73, 73, 65,104,104, 40,182,110,221, 42,149, 74,165, 71, 0,216, 52, 30,239,178, 26, 25,154,
- 74,186,247, 59,123, 51,243,227,242, 44, 15,153,172,194, 42,130, 87, 62, 63, 88, 86, 90,161,127,250, 82, 86,195,247, 79, 61, 92,
- 47, 43, 43,139, 88,184,112, 97,113, 97, 97,225, 67, 38, 43, 35, 35,163,230, 75,113, 16,128, 38,127,252,254,254,219,241,144,207,
-150,204,193,213,152, 4, 12,143,124, 19,215,226,238,225,253, 5, 99, 96,167,148,224,244,233,211, 24, 59,118, 44, 62,249,228, 19,
-220,189,123, 23, 63,254,248, 35,181,117,235, 86,234,210,165, 75,212,231,159,127, 78, 53, 49,164, 97,210,178,101,203,112,245,234,
- 85,140, 24, 49, 2,103,207,158, 69, 73, 73, 9,118, 31, 61,122,103,231,157, 59,239,215,140,217,106, 32,245, 67,189, 40,149,202,
-121,203,150, 45, 67, 76, 76,204, 3,205,226,226, 98, 44, 91,182, 44, 27,192,235,182,152, 44, 91,218,165,206,157, 59, 7,236,218,
-181,235,140, 88, 44, 22,133,134,134, 6,166,165,165,101, 3, 72,111,134,102, 69, 75,122,170,138,138,138, 46,108,221,186,245,210,
-224,193,131,165, 83,166, 76,113, 62,112,224,128,163, 86,171,245, 16,137, 68, 46, 70,163, 81,120,251,246,109,238, 79, 63,253,228,
-118,235,214,173, 52,189, 94,127,197,154,227, 81, 80, 80,112, 37, 41, 41,105, 88,231,206,157,111,111,216,176, 33,219,221,221,157,
-153, 54,109, 26, 94,121,229, 21, 56, 59, 59,211,235,214,173,203,236,223,191,127,252,189,123,247,194,181, 90,237, 77, 43,235,250,
-221,103,159,125,118,126,215,174, 93, 24, 53,106, 20, 62,255,252,115,236,222,189, 27,191,253,246,155,228,143, 63,254, 16,110,221,
-186, 21, 2,129, 0,189,122,245, 66, 68, 68,196,144,234,238, 78,107,191,151,174, 82, 20, 21, 77, 81,212,201, 58,175, 87, 27, 91,
-103,195,182, 13,253,221,232,251,234, 84,115,107,157,197,122, 38,181,197, 71,211, 59, 42,180, 23, 38,247, 34,249,211,250, 17,245,
-132, 64,114,110,160, 3,153,218,142,170,154,210,204,244, 14, 58,157,238,193,178,111,223, 62,226,230,230, 86,165, 80, 40,108, 78,
-239,224,230,230,166,174,168,168, 32, 61,122,244, 40,113,118,118,126,144,138,192,221,221, 93, 93, 85, 85, 69,122,245,234, 85,226,
-226,226,242, 32,189,131,151,151, 87, 22, 33,132,248,248,248,228, 54,164,103,177, 88,136,155,155, 91,205, 12, 61,190,131,131,195,
-166,158, 61,123,150,168,213,106,226,238,238,254, 32,117,130,179,179,243,170,208,208,208,186,229, 77,213, 55, 43, 59, 59,155,100,
-103,103,147, 86,173, 90,229,214, 46,207,200,200, 32, 25, 25, 25,196,203,203,203,230,244, 14,206,206,206, 43,235,169, 75,179,234,
-232,237,237,173,214,233,116,164, 79,159, 62, 15, 29, 83,111,111,111,181, 94,175,175, 41,183, 42,189,131, 68, 34,121, 77, 44, 22,
-231,138,197,226, 92,145, 72,180,180,117,235,214, 5,123,246,236, 33,235,214,173,171,153,146, 14,231,160,168,222,237,251,188,248,
-190,115,208,232,121, 45, 73,239,160, 80, 40, 78,185,185,185, 85,237,219,183,239,161,235, 75,167,211, 89,157,222, 65, 34,145,100,
-107, 52, 26, 70,173, 86,155,207,159, 63,175,141,137,137,209,198,199,199,107,211,210,210,116,197, 5, 5, 38,181, 90,173, 43, 47,
- 47, 55,220,184,113,195, 32,149,254, 51,233, 29,200, 86,191,246,100, 83,192,193,123,159,248,222,154, 51, 64,170,191,185,164, 11,
- 33, 63,143, 37,228,200, 43,132,156,126,135, 92,217, 50,141,244,241, 21,209,231,231,183, 74, 38,155,253,127,177, 38, 37, 3,217,
-218,169, 61,217, 20,112,228,206,199,190,183,166,244,247,208,111,251,106, 29,185,124,249, 50,137,143,143, 39, 41, 41, 41,228,200,
-254, 61,164, 79, 91,233,125,205, 77, 1, 7,109, 76,243,208, 87, 36, 18,105,214,172, 89, 67, 46, 93,186,244, 64,243,224,193,131,
- 68, 42,149,106, 1,235,102, 45, 19,128, 34,155,130,198, 88,190,242,255,227,131,161,242,202,226,195,239, 16,114,243,123, 66,182,
- 6, 19,242, 93, 79, 66,246,140, 36,228,208,139,228,210,186,241,164,175,175,192, 76, 54,251,159, 37, 91,130,172, 30,108,207,231,
-243, 43,246,237,219, 71,114,115,115,201,217,179,103, 73, 76, 76, 12, 73, 76, 76, 36,153,153,153, 36, 58, 58,154,240,249,124, 61,
-154,241,216,178,158,174,240, 9,239, 32,200,187,177,188, 47, 33, 7, 38,146,194,157,147, 72,100, 71, 69, 73,175, 86, 45,202, 71,
-215,213,209,209,177, 40, 58, 58,154,164,165,165,145, 51,103,206, 16, 23, 23,151, 34, 0, 86,143,151,141, 28,222,159, 16,227, 13,
- 18, 54,160, 35,233,220,185, 35, 25,216,183, 3,201,185,183,158,132,118,107, 77, 54,109,218, 68,212,106, 53,105,221,186, 53,177,
-181, 98,225,225,225,151, 9, 33,177, 35, 70,140,136, 5,112, 44, 60, 60, 60, 54, 53, 53, 53, 54, 52, 52,244, 18, 26, 79,253,208,
- 32, 67,134, 12, 49, 17, 66,200,136, 17, 35, 8,128,220,240,240,112,146,154,154, 74, 66, 67, 67,141,205, 57,120,214,180, 75, 33,
- 33, 33,189, 7, 15, 30,252,126, 72, 72,200, 60,107,210, 59, 52,161,249,168,146, 80,115,113, 63,249,103, 16,128,238,213, 75, 96,
-117, 25,183, 5,154, 47,242,249,252,109, 14, 14, 14,191,217,219,219,159,230,114,185, 91, 1, 76, 70,243,242,155,113,170, 35,140,
- 39,156,157,157,239,118,238,220, 89, 55,108,216, 48, 50,124,248,112, 50,115,230, 76,194, 48, 12,217,179,103, 15,249,228,147, 79,
- 72, 59, 71, 71,203, 58,160,104, 51,240, 18,254,165, 60, 72,239, 96, 13,227,125,209,247,165,182,212,153,231,219,160,114, 98, 27,
-104, 94,110, 71, 89,147,176, 52,188, 33,163,197, 48, 12, 73, 78, 78, 38, 97, 97, 97, 85, 50,153, 44, 7,214, 39, 44,125, 72,211,
-201,201, 41,198,197,197,229, 47, 73, 52,107,149, 63,148,176,212,197,197,229,130,187,187,187,218,217,217,249, 90,125,154, 78, 78,
- 78, 49,238,238,238,106, 39, 39,167,135,146,123,114,185,220, 17, 78, 78, 78, 57,117,203,121, 60,222, 96, 23, 23,151,172,186,229,
- 13,236, 59,220,220,220,178,114,115,115, 73, 97, 97, 33,241,246,246,206,173,107,192,242,243,243, 31, 50, 96,214,104, 54, 85,151,
- 70,234, 88,175,166, 21,199,180, 57,231,189, 6, 63, 79, 79,207,130,213,171, 87, 19,185, 92,254,208,148,103,255, 1, 47, 47,186,
-124, 71, 83,241,202,130, 77,123,234, 73, 88,106,109,114,208, 97, 50,153, 44, 39, 44, 44,172, 42, 57, 57,153, 48, 12, 67, 24,134,
-105,200,104,213,167,249, 84,247,238,221,139,139,138,138,232,202,202, 74, 75, 86, 86,150, 33, 53, 53, 85,183,100,201, 18, 83, 97,
- 97,161, 94,163,209, 24,227,226,226, 12,238,238,238,133, 0,158,178,245, 28, 53,147,240,186,221,103,100, 75, 96, 95,178, 57, 48,
- 58,241, 67,159,219, 47,246,148, 25, 98, 87,143, 32,228,244, 59,228,210,166, 87, 72,111, 95,225,125, 67,180, 37,224, 40,249,214,
-111, 0, 89,223, 86,104,149,230,182,118,253,201,150,128,163,183, 22,251,220, 30,219,205,217,184,235,251, 45,228,238,221,187,228,
-224, 79, 59, 73,175, 54,213, 38,107,115,224, 9,178, 41, 48,204, 26,205,250,204,214, 55,223,124, 67,238,222,189, 75,126,249,229,
- 23,107, 77, 86,120,125, 70,235,189,112,121,217, 43, 61,197,134,137, 93,133,198,209,193, 2, 83, 68,123,129,165,143, 15,143,238,
-226,206, 97, 2,157, 65, 34,252, 37, 6,178,217,255, 44,217, 28, 56,204,218,122, 10,133,194, 76,212,202,169, 83,119, 17,137, 68,
-133,141, 24,173,240, 38,205,150,159, 40,239,212, 39,131,201,168,206,138, 98, 43, 77, 86, 83,215, 82, 87, 39, 39,167,162,239,190,
-251,142,184,186,186, 22, 90,105,178, 30,104, 70, 69, 70,144,140,123, 71,200, 47,123,150,145,176, 1,129,100,199, 55,115,200,229,
-179, 31,146,145,195,195, 72,120,120, 56, 41, 42, 42, 34,131, 7, 15, 38,182,214, 83,165, 82,237,208,104, 52,177,199,143, 31,143,
- 13, 15, 15,143,221,177, 99, 71,236,185,115,231, 98,165, 82,233,142,154,224, 68, 93,179, 21,248,215,246, 63,188, 78, 68, 43,182,
-178,178,146, 28, 63,126,156,132,135,135,147, 29, 59,118,144,115,231,206, 17,169, 84, 26,219,220,251,200,218,118,105,232,208,161,
-139,210,210,210, 42, 22, 47, 94,188,167,158,132,165,214,106,222,125, 68,245,124, 36,109,200, 63,160,169,144, 72, 36,177, 55,110,
-220, 32,165,165,165,164,163,171, 43,249,140,203, 37,217, 2, 1,201, 21, 8,200, 38,160,228, 95,224,169,166,213,215,117,104,147,
-209,122,132, 39,130,232,245,122, 50,127,254,124,163, 88, 44,214, 10, 4, 2, 91, 31,193,243, 68, 95,132, 78, 78, 78, 23, 92, 93,
- 93,213,174,174,174, 15,153,189,218,229, 78, 78, 78,215,254,229, 55,160,159, 64, 32,200,224,243,249, 15, 63,130, 39, 40,170,119,
-187,190, 83, 22,186, 6, 71, 13,111, 97, 61, 5, 2,129,224, 61,177, 88,172,157, 63,127,190, 81,163,209,216, 98,180, 0, 96,168,
- 84, 42,205,217,190,125,187,238,206,157, 59,230,146,146, 18,203,229,203,151,205, 49, 49, 49,198,143, 62,250,168, 82, 42,149,230,
-160,225,180, 4,255, 47,199,147,172,111, 43,172, 49, 91, 55, 23,250, 36,142,234, 40, 53,109,157, 27, 65,122,183,174, 99,178, 26,
-206,228, 94,191,102,181,217,186,254,129,119, 98,152,159,220,178,108,225, 91,164, 87, 27,201,195, 38,203, 6,205,186,102, 75, 42,
-149, 86,126,248,225,135,182, 68,178, 30, 54,132,219,252,189,201,150,128, 29,247, 77, 84, 19,203, 38,255,175,201,151,254,222,143,
-203,125,212,211, 21, 62, 67,252, 68, 9, 54, 68,178,172,169,103, 87,123,123,251,219, 54, 68,178, 30,104,126,249,229, 6, 50,105,
-194, 80,114,239,246, 62,162, 41, 62, 66,174, 93, 92, 67,198, 69,133,144, 94,189, 66,201,150, 45, 91, 72, 82, 82, 18,233,209,163,
- 7,105, 70, 61, 35,166, 79,159, 30,155,154,154, 26,155,146,146, 18,123,238,220,185,216, 49, 99,198,196, 2,136,168,221, 19, 84,
- 99,182, 76,227,198, 25,186,114, 56,111, 53,161,249,220,244,233,211, 73,106,106, 42, 73, 73, 73, 33,231,206,157, 35, 99,198,140,
- 33,176,237,241, 61,205,106,151, 66, 66, 66,122,135,133,133, 45,236,214,173,219,240, 71,165,249, 31, 52, 90,178,177, 99,199, 50,
- 52, 77,147,225,195,135,211, 95, 0,101, 91, 41, 74,189,149,162,212, 91,128,194,127,123, 68,235,239,126,224,103, 56,128,147,181,
- 11,196, 98,177, 90,175,215, 59,203,229,242,253, 26,141,102, 54,238, 79,139,108,145,230,223, 81, 79, 86,243, 95,161,233, 46,151,
-203, 55,104, 52,154, 49, 98,177,184, 80,175,215,187,218,160,105, 39, 18,137,222, 18,139,197, 97, 90,173,214, 15, 0,100, 50, 89,
-178,193, 96,248, 77,167,211,173, 5, 80,246, 79,239, 59, 89,223, 86, 8,161,176, 59, 8,222,141,205,172,106,179,236,120,137,207,
-220,193,246,153,125,218,201,210,192,103, 62, 7,101,184, 66,189,148, 97,176, 89, 83, 66,133,130,230,191,123, 37, 93,219,250,243,
- 95, 43,125,230,133,201, 51,251,180,149,103,130,224,115,136,180, 23,109,213,172,107,182,100, 50,217,246,170,170,170, 87, 1,252,
-102,235,190,147,189,129, 2, 84,153, 61, 97,230,118, 4,105,228, 17, 62,132,104,193,225,198, 35, 31,106,234,163,219, 38,246, 62,
-170, 95,243,171,175, 54,146,147,191, 30,129, 65, 91,130,188,130, 10, 76,154,252, 50,186,118, 13,129,147,147, 19, 62,251,236, 51,
-180,111,223, 30,159,124,242, 9,213,140,122, 70,200,229,242, 73, 1, 1, 1,109,111,221,186,149,162,213,106,127, 0,112,162,206,
-123,168, 0, 32, 76,202,227,117,209, 89, 44,103,111, 3, 49, 77,104, 62, 39,151,203,231, 5, 4, 4, 4,223,186,117, 43, 65,171,
-213,174, 6,176,155,109,235,158, 12, 77, 14,135,179,214,199,199,103, 92, 90, 90,218,187, 0,118,225, 63,194, 63, 98,180, 88, 77,
- 86,243, 9,212,172,185, 79,200,227, 86,207, 63,205, 22, 51, 27, 20,218,128, 80,217, 16, 48,235,154, 48, 89, 77,107, 74,168, 80,
- 88,120,111,130, 66, 43, 16,228,131,112,214, 54, 97,178,254,127, 77, 38, 64,225,163, 70,218,175,143, 64,168,134,207, 23,123,205,
-215,195,162, 69,139,200,177, 99,199, 32,149, 74,161,211,233, 48,108,216, 48,124,250,233,167, 20,219,134,176,154,255,143,154,255,
- 74,163,197, 99, 15, 3, 11, 75,211,247,202,227, 90, 49,234,141, 20, 35,217, 27,120, 21, 69,220,249,224,160, 13, 96,201, 64,149,
- 37,159,122, 35,195,216, 66,205,203, 40,162,230,128, 11, 63, 8, 45,247,160, 49,230, 83,175, 55, 95,243,145,239, 55, 64,240,209,
-227,123, 94,158, 68,234,154,170,152,152, 24,246,160,176,176, 88,207, 52, 60, 60,211,240,193,255,172,209, 98, 97,121,194,161,158,
-185,109, 2,144, 93,189, 60,182,154, 44, 44, 44, 44,255, 65,195, 5, 10, 13, 15,104,179, 37, 36,216,156,129,118, 39, 89,205,102,
-105,114, 1,168, 0,216,225,126, 14,146,154, 41,189, 77,165,217, 24, 14,192,204, 30, 79, 86,147,213,100, 53, 89, 77, 86,243, 31,
-214,108, 74,251, 73,236,146,172, 47, 51,252,214,127,106,214, 33,171,217,124,134,177,199,147,213,100, 53, 89, 77, 86,147,213,252,
-151,106,254,235, 32,132, 52, 43, 25, 25,203, 63,135,152, 61, 4, 44, 44, 44, 44, 44, 44,143, 29, 33,213,175,238,184, 31,221,114,
-175, 89,241,143,142,209,146, 56,118,112, 7,143,211,153, 98, 72, 0, 0, 16, 14,149, 8, 11, 19,167, 43,190,147,215, 82,109,185,
-135,159, 3,129,112, 47, 5,227, 51,154,220,228, 22, 39, 67,235,232,167, 28,231,234,164,152,148, 95, 92,190, 61, 33, 73,115,192,
-150,109, 85, 42, 31,149,216,193,126,188,193,100,238, 40, 20, 8, 50, 77,101, 21, 91, 75, 75, 83, 42,155, 81, 13,135,198, 86,126,
-244, 17,161, 14,231, 93,163, 4, 82, 19,199, 81, 41,160, 52,208, 16, 77,158,156,241, 45, 75, 35, 63,253,244, 12,177,245,220, 80,
- 28, 12,146, 41, 20,221, 68, 98,105,168, 84, 97,223,129, 33, 64,137, 58, 39,221,104,182,156,163,141,218, 88,194,224,247, 71,113,
-174, 88, 88, 88, 88, 88, 88,254, 5, 70,235, 26,128,145,184, 63, 70,171,233,193,240, 62, 65,253,174,138,197, 18, 95, 0, 96, 8,
- 1, 67,128,170,138,178,216,252,148,152, 97, 0,224,212, 58,228, 56, 95,172,236,198,144,251,235,105, 6,176,152,244,105, 21, 25,
-151,123, 88, 83, 35,153,179,223,216,193,225, 67,198, 69, 70,142,244,239,212,177, 83, 59, 0,184, 25,127,243,222,225,195,209, 73,
-167, 79, 82,251,170, 10,147,127,105,201, 30, 19,136, 63,237,222,189,107,191,152,152,107,159, 0,152,217,210, 35,232,232, 40,159,
-125,226,231,249, 3,134,140, 91, 37, 3,108, 51, 90, 98, 7,251,241,163, 71, 61,213,245,237, 55,166,115, 94,153,255,153,239,213,
-243,191,175,144,187, 7,151, 17,198,124,162, 74, 61,225,143,198, 30,156, 92,215, 63, 54,100,176,126, 40, 57,198, 89,247, 93,111,
-123, 93,201,189, 9,132,161, 39, 80, 20, 5,174, 80,250,147,115,219,126,123,236, 6,205, 45, 5, 96,245,140, 49,165,123, 80,184,
-139,187,215,190, 9, 47,191, 37,150,170, 92,121,224, 10, 0, 80,200, 77,191,141,211,187,151,217,191,249,241, 55, 33,231,227, 50,
- 44,167,126,222,168,167, 4,252,113,218,188, 91,236, 20, 95, 22, 22, 22, 22,150,255, 50,209,213,230, 42,186,238,138, 6,141,150,
- 88, 44,241,189,244,251, 97,135, 95,206,101, 1, 0,194, 67,220,240,254,146, 13, 17, 59,214,199, 36, 1, 64,239,193,145,126,159,
-188,247, 6, 46, 36, 20,128, 16,130,174,237, 29, 49,124,244, 51,214, 25, 15,215,192, 30,227,199, 63,253,252,252,249,243,162,238,
-222,189,155,190,107,215,174, 63, 0,160,255,128, 1,237, 63,251,236,179,103, 87,217, 59,136,126,252,233,231, 28,189,250,246,213,
-230,236,173,216,163,173,167,127,135, 54,147,126,252,118, 3,103,208,176,167, 39,166,163,106,153, 62, 55, 37,199,154,109,157,156,
-156,230,240,249,124, 21,112,255,105,236, 53,152, 76,196, 13, 0, 44, 52,163,176,247,240,175,228, 10,196,180, 72, 36,184, 85,169,
-209,108,175,200,185,189,173, 49, 77,131,217, 28,252,230,235, 47,113,174,167, 20,195, 55,184, 63,119,221,178, 15,192,208,102,251,
-183,222, 91, 50, 62,230,242,143,168, 82,227,140,149,187,198,175, 91,224,233,217,139,251,233, 50,249, 80,138,194,139, 62,189, 95,
- 30,243,201,247, 63,241,187,183, 87,194, 96,102,112, 52,182,184,247,166,181,159,174, 60,191,105,228, 33, 0, 91, 0,156, 2,208,
-164,169,115,112,116,248, 97,206,194,181,242, 42,227,159,179,189,171, 77, 22,190,222,190, 23, 55,178, 24, 4,248, 7,240,220,230,
-172,144,111, 89, 50,237,123,237,253,231,108,177,176,176,176,176,176,252, 87,201,195,195,179, 13,183, 54,105,180, 0, 64, 46,225,
- 33, 41, 53, 31, 0, 96, 39, 1,102,191, 54, 5,197, 69,133,126, 70, 11,131,151,167, 76,198,181,196, 60, 36,165, 21,130, 16, 2,
- 63, 47,171, 31,194, 13, 46,152,238, 47, 79,125,121,224,241, 19, 39,174, 44, 90,184,232,127, 20,133,139, 0,176,101,235,215,189,
- 23,127,184,248,213,201, 83, 38, 15,253,233,167,159, 18, 0, 52,203,104,241, 40,197,134,149,203,151, 10,179,139,244,250, 57,243,
-223,101,230,205,157,179, 14,192,211, 86, 57, 25, 62, 95,149,157,157, 45,231,112, 30, 30,190,246,249,210,119,207, 14, 29,183,234,
- 78,122,102,217,245,227, 7, 15,246, 8, 10, 10, 66,118, 78,126,223, 21, 95,108,238,114,244,184,228,165,202, 10,221, 56,109,209,
-237,122, 31,218, 44,226,243, 19, 62, 94,177,169, 43, 99,215,158,243,254,171, 35, 16,220,206, 3, 57, 5,101, 24, 48, 44,138, 23,
-123,245,106, 4, 96,181,209,170,155, 60,112,188,145, 41,232,242,217,246,203, 67,198,244,241,232,206,225,112,161,209,153, 81, 88,
-110, 0,205, 0,253, 3, 85,120,106,199, 23,188,146, 42,243,216, 37, 63,103,141,189,184, 62, 82,173, 47,207,157, 5, 96, 95,227,
- 31, 67, 28,188, 92,148, 72,202,170,172,215,100, 85,233, 45, 0, 0, 1,151, 6, 5,226,200,222, 95, 44, 44, 44, 44, 44,255,113,
-234,157,117, 8, 84, 63,153,251,240,225,195,245,142,223,161,105,130,164,180, 60, 36,165,229,225, 74, 98, 33, 76,132,143,117, 43,
- 62,198,234,101, 31,162, 68,199,193, 47, 23,178,144,156,150,143,228,180,124, 20,149,106,234,147,120,168, 75,105,213, 50, 73,200,
-218,181,202,149, 17, 3,100,131, 28,236,237,237,239, 36,252,175,106,241, 92,117,224,199,111,102, 9,248, 70, 81,182, 76, 46,235,
-179,119,239,158, 32, 87,103, 23,153, 92,174,120, 71,234,217,229, 27,149,234, 47, 79, 74,111,180,155, 74,226, 18, 16, 21, 53,242,
-169,193,110,110,174,204,244,117,177,137, 29, 3, 3,204, 29,218,119,232, 43,113,233, 16,213,200,102, 15, 52, 25,134, 1,135,195,
-129, 90,173, 70,110,110, 46, 82, 83, 83,145,156,156,140,172,172,116, 53, 67, 8,159, 6,195,113,119,247, 2,143, 39,132,111,107,
- 31,108, 90,183, 76,186,228,163,247, 67,197, 50,225,129, 58, 70,232,129,166,190,164,244,167, 35,199, 78,228, 28,221,181,137, 6,
-128,130, 82, 13, 78, 95,189,139,107,183,178,108, 61,145,117, 83, 56,180,206,201,184, 91, 97, 73,139,230,126,242,193,188,172,115,
-231,206,167,151, 87, 26, 81,169, 53, 65,171, 55,195, 96,164, 97,166, 25,248, 56,139,177,255,221,142, 56,248, 91,156, 43, 69, 81,
-107,155, 58,158, 6,131,153,238, 23, 32,195,196,176, 86, 8,240,146, 33, 39,233, 34,230, 44, 92,139,152, 84, 3, 74, 75,203, 96,
-174, 42, 2,163,201, 70, 81,218, 53, 88,104,154, 52,117,222, 31, 17,172, 38,171,201,106,178,154,172,230,191, 88,179, 33, 47,242,
-132,176,181,158, 5, 15,140, 86, 67,220,203, 42, 65, 82,106, 62,186, 5,120,162, 93,107,119, 92, 73, 46,197, 15,167,179,240,205,
-241, 12,156,190, 81, 8,134,167, 64,126, 5,112, 39, 93,141, 59, 25, 69, 77,230,207,230,138,248, 19,222,124,179,124,126,167,160,
-138, 94,191, 31,157, 13, 79,231, 59, 65, 11, 22,148,205,230,138,248, 19,236, 91, 41,118,189, 59,255,173, 73, 10,169, 84,104, 52,
- 24,209,182,141,143,248,141, 89,179, 95,162,236, 69, 86, 63, 19, 73,225, 25,104, 47,146, 72,182, 45,249,232, 29,209,218, 95,238,
-100, 86, 25, 81,181,239,162, 58,101,222,187,139, 75,120,124,241, 38,133,103,160,189,181, 90,102,179, 25, 6,131, 1, 70,163, 17,
- 38,147, 9, 57, 89,183,163, 78,253,242,246,176, 54,173, 28,134,137,196, 98, 16, 0, 21, 58, 11, 82,243,180, 8, 27, 50,148,219,
- 45, 36, 36, 88,238, 30, 56,181, 62,173,242,242,140,114,134,112, 21,135,247,239,228,238,249,245, 58,254,119,248, 42, 14,252,118,
- 29, 87,206, 28,181, 16,198,252,224,249, 95,114,247,246,126,114,247, 78, 25,114,143,206,234, 7,139,103,199, 70,211, 51,115,185,
- 28, 18, 54, 36,252,228,107, 51,223,248, 93, 91, 89, 92,176,109,195,199, 57,133,185,233,183, 69, 2,202, 34, 21,113,161,209, 91,
-240,253,169, 92,140, 95,118, 3,183, 50, 53, 32,132, 52,249, 0,111, 6,152, 59, 97,234,219,180,217,100,130,191,183, 28, 59,183,
- 46, 71, 84, 88, 23, 12,238,100,143, 30,237,100,144,242, 12, 72, 72, 76,194,238,157,223, 91, 24,134, 51,143,253, 33,195,194,194,
-194,194,194, 70,180, 30, 44,238,181, 87, 52,216,117,168,215,235,210,158,158, 48, 25,238, 46,110,242,209,131, 94, 20,196,222, 43,
- 67, 97, 94, 6,238, 38,199, 67,171, 55, 67, 96,223, 6, 16,187,161,181,175, 15,226,146, 14,152,214,175,140,214, 48, 22, 67, 90,
- 67,122, 81, 81,238, 94,119, 19, 41,206,202, 21,222,151,146,147, 74,187,237, 92,248, 29,158,127, 94,238,180,114,133,247,165,244,
- 20, 25, 71, 42, 38,125, 94,154, 50,145,226, 80, 4, 11, 22,204,199,232,200,167,240,242, 75, 47, 80,219,183,127,223,171,204,202,
-189,100,192,255,242,189, 15, 62, 22,170,203, 44,198, 43,201, 26,131, 84, 38,145,156,191,163,169, 10,246,245,150,140, 24,247, 98,
-110,244,222,109,107, 1, 76,177, 70,171,198, 96,153,205,102,152, 76, 38, 0,160, 1,128,195,185,255, 90, 92,105, 68, 65,153, 1,
-234, 50, 3, 44, 52,131,113, 19,166, 72,174,198,220,152, 2,160,129,241, 90, 12, 99,182,152,177,239,215,107,200,185,250, 19, 67,
-113,184,229,181, 6,195, 67,238,222,222,207,205,205,251,108,228,184, 23,156,133,226,251,221,176,149, 85, 6,108,223,188,162,209,
-122,114, 40,138, 48,180,165,204, 98, 54, 87,181,109,211, 54, 39, 32,168,139,248,220,239,199,163,206,159,220,167,177,180,125,193,
-238, 94,122, 30,184,124, 17,184, 2, 49, 12, 38,235,126, 44,168,239, 94,218, 8,128,154, 58, 99,254,186,183,222,126,159, 59,119,
-253, 31, 48,234,181, 48,232,170, 80, 81, 94, 10, 9,207,140,132, 11, 7, 45,132, 54,191, 85,149,119,125, 35,123,127,177,176,176,
-176,176,252,199,169,251,248,157, 7,101, 13, 26,173,140, 91,231,122, 0,128, 95,247,136, 98,185,152,231,192,227, 80, 80,103,223,
-195,246, 85,115,192, 48, 4, 35, 94, 93, 9,133,175, 27, 36, 2, 46, 12,154, 98, 77,201,189, 51,141,142,213,161, 40,243,208,141,
- 91,114,124,103,188,222, 86,185,115,167,134, 15, 0, 59,119,106,248,175, 79,111,165,252,106, 75,154,111,207,126,221, 64,104, 26,
-145,163,159,198,132,231, 38, 32, 61, 95,139,159,207,102,162, 74,103,180,106,182,156,196, 41,160,139,147,163,243, 83,111,190,248,
-148,140,199,165,168, 14, 62, 42,110, 86,161,217,194,229,242,233, 67, 87,203,115,199,141,123,206,233,244,145, 61,131,105,167,128,
- 46,186,162,196, 27, 77,233, 25, 12, 6,208, 52, 13,131,193, 0,179,217, 12, 7,167, 54, 71,134, 62,189, 42, 59, 47,191, 50, 58,
-191, 84,223,179,202,108,129,186,204,128,130, 50, 3,202,170, 76,112, 83,216,195, 98, 54,118,106, 72,143, 16,242,191, 49, 79, 79,
-126, 1, 0,135,226, 88,190,211,228, 37, 38,223, 95,243,167,201,122,106,244,243,206,103, 99,239,225,110,204,209, 82,194, 88,238,
-103,113,167,152,236,198,143, 43, 8,151, 2, 35,224, 81,102, 46,135,195,152, 76, 26,179,139,139,243,233, 51,167,143,141,210, 91,
- 82,192, 21,136, 30,188, 87,103,164,173,190, 98,212,119, 47,125, 9, 0, 95,172, 95,183,186,207,208,231, 5,103,174,165, 65,103,
- 6,122,135,248, 97,255,143, 95, 27, 8, 49,191, 93,149,119,253, 75,246,222, 98, 97, 97, 97, 97, 97,121,200, 96, 69,227,254,224,
-248,135, 35, 90, 53,125,163,145,145,145,127,121, 90,123,142,186, 4,142,114, 30,156, 61,124, 49,105,206,106,252,111,237, 92,208,
-180, 25,132, 0, 22,218,186,204, 4,132,240,127,157,249,186,111, 64,107, 95,174,243,164,231,165,186, 31,118,106, 37,147,158,151,
-234, 58,118,114, 44,159,249,186,111, 90,165,222,187,175,133,166,113, 62,161, 0,241,105,229,136, 79,175,128, 92, 98,125,154, 47,
-174, 80,240,250,138,229,203, 4, 60, 46, 69, 37,100,104, 52,217,197, 22, 13,151,207, 55, 73, 37, 66, 98, 36, 60, 67,122, 17, 41,
- 30, 50,230, 37,221,161, 29, 95, 76, 5, 48,171, 33,157,154,153,134, 53,145,172,154, 87, 66, 8,161, 0,134,161,104, 58,187, 72,
- 15,141,201, 12,117,233,159, 70,139,178, 52,220,115, 42,119,111,239,167, 84,200,143,113,185, 92, 17, 33,128,217,100,121, 22,238,
-237,135,105,242,238, 38,215, 54, 89,151, 18,114,113,239,250, 73, 53,109,210, 78,214, 22, 36,157,178,118,223, 41, 10,132,203, 5,
-195,229, 80, 12, 69,129,225,115,136, 17,132, 48,117,107,164,181,193,104,213,152, 45, 33,159,187,240,196,238,181, 46, 47,143, 12,
-196,143,103,239,123, 62,125,101, 97, 69, 85, 14,107,178, 88, 88, 88, 88, 88, 30, 45,141,121,145, 39, 40,170,245,215,136, 86, 99,
- 59, 68, 8,112, 39,163, 8,173,189,156,225,213,186, 29,146,111,199,253,185, 14,128,133,182,174, 59,234,224,193,188,236,213,171,
-149,204,220,185,229,189, 87,172,240,190,248,250,244, 86,170,142,157, 28,203,223,121, 39,179,247,154, 53,170,139,191, 94,226,211,
-164, 58, 95, 87, 77,110, 46,219,158, 17,196, 9,237, 18,212,134,251,241,206, 59,153,167,110, 86, 22, 8, 4, 2,179,155,189,152,
- 82,200,133, 92, 46,135, 47, 52,152, 57, 6,191,224, 16,238, 33, 14, 21,210,152, 74,141,209,170,219,117, 88, 92,120, 47,234,196,
-207,243, 59, 14, 26,179,210, 33,167, 80,135,114, 35,247, 65,215, 33,151, 67,225,230,237, 12,128, 43,136,175, 79, 83,169,112, 56,
-190,235,135,255,121,175, 89,177, 20, 38, 11,141,153,115, 23,225,165, 41,147,143,195,189,253, 48,111, 95,255,216, 63, 14,125, 39,
- 29, 54,125, 19, 50,146, 98,242, 45,134,138,221,182,152,172, 7,102, 11, 32, 52, 97, 56, 37,165, 21,114,131, 5, 98,212,227,251,
- 12, 38,166, 89, 87,142, 70,103,193,161,203,249, 56,252,203,110,168, 20, 50,182, 37, 96, 97, 97, 97, 97,121,228, 60,161,230, 10,
-117,204, 21,208, 80, 68,171, 49,124,188, 92,113, 57, 62, 13,157, 2,218, 64,165, 84, 32,241, 94, 54,184, 28, 62, 56, 20, 96,182,
- 88,111,134,136,201,252,227,154, 53, 42,100,164,201, 56, 95,109, 74,243,157,249,186,111,218,154, 53,170,139,196,100,254, 17,192,
-100, 66,238, 63, 23,168, 38, 65, 42,109,131, 47, 32,140,185,149,171,131,148, 27,147, 82, 85,204,225,112, 13,142, 42, 49,227,168,
- 18,113, 28, 21, 66,190,128,207,101, 44,132, 99,242,114,241,213, 19,134,233, 98,141, 94,237,174, 67,154,166, 65, 81, 28,186,218,
-136,201,178,138,117, 40,215,115,161, 46, 51,160,180,210,132, 14,158, 50,156, 60,253,147,150, 54,235,118,214,167,197,229, 11, 84,
-237,124,189,240,254,167,107,160, 51,208,184,147,163,129, 64, 36,114,115,117, 11,190, 49,121,198,187,162, 55,182,222,195,212,193,
-142,152,251,199,189, 28,173, 90,252,174, 45,103,150,166,105,232,244, 70,129,186,168,212,190,162,178, 74, 41, 17,139,116,206, 14,
-170,162,250,222,171,183, 49,162, 85,131, 84,204,195,168, 94,110,208,155, 38, 66,103,176,224,194,169,125,108,139,192,194,194,194,
-194,194,242, 39, 91, 27, 90, 97,149,209,146, 75,197, 32, 92, 49,254,136,189, 7,255,160,206,248,254,224, 21,180,239,212, 11,121,
-149, 22, 16,112,154,156,109, 88,195,252,247,116,215, 0, 92,139,138,146,122,141, 29,235, 57,148, 16,254,175,155,182, 84,100, 3,
- 64,155,142,247,101, 24,134,128, 16,128, 48,247, 13,151,213, 80,188,140,180,188,138,214,190,110, 50,220,202, 54, 25,100, 34, 1,
-199, 94, 38,228, 58,171,132, 2, 1,143, 7,154, 80,134,188,188,123, 6, 10, 72,183, 70,174,110,215,161, 84,238,126,100,200,152,
-149,133,233,153,229, 49, 29, 74,180, 93,202, 77, 66, 16, 2,116,240,148, 33,254, 82, 52,173,206,185,123, 71,167, 78,218, 92,159,
- 22,195,128,107,178, 48,184,145, 82,142,178, 42, 51,202, 52, 38,244, 13, 27, 37,232, 27, 30,133, 63,226,139,192, 88,204, 88,241,
-117,116, 37, 77,204, 19,128,219,102, 27,118,154,115,249, 90,130, 87, 97,233,255,177,119,222,225, 81, 20,255, 31,127,239,238,245,
-146, 70,146, 75, 35,116, 72,232, 29, 18,122, 39, 82, 5, 65,138, 8, 10, 4, 80, 65, 17, 80, 84, 84, 58,124,233, 85,148, 38,210,
-123,175, 66,232,210,123,128, 4, 72, 35, 61,151,122,189,238,238,239,143, 75,168, 41, 23,130,229,167,243,122,158, 60,151,189,220,
-189, 51,219,102,223,243,153,207,204,232, 37, 66,129, 32,183,102,245,138,177, 98,145,208,174,209,104,196, 47,127,138,129, 66, 38,
- 70,182,206, 6, 0,182,210, 94, 61,121,122, 27, 14, 92, 78,195,193, 61, 91, 33,147,201,192,147, 27,138, 64, 32, 16, 8,132, 23,
-241,131, 99,249,157,195,249,175,207,204,151, 83,139, 74,179, 28, 15, 47,207,114,144, 42, 92, 17,151,110,133,150, 82, 33,199,192,
-131,101, 29, 17,173, 98, 2, 79,133,174,238,125,224, 64,106,210,254,253,153,235, 14, 28, 72,125, 33,209,251,121, 36,235,217, 43,
-199, 59,173, 73,241,236,201, 3, 71,207,228,245,106,238,237, 65, 51,140, 81, 36,164,205, 2, 17, 99, 21, 9,104,155, 72, 64, 91,
-124, 92,133,204,153,131,219,196, 60,133, 51, 37,105,154, 76, 38,116,234,212, 9,221,186,117, 67,239,222,189,209,191,127,127, 4,
- 5,213, 82,209, 12,101,225, 41,142,243, 22,107, 81,205,155,130,192,148,136, 83,219,254,103,184,119,113,223,109,214,108,234,137,
-151, 45,231,115, 77,158,231,178,243,204, 48, 89, 89,228,232,172,200,209, 91, 97,247, 14,197,190, 63, 82, 96,180,176, 72,184,177,
-203,168, 78, 75,250,220,156,241, 56,174,132, 83,241,245,203,155,124,210,136,143,135,170, 93,164,244,227,214, 45,154,170,189, 60,
-203,217, 41,234,121,228,149,162, 40, 72, 93, 85,240,112,119, 65,220,205,163, 56, 49,175,163, 17,192,119,206, 28,207, 23,113,149,
- 11,208,171,185, 47,122,246, 29,132,122, 33, 93,157, 49,214,100, 69,123,162, 73, 52,137, 38,209, 36,154,255, 37, 10,214, 56, 44,
-120,117,110,102,248, 2, 3, 84,213, 79,129,234, 1, 10,152,172, 42,152, 44, 44,244, 38, 22, 26,131, 21, 26,131, 13,113,105, 6,
-220, 59, 80,246, 18, 58,162, 88,142, 25, 63,121, 30, 0,229, 48,120,206, 70, 79,196, 86,203,140,133,243,102,191,191,173, 81, 67,
-203,184,238,126,129,119,226, 44, 41, 20, 69, 27,105, 70, 96, 43,231, 34, 16, 62,124,120, 71,125,233,220,145, 54, 82, 59,251,161,
-161, 24, 29,187,221,158, 23, 16, 16, 0,224,229, 37,120,106, 85,147,245,190,120,248,235, 42,109,123,205,243, 94, 60,107,162,129,
-102, 68, 28, 37, 16,221, 99,109,198,173,198,244,168, 85, 40,198,126,208, 34,233,131, 43,183,238,135,184,151, 11,196,227,100, 61,
-244, 38, 59,172,118, 14, 30, 74, 17,146,238, 30,183,198, 61,188,190, 67,151,114,103,195, 27, 28,182, 45,209, 15,238,149, 15, 11,
-235,250, 94, 72, 72, 40,243,195, 15,223, 35, 56, 56, 24, 70,163, 17, 52, 77, 35,176, 82, 53,196, 69,223,194,229,195, 51, 88, 67,
- 86,252,207, 0,166, 3, 80,151,246,159,100,106, 44, 56,122, 61, 3,135,247,110, 7, 35, 20,147,219,137, 64, 32, 16, 8,132,215,
- 9,127,229,117,181, 83, 70,203,100, 50,197,181,234,212, 19, 28,199,131,229, 1,142,205,143, 60,113,207,163, 79,172,205, 20, 87,
-214,210,113, 28,123,117,197,234,117,221, 26, 53,107,203,212,174,160,132, 38, 43, 13,151, 47,158,182,131,227, 47, 57,243,253,172,
-172, 71, 58,153, 79,245,247,222,239,215,103,231,208,143, 71,231,182,105,223, 94,161, 82,249,154,147,146,147, 12,235, 55,109,182,
- 29, 63,178,191, 13, 7,251,192,172,172,199,186,226,116,242,242,242,150, 22,246,190, 68,172,108, 9,160, 10, 35,160, 44, 70,245,
-163, 82,101,132,103, 38, 39,246,157, 61, 99,106,252,224,145,227,197, 85, 3,170, 33, 35,143, 65, 92, 82, 26, 30,158,219,111, 78,
-142,190,182, 87,147,116,115,184,147, 82,169,133,188,151, 4, 96,241,229,203,151,234,132,133,133,117,237,208,161, 3, 31, 30, 30,
- 14,158, 7, 78,173, 30,195,103,199, 93,222, 5, 71, 20, 43,230, 13,207, 75,194,185, 75,183,202,245,111,211, 68,224,233, 50, 28,
-235,182, 31,177,129,231, 18,200,253, 68, 32, 16, 8, 4,194, 51,222, 60, 71, 43,241,129, 99, 62,173, 63, 27,109, 90,198,144, 13,
- 27, 54,206,220,184,105, 91, 75,147,197, 18,192, 67,148,200,218, 45,103,117, 44,126,112, 86,195,152,254,248,186,167,103,141,186,
-235,215,172,248,110,253,186,159,218,130, 99,107, 82, 64, 60, 79,225,140,212,198, 14, 45,201,100, 21,107,150, 50,181,191,116,126,
-111,129, 49, 43, 75,183,177,180,223, 53,102, 69,165,209,140, 53,240,151, 37, 51,230,211, 52,211,133,101, 57, 33,199,218, 30,179,
- 86,211,255,140,234,168, 3,112, 58,203, 13,217,197,252, 45, 18, 64,100, 68, 68, 68,235,136,136,136,102, 0,150,194,177,134,226,
-245,178,156, 23,115,150,182,227,164,137,147, 78, 77, 0, 85,145,227,120,216, 89, 46, 65,100, 52,116, 36,247, 20,129, 64, 32, 16,
- 8,207, 8,199,235,147,150, 58, 23,209,250,171,200,201,137,209, 34, 7,227,202,170,147,149,245, 72, 7,224,181,145,123,134, 50,
-234,222,123,164,217,141, 71,154,221,111,250,125,125, 70,172, 26,136, 29, 90,198, 98, 56,147,200,126, 62,255,231,173,144,153,249,
- 64,143, 76, 52, 39,247, 16,129, 64, 32, 16, 8,165, 54, 92,206, 37,195, 19, 8, 4, 2,129, 64, 32, 16, 74, 52, 89, 47,190, 2,
-112,228,158, 23, 53,114,160, 52, 43,115,191,201,232,131,147, 68,179,204,154, 66, 0, 98, 0, 74, 0, 37,117,105,118, 69,254,122,
-141,228,120, 18, 77,162, 73, 52,137, 38,209,252, 27, 53, 75,210, 62,137,127, 9,165,155,120,253,205, 32, 67, 95,137, 38,209, 36,
-154, 68,147,104, 18, 77,162,249,111, 39,188,144, 31,240, 60,255,207,201,209, 34, 16, 8, 4, 2,225,175,194,211,179,134, 18,120,
-150,215, 91, 34,114,175, 90, 62, 0, 96,200,124,144, 78,142, 30,161, 16, 94, 92,231,240,173,228,104, 9,105,129,120,146,220,197,
-243,129,194,205, 51,249, 63,126,112,169,160, 74,138,177,157,219, 84,222, 23, 92, 69,214,187, 52, 95,148,123, 7,253,234, 91,173,
-249, 83,133, 42,104, 44,252, 26,201,202, 82, 8,133,170,138,183, 50,176,201, 69,151,128, 58,239,252, 9,251, 40,169, 93,187,118,
-104,237,218,181, 67, 1, 72,222,134,160, 92, 21, 52,168,124,245,144,115,170,170, 13, 79, 43,124,106,244,123,219, 5, 86,250, 85,
-247, 84, 6, 54,222,173,244,175,159,163,244,171,175, 81,150,111,124,214,197,171, 86,213,146,190, 23,216,107,118,205,105, 91,239,
-109, 13,236, 53,187,102, 97,127,247, 8, 91,230,242,227,182, 71,179, 60,123,254, 79, 73,234,149, 55, 35,176,229, 32,119,191,182,
- 19, 60, 75,251,189,128,160,144,200, 74,117, 90,103,248,215,104,126,207,217,239,148, 15, 14,189, 89,177,118,203,244,242, 65,161,
-215,201,145,119, 14,169,119,149, 80,169, 71,133,195, 18,143, 10, 71, 36,229,170,180, 47,171,158,159,159,159,172,102,205,154, 97,
- 33, 33, 33,163, 58,118,236,248, 69,195,134, 13,195, 43, 86,172,216, 5,127,227, 96, 44,185, 42,232, 27,179,144,202, 52, 11,169,
- 76,185, 42,232,155,146,235,215,224,153, 20,205,166, 80, 52,155,162, 80, 5,207,252,167,156, 43,137, 79, 80, 69,185, 42,104,145,
-139,111,237,171, 50, 85,141,158,165,253,190,135,135, 71, 23,111,111,239,119, 11,126, 60, 60, 60, 12, 35, 15, 31, 0, 0, 32, 0,
- 73, 68, 65, 84,186,144, 59,224,141,121, 22,197,122,229,247, 55,186,208, 25,161, 68,126, 97,240,199,159,214,157, 59,117,178,116,
-201,186,125, 88, 50,107,226,125,179, 62,183,246, 63,113,207,189,170, 52,187,206,208, 76,249, 23,223, 99, 57, 54, 41, 51,246,106,
-147,183,161, 31, 92, 73, 54,252,187,175,134,124, 57,232,253, 78, 21, 59,245,248,156,138,138, 53,238,119,222,162,161,193,142,221,
-123, 3,207,157, 57,189,108,221,186,213,211,213,246,224, 69, 66,137, 96,133, 38, 49, 50,183, 52,101,112,245,174, 90, 69,160,240,
- 58,215,170,247,167,190, 55, 78,110,222,192, 90,184,206,134,204, 23, 86,255,126,115,188,171, 85,171,214,148, 97, 24,207,177, 99,
-199,138, 0, 96,241,226,197,213, 89,150,205,122,242,228,201, 53,188,193,228,167, 14,131, 25, 60,100,233,252,105, 27,223,121,167,
- 27, 82, 50,245,152,183,104,101,187, 99,135,118,244,215,167, 63,218,245, 54,206,137,187,123,101, 87,136, 92,238,126,254,213,116,
- 85, 88,187,166,140,206,100,199,177,115,183, 90,111, 94, 57,253, 42, 80,171,153, 54,243, 65,145,115,138,113,134,188, 41, 62, 74,
- 62,140, 51,228, 1,192,160,215, 30,246, 74, 91, 39,111, 25, 27,230, 39, 17,220,202, 2, 74, 92,244,209,189, 82,203,227, 66,137,
-164, 34, 77,211,160, 41,128,166, 41, 48, 20,229, 88, 39,212,106, 76, 72,126,120,190,235, 63,225, 62,113,169,208, 44, 13,140,192,
-147,166,158,151,143,162,243, 95,121, 94,147,246,232,130,231, 91,248, 55,110,117,171,187,215,105, 89, 93,191,254,108,108,182, 66,
-208,230,139,195, 20, 79,255,244,244,252,162,219, 78, 25, 0,169,212,227,224,193,131,222, 97, 97, 97,110,170, 58,189,207, 58,243,
- 29, 49,163,171,125,232,208, 1, 81, 88, 88,215, 82, 92,159, 65,157, 65,211,155, 40, 64,200,113,252, 98,134,227,119,232,178,162,
-159, 0,165, 91,125, 74,166, 10, 30, 78,131,119,186,158,225, 64, 93, 55,102, 68,173,123,211,131, 43,144,184,118, 20,138, 68, 95,
- 84, 9,170,215, 40, 57,254,241,117,189, 78,187,200,110,206, 59, 91,106, 33,155,125,210,201,243, 55,222, 17, 8,133, 84, 88,199,
-230,140, 25, 56, 93,150,147,238,227,227,243,238,242,229,203,171,134,134,134, 2, 0,236,118,187,235,206,157, 59,125,103,204,152,
-161,136,142,142,126,211,133, 83, 3,188,189,189, 43,136,197,226, 0, 0,176, 88, 44,201,106,181,250, 41,128, 18, 27,254, 10,159,
-170, 94,224, 49,253,252,185,115, 2, 0,104,221,186,205,204, 10,173, 62,243, 96, 68, 74, 99,161,135,195,162, 85,228, 62, 57, 61,
-254,242,149, 75, 20, 0,132, 52, 15,157, 44,247,170,181,226,239,140,108, 73, 85,193,205,105,224,203,144,214,157,250, 14, 24, 56,
-132,174, 83,163, 2,186,116,238,240,181, 17, 56, 88,170,107, 70, 32,144, 93,189,122,181, 26, 77,211,140,221,110, 55,133,132,132,
- 60, 45, 75,185,252,131, 66,255,160, 64, 7, 90,237,150, 53,234,152,235, 51,129,215, 22,142, 97,220, 2, 27,125, 7, 70, 48,146,
-227,184, 68,237,211,235, 45,254,133, 17,173,215,143,115,105,149,104,129,248,139, 65, 31,125, 82,119,252,132,111,165,159, 47,137,
-192,225,149,147, 51,255,169, 38, 11, 0, 24,154, 41,127,252,196,113,149, 92,204, 0, 0,116, 38, 59,222, 9, 11, 43,249,137, 80,
-169,217, 25,154,162,130, 11, 22,180, 97,237, 86,169, 64, 40, 54, 81, 14,131, 4, 10,128,151,127,165, 8, 31,251, 5,249,160,247,
- 59, 85,220,180,237,247,164,167, 73, 89,165,174,212, 40, 70,132,144, 54, 93,208,169,115, 87,183,171, 87,254,152,190,250,231, 85,
-223,216,173,182, 85,156,141, 91,100,202,126,156, 82, 98,101,238, 91,163,177, 88,233,117,172,239,168, 25,158, 38,186, 28,126,152,
-181,212,235,220,209, 45,103,147, 19, 27,112, 9, 9,137, 38,158,162,238,231,100,167,126,161, 79,123, 18,229,236, 33, 83, 42,149,
- 85,149, 74,101,131,250,245,235, 75, 39, 78,156, 40,108,215,174,221,115,203, 30, 30, 46, 58,115,230,140,223,130, 5, 11,186,221,
-185,115,199,164,211,233,110,235,116,186, 24,148, 34,209,222,215,215,251,179,247,250,244, 68,135,190,159,130,229, 40,132,127, 50,
- 30,199,143,238, 25, 13,224,173, 24, 45,155,220,117,198,200, 81, 19,189, 67,154, 54,100,166,111,137,130, 76, 44, 64,215, 38,193,
-212, 71, 99,167,184,175, 91, 54,125, 45, 50,209,182,176, 72, 22,103,200,155, 82,215,203, 50,176, 87,104, 21, 28,216,106, 25,136,
-142, 95,129,150,187,205, 76, 60,240,237, 67, 0,168, 26, 54,214, 69,194,170,151,251,187, 51, 42, 9,171, 94, 94, 53,108,236,201,
-152, 99,203,181,197,149, 69, 40,145, 84,220,186,101, 75, 13, 15, 23, 17, 4, 52, 5,134,161, 32, 96,104,152, 44, 44,250,191, 63,
-240,173, 93,230, 50, 85,141,110, 52,240,145,227,129,141, 95,141, 25,143,142,148,230,156, 80,140,200,243,208,129,189, 2,149,155,
- 4, 12, 67,129,161, 1,134,166, 16,159,110,196,240,225, 31,185,149,213,176,191,211, 82,213,116,210,128,224,174, 33,117,203,213,
-223,126,137,114, 11,121,103,128,103,166, 73, 62,108,219,254,211, 3,249,214,227,175,240, 60, 55, 63,233,194,210, 19,197,137,152,
-205,230,244,174, 97,239,184, 82, 2,133,252,228,190, 13,109, 4, 52, 5, 27,203,195,206,242, 96,243,215, 70,165,242, 91, 48, 52,
- 77,129,231,120,140, 28, 57, 28, 93,195,222, 49,112,118, 46,201,249, 74,142,222,116,236,228, 69,111,179,141,195,130,229,235,166,
-235,243,212,211, 99, 31,122,198,235,242, 50,199, 27, 51, 30, 57,189, 14, 6, 13,190, 73, 98,204,189, 81, 91, 14, 93, 70,221,218,
-181,192,114,142,114, 6,151, 87, 96,203,225,203,168, 25, 92,211, 81,110,142, 71, 80,160, 18, 77,155, 52, 5,128, 55, 50, 90, 2,
-137,203, 15,109,187, 15,153,214,163,255,199, 80,121,123,131,230,109, 61, 78, 30,222,210,227,215,159,230, 79,178,155, 52, 11, 74,
- 37,198,179,207,158, 11, 60,199,149, 57,234,228,239,239,239,221,180,233,243,233, 24,237,118, 59, 42, 87,174,140,228,228,228,224,
- 55,105,167,249,249,249,117,255,241,199, 31, 85,221,186,117, 19,250,250,250, 2, 0,210,210,210, 2,142, 29, 59,214,232,199, 31,
-127,204, 72, 77, 77, 61,140, 98,102,244, 97,109,180,136, 22,128,145, 74,229,142,125, 4, 69, 79,252,236,195,250, 62,126,254,230,
-194, 62,175, 86,167,137,191,250,244, 52, 37, 16,136,242, 63, 15,154,231, 57,170,152, 40, 81, 39,161, 80, 88,104, 15,133,149,113,
- 13,225,133,110, 35,104,134,118, 92,172,118,155, 58,231,233,205, 90,165,136,196,213, 17,138, 69,171,222, 27,240,113,139,126,125,
-123,195,207,219, 13, 39, 47,220,193,232,207,190,180,217,173,182, 69,111, 84,121, 48,140, 32, 35, 35, 35,222,195,195,195,183,236,
-207, 91,170,202,239,199,143,170, 78,158,138,152,188,112,201,178, 49, 86,139,221,198,241,252,179,117,140,101, 50,137,176,115,143,
-247, 93, 85,213, 66,164,203,126, 28, 33,252, 23, 70,180, 86,191, 21,163, 37,150,185,188,255,253, 87, 99,165, 51, 54, 95,198,225,
-149,163, 51, 13,154, 76,239,103, 45, 5, 87,247,155,122, 77,110,163, 55, 41,161,210, 59, 40,148, 98, 4,163, 40,134, 81, 80, 52,
- 37,230, 88, 46,209,110,177,204, 52,102, 61, 74, 45,235,222,115, 28,143,221,127,100,148,206, 0,241,168,190,105,251, 94,149,143,
-187, 4, 38, 43,139, 1,131,134, 96,227,198,141, 46,222,110, 98,152, 44,118,204, 95,184, 80,171,139, 63,172,138, 79,204, 73,238,
-212,243,203, 19, 49,113, 25,247,158,166,154,118,148,182,108,102, 43, 11,141,193, 14,131,153, 70,141, 58, 77, 49,127, 81, 77,233,
-211,132,216, 47, 55,252,186,118,220,253,251,204, 70,142,161,167,153, 82, 31, 36, 22,122,211,249,214,237,234,234,225,185,181,207,
-168, 89,238,143, 50, 4,224, 97,197, 19, 87, 41,222, 31, 54,206,181,170,175, 12, 10, 41,227, 30,155,144,236, 55,113,210,164, 11,
- 49, 44,223, 76,163,142,137, 45,169, 60,149, 42, 85,234,219,163, 71, 15,249,132, 9, 19,132,129,129,129,248,117,203,206,138,173,
-187,246,239,153,146,154, 30,200,243, 60,124, 84,170,196,145, 31,245, 63,120,228,200,145,132,196,196, 68,225,188,121,243,154,239,
-221,187,183,118, 90, 90,154,211, 45, 83,150,231, 97, 50,179, 96,243, 31,144,234, 60,115,169,253,105, 64, 64,128, 36, 57, 57,217,
-252, 66,148,129,122, 30, 40,164,186,118,108,219, 92,240,203,209, 56,232, 76, 44, 20, 82, 33,226,210, 13,104,210,176, 30,181,134,
-181, 55, 40, 76,112,248,251,221,167,248, 40,249,176, 94,161, 85,160,242,144, 99,253,138, 89, 56,112, 41, 54, 44, 93, 71, 97, 57,
-207,140,242,147, 8, 58, 43,184,212,229,237,154, 84,243,237,208,184, 34,174, 53,169,230,123,238, 70, 84,180,172,255,194,177,201,
- 58,225,201,156, 99,227,180,133, 87, 60, 52,202,185,136,176,238,120, 2,228, 82, 1, 20, 82, 1, 20, 18,199, 43, 77, 83,101,107,
-213,250,213, 10,100, 56,118, 56,195, 8,134, 15,124,191,191,255,224,129,253,121, 48, 52,118,238, 62,216,123,243,230, 77,169, 54,
-171,101, 45, 75, 51,235,138,186,126, 94, 58,160, 52,160,114, 19, 99,210,218,123,112,149, 9,225, 34, 23,194, 85, 46, 68,135,250,
-222, 96,222,124, 18, 24,143,209,189,171,118, 27,221,167, 82,251,224, 10,202, 26,183,159,228,221, 31, 62,243,250,146, 51,185,237,
-191, 88,177,184,182,167, 46,215, 34,248, 97,226, 72, 65, 82, 74, 74,251,157, 7,207,118, 96, 45, 31, 71,217,173,250,111,213,119,
-118, 22, 26, 21, 78,138,186,212, 40, 32,164,159,212,170,179,221,189, 29,149, 84, 45,199, 44, 65,100,188, 6, 10,169, 0,202,130,
- 99, 43, 21, 64, 33, 21, 66, 41, 21, 32, 37, 41, 14,217,122,230, 66,178, 39,221, 30,103, 47,217, 75, 83,112,147,149,197,173, 88,
- 29, 42, 5, 55,132,159,159, 63, 44,221, 62,168,116, 37, 98,247,254,171,103,247,205, 49,164, 61,252,214, 89,157, 45,135, 46, 99,
-242,248, 81, 55, 40,224,102,254, 67,186,209, 15,115, 87, 54,158, 62,249,211,151,222,155, 56,109, 89,227, 55,143,100,185, 76,233,
-208,231,147,105,173, 59,247,129, 54, 59, 29,127,156,216,129,174, 61,222,195, 7, 31,127, 14,119,119,175,249,139,102,126,117,219,
-110,214, 68,188, 86,231,250,214,108, 85,175,110,173,205, 1,254,254,129, 28,231, 88,229,131,231, 1,157, 54, 15, 95,125, 49, 18,
- 28,207,163, 65,163,102, 29,164,173, 59,243,124,254,106, 32,153, 89,153,250,168,135,247, 59,153, 50,162,174, 56,125, 44, 77, 38,
-155, 90,173,198,173, 91,183, 16, 29, 29,141,200,200, 72,100,101,101,193,205,205, 77,167,215,235, 75, 21,188,175, 95,191,254,224,
-136,136, 8,169,135,135,199,179, 55, 45, 22, 11, 92, 92, 92, 48,120,240, 96, 97,151, 46, 93, 2,186,119,239, 62,244,222,189,123,
- 91, 0,104, 10, 45, 79,246,227, 20, 23,159,224,159,219,182,107, 59, 6, 0,100,174,126,177,203,127, 61, 24, 89,108,131,214,205,
-191, 98,139, 22, 45,171,129,231, 65,129, 95,106,200,138, 78, 43, 38, 74,164,184,124,249,114, 85,134, 97, 4,207,159, 65, 28,126,
- 90,191,189,230,239,231,239,246,157, 59,127,129,212, 85, 33,129, 58,207,130, 17, 31,244,113,250, 25, 44,243, 9,238,214,162, 69,
-155,253,211,167,125, 47, 80, 42, 20, 56,113, 37, 6, 99,191,152,100, 74,141,191,183,128,231,132, 43, 13,234,232,140, 50, 62, 42,
-223,202,240,184, 26,229,149,112,233,213, 85, 58,250,195, 94, 82,139,141, 69,174,222, 6,179,149, 5,203,241,200,211,219,112,255,
-169, 22, 94,174,165, 95,202,141,231,249,166, 0,188, 1,168, 41,138,186,246,226,118, 65,131,174,192, 27,191,178,157,153,255,124,
-240, 4, 96,129, 99,164,254,179,203, 39,127,187,168,247, 11,190,127, 31, 64,173,124, 77, 22,192, 85,138,162,114,138, 48, 91,175,
- 69,185, 4,135, 14, 29,226,123,244,232,241,172,198,127,117,251, 85, 36, 34,161,191,194,205, 27, 60,255, 0, 47, 46, 96,172,242,
- 13,200, 90,176,104, 73,185,207, 62, 25,149,160,201,205,174,152,255,246, 73,103, 30, 22, 2,138, 89,212,182,101, 72,151, 49,159,
-124,130,224,170,229, 69, 44,203,242,247,162, 99,109, 27,214,173, 31,118,238,146,120,137, 38,233,222,148, 23, 66,144,165, 26,246,
-201,114,108,210,171, 17, 44,150, 99, 95,109,221,190,166, 73, 81,128,187, 82,140,159,143,198,129,231, 1, 10, 60,220, 20, 66,108,
- 59,147,132,216, 27,123, 52, 61, 26,104,244,131,231, 78,237,208,190,219,184,136,251, 79, 76, 59, 50, 50, 76,199, 1,164, 21,167,
- 89,120,133,206,193,108,101, 97,179,219,177,235,224, 65,132,117,104,142, 22, 45,154,163, 77,235, 22,130,235, 55,238,124,252,201,
-152,145,129,120, 62,186,227,153,166,212,167,122, 83,165,155,215,142,190, 99,230,185,220, 77,178, 67,192, 0, 85,124,101, 40,231,
- 34,130,197, 78, 33, 94,109,205,191,115,220, 49,118,226,180,114,147,191, 28,115, 68,163, 22,215, 5, 30, 88,139,219,119,131,193,
- 32, 30, 50,100,136,208,102,179, 89, 7,143,248,188, 75, 90,154,186,247, 79, 75,255, 39, 81,169,124, 96, 48,217,113, 35,242,113,
-173,233,211,167, 85, 57,120,236,204,190,169,147, 70,239, 15, 11, 11,115,219,190,125, 59, 87,210,241,124,169,133,152,158,185, 98,
-253,230, 93, 27, 23, 47,152,141,168,132, 28,172,251,101, 37,120,214,254,115, 9,135,234, 69, 77,126,200,144, 33,178,125,251,246,
-149, 79, 74, 74,210, 24, 12, 6,245, 75,241, 8,154, 18,164,103, 27,224,229, 34,134, 72, 64,195,199, 67, 10,149,155, 4, 66, 6,
-160, 41,138, 45, 76,115,221,142,195, 51, 57, 67, 30, 14,108,181, 12, 92,191, 98, 22, 62,254,236, 59,220,203, 20, 31,163,229,110,
- 51, 63, 29,216,119,178,183,140, 13,243,119,167, 85, 29, 26, 87,130, 66, 42,194, 55,227,134,160,217,141,120, 85,114, 46,247,157,
-218,200, 52,156,118,236,217, 98,221, 39, 95, 14,142, 56, 34, 88, 46,114, 33,142,109,158,159,161,207, 83,231, 21,116,201, 89,204,
-166, 4, 39, 47,227,147,133,180,108, 39, 55,172, 87,103,214,152,240,225,116,203,208,102, 60, 77, 11,145,169,181, 80, 60, 15,124,
- 49,118, 52, 62, 29, 61,210, 55, 49, 37,227,135,149, 43,127,158, 18,241, 59, 63, 67,175,126, 56,181, 56, 77,154,114, 68,129,148,
- 82, 1,148, 50,135,113, 81, 74, 5, 48, 89, 88, 80, 20, 24,247, 10,141,242, 40, 71, 36, 55, 37, 59,161,200, 22,248, 75,154,229,
- 42,212, 57,245,123,172, 75,205,156, 29, 57,151,226, 82, 34,103,222,184,147,126, 21, 64,118, 96, 27,247,161, 86, 59, 15,157,201,
-142,184,116, 3,236, 86,158,250,248,157,138,168,220,143, 10,158,189,254,230,198,163,119,224,250, 66,165,255,146,102,242,229, 93,
- 38,207,186,125, 6, 44, 94,246,203,181, 5,179,190, 99, 50,243, 44,224,120, 30, 82, 49, 3,153, 88,144,255,195,192,168,207,195,
-202, 85,107,210,236,160,250,226,236, 89,123,105,174, 79,112,252, 7,125,186,181,217, 70, 1, 98,138, 22, 37,249, 87,172, 84,177,
- 99,207, 97,210,142,189,134,128,181, 91, 38,223, 56,207,159, 54,100, 68,157,114, 70,179,110,237, 90,160,128,155,250,140,232,209,
- 0,160, 80, 5,253, 92, 51,184,102,227, 87,223,171, 94, 61,184,177, 51,231,253, 89,164, 84,234,242,153, 71, 57,239,239,130,235,
- 52, 84,165,231,152, 41, 23,207,242,136,123,116, 11, 91, 87,253,176,137, 51, 89,166,157, 58,188, 99,214,146,117,123,223,239, 24,
-214, 7,235,127,250,223, 55, 89,169,207,140,214,201, 23,162, 85, 31,108, 88,187, 58, 80, 40,150,192,102,231, 96, 99,121,199,171,
-157, 69,118,118, 14,108,118, 14, 82,185, 11,236, 28, 5, 27,203,193,102,231, 96,182,216, 21,163,135,116,255,196, 4, 92, 41,172,
-156, 1, 53,219, 30, 23, 73, 36, 21,121, 56,214,174,229,121, 30,113,105, 70,218,207,207,111, 11, 0, 72, 36, 18, 72, 36, 18,112,
- 28,135, 27, 81,234,207,188,130,131,198, 32,223,224,177, 86, 75, 66,110,252,197,174, 69,237,187,175,175,111,207, 87, 77,150,201,
-100,130, 78,167,195,249, 75,215,220,214,110,220, 21, 22,151,144, 84,149,227,221,204, 46,170,170, 93,181, 25, 49, 61,139, 58,158,
-218,244,168, 79, 92, 67, 70,210, 19, 62, 29, 90,125,217,134, 67, 87, 31, 31,159, 89,108,158, 86,229,142, 95, 91, 38,140,122,175,
-201,220,165,235, 30,229, 92,252,121,124, 73,231, 72, 32, 16, 8,213,106,245,179,251,123,249,154,173, 77,110, 70, 37,191,187,100,
-241, 18,233,141, 24, 45,238,198,165, 96,104,167, 10,142, 22,142, 19,231, 93,225, 83,213,171, 74,181,106, 91, 86, 46,157, 43,120,
-148, 98,194,138, 61, 87, 17,177,255,231,243,105, 25, 87,194,144,158,106,124,147, 58,228, 45, 24,173, 34, 53, 79,223,201,132,206,
-100,135,217, 98,135,141,227,161, 49,216,144,145,107,129,198, 96,133,206,104,199,208,206, 21, 10,253, 94, 9,126,196,155,162,168,
- 67, 60,207,247,224,121,190, 19, 0,113,193,182,227,153, 77, 29,202, 55,100, 47,109, 79,158, 60,249,219, 57,115,230, 68, 22,124,
-182,224,253,130,207, 22,247,254, 11,223,247,252,230,155,111,234,206,157, 59,119,118,104,104,232,182, 63,254,248, 35, 22, 64,142,
-179,221,135,130, 23,119,230,208,161, 67, 37, 29,232,170, 86,155, 85,226, 42, 19,162, 74,229, 10,248,232,219,245, 94,191,205, 29,
-158, 33, 21, 11,152,163, 71,143,150,203,178, 40, 65,211,140,211, 77, 20,165,119,141, 22, 34,145,248,240,194,133, 11, 49,176,103,
-107,217,211, 76,155,238,206, 83, 99,186,222, 2,187,202, 59, 72, 60,115,246, 92,229,220,121,243, 63, 61,116,128,203,213,165,223,
-159, 95,120, 23, 95,147,235, 12,245, 66, 14, 22, 69,129,231,216,164,156,248,107, 77, 0,160, 44,185, 88, 58,147, 13, 76,126,110,
- 13, 69, 1, 6,147, 29, 12, 67,101,228, 70,237,184, 63,120,198,204, 14,155,182,253,158,194,211,238, 90,189, 62, 78, 14,199,154,
-131,165,198,100, 97, 97,182,177,136,188,125, 3,109, 66,106,163, 69,147,154, 48,152, 88, 24,204,118, 84,174, 22, 12, 0, 94,133,
-158, 56,134,142,229, 89,155,137,231, 89,151, 30, 77,189,161,114, 23,195,207, 67, 2,137, 88, 0,155, 29, 48, 90, 56,152, 44, 44,
-226, 51,140,208, 26,101,168,215,182,127, 21, 79,191,235,230,180,120,217,190,236,167,215,251, 22,107, 78, 89, 22, 27,182,236,170,
-158,146,146,222,251,200,190,205, 18,181,198,134, 59,241,122,100,228,154, 1,198, 27, 63,206, 94, 33,249,122,124,248,187, 27,182,
-238, 78,232,216,186,121, 66,105,247,217,160,142,218,180, 99,231,174,159,123,244,120, 87, 22,121,229, 8, 30,221, 58, 53, 75,159,
- 81,170,252, 44,186, 65,131, 6,246,240,240,112,237,236,217,179, 3, 15, 28, 56, 80, 89,173, 86,223, 2, 96,115,119,119,175, 25,
- 84,189,226,237, 19,199,142, 6,116,127,183,191, 48, 41,211, 8, 55,185, 8, 21, 85,114, 92, 58,127,220, 38, 22, 11, 11,205, 55,
-201,239, 30, 28,132,142, 95,225,192,165,216,176,200, 44,233,153,145,195,135, 38,156, 56, 23,149,181,124,227,137,255, 5, 40,109,
-183,164,156,122,249,245, 38,213,124, 39,143, 29,130, 57,203, 54,225,236,141,168, 12, 61,237, 55, 43,213,108,255,189,232, 80, 58,
- 32, 96, 40,184,200,132,208,107,212,121, 79,110, 30, 11,122, 75, 97,234,161, 39,246,109,162,179,181, 54, 36,102,154,168,148,108,
- 45, 88,142,135,187, 92, 4, 59,199, 35, 55, 59,147,218,188,105, 35,174, 93,187, 68,131,161, 71, 0,152, 90,236, 1,165, 28, 93,
-133, 74,169,208, 17, 17,146, 57, 94,109, 44,135,224,234,213,176,122,249, 34, 87, 47,149, 15, 90,181,113, 62, 55,218,197,179, 98,
-131,109,191, 46,199,153, 63,110,182, 59,187,100, 69, 83,165,191,247, 50,138, 98, 23,128,135,201,108,101,145,151,155, 3,177, 37,
- 17,205, 2,212, 40, 39,103, 17,175,241,195,189,180, 71,202,146, 42,252,172,123,123,111, 81,252,187, 83,118, 29,140,152,211,181,
-115, 59,220,139,215, 64, 38, 22, 64, 42,102, 32, 21, 51, 16, 82, 44, 22,173,250,217,150,147,167,237,145, 21,185, 63,243, 13,174,
-207,147,249,173, 95,135,185, 99,117,222,155,150, 77,249,109,228, 87,243,186,134,245, 25, 70,221,187,118,250, 91, 3,112,202,185,
-134, 30,239,212,123, 28,231,252, 51, 78,234,226,181,116,220,215, 51,199,117,233,209, 31, 12, 35,128,205,102,195,238,237,155,240,
-235,138, 31, 31, 90,116, 89,195, 0,112,150, 12, 38,124,199,166, 85,253,191,250, 97, 17, 85,183, 65,179,230,167, 83, 95, 95,142,
-150, 99,168, 95, 62, 28, 62,106,128,143,143,143,203,243,136, 22,143,160,224,218,232,214,235, 61, 28,223,191, 23,247, 35,239,128,
-227, 29,134,137,227,120,228,230,100,165,217,109,150, 13, 69,246,120, 72,165, 21,215,255,186,177, 6, 77, 83,176,218, 56, 88,236,
- 28,198,127,242,145,101,244, 23,223,182,234,214,165,109,164,152,129, 38,254,105,170,251,165,155, 15,234,113, 66,101,224,240,137,
-139, 68, 38, 51,139, 60,131, 13, 71,214, 21,237,117,164, 30, 21, 66, 43, 53,238, 54,124,244,247,171, 37, 18,134,182,214, 9, 10,
-140,109, 27, 82, 39,177,130,191,151,118,250,220, 21,205, 46, 92,185,217,237,253,193,195,165, 67,107, 54,166,252, 61,101, 46, 31,
- 13,238, 83,159,181, 91, 63, 52,100, 39, 22, 57,191,160, 80,238,145, 91,161,114,117,195,243,136, 81,208, 30,138, 71,149,151,156,
- 7,133, 88, 99,122,116, 95, 0,240,243,175, 96, 18, 74, 92,181,165,136,192,240, 0,176,108,205,214, 38,183,163, 83, 70, 46, 94,
-188, 68,126, 35, 70,139, 91, 49,121,144,136,104, 88,109, 28, 40, 39,131,218, 28,207,140,250,238,155,201,174, 57,122, 22,103,238,
-168, 17,121,253, 52,111,209,153, 6,203,237,174,125,161,114,249, 16, 64, 53, 0, 79, 40,138,255, 69,159,238,187, 31, 56,107, 47,
-237,117,207,113,142,246,178,171,119,213, 42,172, 64,210, 77, 40, 86,132, 82, 20, 95,135,226,225, 1,240,201,217,249,207, 84,103,
-157,154, 62, 61, 26,243,102,255,128,165,107,247, 34, 37,203, 4, 55, 54, 17,251,215,205,196,132, 57, 91, 96, 52, 23,157,213, 80,
-146, 31, 41,204, 24,189,106,184, 10,126, 47,248,220,156, 57,115,122,188,114,110,122, 20,113,206, 94,251, 92,193,247,231,206,157,
- 59,251,133,191, 27,156, 53, 89,207,140, 86,193, 78,149, 96,182,130,188,253, 42,254,177,127,223, 30,143, 28,157, 21, 82, 17,131,
- 10,149,171, 99,234,242,253,222,239, 52,241, 66,166,213, 13, 91, 87, 47,200, 54, 25,180,219,157,170, 44, 84,193,205,101, 74,197,
-145, 61,187,247,162,106, 5,149,104,243,249,236,184,155,177,198,103,161, 94,141, 58, 65, 92,217,213, 32,232,219,167,143,252, 84,
-196,233, 47,116, 64,161, 70,139,161,152,242,107, 54,238, 86,185,200,132,160, 40, 64,107,180, 99,228,135,239,149,253, 49,198,115,
-204,240, 97, 67, 65,229,155, 44, 77, 86, 26,190,253,250, 19,147,194,246,232,254,211,248,167,201,157,122, 78, 56,165,209, 81,166,
- 1, 67, 62,185,118, 63,122, 78,142,193,240,102,139,252,152, 45, 44,204, 86, 14, 49, 49, 79, 48,126,104,103, 8, 25, 26, 12,195,
- 57,146,165,237, 69, 95,140,186,148,232,108,248,138,250,109, 90,248,217, 26,127, 31,149,167, 82, 33,227,149,114, 9, 85,167,102,
- 13, 81, 72, 72, 11,113,229,224,250,162,243, 15,140,120,170, 54, 34, 54, 37, 15, 18,159,134,130,129, 29,222,193,166, 37, 19,219,
-101, 63,189, 78,227,245, 36,197,151,248,253,204,229,158,107, 87, 45,150,164,231, 90,241,240,169, 14,105, 57, 38,164,230,152,145,
-150,109,130, 82, 38, 68,155, 94,225,146,195,251,127,233,217,177,117,243,101,111,178,223,177,177,113,135,227,147, 83,251,215,111,
-212, 12,155,126,251,181,181,187,123,101,215,220,220, 56,141,179,103,103,230,204,153,226,185,115,231, 10,150, 47, 95,174, 9, 9,
- 9,241,253,230,155,111,186,102,100,100, 92,173, 84,169, 82,240,241, 61, 27, 34, 26,182,233,221, 20,156,213,187,117,219,246, 34,
- 9, 39,192,137, 67,135,172, 59,182,111,206, 50, 26,181,163,139, 53, 28,114,183,153,233, 58, 10,222, 1, 1,145, 74, 49,219, 89,
- 64,231, 70,231, 28, 27,183, 49, 7,216, 83, 53,108,236,201,211,215,163,162,155,220,136, 87, 69,220,120,156,145,109,176, 6,197,
- 28,155, 80,108,197,203, 80, 20,132, 12, 13, 23,153, 0,116,126,173,170,244,175,255, 24, 20,229, 93, 16, 57,165, 64,229,191, 2,
- 20,133,148,156,167,183,156,200,217,160,120,142, 7,162,146,244,208,153, 28,161,249,242, 94,114,168,211,147,240,211,178, 13,184,
-121,253, 26,186,188,211, 11, 43,215,108,198,200, 15,251,155, 74,106,253,208,116,126, 68,235,133,104,150, 82, 38, 0, 64, 33, 87,
-111,195,238, 11,137,168, 86,133,118,250,193, 0, 0, 46, 74, 57,242,180, 70,208, 34, 23, 60,185,113, 68,126,244,244,149,111,166,
-204, 88, 60, 41, 39,245,206,211,199,119,207, 35,216, 43, 15, 85, 2,172,136, 76,115,197,245,172,202, 8,174, 94, 21,180,232,154,
- 83,218,153,145,245,230,237,167,119,247,104,210,176,118,104, 69,149, 59,140, 22, 54, 63,170,197,224,215,245, 27, 17, 31,151, 52,
- 60,235,254,254,155,111,195,209,234, 51, 98,213, 18, 85,245, 79,239, 94, 57, 21,219,103,240,167,240, 11,168,208, 32,247,233, 45,
-167,211, 22,156,121,143,117,210,104,137,228,238,223,140,255,238,127,227,186,116,239,135,203,231, 79,225, 86,228, 19, 52,111,222,
- 20,239,188, 59, 16, 90, 77,118,205,157, 27,151,116,182, 27,180,199, 5, 18,251,184,102, 45, 58, 80, 28,203,226,209,195,123, 79,
- 10,211, 50,166, 70,221,186,148, 26,229,250, 82,247,148, 87,205, 6, 74,183,114,183,204, 86, 22,201,201, 73,184,248,199,153, 70,
-198,212,168, 91,165, 57, 94, 18, 17,131, 19, 55, 51, 96,181,113,176,218, 57,180,105,219,217, 34,162,205,173,103, 45, 94, 31,146,
-154,146, 74, 43, 92,189,184,114, 1,181, 68,126, 18,171,249,118, 76,158,200,106,227, 80,213, 95, 81,172,166,183,127,245,217, 19,
- 39,142,175,197,136,100,208,234,205,150,212,148,100,223,213, 91, 79,235, 30, 60,188, 27, 80, 94,229,230,250,191, 37,191,136, 52,
- 38, 10, 25,121,102,100,107, 53,212,224, 81, 95,249,175, 93, 49,231,131,226,140, 86, 33,233, 34, 85, 14,159, 56, 95,211,195, 69,
- 68,233, 76,118, 46, 75, 99,101, 7,191, 91,182, 65,151,249, 38, 43,124,241,162, 37,242,155, 49, 90,220,142,201,131, 84,196, 64,
- 44,162, 97,177,113,112,242,118,162,125, 85,190,163, 91, 52,169,135,227,183, 50,193, 48, 52,140,218, 28,131, 0, 89,209, 77,218,
-117,145, 55,110, 22,130,246,237,218,226,113,116, 84,133, 67, 7,118,119,188,116,241,108,154,221, 26,244,153, 94, 29,189,183, 84,
-129, 5,131,129,177,137,125, 63,242, 11,168,212,178,239,192,143,220, 42, 86, 8,160, 84, 94,158,176,243, 2,132,127,248,158,211,
-119,190,195,152, 3,115,103,124, 3,179,217, 2,111,119, 49,120, 30, 88,191,108, 42, 44, 22, 11,252, 61, 37,200,211, 23,189,154,
- 92, 73,126,164,168, 40, 84,169,114, 79, 94, 48, 99,197,189, 79, 81,212,161,201,147, 39,127, 11,128,159, 60,121,242,183, 5,219,
-115,230,204, 49, 2, 72, 41,161,235,112,245, 75, 70,171, 96,231,138,190,187, 69,193, 94,158,126,151, 78, 28, 63,230,182,239, 54,
-135,203,123,175,163,123,115, 63,136, 4, 52,228,110,254,184, 29,151,135,195,123, 86,229,238,223,246, 75,178,217,108,158, 95,114,
- 95,115,245, 38, 74,185,226,248,111,155,182,115, 94,158,158,244, 79, 39,212, 49, 89, 90,251,179, 46,173,232, 43, 7,184,235,199,
- 87,251,241,160,142, 73,165,210,234, 22,139,197,163,164, 19,187,254, 68, 66,126, 18, 47,245, 54,234, 86, 80, 12,195,110,218,188,
- 9, 94,174, 98,152,109, 28, 38, 79,250,220, 56,180,139, 50,119,240,251, 3, 59,180,239, 54, 46, 66,168,168,113,170, 69,163, 26,
-124,195,134, 13,115, 25,134,113, 42,149, 66,165, 82, 77,165,105,122,144, 88, 44,118,177, 88, 44, 90, 11,103,146,235, 77, 22,152,
-172,128,193, 96,130, 80,228, 48,139, 66,134,130,209,100,129,193,104, 41,254,198, 72,187,119, 1, 64,144,230,133,152,210,169, 7,
- 85,197, 91,118,238,255,188,223,251, 3,166, 4, 52,120, 87, 25,151,154, 7, 17,101, 69,211, 90,126, 56,125,108, 47,159, 20, 31,
- 61,190, 36,147, 5, 0, 25,234,236, 64,111,111, 31,220,140,213, 33, 57,203,136,180,124,147,149,154, 99,134,214,168, 69,253,138,
-254,200,205,203, 11,124,227,227, 11,236, 61,126,252,120,255,110,189, 7, 96,220,164,105,173,214,173, 90,112, 71, 33, 22,126,172,
- 79,127,116,198, 25,163,117,239,222,189,236,175,191,254,186,218,154, 53,107,232, 15, 62,248,192, 88,175, 94, 61,233,144, 33, 67,
- 90,109,220,184, 81, 42,151, 75,141,183,207, 31,152, 50, 98,236,228,222,171,151,206,108,144,147,147, 67,217,109,182,163,214,156,
-156,201,186, 18,204, 92,226,129,111, 31,254, 24, 99, 29,214,185,181,247,129,114,114,186,142,132,183, 12, 68,173,169,219,241, 96,
-170, 53,230,216,114,173,172,255,194,177, 41,185,220,119, 38, 90, 53,171, 36,147, 5, 0, 52, 67,193, 98,103,225, 34, 19,130,166,
-233, 2, 19,239,247,235,246,163,114,111, 55, 49,132, 12, 13, 1, 67, 65, 99,176, 33, 83, 99,197,167, 31, 57, 59, 67, 8,207,217,
- 89, 30, 70,139, 29,134,252,214,161, 86,147,137,111, 38,125,137,119,122,246,193,136,209, 95, 34,199, 8, 92,143,213,194,106,179,
-149,120, 83,208, 20, 13,131,217,142,143,187, 84, 68,182,206, 10,189,209, 14,139,157,131, 92, 44,128, 80, 64, 67, 33, 21,192, 85,
- 46, 4,120, 94, 84, 80,153, 8,133, 66,147,205,102,219, 84, 76,139, 30,149, 3,125, 96,180,209,104, 54, 96, 1, 58,133, 6, 33,
-242,194,110,193,217,203,119,171,124, 49,233, 59,124, 62,178, 39,118, 61,172,134,114,170,138, 80, 42,100,176,241, 52, 0,222,201,
-132,189,169, 28,109,237, 51,232,231, 53,235,163,166,255, 48, 89,154,171,167, 32, 17, 49,136, 56,117, 18,151,174, 92, 95,154,121,
-127,255, 38,188, 69,132, 60,237,227,234,234, 10,169,152,129,197,106,182, 56,159,186,192,131, 7, 26, 41, 84, 65, 63,231,183,248,
- 27,177, 28, 10,121,175,100,163, 37,144,186, 78,254,108,210,244,217, 93,186,247,195,137, 67,187,176,115,215,118, 54, 52,108, 56,
-179,249,215, 85,104,213,169, 23, 90,117, 25,128,163,123, 55,126,169,231,168,218,225,227,166,204,104,211,161, 27, 78, 28,222,133,
-244,180,164,133,206,150,151, 17, 82,227, 58,116,238, 9,147,133, 69,235,142, 61,112,236,224,222,177,200, 31,100,225,252, 67,236,
-149,250, 25,180,253,203,241,227,132, 25,185, 22,161, 90, 99, 65,146,218,128,184,116, 3,246,111, 91,199, 59, 95, 95, 88,154,182,
-169, 95, 94, 24, 62, 47, 34, 49,176,188,159, 89,104, 54,202,162,159,196,212, 28,241,209, 80, 97,149,234, 53,233,140, 60, 51,212,
-121,102,100,230,153,161, 51,217, 81,189,124, 13,218,102,167, 66, 75,123,158,189,220,196,194,149, 7, 99,225,170, 16,162, 69,205,
- 55, 31,104,203,113,220,115,147,181,216, 97,178,238,196,230, 65, 34, 98, 32, 17,209,144,136, 24,216, 89,222,169,134,139, 76, 21,
-212,237,211,207, 62,241,183,216,129,172, 60, 11, 4, 12, 5,149,151,135,162,105,131, 65, 88,191, 96, 44, 0, 96,228,215, 63, 97,
-196,199, 67, 80,171, 78, 61,228,230,228,248, 14,234,215,109, 49,128,189,206,150,245,200,137, 51, 21, 78,156,187,249,245,167, 19,
-127, 84,190,223,179, 61,115, 43, 38, 15,169,217,102, 60,137,214,150, 42,242, 6, 0,118,150, 3, 15, 30, 27,182, 31,130, 76, 44,
-128, 58,207, 10,158,231, 49,115,249, 14,184,200,132, 72,205,113,116,247, 23, 71,177,126,164,152,136, 84, 41,162,141, 61,224,200,
-229,242,118, 54,162, 53,103,206,156,200, 57,115,230, 20, 26, 33,123,193,100,189,217,162,210, 34,145,162,166,171,167,215,229, 19,
-199,142,184,236,189,205,226,244,237, 44,244,107, 93, 30,186,236,167,152, 63,233,253,108, 10,188,133,102,152, 92,179,209,176,199,
-104,212,207, 2, 96, 45,246,162,241, 13,106,164,144, 42, 79,174, 92,253,155,221, 75,165,194,166,243,217, 73, 57,122,187,237,121,
-183,149,141,186,126,124,117, 21, 59,103, 11, 51,165, 63,190, 86, 82, 75,156,227, 33,154,179,106, 63, 0, 30, 28,199,129,231, 56,
- 8,165, 74,133, 87,213,144,244,252,138, 78, 42,160, 41,211,139, 53, 0,207,217,147, 50, 99,139, 15,131, 82, 0,220,228, 66,108,
- 63,155, 12, 0,233,140,246,198,131,193,239, 59,186, 11, 77, 22,169,166, 78,181,106,124,211,166, 77,115,101, 50,167,166,191, 98,
-124,124,124,174, 78,153, 50,165,230,136, 17, 35, 36, 98,177, 24,118,187,189,220, 47,171, 87,115,171,103,141, 68,223,177, 43, 33,
- 18, 75, 96, 52, 89, 33, 20, 10,144,147,167, 67,174,198, 0,173,193, 86,250, 43, 40, 38,198,162, 6,230,237,219, 43,238,211, 85,
- 89,191,153,152, 22,161,113,176, 31, 78, 31,223,199, 95, 62,182,126,164, 49, 35,250, 55, 39, 47, 68,232, 76, 54,164,100,153,144,
-156,101, 66, 90,142, 9,105,217,102,164,229,152, 64, 81, 20, 76, 22,123,153, 30, 92,250,140,168,157,155,126, 91,219,203,108,197,
-192, 54, 93,250,224,203, 31, 87, 86,220,244,243,220,147,177, 60,221,210,201, 68, 91, 54, 50, 50, 50,254,163,143, 62,106,176,117,
-235, 86,166,110,221,186,198, 7, 15, 30,200,243, 77,164, 85,169,148,203,214,173,152,115,188, 89,179,102,219,146,163, 31, 70,228,
-247,167,151, 88,177, 87,108, 59, 76, 34,179,222, 12,175,160,104,209,181,170,175, 28, 21, 20,218,174, 53,149,183,231,103,117,248,
-124,182, 58, 98,105, 70,170,217,254,187,218,200, 52, 76,214, 9,157,202,193,179,153, 77, 9,125,251, 13, 4, 67,209,176,154, 12,
- 9, 5, 23,151,202, 77,140,169,155, 31, 66, 41, 21,194, 69, 38,128, 82, 38, 68,171,218,229, 80,138,250,140,183,177, 28, 12,102,
- 22, 70,179, 29, 38,139, 29, 94,129, 30, 88,179,105, 39,158,102, 24,177,255, 90, 38,162, 18,180,168, 81, 94, 1,158, 47,185,154,
-228, 88,155,190,231,123, 31,184, 48, 52, 5,134,166,232,218, 53,131,144,173,179, 66, 36,160, 33,146,202,160,144, 8,224, 42, 19,
- 66, 36, 18, 34, 35, 35, 3,102,179, 25, 21, 42, 84,144, 22,111, 5,121,184, 40,101,168, 81,197, 31, 86,155, 29, 71,206,221,199,
-172,241,125,209,185, 77, 19, 80, 66, 37, 30,154, 27,193,165,156, 11, 56,154,134,213,206,193, 98,101, 1,208,166,162,244, 2, 3,
- 3, 59, 40, 20, 10,133,193, 96,208, 62,125,250,244, 76, 90,212,222,167, 44,211, 59,252,216,137,136, 77, 61,222,233,140,155,119,
- 34,177,107,239,129,243,153,158,121, 19, 11,190, 83,167, 78,157, 16, 47, 47, 47,101, 86, 86,150,230,222,189,123, 87,223,180, 93,
-192,211,244, 23,161,173,218, 65,151,155,129,244,196, 56,167, 91,209,181, 42,186,224,251, 57, 43, 27, 7, 7, 5, 55,102,121,135,
-241,170, 93,193, 5, 19,126, 92,214,184, 90,141,160,198, 5, 3, 66,106, 85, 40,126, 90, 54,129,220,165,203,135, 35,190,156,211,
-171,223, 48, 68,156, 56,128, 69,179, 38,109, 82,184,121,215, 42,231,225,214,176,110, 72, 23,156, 63,121, 0, 82, 23, 95,120,120,
-250,182,250,224,227,207, 58,245,251, 96, 20, 46,157, 63,137,165,115,191,221,200,154,181, 91,156, 41,171, 66, 85,197,187, 65,163,
-102,131, 93,202,249, 32, 55, 79, 11, 23, 15, 21,106,213,111, 58,248,254,109,243,215,250,140, 88,245, 27,155, 14,158,135,217,202,
- 35, 71,103, 69,162,218,136,248, 52,135,209,226,184, 82,228, 4,177, 28,165,148, 10, 4,229,108,143, 43,220, 61, 25,193, 87, 12,
-244,161,230,205,152,196, 88, 33,133, 58,215, 97,178,212, 26, 11,212,121, 22,232, 76, 54,148, 83, 8,192,177, 92,169, 91,221, 57,
- 58, 43, 92,228, 66,184,201, 69, 78, 71, 25, 11, 99,213,175,219,131,111, 71,167,188,187,104,209, 18,249,173,216, 23, 76,150,208,
- 17,205,146,136, 24,176, 28, 7, 56,113,199, 11, 5,194,113,189,187,117, 66, 98,166,209, 49,106,153,166, 80,163, 94, 51,120,201,
- 56,116, 28, 48, 25, 0,208,179,155, 35,181, 45, 54, 85,143,131,151,213,192,203,137,221,197,215,197, 70, 35,179,122,243,225, 47,
-118,238,216,230,102, 98, 5,248,229,104, 60, 12,102, 59,164, 34, 6, 18, 17, 3,153,136,121, 41, 31,187,100,163,229,200,185,123,
-154,105,131,193,100,130,198,104, 3, 15,224,234, 99, 29,140, 22, 59,242,244, 54,132,212,244, 40, 91, 32,132,162, 14,243, 60,223,
-253, 85, 67,244,170, 89,122, 33, 34, 85,152,198,181, 23, 53, 10, 62, 95,148,145,123, 49,103, 11, 64,169, 70,112, 9, 94,117,142,
- 47,110,139, 20, 30,181,220, 92,220, 46, 31, 59,122, 72,185,247, 54,135, 51,119, 28, 38,203,102,204,196,194,175, 7, 37,105,114,
- 51,219, 3,136,113,246,159,201,189,106,213,151,138, 37, 17,255, 91,242,139, 85,229, 19,192,237,185,156,155,145,103, 96, 95,114,
- 19,172,217, 76,216, 55,223,224, 0, 0, 32, 0, 73, 68, 65, 84,243, 28, 47, 50,165, 63,118,170, 15,129,166, 41,235,143, 99,251,
-128,227,121, 76, 93,178, 19,179, 39, 14,128, 82,246,129,156,162, 40,185,222,100,199,248,105,107,177,240,251,225, 46,114,137, 0,
- 20,229,200,137,250,112, 96, 31,231, 46, 64,147, 29, 79,174,108,213,105, 99, 15, 61,120,177,187,176,121,171,119,174, 55,111,222,
- 60,215,195,195, 3, 50,153,236,121,164,162, 8,124,124,124,190,255,241,199, 31,131, 71,143, 30,253,108,178, 79,129, 64,128, 79,
- 63,249,132,102, 89, 30, 71,143,174,135,119,165, 70, 56,240,251,101,132,117,104, 10,157,193,132,236, 92, 45, 56, 48,111,124, 33,
-106,115, 51, 35,210,226,239, 54,107,217,190, 39,206, 28,223,199, 95, 62,186,110,100,105,230,232,241, 40,231,145,120,227,238,147,
- 90, 20, 85,206, 17,209,202, 55, 89, 22, 27,135,138, 62,114, 36,198, 63,129,187,155, 91,162,179,122, 50,239,224,222, 20,205,143,
-166,192,175,215,167, 63,218, 9,128,215,167, 62, 24,180,115,203,234, 59,145,247,110,205,234, 49,120,156,160, 75,191, 79,152,159,
-231,124,246, 45, 0,103, 39,222,179, 70, 69, 69,221, 31, 62,124,120,139, 75,151, 46,177, 0, 12, 20, 69,217, 24,134,145, 91, 44,
- 22, 81,251,246,237,243, 30, 62,124,120, 22,133, 39, 45,190, 68,171,143,118,122, 81, 18,237, 59, 98,206, 58,168,162,139,182,115,
-251,214,161, 8,173, 19,136,196,214,161, 0, 48, 46, 65,167, 12, 54, 85, 91,187,221,102,151, 29,249,249,215,131,179, 71, 14,232,
- 52,126,147, 96,234,162,212, 67, 83,139, 77, 68, 77,124,112,182,107, 97, 54, 94,192,208,112,145, 9,161,148, 9,224, 34, 19,194,
- 69, 42,132,205,206,151,166,229,200,219,236,156, 35,162,101,177, 67,103,180, 35,226, 86, 58,210,242, 44,200,213, 90, 97,180,178,
-224,193, 59, 90,163, 78,212,230,234,199, 23,221, 11,158,164,238, 21, 26,229,173, 94,190,192,117,247,133,164,103, 35,250,220,228,
- 98,184,200, 29,163,177,207,157, 59, 7, 79,207,146, 91,251, 28,199, 97,215,177,171, 88,180, 33, 2,199,214,127, 5,169,136, 65,
-253,222,211, 48,236,221,230,224,120, 14, 79,162, 34,211,107,212,110,224, 67,211, 50,208, 20, 5,179,141, 3,192, 23,121, 60, 45,
- 22,139,231,211,167, 79, 53,213,171, 87,247,245,247,247,239,199, 48, 12, 15,237, 45,243,190,109,217,134, 83,135,182,200,245, 70,
- 51, 43,183,231,173,175,158,106,236,142,234,213, 65, 81, 20,239,234,234, 42,138,136,136,208,213,171, 87,207,251, 13,111, 37, 90,
-166, 10, 90, 58, 98,204, 23,253,170, 85,173,138,157, 91,214,131,231,169,221,206,126,121,243,193, 75,152,241,205,203, 35, 12, 39,
-252,184,172,241,194,105,227, 94,122,111,204, 55,139,138, 29,117, 40,147, 40, 39,246, 29, 20,142,235, 87,255,192,252,105, 19,182,
-153,117,217,195,108,118, 91,255,236,212,216,109, 85,106, 55, 7,111,213,226,196,142, 5, 24, 48,100,164,164, 75,143,126,184,116,
-254, 36,102,127, 59,102,179, 33, 55,227, 35, 56,153,228,204,241,194,209,237,187,190, 43, 52,154,173, 88, 54,239, 7,140,154, 56,
- 11, 33, 29,122, 10,239,221,186, 60, 26,192,116,167,211, 33,172, 44,218,215,243,114,152,103, 27,135, 3,177,140,160,176, 43, 80,
-192, 80,116,195,170,238, 48, 90,236,208,148,208,168, 20,136,132,105,185,121,154, 74, 43,102,127,193,232, 77,118,168,243, 44,200,
-200, 51, 35, 51,247,185,193,202,204, 51, 67,157,103,129, 80, 64, 33, 58, 38, 1,180, 80, 80,234,252,188, 28,157, 13,205,130, 60,
- 28,247,232, 27,246,142,216, 4,174,205,143,157,189,221,119,209,162,197,210,219,113, 90,220,137,213,228, 71,178, 24, 72,132, 52,
-196,249,191,179,156, 35, 55,178, 56, 92,189,171, 86, 25,250,225, 7, 29, 93,149, 50,164, 60,202,128,128,113, 76, 17,227,166, 10,
-132,155,196,132,207,198,132,195,203,211, 29, 79, 51,205, 88,186, 55, 26,119,238, 63, 6,103, 44,221,110, 47,251,101, 91,216,136,
- 79, 39,184,211, 66, 49, 54, 30,143,115,148,147, 97,241,240,242, 65, 83,202,147,187,122,157, 38,139, 7,207, 58,153,131, 76,241,
-118,214,113,185,205,158, 58, 25,219, 54,252,132,227, 55, 50,158, 93,129, 23,118, 47,196, 23,223,204, 68,166,198,130,194,174,203,
-226,252, 8, 0,245, 11,145,168,215,182, 95, 48, 71,133,109, 83,249,219,150, 34, 52, 44,175,152, 43,203, 43,239, 91, 94,209, 43,
-108,238,191,213, 37,118, 29,190,102,138,220,189,235,202,165,138, 63,142, 30, 61,168,216,119,135,127,102,178,172,134, 76,126,214,
-184,158, 73,154, 92,117,151, 82,153, 44,239, 26,117, 37,114,201,217, 41, 51,151,154,125, 2, 42,217,143,220,210,100,105, 77,172,
-253,245, 28, 4, 5,171,112,243, 54, 9,196,146, 69, 66,163,229,135,204,204, 7,250,146, 34, 79, 28,207,227,208,149, 52,240,188,
-163,137,180,227, 92, 50,242, 91,230, 96, 57, 71,183,202,239,183, 50, 32,200,207, 67,113, 54,252,189,234,151,159, 52,221,235,229,
-233, 7,207,158,250,172,187, 48,164,129, 35,146,229,234,234, 10,119,119,119, 40,149, 74,148,212,117, 72, 81,212,135, 35, 70,140,
-120,173,245,159,145,145,129, 78, 29,219, 99,249, 79,107,208,160,227, 80,252,126,241, 56,172, 54, 14,245,107, 87, 69, 37,127, 15,
- 36,166,107,223,232, 70, 87,248, 4,127,218,172,253,187,223,182,234,208, 19, 17,199,246,240,151,143,253, 26, 94,218,137, 16,187,
-119,106,113,112,198,140,169, 85,166,204, 90, 33,113,145, 10,240, 64,103, 1, 77, 81,168,232, 35,135,167,130,198,153,125, 27, 77,
- 3,122,182,112,122,114,188,192,192,128, 77, 11,151,175, 86, 44,156, 59,173,253,245, 27, 84,132, 46, 37, 58, 27, 0, 12,233, 81,
-243, 30, 2,247,203,255,113,226, 72,131,182,125,224,227, 95,181,115,108,250, 67,167,205, 6, 0, 67, 76, 76, 76,236,148, 41, 83,
-130,231,206,157,203, 51, 12,195, 1,144, 44, 89,178,196,240,232,209,163, 91,112, 12,205, 69, 73, 15,155,142,157,235,140, 87,138,
-217,144,114,114,186, 78, 85, 95, 57, 66,235, 56,122, 69, 7,116,111,133,192, 10, 21, 16,147,102,104,152,109,224,132, 58, 11, 83,
-117,229, 47,119,174, 85,246, 98, 70,218,141,150,251, 0,246,151,246,252, 80,120,158, 32, 95, 16,205,114,145, 9,193, 57,174,149,
- 82, 25, 45,179,149,133,209,204,194,104,177, 67,111, 97, 97,176,176,224,120,199, 61, 65, 81, 20,172,118, 14, 78, 53,155, 95,185,
-246, 93,203,121,161,106,101, 10,174,114, 71,217, 92,243,167,123,160, 0,120,122,122, 66,165, 82, 57, 21, 21,181, 88, 29,183,184,
-197,198, 61,235,214,183, 88,237,224,121, 30,209,209, 81, 95,197,199,198,246,174, 94,163,122,155,218,245, 27,148,147, 75,104, 0,
- 40,210,104, 25, 12, 6,214,197,197, 69, 85,174, 92, 57, 58, 57, 57,249,153,121,174,222,176,189,125,239,158,221,232,219,183,143,
-238,193,213,219,207,134,184, 27,141, 70,170,101,203,150,174,129,129,129,180,217,108,214,148,246, 52, 41,188,131,222,245,240, 44,
- 55,235,195,143, 70, 5,181,239, 20,134,211,167, 78, 96,255,158,173,191, 25,212,209, 39,156, 21, 9, 14,174,249,218,168,195,106,
- 53,130, 94, 27,117, 88,169, 74,141, 98,141, 86,237,250, 77,155,243,148, 0,199, 15,237,224, 77,180,117, 12, 0,142, 53,105,119,
-108, 95,245,253,244, 65,163,191,169,214,173,215, 32,124, 56,100, 24, 4, 2, 6,103,126, 63,136,133,211,190, 60,172,203,203, 24,
-234, 76,154,128, 35,244, 86, 75, 20, 32, 11,252,188, 66,181,186,184,113,249, 60,158, 68,223,139,188,125,237, 82,157,234,245, 66,
-224,237, 95,241,243, 4, 47,102, 46, 30, 60,176,150, 36, 99, 49,153, 18,134, 13, 29,130, 23, 71, 29,134, 54, 10,246,164, 94,189,
- 1, 0, 24,180, 25,214,117, 11,198, 63, 42, 24,117,200, 89, 45, 9, 69,233,230,229,168,119,157,185,120,101, 98,239,238, 97,116,
-166,198,226,136, 96,229, 89,242,127,204,200, 44,248, 93, 99, 70, 13,127, 37,162, 34,111,112,166,188,204,221,165,188, 47, 77,195,
-250,119,189, 95,112,237,114, 28, 15, 10, 48,149,186, 91, 74,232, 26, 62,111,254, 34,233,237, 88, 29,238,196,105, 28, 93,133, 66,
-198, 97,176,132,244, 51,211,229, 24,205, 94, 66,116,136, 98,102,127, 60,116, 32, 50, 53, 86,112, 28, 32, 96,232,252, 31, 17,158,
-106, 41, 36,106, 13,200,204, 81, 35, 54, 62, 1,185,105, 79, 64,211, 52,188,252,131,156,158, 73,154,229,197,126, 6, 11, 95,175,
- 95,247, 54,130, 61,127,164, 66, 46, 17,192,172, 77,199,209,237, 11,212,102,157,102,150,209,160,219,227,204,124,142,207, 83, 16,
- 40,181, 70,103,242,145, 8, 25,236,220,176, 2,253,135,141,121,169,246,253,234,187, 25, 0, 77, 33, 59, 71, 11,138,162,212,165,
-171,151,168,107,197,109,191, 97,100,172,204, 26,133,152,173,215, 27, 10, 69,183, 70,249,163, 39,142, 29, 84, 92,136,151,224,106,
- 84,106,190,201, 82,115, 51,199,118, 79,210,230,101,119, 5, 16, 93,186,118, 33,221,117,192,199, 19, 35,171, 6,213, 54,159,190,
-167,139,203,213,219,138,204,115, 8,237, 55, 37,242,250,225,229,221,242,108, 49,159, 40,252,106,179,156,221, 62,207,168,142,158,
- 86, 68,215,161,120,218,210,157,207,186, 13,191,158,187,209,241, 59,203,130,229, 57,240, 28,240,217,247,171, 96,231, 88,112, 44,
- 11,142,229, 97, 99,121,121, 73,197, 85,249, 87,218,147,243,112, 71,205,193,211, 95,239, 46,116,119,119,135,167,167, 39, 60, 61,
- 61,225,234,234, 90,162,209, 18, 10,133, 74,129,224,229, 67,157,144,144,128,248,248,120,184,186,186,130,231,108,176,216,128,186,
- 33, 93,112,247,201, 61,156,188,112, 11, 60,199, 66,161, 44,253, 42, 47, 10,159,224, 79,154,182,235,189,162, 67,175,225,248,125,
-207, 47,252,181,115, 7, 71, 25, 51,162,215, 58, 29,161,103, 89,202,102,179,161,123,151,118, 9, 55, 35, 31, 31,251,110,226,232,
-176, 22, 61, 70, 73, 66,131, 3, 96,178,176, 72,138,127,130, 51,251,126, 53, 5, 85,241, 59,222,177,117,243, 4,155,205, 6,150,
-101, 75,124,144,155, 44,214, 76, 70, 40, 83, 12, 28, 56, 88,120,237,234,213,221, 10,239, 26, 59, 89,138,190, 77,241, 92,125,138,
-231,251,214,175, 95, 11, 86, 27, 7,131, 65,147, 83,218,125,214,106,181,177,235,215,175,175, 50,116,232, 80,121,237,218,181,133,
- 79,158, 60,193,194,133, 11,179,180, 90,109,172,179, 26, 39,206, 69, 45, 17, 80, 57,143, 10, 34, 90, 79, 91,133, 98, 96,143, 86,
-216,118,248, 2,206,156,191,132, 4,157,242,150,206, 46,216,151,152,144, 98,174, 83, 78,179,187, 87,104, 37,102,231,134,156,221,
-145,237, 38,191,207,243,146, 19,153,103,167,234,157,191,185, 1,173,209, 6, 87,185, 99,190,167,130,200, 22, 67, 81, 78, 59, 34,
- 10,136, 61,127,233, 70,221, 38, 53,106,227,102,108, 30, 50,114,205, 48,154,237,224, 56, 30, 28,120,120,186,136, 33, 21,209,120,
- 26, 31, 11,142,183,198,149,242, 81,161,110,219,166,173, 0,160, 64, 81,188, 64, 40, 16,128,135, 99,126, 69,153, 76,166, 83,169,
- 84, 78, 69,180,172,118, 59,250,134, 53, 71, 72,211,250,232, 61,202, 49,103,230,169,223, 38,195, 67, 41,196,182, 77,107,145,120,
-110,201,166, 42,161,163, 79,220,187, 27,249, 94,228,205, 63, 6,191,211, 88,214,208, 87,144, 34, 42, 42, 76,170,215,235,119, 3,
- 16,139, 68,162,176, 54,109,218,148,219,189,123,119,174,151,151, 23, 39, 22,137,212,189,122,246,224,132, 34, 81,118,193,103, 47,
- 94,188, 40, 28, 53,106,148, 75, 78, 78,206,211,244,244,244, 75, 0,108,197, 55, 4,131, 59,129,198, 86, 80,148, 84, 41,147, 39,
- 84,174, 92,213,191,105, 72,115,183,119,251,246,135, 68, 44,193,239, 39,142, 97,217,226,185, 59,116,169, 15, 62, 46,205,145,124,
- 91,163, 14,147,158,198,197, 26,140,230,122,117,155,180,163,206,159,216, 55,206, 10,175,197,140,196,186,160, 83,223, 49,213, 98,
- 83,116, 88, 54,231, 43,120,184, 41, 16,247,228,161,241,209,131,187,171,108, 38,205, 87, 78,155, 44, 0,242, 44,246,189,208, 33,
- 97, 30,102, 43,139,115, 17,135, 77,156,157, 11,187,116,246,200,147,242, 65, 77,165,117,155,118,244,200,220,191,182,175, 1,216,
- 86,146, 78,242,195,215, 35,184,188, 37, 55,238, 84,196, 73, 55,159,138,117, 24, 10, 20,172,102, 19,212, 49,215,236,134,244,135,
- 26, 77,242, 61,167, 70,225,102, 37,226,251,111,126,252,223, 39, 77,155, 52, 81,240,144,190, 20,193, 42, 48, 88,153, 26, 11,188,
- 92,196, 48,106,212,120,116,237,152,201,160,102,138,157,239,204,110,209,203, 51, 51,210,197,207,211, 25,162, 67,138,251,124,102,
- 70,186,216,110,209,203, 75,126,212, 49,112, 85,136,113, 55, 46,249, 89,226,187, 68,232,200,205, 18, 11,153,103,121, 90, 5,117,
- 65, 9,180, 19, 73,221,145,156,101, 2, 5, 30, 28,107,135,221,102,129, 86,163, 65,114, 74, 26,210,211,210,161,213,230, 66,174,
-244, 64,221,134,205,224,162,144,226,246,153, 29,224,121,222,169,121, 13,109,148, 48,184,105, 72,107,201,189,120, 71, 46,150, 84,
-200,227,224,214,185, 89, 58, 77, 70,107, 93,234,163, 71,165,173,139,237, 44,123,242,206,253, 71,117,202,251, 85,166,110, 61,201,
-195,166, 53,203, 97,201,143,108,218,108, 44,238, 61,213, 35, 53,219,128,167, 49, 15,120,142,101, 79,226, 63,130,160,232, 0, 32,
- 4,245,235,214, 66,151, 15,222,197, 79, 63,173, 66, 76,108, 60, 55,107, 92,183,167, 58,109,238, 59,165, 48, 89,157,144, 63,215,
-134, 33, 61,106,158,209,163,105,210,129,155,217,180,209,194, 23,155,224, 35,245,174,136,214, 31, 47, 60,110,212,102,139, 89,179,
- 65,112,112,211,199, 91, 11,211,116, 56,104, 88,102, 77, 24, 0,165, 76, 0,138,162, 80,208, 93,184,114, 70, 56,228, 18, 71,223,
-178,209,108,199, 7,227, 23, 97,211,162, 47,193, 3, 24,212,255,130,161,168,114,194,177,118,225,103,126,184, 90, 62, 33, 62, 35,
-185, 83,207, 9,167, 76, 86,137,185, 71,159,161,215,155, 52,105,146, 43,147,201, 32,147,201,224,234,234, 10, 15, 15, 15,184,187,
-187,151,184,239, 54,155, 77,103,177, 88, 60,197, 98, 49, 56,142, 67, 92, 92, 28,226,226,226,144,151,151, 7,181, 90, 13,189, 78,
- 99,191,122,106,167,160,110,104, 55,248, 87,173,135,138, 53, 26, 64,200, 80, 16, 8,104,156, 57,176,166,168,114, 22,110,178,218,
-246, 90,217,177,247, 8,252,190,103, 53,127,237,220,193,209,198,140,232, 53,206,158,163,252,238,158,219,125,251,246,173, 55,106,
-212, 40,209,143, 19, 71, 29, 63,124,226, 76,244,206, 67,171,123,230,228,228, 6,242, 60, 15,119, 55,183,196, 1, 61, 91, 28,108,
-223,178,105,194,169, 83,167,184,173, 91,183,154, 41,138,186, 91,156,166,163,146,202,248,237,212,201,136,169,173,219,182,195,218,
- 13, 91,219, 70,222,127,208,246,201,147, 71, 8,172, 88, 21,149,171,212,128,129,242, 64,196,217,243,208,229,102,252,230, 76, 57,
- 95,137,106, 81, 57, 57, 57,127, 12, 24, 48,160,203,133, 11, 23,232, 1, 3, 6, 24, 50, 51, 51, 47,190, 16,197,226, 75,210,188,
-244,115, 31, 53,128,223, 42,182, 29,182, 35,217,154,251, 57,128,185, 21, 42, 86,192,153,243,151,112,233,194,149, 85,153,242, 10,
-211, 62,254,224,163,240, 74,189,152, 17,189, 66, 43, 49, 42, 15, 57,182,172, 94,200, 28,184, 20,191, 40, 62,139, 93, 59,247,236,
-212, 25,206,156,163,103, 15, 14,173, 21, 45,107,149,131,141,229,193,241,142, 10,215, 69, 42, 44,170,226,125, 77, 83, 96,145,124,
- 60,122,212,168, 39,117,235, 55,252,226,131,143, 70,139, 26, 86, 13,196,213,199,185, 0, 69,161,156,175, 2,169,169,169, 56,183,
-107,181, 61, 39,249,225, 42,134,225,166,151,226,120, 34, 39,225, 86,245, 23, 54,195, 51, 51, 51,113,230,204, 25, 20, 24, 44,111,
-111,239,162,140,214, 75,154, 89,233, 41, 23,103,204,255,165,229,200, 15,251,160, 71,187, 58, 56,123,237, 9, 44,249,243, 53, 21,
- 12, 37,143,189,244,179,248,243, 1, 85, 45,159,244, 13,210, 24,109,226,248,239,227,242,206,193,177, 6, 43, 87, 68, 57, 45,217,
-217,217, 7,162,162,162, 90, 53,104,208,160,210,145, 35, 71,178, 35,175, 28, 31,247, 98, 33, 38, 76,152,160,252,233,167,159,228,
- 60,207, 95,180, 88, 44, 49, 78,237, 59,141, 45, 55,174, 95,247,180,218, 56,156,191,114,187, 86,199,150, 13,193,241,192,181,107,
-215,176,118,221, 90,211,221, 59,183, 22,232,211,125,167, 23, 99, 94, 10, 61,158,108,217, 70, 29, 62,211, 76, 77,142, 95,240,251,
-225, 93,155,154,182,237,137,193,159, 77,159,126,230,240,214,169,141, 91,247,160,107, 53,237,130, 27,151, 34,112,242,200,177,255,
- 89,117,217, 83, 81,114,238, 72,161,229,148,200,228, 99,107, 55,110,139,167, 9,241,136,123,116,239, 55, 83,246,227,148,132, 39,
-204,111, 41, 73, 9,163,171,212,105,137, 11,199,183,141, 43,198,104, 21,123,205, 7,122,203, 86, 31, 57,116, 96, 96, 82,210,207,
-190,122,163, 73,194,243,188, 73, 34, 22,164, 41,105,237,118,141,211,229,124, 96, 85,167, 84,234,219,255,131,209,135,151, 45, 91,
- 44,244,113,151, 35, 45,199, 4,141,209, 10,173,193, 10,154,162, 80,221, 95, 1,131, 54, 27,103,119,205,183, 89,116, 57, 3,128,
- 39,214,162, 52, 21,170,224,153, 57,143, 35, 62,155, 48,230, 52,196,110,129,254,149, 59,124, 83,108,180, 78,155,124,171,231,132,
- 49, 7,131,121,158,239,168, 80, 5,107,245, 25, 81, 83,138,218,119,138,114,220,223,131,219, 7,194,106,119,204, 63,102,231, 0,
-150,227,242,163,124, 0,255,172, 63,159, 42, 97,223, 41,110,251,225,139, 72, 73,207,133,209, 98,131,217, 98,135,213,198,130,102,
- 24,184,123,184,163, 70,229, 70,112,115,119, 69,122, 90, 10, 46,157, 58,128,232, 59,103, 47, 82, 60,166, 25,213,143, 78, 57,115,
-142, 68, 50,247, 96, 63,127, 95, 58, 85, 99,129, 76,204,224,214,217, 35, 86,155,197,188,192, 73,147,245,154,102,110, 86,246,162,
- 47, 38, 78, 26,244,235,250, 13,190,245,170,184, 34, 41,211,136, 36,181, 9, 90,147, 45,223,136,113, 48,235, 50,113, 39, 98, 67,
- 26,107,210, 46,194,127,132, 34,141,150,221,106,210,238, 62,118,213,115,242,212,249,204,227, 39, 49,182,153,159,119, 79, 50,234,
- 52,221, 74, 29,201,122,129, 95, 63,173,178,237,207,216,137,215,186, 11,121, 14, 28,207,227,224,149,180,103,221,133, 92,126,230,
-229,205, 39,197, 47, 35,248,226,218,133,237,186,141,251,253, 78,148,118,179,209,152,238,246,240,241,130, 28, 0, 96, 24,230,217,
- 79, 65,110,150,201,100,178,148,208,133,178,113,205,154, 53, 95,143, 30, 61, 90,146,152,152,136, 39, 79,158, 32, 55, 55, 23, 82,
-169, 20,199,142, 29,179,129,179, 47,184,115, 97,111, 92,212,141, 19, 63, 4, 55,233, 82,190, 94,104, 55,200,229, 10, 8,120,231,
-147, 49,229,170,160,129, 77,218,246, 90,209,241,221,145, 56,185,119, 13,127,237,236,129, 49, 70,117,244,234,210, 30,203,220,220,
-220, 72, 0,143, 22, 44, 88,208,112,237,218,181, 85, 38, 78,156, 24,179,113,197,212,101, 0,144,149,149, 5, 0,184,121,243, 38,
- 63,102,204, 24,179,201,100,138,205,201,201,185,129, 18, 6, 64, 0,128, 81, 45,159,189,118,229,220,186,137,201,169,125,170,214,
-109, 6,239, 42,205,224, 91,189, 57,114,180, 86, 92,125,156,130,152, 7,167,240,224,252,174, 35, 6,165,125, 42, 74, 57,191,113,
-131, 6, 13, 2,105,154,174,172,211,233,124,107,215,174,221, 64,161, 80,220,108,208,160, 65, 35,129, 64,144,116,253,250,245,248,
-210,104, 37,156,221, 96,174,216,118,216,210, 4,173, 75,251,152, 52, 67,163, 4,173,203, 77,131,196,237, 75,117,196, 82,243,175,
- 76,192, 34,222,154, 25,185,115,131,102,247,150,213, 11,153, 15,194, 39,176,247,242, 60, 62, 23,200,196,191,151, 46, 92, 77,167,
-126, 50,180,247,243,233, 29,242, 35, 89,249,191, 59, 21,166,207,203,187,147, 7,224,235, 59,247,133, 43,238,125, 62,106, 70,253,
-166, 45,135,180,121,103, 0,109, 23, 41,113,124,239,207,124,236,157,136,157, 2,158,253,206,232,196,106, 0, 37,118, 7, 89, 44,
-206,152,172,215,203,152,168,104,183,115,235,186, 97,187,247,238,153,243,110,175,222,158, 43,191,127, 31,243,127,217, 7,133, 76,
- 2,158,227,240,126,251,192,126, 63,140,168,217, 51,208, 71, 26,176,251,116,210,185,207, 22,223,251,218, 96,176, 70, 59, 17,137,
-225, 51, 51, 51,207, 43,149, 74,117,171, 86,173, 66, 36, 18, 9,149,153,153, 41, 80,169, 84,118, 55, 55, 55, 75, 82, 82,146,193,
-108, 54,239, 6, 80,170,105,199,173, 54, 14,113,233, 38,236,223,179, 27,183,175,156,194,131, 7, 81,218, 7,247, 31, 44,167, 4,
-252, 98,125,250,163,108,160,212, 13,124,112,133,142, 58,228, 75, 61,234,144, 53,107,183,108, 92, 53,179,131,193,100, 30,214,160,
- 69,119, 84,170,213,146,182,218, 88,220,189,118, 26,167,119, 45,158,111,213,101, 79, 46,203, 57,246, 47, 95,165, 6,207,136,241,
-199,153,195,224, 57,110, 21, 0,240, 28,183,234,230,133, 35,163,155,119, 27,129,114,170, 74, 13,114,159,222,164,240, 6,179,135,
-139, 4,180,254,232,238, 95,247,198,197,197,225,225,195,135,120,252,248, 49,178,179,179,177,101, 75, 92,169,206,143, 33, 39,254,
-247,232,251,116,215,247,222, 31,124,176,223,192, 15,165, 85,106,212,163,131,203,123,192, 83, 41, 64,212,227,120, 68, 95,191,195,
- 69, 93, 61, 98,178,106, 50,222, 53,230,196, 23,105,252,228, 94,181,124, 0,118,114,193,218,133,161,161, 45,131, 39,205,154, 19,
-226,233,173, 42,180, 30,207, 82,103,136,191,250,236, 64,240,165,203,127, 56,181,214, 33,199,178, 89,225,195, 6,112,140, 99,161,
- 80, 60,139, 83,231, 31, 61, 71, 99,202,241, 62,207,217, 75,140,224,127,212,167, 53,236, 28, 7,189,209, 10,141,222,140, 60,173,
- 9,169, 25, 89,184,125,231, 14,206, 30, 60,128, 39, 81,183, 99,109, 22,203, 9,154,166,118, 25,211,163,207,150,174,167, 73, 80,
-197,179, 92, 57,196,102,235, 32, 21, 11, 16, 31,125,221,172,215,228,109,126,211,235,200,152,245, 40, 53,131,161,186, 12, 24, 48,
-240, 88,135,174,189,220,154,182,232, 36,247,114,117,135, 72,192,227, 81, 92, 10,110, 92, 60,166,143,185,125, 78, 99,179,232,194,
-222,198,170, 47,255,112, 74, 30,117,104, 53,235,123, 14,234,221,118, 15,195, 8,196, 28,103, 55, 91, 45,230,247,202, 98,178,254,
- 44,120,158, 77, 26, 54,168,207, 75,109, 3, 59,199,203, 6,245, 63,110,124,177,173, 96, 99,121,249,160,254, 23, 13,142, 10,164,
-232,196, 62, 63,191,114,221, 11,214, 46, 76, 72,200,186,150,157,109, 62, 13, 32,201,100, 50,189,113, 25,211,211,211,103,204,154,
- 53,171,135,193, 96,168,217,174, 93, 59,137,171,171, 43,178,178,178,112,226,196, 9,219,161, 67,135,238,103,100,100,252, 0,100,
-216,141,104,244,219, 29,211,222,161, 81,215, 79,252, 80,179, 73,215,242,245, 90,116,115,190, 50,147,200, 70,118,232, 53,156, 58,
-185,111, 13,127,245,204,190, 79,140,234, 71,191,148,225,176, 90, 77, 38,211, 21,147,201,116,239,187,239,190,107,234,227,227,227,
-243,195, 15, 63, 72, 53, 26,141,112,229,202,149,166,204,204,204, 52,141, 70,115, 9,197,228,211,188,206, 77, 91, 94, 50,250, 30,
-221,189,166, 61,191,123, 77,103,119,175,128, 46,110,222,229,171,229,170,147, 99,243,212, 41, 39, 0,156,204,159, 40,178, 84, 52,
-108,216,176, 42, 69, 81, 3, 0,212, 85, 40, 20,213,149, 74,165,132,231,249,154, 20, 69, 69,114, 28,119,167,118,237,218,135,238,
-223,191, 95,170,201,100, 19,206,110, 48, 7, 6,183,220,154,109,224, 68, 22, 90,180, 53,225,236, 6, 51, 0,100,252, 62,201, 0,
- 96,255,253,118, 95,247, 61,112, 41,126, 89,100,142,219, 56,245,153, 57, 7, 74, 91,230,188,164,219,213,223,214,245,111, 74,189,
-159, 4, 96,216,157,235, 88,120,247,230,165, 31, 41, 30, 66, 22,246,153,198,140,199,215,223,134,190, 80, 40, 52, 5, 4, 4, 20,
- 58,186, 80, 34,145,152,204,230,226, 2, 40,103,237,186, 84,172, 5,218,110,216,179, 99,195,176,125, 7,246,207,105,211,241, 93,
- 79,105,249,242,168,172,162,176, 97,114,227,113,167,110,170,175,246,154,116,238,167,152, 20,211, 29,148, 50, 31, 70,167,211, 69,
- 3,200,209,233,116,189,121,158, 79,164, 40, 42, 48, 39, 39,231,150,205,102,187, 91,106, 67,192, 97,112,104,104,179, 45, 20, 69,
- 9,120, 59, 55,239,146,144,217,106, 74,125,144,132, 50, 46, 75, 82,175,178, 43,198,255,176,180,113,181,234, 65,141, 11,214, 58,
-172, 83,201, 5,163,190, 94,216,184, 82,149, 26,141,159,175,127, 88, 98,154, 0,111, 51,228,124,188,103,221,188,115, 55, 47,159,
-254,214,203,175, 82,165,180,164,152, 7,137,143,111,205, 96, 77,154, 61,101, 61,207,113,143, 35, 23,175, 93,240,245,196,212,228,
-216,181, 6,245,163,123, 0, 96, 80, 63,186,247,224, 6,190,207, 76, 75,154,152,149, 17,179,224, 77,143,133, 94,175, 79,217,188,
-121,179,123,203,150, 45,105, 31, 31, 31,168,213,106,156, 62,125,154,227, 56, 46,185,212, 90,217,177,167,245,217, 84,185,223,126,
- 89, 49, 79,164,112,233,102,183,219,253,121, 30, 16, 8, 4,169, 22,131,230,152,150, 86, 76, 66, 78,188,169,248,103, 6, 71, 1,
-160, 11,214, 46,228, 56,142,154,183,108, 67,188, 80,234, 82,232,100,136, 54,147, 86,206,113,156,211,107, 29,230, 62,189, 81,237,
-109,221,223, 20,207, 79,107,208, 36,228, 91,155,205,106,202,191, 63, 76, 0, 76, 60,143, 44,154,166,206, 50,156,237,184,166, 12,
-141, 41,138,130, 43, 79, 9,224, 34, 19,128, 2, 5, 93, 94, 54, 95,154,156,172, 66, 13,113, 70,116,164, 33,163,109,197,163,150,
- 29, 67, 35,126, 63,210,159,101,217,202,249, 49,131, 56,179, 81,191, 83,151,234,241, 27,112,221,142,127, 63,135, 11,204, 22,245,
- 39,255, 35,167,186, 81,254, 73,154,193, 85,100,189,203, 7,248, 12,141,139,207,184, 26,147,104,248, 13, 47, 47,171, 83,150,114,
- 50, 62, 62, 62,223, 83, 20, 53, 68, 44, 22, 43, 45, 22,139,158,231,249,141,233,233,233, 51,240,218,226,191,141,132, 50,149,113,
-168, 88, 42,159, 98, 53,233,255, 48,100, 68, 15, 46,105,223,229,222, 65, 93,164, 10,197,215, 38,163,126,163, 33, 61,122,195, 91,
- 62,158,110, 18,137,164,145, 82,169, 20,102,102,102, 94, 1,144,247, 79, 58,239, 13, 26, 52,168, 64,211,116,101,142,227,124, 0,
-184,193, 49, 42, 36, 83, 32, 16, 36,231, 71,180,248,210,106,182,250,104,167, 87,199,206,117,198,159, 56, 23,181, 36,191, 91,241,
- 25, 1,253, 22, 73,135,116,107, 63,225,183, 61,251, 11, 27,117,248,255,238,154,255,235, 52,219, 10,148,126,153,195,104,177,219,
-204,142,193, 38, 67,102, 74,242,152,243,119,213, 87, 0,104,203, 82, 78,145, 72,244,129,213,106,149,137, 68, 34,163,213,106,221,
-252, 79,217,119,153, 42,120, 56, 13,222,233,149, 41, 56, 80,215, 95, 25,180,242,111,185,150,152,122,245,234,181, 22,137, 68, 21,
- 88,150,149, 91, 44, 22,131,209,104,140,139,143,143,255, 3, 69, 47,124,254,167,150, 83,161,170,177, 88, 36,146,124, 14, 0, 86,
-171,121,169, 62,227,209,248,226,190, 88,204,231,255, 95,159, 35,175,202, 77, 30, 9, 24,161, 55,242, 39,230,230,236,118,117,122,
-236,181, 26,127, 99, 57,255,117,240, 60,255,167,255,143, 78, 68,147,104, 18, 77,162, 89, 8, 52, 57,158, 68,243,239,212,148,250,
-213, 10,148,250,213,114,122,210,229, 34, 62, 79,142, 39,161,128,240, 66,126,192,243, 60, 4,228,216, 16, 8,132,191, 1,142, 28,
- 2,194,223,137, 41,245, 65,226,159,249,121,194,127,142, 34,115,162,169, 98, 92,105,105, 66,130,111,226,108, 79, 18, 77,162, 73,
- 52,137, 38,209, 36,154, 68,243, 63,167, 89,146,246,255,199, 46,201,240, 87,182, 15, 3, 72, 37, 93,135, 68,147,104, 18, 77,162,
- 73, 52,137, 38,209,252,167,104,254,155,120,214,117, 72,147, 99, 65, 32, 16, 8, 4, 2,129,240,231, 64,114,180, 8, 4, 2,129,
- 64, 32, 16,202, 70, 97, 93,135,196,104, 17, 8, 4, 2,129, 64, 32,188, 5,138, 76,134, 39, 93,135, 4, 2,129, 64, 32, 16, 8,
-101,163, 32,162,229,135, 23,166,119, 32, 70,139, 64, 32, 16, 8, 4, 2,225,237,145,138,194,162, 91,135, 14, 29,226, 11,251,157,
- 64, 32, 16, 8, 4, 2,225,175,224,255,185, 23,121, 49,146, 21,158,191,253,242,168, 67, 98,176, 8, 4, 2,129, 64, 32,252, 83,
-204,214,255, 51, 10, 34, 89, 5, 63,207, 22,205,126,102,180,122,244,232, 65, 17,179, 69, 32, 16, 8, 4, 2,225,239,226,223,232,
- 69,232, 87,119,144,156,102, 2,129, 64, 32, 16, 8,127,167,217,250, 55,237, 15,153,222,129, 64, 32, 16, 8, 4, 2,161,108,248,
- 1,232,254,194,246, 97,188,208,125, 72, 32, 16, 8, 4, 2,129, 64,120,115,194, 11,219,230,121,158, 68,180, 8, 4, 2,129, 64,
- 32, 16,254, 4,179, 69, 32, 16, 8, 4, 2,129, 64,248,179,248, 43, 22,149, 38, 43,155, 19, 77,162, 73, 52,137, 38,209, 36,154,
- 68,243,223, 78,193, 60, 90,192, 11,243,104, 1,100,102,120, 2,129, 64, 32, 16, 8,132,178,210, 29,142,249,179,194,243, 95,187,
- 19,163, 69, 32, 16, 8, 4, 2,129,240,118,121,109,249, 29, 98,180, 8, 4, 2,129, 64, 32, 16,222,174,193, 90, 77,140, 22,129,
- 64, 32, 16, 8, 4,194,159, 12, 49, 90, 4, 2,129, 64, 32, 16, 8,127, 18, 20,138, 30, 57,112,178, 20, 58,111, 50,250,224, 36,
-209, 36,154, 68,147,104, 18, 77,162, 73, 52,255,115,154, 37,105,159,196,255, 63, 10,102,134, 63,140,231,137,240,171,121,254,207,
- 95,182,145, 12,125, 37,154, 68,147,104, 18, 77,162, 73, 52,137,230,191,157,240, 87, 94, 1,252, 53,243,104, 17, 8, 4, 2,129,
- 64, 32,252,215,204,214, 51,195, 69,150,224, 33, 16, 8, 4, 2,129, 64, 40, 27,171,139,250, 3,137,104, 17, 8, 4, 2,129, 64,
- 32,148,141,240,162,182,137,209, 34, 16, 8, 4, 2,129, 64,248,115, 12, 23, 49, 90, 4, 2,129, 64, 32, 16, 8,111,209,100,133,
- 23,250,215, 67,135, 14,241,228, 24, 17, 8, 4, 2,129, 64,248,187,248,183,121,145,103,211, 59, 20,236, 24, 49, 91, 4, 2,129,
- 64, 32, 16,254, 78,147,245,255,212,139,248,225,249,104,195,240,252,109,240, 60, 79, 70, 29, 18, 8, 4, 2,129, 64, 32,148,145,
-238,120,121,228, 97,120,193, 54, 49, 90, 4, 2,129, 64, 32, 16, 8,101, 39,188,216,191,146,110, 67, 2,129, 64, 32, 16, 8,127,
- 39,255,198, 28, 45,138,156, 86, 2,129, 64, 32, 16, 8,132, 50, 81, 88, 52,235, 47, 89,235,144, 64, 32, 16, 8, 4, 2,225, 63,
-105,184,136,209, 34, 16, 8, 4, 2,129, 64,248, 19, 76, 86,129,209,250,179, 39, 44, 37, 43,155, 19, 77,162, 73, 52,137, 38,209,
- 36,154, 68,243,191, 98,178, 94,156,226, 1, 0, 25,117, 72, 32, 16, 8, 4, 2,129, 80, 86,200,162,210, 4, 2,129, 64, 32, 16,
- 8,127, 18,100, 81,105, 2,129, 64, 32, 16, 8,132,191,216,112, 17,163, 69, 32, 16, 8, 4, 2,129,240, 22, 77,214, 75,102,139,
-228,104, 17, 8, 4, 2,129, 64, 32,148,141, 34,115,180, 40, 20, 61,114,224,100, 41,254,193,155,140, 62, 56, 73, 52,137, 38,209,
- 36,154, 68,147,104, 18,205,255,156,102, 73,218, 39,241,255,159,112,252, 69, 19,150,146,161,175, 68,147,104, 18, 77,162, 73, 52,
-137, 38,209,252,175, 17, 14, 56,230,209, 34, 93,135, 4, 2,129, 64, 32, 16, 8,111,193, 88, 21, 6, 49, 90, 4, 2,129, 64, 32,
- 16, 8,101,131,204,163, 69, 32, 16, 8, 4, 2,129,240, 39,225, 7, 71, 84,171,224,181, 17, 49, 90, 4, 2,129, 64, 32, 16, 8,
-111,135,238,112, 68,181, 10, 94,137,209, 34, 16, 8, 4, 2,129, 64,120,139, 20, 58,143, 22, 5, 0,135, 14, 29, 42, 24,127,216,
-174, 71,143, 30,103,201,177, 34, 16, 8, 4, 2,129,240, 87,242,111,244, 34, 60,207, 63,143,104,245,232,209,131, 2,112,134,156,
-106, 2,129, 64, 32, 16, 8,127, 7,255, 70, 47, 66,191,226, 36,219,145,211, 76, 32, 16, 8, 4, 2,225,239,224,223,232, 69, 4,
-175,184, 72, 2,129, 64, 32, 16, 8,132,191,133,255,199, 94,196, 15,142, 68,248,195,249,175, 64,254,148, 15,100, 30, 45, 2,129,
- 64, 32, 16, 8,132,178, 81, 48,218, 48, 28,175,204,169, 69,162, 88, 4, 2,129, 64, 32, 16, 8,101,163,176,153,225,255,146,181,
- 14, 9, 4, 2,129, 64, 32, 16,254,147,144,181, 14, 9, 4, 2,129, 64, 32, 16,222, 14, 47, 70,181, 86,255, 85,255,148,172,108,
- 78, 52,137, 38,209, 36,154, 68,147,104, 18,205,255,146,201,122,182,253,210, 60, 90, 4, 2,129, 64, 32, 16, 8,132,183, 11,233,
- 58, 36, 16, 8, 4, 2,129, 64, 40, 27, 5, 35, 14, 95,220, 38, 70,139, 64, 32, 16, 8, 4, 2,225, 45,154,173,215, 32, 93,135,
- 4, 2,129, 64, 32, 16, 8,101, 35,188,168, 63, 16,163, 69, 32, 16, 8, 4, 2,129,240, 39, 25, 46, 10, 69,143, 28, 56, 89, 10,
-225, 55, 25,125,112,146,104, 18, 77,162, 73, 52,137, 38,209, 36,154,255, 57,205,146,180, 79,226,255, 31,127,219,132,165,100,232,
- 43,209, 36,154, 68,147,104, 18, 77,162, 73, 52,255,147,144,233, 29, 8, 4, 2,129, 64, 32, 16,254, 68, 74, 99,180,188, 5, 2,
-193,183, 50,153,236, 39,153, 76,246,139, 64, 32, 88, 0,192,163,180,255, 80,161, 80,140,243,245,245,125,232,235,235,155, 84,161,
- 66,133, 35, 46, 46,242, 47,170, 74,208, 6,128,240, 45,237, 79, 48,128, 47,100, 50,217, 3,169, 84, 26, 15, 96, 19,128, 47, 0,
-120,149, 69,120,134, 63,222,187,247,121,239,125, 51,252,241,222, 43,127,234,238,227,227,115, 30, 64,151,183,117, 82, 6,202,209,
-169,159, 2, 79,251, 41,240,116,160,252,205, 91, 13, 46, 46, 46, 67,252,252,252, 46,121,122,122, 38,251,249,249, 93,148, 74,165,
-253, 74, 41,161,242,241,241,153, 31, 24, 24, 24,237,239,239,191, 4,142,213,201,255,177,180,150,160,117,136, 4,234, 80, 49,180,
- 45,197,248, 41, 84,140,206,157, 1,249, 27,202,181, 2,176,203,213,213,245,150, 64, 32, 56, 4,160,111,254,245,213, 87, 32, 16,
- 28,114,117,117,189, 5, 96, 87,254,231,222,228, 58,157, 15, 32, 25,192,236,252,237,177,129,129,129,218,250,245,235,199,215,175,
- 95,255,215,234,213,171,127,232,172,152, 92, 46,239, 28, 24, 24,184,187, 66,133, 10,241,161,161,161,217, 1, 1, 1, 81,229,203,
-151,223, 32,145, 72,218,145, 42,142,240,127,236,125,119, 88, 20,215,251,253,217,198,238,194, 46,236,210,151,174, 82, 4, 11, 40,
- 42,118,236, 53,216,137, 93, 99,143,209,104, 52,198,174,128, 81, 99,137, 61, 38,209,143, 45,162,177, 18, 11,118,108,216,149, 69,
- 17, 16, 1, 65,164,119,182, 2,219,239,239, 15, 74,136,161,154,228,251, 75,153,243, 60,243, 44,236,222, 57,115,239,204,189, 51,
-103,222,251,222,247,165, 64,129,194,223, 31,195, 0,124, 3, 96, 79, 76, 76,140,152, 16, 34, 38,132,136, 99, 98, 98,196, 0,190,
- 7,176, 9,117,155, 16,127,243,189,165,165,101,200,250,245,235,203,115,114,114, 72, 65, 65, 1, 73, 76, 76, 36, 59, 86, 47, 51,
- 12,178, 96, 18, 87,107,243, 82, 59, 59,187, 55, 46,142,142, 39,218,240,233,203, 0,184, 53,134,179, 6,204,141,141,141,159,172,
- 94,189, 90,113,239,222, 61,133, 90,173, 86, 24, 12, 6, 69,118,118,182, 34, 34, 34, 66,209,189,123,119, 5,128, 69, 0, 24, 77,
-224,172,198, 58,123,220, 37, 7,215,144,117,246,184, 91,243,123, 47, 47,175,120,131,193, 64,198,140, 25,163, 2,224,208, 20,206,
-247,225, 0,112,219,152, 65, 24,200, 71,158,238,200,215,132,236, 93, 66, 2,121, 72,255, 16, 78, 27, 27,155,243, 11, 22, 44,144,
-101,101,101, 17,149, 74, 69,210,211,211,201,156, 57,115,164, 54, 54, 54,199, 26,217,118, 75,111,111,239,188, 71,143, 30, 25, 36,
- 18, 9,185,115,231,142,161,109,219,182,121,141, 20, 91,253,223,171,203,126,123,123,251,203, 77,217,108,108,108, 14, 52,245, 26,
-117,230, 32, 93, 35,190, 77,200,179,235,228,194,152,174,100, 71, 71, 71, 50,218,130, 45,233,193,198,231,189,106, 15,101, 82, 23,
-231,199,189,122,245, 82,190,124,249, 82, 95, 84, 84, 68,226,227,227, 13,179,102,205, 42, 7, 16, 55,107,214,172,242,248,248,120,
- 67, 81, 81, 17,121,249,242,165,190, 87,175, 94, 74, 0, 51,155, 80, 79, 58,128, 67,193,193,193,132, 16, 66,214,175, 95, 79,124,
-124,124, 72,223,190,125,137, 66,161, 32,132,144, 52, 66,200, 97,157, 78,247, 73, 99, 56, 5, 2,193,228, 5, 11, 22, 40, 74, 75,
- 75, 73, 21, 12, 6, 3,145, 72, 36,100,207,158, 61, 74,145, 72,116,185,142,151, 12,106,202,131,226,164, 56, 41,206,191, 27,231,
- 63, 25,118,168,240,211,170,218,236,128,138,169,195,134, 48, 97,217,178,101, 85,162,234, 74,143, 30, 61,158,126,242,201, 39,226,
- 79, 62,249, 68,220,163, 71,143, 59, 0,174, 69, 69, 69,137,151,246, 11, 11, 36, 0, 0, 32, 0, 73, 68, 65, 84, 46, 93, 42, 6,
- 48,161,129, 11, 97,222,173, 91, 55, 73,110,110, 46,241,240,240, 32,205,154, 53, 35,185,185,185,132, 16, 66,158,125,220,129,220,
-108, 5,146, 17,121,133, 92,255,229, 12,153,101,199, 36, 61,237, 4, 90, 59,145,168,200,202,202,106, 3, 42,156,246,235,187,184,
-163, 90,181,106, 37,143,139,139, 83, 36, 37, 37, 41, 66, 66, 66, 20,125,251,246, 85,120,123,123, 43, 70,143, 30,173,216,189,123,
-183, 66,163,209, 40, 14, 28, 56,160, 48, 51, 51,139,171, 69,108,125,176,208, 98, 50,153,187, 98, 98, 98,200,155, 55,111, 72,165,
-149,162, 46, 78,129, 80, 40, 28,108,110,110,190, 72, 40, 20, 14, 6, 32, 0, 0, 15,128,223, 78, 0,231,207,219,185,122,133, 79,
-232,239,182,167,127,167, 14,129,166,116,137,246,187, 37,132,140,113,254, 32,161, 37, 16, 8, 38,127,241,197, 23,114,149, 74, 69,
- 74, 75, 75,137, 66,161, 32,165,165,165, 68, 46,151,147, 9, 19, 38,200,184, 92,238,168,134, 56,173,172,172,190,142,140,140,212,
-229,230,230,146,200,200, 72,114,249,242,101,178,119,239, 94,131,141,141,205,246,166, 14, 64,145, 72,116,227,250,245,235,226,232,
-232,104,241,147, 39, 79,196, 90,173, 86,172,209,104,196, 26,141, 70, 28, 30, 30, 46, 14, 11, 11, 19,159, 60,121, 82,172, 86,171,
-197,106,181, 90,172, 82,169,196, 45, 90,180,184,218,212,107,228,199, 65,134,250,222, 5, 66,182,207, 35,210,205,115,137,100,241,
- 80,146, 63,199,159,124,223,201,145,248, 27,227,226,123,253,168, 78, 78, 22,139,117, 55, 45, 45,205,176, 98,197, 10,117,235,214,
-173,165,211,167, 79, 47, 87,169, 84,132, 16, 66, 84, 42, 21,153, 62,125,122,121,235,214,173,165, 43, 86,172, 80,191,125,251,214,
-192,100, 50, 35,154, 80,207, 77, 85, 34,235,238,221,187,164, 38, 20, 10, 5,233,219,183,111,154,143,143,207,225,230,205,155, 79,
-108,136,147,207,231,143, 88,190,124,185,130,212, 2,173, 86, 75,228,114, 57,121,251,246,173,161, 89,179,102,217, 0, 44,169,155,
- 57,197, 73,113, 82,156,148,208,250,203, 80,103, 10,158,122, 79,226,210,165, 75,197,132, 16,241,170, 85,171,196,149,150, 45, 35,
- 0,252,202,141, 9, 96,252,242,229,203,197,132, 16,241,178,101,203,170,202,212,117, 33,134,157, 62,125, 90,179,115,231, 78, 98,
-107,107, 75, 68, 34, 17,217,181,107, 23, 49, 24, 12, 36, 55,252, 24,185,217, 10,228,213,202,169,132, 16, 66, 18, 55,204, 39, 55,
- 91,129,164,252,176,142, 76,154, 52,169,212,196,196,100, 66, 61, 23,215,162, 67,135, 14,242,178,178, 50,197,145, 35, 71, 20, 38,
- 38, 38,207, 0,180, 70,197, 84, 36,173,178,174, 83, 90,183,110, 45,139,141,141, 85,252,252,243,207, 10, 0, 33,141,236, 48,110,
- 0,250,240,120,188,209,203, 29, 88, 73,228,224, 26,178,220, 22, 47, 1,180, 5, 96, 93, 89,198,126,217,178,101,132, 16, 66,156,
-156,156, 34,235,224, 20,120,123,123, 47, 75, 74, 74, 10,210,106,181, 65,209,209,209, 65, 45, 91,182, 92, 49,188,133, 93,215,115,
- 19, 6,248, 74,215,205,245, 37,219, 22,123,127, 59,196,175,255,137,113,189, 39, 76,107,110,117,111,186, 13,183,116,172,128, 33,
-127,111,234,176, 81, 29,219,193,193,225, 73,122,122,122,181,184,146,203,229, 36, 43, 43,139,164,166,166,146,123,247,238, 17, 59,
- 59,187,155, 13,113,138, 68,162,248,244,244,116,242,195,142, 29,100, 76, 91, 47,226, 47, 52, 37,189,204, 77, 73, 71, 62, 87,217,
- 10,232,216, 84,161,245,252,249,115, 49, 0, 49, 0,113, 81, 81,145,184,168,168, 72, 92, 82, 82, 82,253, 29, 0,177, 84, 42, 21,
- 75,165, 82,177, 90,173, 22,187,186,186, 54, 89,104,117,231,162,123,103, 46,138,187,114, 80, 54,204,193, 42,123,110, 11, 43,253,
-227, 9, 93, 73,201,188,190,100,167,175, 3,233,193,198,231,141,228, 28,198,102,179,239, 0, 88, 82, 41,202,167, 14, 30, 60,184,
-148, 16, 66, 6, 15, 30, 92, 10, 96,106,229,247, 95, 84,138,172,193,141,172, 39,221,221,221, 93, 89,101,201, 2,240,208,221,221,
- 93,233,227,227, 67,124,124,124,136,147,147,147,188,146,187, 81, 55, 52, 55, 55,183,196,178,178,178,106, 1, 40,145, 72, 72,118,
-118, 54, 73, 73, 73, 33,113,113,113,228,217,179,103, 36, 45, 45,141,156, 58,117, 74, 47, 20, 10, 47, 81, 55,115,138,147,226,164,
- 56, 41,161,245,151, 10,173,247,183,223, 10,173,240,240,240,247,101,215,230,168,168, 40,241,242,229,203,197,168, 39, 16, 23,128,
-217,171, 86,173,170,178,122,125, 83,207,195,255, 64, 98, 98, 34,153, 58,117, 42,241,244,244, 36,158,158,158,228,147, 79, 62, 33,
- 82,169,148, 40,146, 99,201,205, 86, 32,207,198,118, 36,132, 16, 34,127, 21, 77,110,182, 2, 17, 79,234, 70, 94,188,120, 65, 28,
- 29, 29,175,215,115,252,139, 15, 30, 60, 40, 56,118,236, 88, 46, 42,252,177, 88, 0,186, 0,216,101,108,108,124, 8, 21,211,133,
-205, 0,152,123,120,120, 20,151,150,150, 42,198,140, 25,163, 0,224, 92, 15,103, 47, 79, 79,207, 55, 7, 14, 28, 32,249,249,249,
-164,184,184,152,108,233,222,146,144,131,107,200,250,142,205, 12, 63,252,240,131,106,201,146, 37, 74, 11, 11,139,112, 0,246, 99,
-198,140,209, 17, 66,136,191,191,127, 94,109,100, 66,161,112,112, 82, 82, 82, 80,121,121,121,144, 68, 34, 9, 42, 46, 46, 14,186,
-112,238, 92,208,160,182, 45,167, 74,215,205,245, 61, 55, 97,128,239, 16, 7,243,209,219, 7,118,250, 52,107,197,204, 49,171,186,
-181,126, 85,190,105,225,237,143, 91,216,110,253,144,171,109,109,109,157,163, 82,169, 8,128,223,109,111,222,188, 33,150,150,150,
-233, 13,113, 88, 88, 88,172,250, 98,252, 56,253,168,102, 14,228,205,206,213, 68,123,227,103,162,189,124,132, 36,111, 94, 76,134,
-139,172,100, 93,140,232,203, 27, 91, 31,145, 72,116,227,201,147, 39,191, 17, 90, 37, 37, 37,181, 10, 45,153, 76, 38, 86,171,213,
- 98,119,119,247,171,127,180,215,119, 97,195,181,151, 49,227, 89,244,212,158,164, 96,110, 95, 50, 88,192, 74,251, 3,116,227, 1,
-220, 1, 48,169,137,251,209, 1,108,170, 18, 84,155, 55,111, 38,132, 16,226,238,238,174,196, 31,139, 99, 39,240,242,242, 74,157,
- 57,115,166,174, 85,171, 86,249,221,187,119,151, 60,125,250,148,220,189,123,151, 92,190,124,153,156, 57,115,134,196,198,198,146,
-172,172, 44,146,152,152, 72, 62,250,232, 35, 9,128, 94,212,189,144, 2, 5, 10,127,103,212,162, 69,254,209,168, 94,117, 24, 30,
- 30, 78, 2, 2, 2,104, 53, 26, 40, 0,192,237,216,177, 99,193,166, 77,155,182,161, 34,172, 60,205,155,129,143,251, 26, 51, 95,
-244, 53,102,190,240,102,224,227, 74,139,209,254, 13, 27, 54,124,237,227,227,147, 3,192, 24,128,168,142,131,245,180,180,180, 68,
-122,122, 58, 4, 2, 1, 4, 2, 1,210,211,211, 65, 8,129,142, 0, 90, 2,168, 52, 26,148,149,149,161,220, 64, 80,102, 0,100,
- 10, 5, 68, 34, 17, 52, 26,141,107, 29,109,104, 55,118,236, 88, 87,111,111,239,130,165, 75,151,102,163,194, 87,230,208,140, 25,
- 51,110, 60,124,248,208, 91,161, 80, 20,199,197,197,149,183,109,219,118, 48, 0, 81, 82, 82,210,228, 61,123,246, 96,234,212,169,
-168,231,161,211,246,163,143, 62,186, 28, 27, 27,235, 58,105,210, 36,220,185,115, 7, 91,182,108, 65, 97, 97, 33, 1, 0,149, 74,
- 69,244,122,189,166, 91,183,110,154,157, 59,119,250,249,251,251, 63,105,209,162, 5, 3, 0, 82, 83, 83,147,107, 35,164,209,104,
- 45, 93, 92, 92,160, 82,169, 80, 80, 80,128,216,216, 88,152, 10, 4,136,201, 46,180,237,189,253,135,162,149,231,110,176,198,251,
-121, 91, 44, 26,208, 93,181,241,250, 29,143,214,246,182,182,106,141, 86,148,152,147,151,253, 33, 23,214,200,200, 40,189,176,176,
- 16,106,181, 26,101,101,101,144,201,100, 40, 42, 42, 66, 97, 97, 33,178,179,179, 97,100,100,244,166, 33, 14,179,226,226,200,212,
- 7,119,105,167,126,220, 12, 87, 93, 49,152,103,119,129,121,254,123,184,169, 11,176,111,245, 28, 83,181,165,117,176,153,169,105,
-137, 80, 40,220, 15,192,189, 33, 62, 95, 95, 95, 20, 21, 21,161,168,168, 8,150,150,150, 48, 55, 55,135,185,185, 57, 36, 18, 9,
-164, 82, 41,100, 50, 25, 60, 60, 60,208,174, 93, 59, 28, 61,122,244, 79,233,224,143,213, 72,209, 65, 63,247,198,235,108, 24,241,
-120,104, 97,206,119,233,196,135, 69, 61,187,244,101,177, 88,167, 45, 44, 44,174, 3,152, 7,128, 7, 96,158,133,133,197,117, 22,
-139, 53, 18,192,122, 0,199,154, 88,141,141,193,193,193,203,146,146,146, 76, 94,188,120,129,165, 75,151, 34, 36, 36, 4,201,201,
-201,223, 1, 48, 84,150,249,204,210,210, 50,156, 78,167,255, 15,192, 80, 0,131,237,236,236,250, 53,192, 59,114,201,146, 37,229,
- 29, 58,116, 72,124,245,234,213,200, 7, 15, 30,116, 92,188,120,177,244,221,187,119, 72, 76, 76,132,157,157, 29,156,156,156,160,
- 80, 40, 80, 82, 82,130,145, 35, 71, 10,204,204,204, 38, 80,183,113, 10, 20, 40,252,157, 69,214,123, 90,228,159,102,209,170,245,
-255, 90,223,168, 77, 76, 76,130,197, 98,113, 87, 31, 31, 31, 38,128, 83, 0,224,205, 64,224,200,110,237, 15,157,219,191,217, 39,
-108,231,106,159, 65, 62, 30,135,188, 25,168, 90,197, 22,222,177, 99, 71,115,177, 88,220,141,195,225,124, 94,151,176, 3, 0,115,
-115,115, 8, 4, 2, 8,133, 66,152,155,155,195, 96, 48, 64, 81, 90, 14,165, 30,144,151,171, 33,149, 74, 33,175,252, 95,161,210,
- 64,169, 84, 86,239, 91, 11,122,207,156, 57,179, 96,207,158, 61,249, 57, 57, 57,155, 1,180,157, 58,117,234,136,221,187,119,227,
-214,173, 91,229, 67, 61,221, 44, 55,244,108,255,117,235,156,228, 32, 79, 22,102, 1,136,140,140,140, 68,183,110,221, 64,163,209,
-198,213, 70,104,108,108,252,253,137, 19, 39,140,227,226,226,224,230,230, 22, 55,110,220,184,143, 55,111,222,236,202, 83, 20,223,
- 7, 0, 93, 81,110,220,252,249,243,215,108,216,176,161,160,160,160, 64, 83, 90, 90,106, 51,124,248,112,164,167,167, 35, 43, 43,
-235, 97, 29, 34, 51, 49, 58, 58,154, 72,165, 82,164,164,164, 32, 58, 58,218,120,205,154, 53,126,122, 58,125, 68, 38, 76,167, 77,
-237,222,209,111, 82,151,246, 56,246,232,133,209,189,215,169,194,142,205, 28,204,159,103,228, 52,215,210,240,230, 67,174,182, 92,
- 46,223,245,245,215, 95, 43, 20, 10, 5, 50, 51, 51,241,242,229, 75,188,122,245, 10,105,105,105,216,178,101,139,162,184,184,120,
-119, 67, 28,246, 92,230,151, 91, 23,207,160, 49,227, 31, 2, 47,238, 2,165,114,160, 76, 1, 85,130, 24,135, 19,114,177,247,236,
- 47,236,119,233,233,194,147, 39, 79,206,116,118,118, 22, 3,240,104, 72,213, 3, 0,157, 78,127, 95,132,130, 78,167,203, 1,228,
-242,120,188, 12, 83, 83,211, 12, 58,157,158, 75, 8, 81,254, 25, 61,159,174,131, 6, 12, 6,192, 54, 6,157, 85,111,106,207,143,
-199,141, 27,119, 34, 35, 35, 99, 80, 74, 74, 74,215,221,187,119,127,205,229,114, 99,118,239,222,253,117, 74, 74, 74,215,140,140,
-140, 65,227,198,141, 59, 1, 96, 74, 83,142,239,238,238, 62, 63, 40, 40, 8, 91,182,108, 65,187,118,237,224,225,225, 81, 26, 28,
- 28,188, 11,192,106, 0,159,187,187,187,223,159, 63,127,254,244,252,252,124, 81,102,102,102,187,239,190,251,110,206,174, 93,187,
- 58,101,103,103,115, 27,160,238, 49,112,224, 64, 92,185,114, 5, 0,114, 0,164, 20, 21, 21,233,178,179,179,225,229,229, 5, 63,
- 63, 63, 40, 20, 10, 40, 20, 10, 72, 36, 18,184,184,184,192, 96, 48,116,165,110,229, 20, 40, 80,160,240,127, 42,184,106, 23, 90,
- 92, 46,215,220,215,215, 23, 45, 90,180, 48, 71,229,106, 45, 75, 54,115,197,162,153,227, 77,248,226,171,160, 69,223,196,184,158,
-109, 76, 44,217,204, 21,149,187, 48, 93, 92, 92, 56,190,190,190,224,241,120, 14,117, 28,252, 78,110,110, 46,124,125,125, 33, 20,
- 10, 33, 16, 8,224,235,235, 11,141, 70, 3,169, 92, 14,165, 30, 40,213, 26, 32,149, 74, 81, 92,144,135, 82, 61,160, 51,181, 68,
- 90, 90, 26, 24, 12, 70,106, 29,156,118,110,110,110, 5, 49, 49, 49, 5, 0, 34, 1,124, 26, 18, 18,130,229,203,151, 99,237,218,
-181, 39, 76,114,222, 14, 60,113,229,188,229,241,224,207,172, 61,216,180,241, 0, 52, 25, 25, 25, 16, 10,133,224,241,120,181, 10,
- 3,127,127,255, 14, 60, 30, 15, 71,142, 28, 33,153,153,153,221, 81,177,132, 63,149, 70,171, 16,123,198,116, 72, 1,236, 18,139,
-197,157,215,172, 89,243,186,127,255,254,172, 46, 93,186, 96,253,250,245, 0, 16, 94, 27,167, 68, 34,121, 60,101,202, 20,245,237,
-219,183,145,144,144,192, 59,119,238, 92,224,250,245,235,219,188,123,247,142,115,241,242,213, 33,161, 25,178,192,205,215,239,113,
- 55, 92,187,243,216,202,140,215,186,185,149, 5,162,223,101, 25,233, 25,120,218,208, 21,237,204, 98,204,236,205,101, 70,247,228,
-208,115,122,115,153,226, 78, 44,198, 12,185, 92,126,242,194,133, 11,215, 22, 47, 94,172,200,207,207,135,169,169, 41,138,138,138,
-176,113,227, 70, 69,116,116,244, 89,181, 90,125,177, 33, 94,189,129,116,112,106,230, 12,188,137,169,254, 78, 99, 32,120,170, 54,
- 66,192,167, 11,225,233,229, 5,181, 90,141,182,109,219,210, 66, 66, 66,120, 2,129,224,171, 6, 69, 15,253,119,221, 77, 71,163,
-209,114, 9, 33, 89, 10,133, 34,211,216,216,248,157,145,145,209,187,226,226,226, 76, 66, 72,222,159,161,179, 8, 29, 95,118,107,
-235, 14,112,140,241,174, 72,145,253, 76,129,226,218, 10,154,154,154,206,216,187,119, 47,247,224,193,131,218,249,243,231,171,230,
-204,153,195, 42, 43, 43,179,153, 51,103, 14,107,254,252,249,170,131, 7, 15,106,247,238,221,203,229,243,249,163, 63,164, 34, 90,
-173, 22, 49, 49, 49,155,147,147,147,121,168, 8, 55,178, 48, 56, 56,120,106, 82, 82, 18,119,207,158, 61, 56,115,230, 12,206,156,
- 57,131, 17, 35, 70, 96,193,130, 5, 8, 10, 10,170,143,206,196,199,199,199,215,210,210, 18,119,239,222,205, 6,240, 14, 64, 7,
- 62,159,111, 58, 98,196, 8, 12, 26, 52, 8,229,229,229,208,104, 52,213, 66,139,193, 96, 64, 40, 20, 90, 82,247, 64, 10, 20, 40,
- 80,248,203, 69,214,111,196, 22, 19, 0,170, 76,117, 1, 1, 1,180,250, 30,140,250,146,124, 72,148,165, 72,147,150, 34,189,196,
-240,155,223, 12, 6, 67,189, 71,207,206,206,190,248,232,209,163, 25,190,190,190,204,236,236,138, 25, 49, 95, 95, 95,148,150,150,
- 34,251,197, 19, 40, 13, 0,207,205, 27, 74,165, 18, 37,175,158,131,239,211, 21,150, 31, 77,194,246, 61,123, 84, 69, 69, 69, 63,
-214,198,201,102,179, 89,142,142,142, 5,169,169,169, 58, 0,197, 2,129, 96,160,179,179, 51,238,220,185, 3, 0,199, 8,176, 21,
-209,183,129,187, 97, 32, 21, 38, 21,190,139,139, 11,242,243,243,161, 80, 40,238,212,198,249,232,209,163, 36,173, 86,219,118,248,
-240,225,180,159,126,250,233,148, 76, 38, 91, 11,224,165,202, 0,198,139,140, 60, 40,245,224, 2, 24, 96,110,110,254, 69, 80, 80,
- 80,191,249,243,231,227,194,133, 11,184,126,253,186, 6, 21,190, 96,143,106,161,149,166,164,164,236, 91,178,100, 73, 23, 58,157,
-254,233,141, 27, 55,116, 30, 30, 30, 50,141, 70,163,111,233,233, 73, 95, 27,178,206,104,222,167,179,133, 69,165,136, 31,212,210,
-174, 27,141, 6,196,103,229,191, 75, 86,160,168,190,115,234,207,102,132,143,236,238,227, 63, 99,220, 48, 62,207,173, 53,148,177,
- 79, 68,251, 78, 95,222,110, 28,157, 20,112, 55, 63,127,196,133, 11, 23, 2,239,220,185, 51, 79,173, 86,183,224,112, 56,111, 36,
- 18,201, 78,133, 66,209,160,200, 98, 48, 24, 31,169,236, 28,205, 37,197,197,224, 86, 90,162,100, 90, 3, 10, 85, 58, 36, 8, 61,
- 48,193,209,169,122, 26, 52, 55, 55, 23, 34,145,136,166,215,235,135,213,199,121,253,250,117, 4, 4, 4, 84, 9, 79,208,104, 52,
-208,104,180, 66, 79, 79,207, 60, 14,135, 83,100,100,100, 36,219,186,117,107,121,121,121, 57,152, 76, 38, 87,175,215, 51,254, 72,
-111,247, 51,129, 13,135,208,190,159, 51,188, 79,255,118,173,189, 72,228,179, 23,180,146,210,242,195,245, 88, 1,191,115,119,119,
-103, 22, 23, 23, 95, 4,144,160,213,106,143,159, 58,117,138, 59,121,242,228,242,211,167, 79, 79, 4,224,186,109,219,182, 64,133,
- 66,177,191, 41,245, 72, 78, 78,254,110,195,134, 13,203, 86,173, 90,133,163, 71,143,206, 79, 78, 78, 94, 94,105,233, 26, 17, 20,
- 20,132,173, 91,183,226,232,209,163,134,132,132,132,203, 6,131, 33,121,241,226,197, 62,182,182,182,133, 57, 57, 57,201,245,208,
-118, 28, 60,120,176,234,254,253,251,108,185, 92,126, 15,192, 23,115,231,206,157,217,185,115,103,217,184,113,227,248,197,197,197,
- 18, 19, 19, 19,246,129, 3, 7,204,153, 76, 38,148, 74, 37,104, 52, 26,228,114,185,154,186, 15, 82,160, 64,225,239,138,186,180,
-200, 63, 4,117, 62, 27,152,181, 53,176,180,180, 52, 47, 61, 61,221, 43, 43, 43, 75, 7, 64, 7, 0, 69,106,221, 55, 27, 14,132,
- 29, 28,221,197,157,151,163,213,226,220,179,184,210, 34,181,174,202,249, 93,151,149,149, 37,127,247,238,157,105, 89, 89,153,162,
-142, 99, 61,252,254,251,239,203,110,223,190,109,154,146,146, 2,189, 94,143, 14, 29, 58, 32, 49, 49, 17, 37, 9, 49,224,121,117,
- 0,175, 87, 0,226,196,207, 16,125, 61, 2,111, 21,106,221,235,213, 27,164, 10,165, 50, 72,163,209,156,171,141,144,197, 98, 21,
- 3, 32,132, 16, 61, 0,200,100,178,151, 10,133,162,167,173,173, 45,226,227,227,121, 74, 61, 22, 4,174,216,190,155, 16,162, 55,
-170, 88,205,181,104,220,184,113,136,138,138, 2,128,168,218, 56,101, 50,217,252, 89,179,102,221, 62,114,228, 8, 51, 37, 37,101,
-208,193,131, 7, 7,189,126,253,154,208,138,211,245,247, 75, 89,112,157,186,160,211, 15, 46,158,215, 3, 2, 2, 96,103,103,135,
- 3, 7, 14, 96,231,206,157,218,207, 62,251, 44,105,231,206,157,157,242,243,243,143,215,209,126,169, 68, 34,185,106,105,105, 57,
-175, 77,155, 54,114,165, 82,137,162,162, 34,100,103,103,195,194,210,146,174, 3,189,155,181, 80,120,252, 98,174,156,199,188,250,
- 24, 79, 50,115,234,181,102,117, 97, 49,166,140,246,111,239,255,249,170, 21,124,220, 63, 7,218,172, 32,144,131, 95, 99,225, 39,
-129,166,229,170,227,189,148, 47,210, 38,139,101,178, 80,153, 76,118,166,137,157,101,112,183,110,221, 78,108,216,176,193,120,229,
-150, 13,216,230,229, 0, 93, 81, 17, 10, 84,122, 20,170,116,144,149, 36, 32, 62, 62, 14,150,150, 86,120,251,246, 45,202,203,203,
-241,234,213, 43,194, 96, 48, 46, 54,100,209,169, 66,141,233, 66, 9,135,195, 41, 98,177, 88,121, 76, 38,179, 56, 37, 37, 69, 89,
- 94, 94, 14, 58,157,206,211,235,245,198,141,168,171,163,149,149,213, 98, 84, 4, 19,189, 32, 47, 44,220,229,203,130, 16, 76,244,
-118,177,178, 28,178,122,206,100, 43,103,123, 27, 73, 74,210, 27,237,143,215, 30, 20,150,171,234, 94,172, 1, 32,188,184,184,184,
-218, 34,121,250,244,233,133,167, 79,159,158, 9,224, 16, 42,242,110, 69, 72, 36,146, 31, 62, 96,240,173, 62,123,246,236,178, 85,
-171, 86,193,216,216,184, 58,120,170,177,177, 49, 23, 0,126,254,249,103,196,199,199,119, 70,165,191,150,193, 96, 56,145,147,147,
-211, 16,167,171,183,183,119, 74, 88, 88, 24, 27,128,253,220,185,115,187,238,222,189, 27,159,124,242, 73, 65, 92, 92, 92, 23, 0,
-169, 0, 92, 63,253,244,211,167, 71,143, 30, 53, 55, 24, 12, 40, 41, 41,129, 90,173, 78,165,110,229, 20, 40, 80,160,196,214, 95,
- 2, 95, 0,209,168,136,159,245, 17,128, 75,168,112,235,168, 19, 78,149,234,236, 26,128,225, 85,207,199, 58,156,225,129,138, 21,
- 89, 87, 1,252, 15,128,109, 93,164,150,150,150, 95, 77,157, 58, 85,155,153,153, 73,114,115,115,201,153, 51,103,200,162, 25, 83,
-245, 3,220,236, 13,110,246,182, 74,107,107,235, 68, 59, 43,139,195,237, 77,176, 8,128, 99, 35, 26, 54,245,245,235,215,179,167,
- 78,157, 58,163,242,184, 51, 78,156, 56,161,184,113,227,134,130,193, 96,132,163, 34,180, 67,149,160,156, 50,108,216, 48,133, 74,
-165, 82,120,122,122, 22,163,194,113,191, 46, 4,246,238,221,187,228,202,149, 43, 68,175,215,255, 46, 70, 81, 65, 65, 1,185,126,
-253, 58,233,222,189,187, 4,192,228,126,253,250,221,121,240,224,193,157, 30, 61,122,156,109,168,194, 86, 86, 86, 43, 94,188,120,
- 17,149,150,150, 38,190,116,233,146,248,248,241,227,226, 79, 63,253,244,165,143,143, 79, 89, 82, 82,146, 65,167,211,145, 23,207,
-159, 19,207,150, 45,149, 0, 92,234,226,233,107,204,124, 42, 59,240, 53, 41, 95,255, 9, 41, 31,233, 68, 0, 16,249,246,175, 72,
-222,252,254, 36,113,222, 16,210,135,203,120,244, 33, 61,197,194,194,226, 90, 84, 84, 20,145,203,229, 36, 54, 54,150, 76, 9, 24,
- 68, 30,205,236, 79,174, 14,114, 39, 71,123, 53, 39,219, 7,250,144, 65,189,122,146,239,191,255,158,132,133,133,145, 21, 43, 86,
- 24,172,172,172,228,168,199, 71, 75, 36, 18,221, 56,117,234,148, 24,128,152,193, 96,136,101, 50,153, 88, 46,151, 95,204,200,200,
-216,235,233,233,185,172, 77,155, 54, 19,189,188,188,250,246,105,238,178,172,159, 41, 39,177,191, 25,247, 77, 75,190,201,118,252,
- 62,238, 85, 53, 4,128,139,155,171,171,252,238,221,187, 6,149, 74, 69,238,221,187,103,104,213,210,163,124,219,216,193,103,223,
- 30,216,116,182,252,202, 79,215, 74,207,239,127,112,122, 90, 64, 76,111, 19,250, 79, 93,121,213,225, 56, 62, 20,227, 1,156,195,
-175,171, 14,167, 2, 56,143,250, 87, 33,210, 1, 28, 90,191,126,125,205,149,134, 0, 64,247,241,241, 17, 19, 66,196, 62, 62, 62,
-226,166, 86,196,196,196,100,241,133, 11, 23,130,157,157,157,183,140, 27, 55,238,128, 68, 34,185, 52,113,226,196, 24, 84, 44, 6,
-161,161, 34, 59,194, 48, 71, 71,199,130,232,232,104,114,231,206, 29, 50,102,204, 24,185,145,145,209, 36,234, 54, 78,129, 2, 5,
- 10,127, 9,102,215,246,217, 80, 28,173, 13, 49, 49, 49, 85, 49,180,230,214, 71,190,124,249,114,113, 84, 84,148, 24, 21, 81,226,
-235, 5,147,201,252,229,179,207, 62, 35,182,182,182, 10, 27, 27,155, 95, 88, 12,198, 76, 39, 99,248,226,195,150,186,247, 12, 13,
- 13, 29,241,221,119,223,125, 4,160, 51, 0,150,131,131, 67,118,110,110,174,226,193,131, 7,138,238,221,187, 43,172,172,172,242,
-189,189,189, 21,219,182,109, 83,104,181, 90,197,226,197,139, 21,248,125,188,175,218,192, 5, 48,143,205,102,255,210,170, 85,171,
-152,213,195,251,106,183, 44,152, 73,166,186, 91, 43, 0,124, 7,224, 51, 0, 66, 0,172,192,192,192,155,175, 94,189,186,230,237,
-237,189,175, 17,188,246,109,218,180,185,117,226,196,137,168,176,176, 48,241, 87, 95,125, 21,101,105,105,153,153,148,148,100, 40,
- 47, 47, 39, 37, 37, 37, 68, 34,145,144, 75,151, 46,233, 45, 44, 44,246,212,217,112, 14, 35,135, 92, 63, 86,107, 8,135,140, 85,
-147, 72,119, 54, 61,235, 67,122, 10,143,199, 43, 46, 42, 42, 34,185,185,185, 36, 37, 37,133,156, 61,123,150, 12,238,230, 71, 78,
-126, 58,154, 28,155, 49,130,108, 29,236, 71, 58,155,114,149, 34, 83,126,148,169,169,105,126, 99, 86, 29,138, 68,162, 27, 42,149,
-170, 58,124,131,163,163,163,216,211,211, 51,204,219,219,123,251,133, 11, 23, 22,238,216,177, 99, 68,159,230, 46,203, 54, 14,234,
- 86, 86, 26,113,154,200, 79,125, 71,150,119,240, 40,175, 20,243,181,194,193,210, 34,244,238,157, 59,134, 42,241,171,211,233,200,
-185, 95,126, 33, 99,135, 12,136,145, 94,253,249,127,247,130,230,159, 88,220,193,227, 92,119, 46,198,215, 39,216,170, 95, 69,248,
-176,244, 55,163,239, 29,234,108,145,211, 83, 64,255,174,139,233,111,210, 75,141,245,240,240, 72, 33,132,228,120,121,121,165, 0,
- 56,230,229,229, 85,243,255,105,117,208, 86, 7, 39, 13, 14, 14, 38,149,227,131, 14, 96,237,134, 13, 27,196,132, 16,177,187,187,
-251,125, 0,104,199,131, 85, 47, 1,253,127,195, 93,109,139,122, 9,232,255,107,199,171, 61,101,148,139, 17, 90,246,180, 54,185,
- 55,194,221, 78,222,219, 65, 16,121,236,240,193, 45, 67,135, 14, 61, 0, 96, 15,128,175, 45, 45, 45,239,141, 31, 63, 62,254,232,
-209,163,241,219,182,109,211, 36, 37, 37,145,233,211,167, 43, 57, 28,206,215,212,125,144, 2, 5, 10, 20,254, 50, 84, 69,134,183,
-107,138,208, 26,182,108,217, 50, 49, 33,164, 42,150,214,228, 90,202, 12, 95,181,106,149,152, 16, 82, 21, 29,254,253, 0,102,181,
- 5, 52, 11,222,187,119, 47,225,112, 56,255,251,192,198,212,228, 20,141, 28, 57,178,139, 76, 38,235,100,107,107,219,169,210,114,
-229,100,101,101,149,114,252,248,113, 69, 89, 89,153,130, 16,162,208,233,116,138,168,168, 40, 69,239,222,189, 21, 53,222,250, 27,
-170,231,111,176, 82,132,251,207, 86,207, 32, 43, 69,184,255,222, 79,147, 14, 29, 58,116, 37, 53, 53,245,162,153,153,217,210, 70,
-114, 58, 89, 91, 91,175,181,176,176,184,102,101,101,181,210,194,194, 34, 71,163,209,144,146,146, 18,146,152,152, 72,238,220,185,
- 67, 30, 61,122, 68, 44, 44, 44, 50,235,170,103, 63, 99,230,227,146, 45,243,136,225,208, 6,162,222,189,130, 0, 32,146, 29,203,
- 73,225,247, 33,228,217,172, 65,164, 55,151,241,240, 3,206, 39,132, 66,225,254, 95,126,249,197,144,156,156, 76,194,195,195,201,
-165, 75,151,200,130, 5, 11, 72, 75,123, 59, 85, 23, 54, 61,175, 39,135,121,237, 67, 2,150,170, 84, 42,177, 76, 38, 19, 43, 20,
- 10,113,171, 86,173,196,126,126,126, 97, 93,186,116,217,126,250,244,233,133, 27, 55,110, 28,209,207,148,147, 88, 26,113,154,144,
-175,134, 16, 50,175, 7,121, 51,179, 55,233,107,204,124, 81, 39,167,173,109,102, 85,180,118,165, 82, 73, 34, 35, 35,201,173, 91,
-183,136,200,202, 74,230,111,204,152,221,157,131, 94,221,205, 32,108,108, 61,251, 8,232,135, 31,127,255,141,190,236,202, 81,242,
-243,212, 33,186,222, 66,250,222, 26,229, 78, 18, 66,114,198,140, 25,243,150, 16,146,115,246,236,217, 12, 66, 72,206,232,209,163,
-223, 18, 66,114, 0,156,168,141,243,189,224,164,135, 42, 69,214,188,224,224, 96, 49, 33, 68, 28, 28, 28, 44, 6, 42,130,168,246,
- 18,208,143, 60,217,183,213,160,186,116,132,156,158,254,145,190,151,128,126,164,214,122, 10,153, 23,163, 15,237, 32,234,107,199,
-200, 47, 11, 38,234,123,136,204,238,122,120,120,108, 93,184,112, 97,216,163, 71,143, 94,234,245,250,248,148,148,148,248, 61,123,
-246,196,119,237,218,245,190,165,165,101, 12,155,205,254,172,161,107,244, 39,129,226,164, 56, 41, 78,138,147, 66, 13, 16, 66, 80,
-223,122,247,139,155, 55,111,230, 17, 66, 22, 7, 6, 6, 98,211,166, 77, 99,219,180,105, 51,222,193,193,193, 26, 0,178,179,179,
- 75, 99, 99, 99,101,129,129,129, 88,187,118, 45,182,108,217,178, 29, 21,190, 44,255,151,200, 61,119,238,156,227,252,249,243,243,
- 55,110,220,104,152, 62,125,186, 23,128,216,194,194,194,150, 19, 39, 78,156,199,100, 50, 3, 93, 92, 92,188,115,114,114, 10,202,
-202,202,142, 1,216,135, 6,230, 76,235, 2,135, 14,125,199,102,118,184, 70,135,190,198,215, 67,214,174, 93, 59,110,244,232,209,
-154, 29, 59,118,232,100, 50,217,133, 70,210,101, 20, 20, 20,172,171,250,199,194,194, 66,244,226,197,139,207,108,108,108,232, 41,
- 41, 41, 80,169, 84, 72, 78, 78, 54,160, 98,106,170, 86, 40,116,100,215, 15,103,111,120, 46,158, 20, 96, 86,154,240, 28, 70, 12,
- 6,180, 44, 54,114, 31, 95,195,161,200, 4,153, 82,131,221, 31,210, 78,137, 68,242,237,130, 5, 11, 38, 46, 93,186,148,235,226,
-226, 66,123,248,240, 33, 78,157, 58,165,202,207,207, 31, 12,224,238,175,161,159,154, 6,131,193, 0, 54,155, 13, 0, 88,190,124,
- 57,232,116, 58, 43, 63, 63,159, 77,163,209, 56, 52, 26,205,132, 70,163, 49,180,169,241, 48,200, 74,144, 87, 34, 65, 70,158,164,
- 94, 62,189,193,112,234,201,147, 39,139,218,183,111, 79,127,246,236, 25, 10, 10, 10,144,156,156, 76,244,132,156,136, 44,211, 87,
- 56, 37,170, 26, 95, 63, 19, 11,203,145,237,204, 57,116,246,225,181,240, 87,211, 25, 63, 26, 48, 6, 21,177,180, 0,224, 16,141,
- 70, 51, 2, 80,212,170, 85,171, 62,175, 94,189, 50,110,213,170, 85, 89, 66, 66,194, 21, 26,141,230, 0,224, 72,109,156,198,198,
-198,133, 0, 10,207,158, 61, 11, 0,179, 80,113,242, 58, 4, 5, 5,229, 68, 70, 70, 34, 56, 56, 56, 15,192, 94, 0,224,155, 91,
- 14,247, 22, 24,209,216, 63, 5,163,171, 10,244,221, 6, 82,171,213,149,111, 99,219,183, 13,143, 14,214,193, 53,232, 36,242,164,
-179,117,154,182, 33, 33, 33,145, 10,133, 66,117,242,228, 73,245,180,105,211, 24, 73, 73, 73, 79, 1,220, 3,112, 22,149, 62,150,
- 20, 40, 80,160, 64,225, 47,197,251, 97, 29, 26,244,209,122, 95,181,110, 2,240,195,235,215,175,171,147, 74,191,126,253, 90, 12,
-224, 71, 84, 68,131, 31,214, 4,197,187,186,210,162,181,239, 3, 27,243, 62, 39,215,215,215,215,248,213,171, 87, 70,168, 61,225,
- 49,237, 3, 56,127,135,218,114, 29,122,120,120,236,212,106,181, 97, 63,254,248,227,105, 6,131, 49,241, 15,168,125, 23,119,119,
-247,146,227,199,143, 27,194,195,195,201,234,213,171,245,118,118,118, 37,248,189,143,214,111, 56,253,217,140, 51, 75,188, 28,100,
- 81,147,123,144, 55, 11,135,147,123,147,122,147,217, 14,124,153, 63,151,113,234, 15,190,149,184, 11, 4,130, 67,198,198,198, 50,
- 51, 51,179, 27, 0,186,253,145,107,100,105,105,121, 84, 36, 18,221,168,185,217,218,218,134, 89, 91, 91,127,103,101,101,181, 90,
- 40, 20,206,113,229,178,119, 44,108,105, 95, 30, 51,178, 21,137,232,110, 77, 38, 89,177,223,159, 58,124,191,158,118,174,174,174,
- 69,161,161,161,134,139, 23, 47,146, 21, 43, 86, 24,154, 53,107, 38, 67, 61,126,109,245, 90,180,132,140, 83,103, 70,119, 49,228,
-125,228, 64, 54,121,153, 26,250,152, 51,234, 90,161, 56,169, 82, 0, 79,109,136,211,205,205,237, 71, 66,200,225,245,235,215, 31,
-198,175,185, 64, 7,132,132,132, 4, 17, 66,130, 66, 66, 66,130, 0, 12, 2, 0,127, 1, 61,244,216,136,142,250,236,161,246,228,
- 27, 47,190,222, 95, 64, 15,173,213,146,105,193, 60,119,126,230, 71,134,156,153,221,201, 90,119,158,190,139, 5,231, 38,155,205,
- 94,136, 10,139,179, 31, 0, 54,245,214, 76,113, 82,156, 20, 39,101,209,250,123, 8,175,198, 36,149,174, 9,145,133,133,197,161,
- 22, 45, 90,156,118,113,113, 57,205,231,243,183,163,194,105,190,169, 23,194,117,195,134, 13, 50,129, 64,208,238, 79,188,184, 54,
- 0, 28,240,251,196,185,127, 90,135, 89,103,135,249, 73, 75,199,190, 88,103,135,249, 53,190,246,243,242,242,250, 6, 21,209,188,
-255,104, 39,116,177,176,176,216, 99, 97, 97,145, 89,233,155,229,210, 24,206,142, 12,198,196, 62, 92,198,195,110,108,122,110, 31,
- 46,243, 65, 39, 6, 99,194, 63,116, 0,214,183,216,162, 46, 78, 71, 43, 43,171, 29, 22, 22, 22,217, 86, 86, 86,123,154, 40,178,
-126,195,217,206, 24,118,125,133,140,115,221, 76,105,202,190, 2,198,217,142, 38,117, 47,234,104, 66,219,125,131,131,131, 63, 33,
-132,124, 98,111,111, 31, 88, 67,248,123,175, 93,187, 54,128, 16, 18, 80, 21, 1,222,207, 4, 54,189,133,140,227,221,205,104,146,
-222, 66,198,113, 63, 19,216,212, 85,207, 62, 66,198,169,238,102, 52,137,191, 25,253,184, 51, 7,205,168,155, 57,197, 73,113, 82,
-156,148,208,250,119, 8, 45,170,195, 80,156, 20, 39,197, 73,113, 82,156, 20, 39,197, 73, 9,173,218,133, 85,205,205,174, 74,104,
- 49,169,115, 67,129, 2, 5, 10, 20, 40, 80,160,240,135, 80,103,192, 82, 90, 61,170,180, 41,142,237, 31,162,108, 35, 40, 78,138,
-147,226,164, 56, 41, 78,138,147,226,252,207,113, 54,196,253,127,189,176,238, 47, 3, 53,117, 72,113, 82,156, 20, 39,197, 73,113,
- 82,156, 20,231,223,133,243, 95, 7, 66,200, 7, 5, 9,165, 64,129, 2, 5, 10, 20, 40, 80,160,240, 43,124, 43, 63,171, 3,151,
- 86, 89,179,106,245,209, 98,250,173,207,211,233,116, 54, 0,192,100, 50,243,181, 79, 87,219,213,199,206, 2,250,233, 42,210,239,
-128, 9,204,210, 1, 55,106,225,188,161,211,233,204, 43, 57, 75,180, 79, 87, 15,170,151,211,111,253,181,154,229,117, 79, 87, 15,
-248,157, 82, 4, 24, 44,191,245,217,239,213,213,190,177,103,133,134,223,196,196,250,203,234,249, 79,225,252, 47,131,213,121,125,
-158, 86, 91,209,143, 88, 44,102,190,230, 73,253,253,200,168,243,250,236,154,229,181, 79, 86,219,214,199,105, 98,204, 41,114,115,
-176,222, 94, 31,103, 74,118,225, 98,101,105,185,101,125,156, 77, 29,155, 78,118,118,253,244,149, 99,147, 1,204,202,204,201,185,
-241, 55,235, 75, 29, 1,172, 6, 96, 86,227,187, 24, 0, 95, 80,189,146, 2, 5, 10,255, 48,161, 21,141,138, 60,135,251, 43,197,
-214,254, 58,133,150, 78,167,179, 17,255, 18, 4,165, 10,232, 55,101,189,141,235,200,125,191, 75,148,172, 43, 47, 97, 75,226, 78,
-122, 51,180, 50,115,107,166,198, 44, 59, 59,155, 6, 0, 52, 26,237,127, 0,156,107,225, 52, 23,255, 18,132, 82, 53,224, 63, 62,
-196,220, 25, 48, 43, 48, 50,250,210,152,199,235, 83, 86, 86,214, 6, 0,140,141,141,227,202,148,202,219,214, 26,205,182,247,203,
-215,213,178,154,117,237, 59,121,189,141,215,200,125, 11,244, 6, 3, 59,235,217,143,254,229,133, 73, 76,150, 78,181,119, 37,112,
- 37,168, 22, 81, 85, 7,223,175,199,253,120,133, 37, 11,232,203,230,114,219, 9,205,205,123, 26, 8,105,101, 48, 24,104,122,157,
- 46, 94, 38,149,222, 51,232,116, 47,116,106,165,165,248,194, 55,134,250,234,249,126, 91, 62, 6,152,191, 0,129, 60, 62,191, 15,
-131,197,234, 6, 0,122,173,246,161, 82,161,184, 61, 10, 56,211,152,182, 55,246,252,124,104,249,255, 26,180, 90,157, 77,234,181,
- 32,168,180,128,239,152,111,108,124, 38,254,116, 28, 0,212,249, 47,108, 21, 73, 23, 58, 3, 0,207, 45,224, 9, 71,228,155, 7,
- 0,204,119, 57, 54,137,225,171,160,210, 2,173, 2, 66,108, 26,226,156,182,246,148,229,210,217,163, 57, 0,112,253,236,119, 45,
-111,133,253, 48, 4, 0,250,142,158,123,101,224,152,249,137, 0,176,101,127,152,229,137,111,198,214,203,217,184,177, 41, 53,146,
- 38,133,187,171,101, 57, 66, 39, 30, 83,148,148,148, 68, 7, 0,123,123,251, 70,141, 77, 71, 64,144, 3,204,163, 51, 24, 61,221,
-220,221,125, 1,144,148, 55,111,162,245, 58,221,125, 59, 96,239,159,220,151, 22, 16,242,219,224,172, 52, 26,141,234,144, 20, 40,
- 80,248,167,225, 82,165,184,186,244,187,151,217,186,246, 80,170,128,187,201, 64,175, 46, 62,152, 61,113, 40,191,230,111,103,246,
-133, 56, 39, 61, 59,239,117,240,167,109,116, 31, 31, 31,164,166,166, 54,170, 22,165,106,224, 78, 18, 0,201, 43,211, 18, 30,239,
-205,142,173, 91,205, 6, 12, 24,192,180,183,183, 7,141, 70, 67,110,110,110,151,136,136,136,142,139, 22, 45,250, 20,146, 87, 37,
-165,106,200,239, 36, 53,204, 91, 85,215, 54, 45,155, 97,245,252,177, 2, 0, 88, 57,101,111,199,103,175,243, 44,222,188,121,211,
-111,217,178,101, 69,140,219,183,127,176, 2, 14,231, 1, 25,141,169,231,209,139, 79,184,130,156,159, 93, 39,205,159,127,214,221,
-221,157,239,226,226, 66, 51, 53, 53, 5,131,193, 64, 73, 73,137,115,108,108,236,144,167, 79,159, 42, 35,238,254,143, 29,245,116,
-120, 74, 62,183,115,121,163,218, 94,150,205,189,110,106, 26, 55,121,212, 40,199,177, 99,199,114,221,220,220, 0, 0,111,222,188,
-241, 56,115,230,204,248,179,103,207,174, 69, 89,182,174, 84,141,242,134,218, 94,205, 9,128, 11,116, 19,218,216, 76, 98,176, 88,
-109,116, 58,157, 67,165,181, 33, 75,175,213,198, 73,242,243,143,189, 95,158,194,239,161,210, 2,175,114,128,254, 61,125, 49,121,
-116,127, 30, 0, 44, 27,183,161,203,187,183,201, 70,106,181, 26, 45, 61, 91,117,255,250,155,237,215, 64,167, 35, 52, 44,162,186,
-124, 99, 56, 99, 94,165, 34,232,235, 29,200,126,121,166,139, 94,154,220, 71, 46,147, 50, 0,192, 76, 32, 24,125,230,228,207,183,
-237,189, 3, 31, 39, 23,106, 26,197, 89,223,216,188,122,114,143, 93,102,236,237,214,223, 95, 63,196,114,118,118,198,203,151, 47,
-155, 54, 54,165,175, 77, 13,118,118,241,219,190,250, 74,228,239,239, 15, 62,159, 15, 38,147, 9,157, 78,215,255, 42,105,207, 98,
- 0, 0, 32, 0, 73, 68, 65, 84,254,253,251,253,131,130,130,230, 66,250, 90,217,216,177,217, 8,108,163,209,104,125,166,205, 94,
- 96, 55,116, 68, 32, 70, 15,238, 78,117, 68, 10, 20, 40,252,211, 80,101,189,170,185,242,112,127,189, 66,139,201,100,230, 15,152,
-186,209,166,103,231,182,120,246, 34, 81,154,150,158,163,168,250,173, 56,238, 76,203, 17,221, 29, 90, 71, 70,222,133, 74,165,194,
-195,135, 15,241,226,197, 11,188,125,251, 22,115,230,204, 81, 85, 78, 29,214,198, 89,226, 63, 62,196, 28,210, 36,190, 7,251,117,
-243,136,132, 4, 70,121,121, 57, 34, 35, 35, 81, 82, 82, 2, 54,155, 13, 71, 71, 71, 12, 28, 56,144,153,144,144, 96,209,111,192,
- 96,129,255,224, 9,169, 16,120, 40,152, 76,102, 73, 93,121, 68,152, 76,102,126,191, 41,235,109, 90,123, 52,195,155,180,108,233,
-234,111, 14, 42, 12, 6,194, 76,121,251, 78,115,247,238, 93,248,250,250,226,198,141, 27,150,197,197,197,107,246,238,221,187,154,
-181,249,251, 93, 90,117,209, 18,212,205, 87,226, 63, 62,196,220, 50,255,180,203,173,171,231,140,226,226,226,140,126,252,241, 71,
- 20, 21, 21,129,205,102, 67, 40, 20, 66, 36, 18,161,101,203,150,180,149, 43, 87,242, 3, 2,226,240,249,172, 64, 23,141,235,204,
-215,117,213,179,186,237,138,119, 38, 86,178,235,110, 97,151, 46,209,123,244,232,241,155,215,246, 22, 45, 90, 96,208,160, 65,220,
- 73,147, 38,185,141, 29, 63,209,224,255,209,180, 55,224,187,148, 54,200,169,204, 48,182, 44,125,100,223,127,252,248, 11, 33, 33,
- 33, 66,145, 72, 4, 30,143, 7, 0,144, 74,165,142,105,105,105, 93,214,174, 93, 59,230, 73,204, 73,166,127, 64, 70, 54,120, 78,
-101,245,157,207,255, 42, 88, 44,102,126,149, 21,201,148,103, 92,146,145,153,167, 4, 0,181, 90, 13,181, 90, 13,149, 74,133,207,
-230,206, 97,204, 26,227,231,238,210,115,193,243,183, 89,121,197,173, 34, 30, 91, 84,237,171,109,128,147, 89,250, 86, 34, 73,191,
- 57, 43,232,171,175, 68,182,182,191,206, 8,134, 30, 61,202, 40, 46, 46,238, 31, 20, 20,212,154,152,244,150,180, 10, 8, 17,214,
-199, 89,223,216,148, 36, 94,106,254,245,252, 65,237,246,125, 19, 14,189, 94,143, 71,143, 30, 33, 50, 50, 18,219,183,111, 39, 87,
-174, 92,145,154,241,120,179, 80,239,216,124,109,218,195, 46,215,117,243,230,179, 52, 14,135,131,243,231,207, 35, 33, 33, 1,116,
- 58, 29, 62, 62, 62,152, 60,121, 50,250,247,239, 47,154, 61,123, 14,241, 31, 60, 46, 5, 2, 79,249, 31,236, 75,116, 0, 11, 86,
- 4,109,182,155, 50,115, 30,182,124,189,146, 18, 90, 20, 40, 80,248, 39, 91,179,234, 12,241,128,240,240,112, 82,185,245, 2, 0,
- 2,208, 91,140,220,119,226,116,148,225, 82,139,145,251, 78, 16,128, 78, 0,186, 25,208,172,125,251,246, 90,137, 68, 66,158, 62,
-125, 74, 62,251,236, 51,229,174, 93,187,110, 95,186,116,233,140, 78,163, 57, 96,111,103,247, 45, 65,237, 14,246, 4,160,187, 0,
- 2, 19, 19,147,130,244,244,116,114,249,242,101, 18, 28, 28, 76,142, 29, 59, 70,174, 92,185, 66, 34, 34, 34,200,149, 43, 87,200,
-137, 19, 39, 72, 76, 76, 12, 73, 76, 76, 36, 60, 30,175,192, 5, 16,212,195,201, 32, 0,163,229,200, 31,151,156,125,166, 13,241,
- 28,185,111, 17, 1, 24,230,128, 87,251,246,237,245,103,206,156, 33,161,161,161,228,167,159,126, 34, 49, 49, 49,164,176,176,144,
- 48, 57,188,130,170,253,234,170, 39, 1,232, 14, 14, 14, 5, 18,137,132, 56, 57, 57, 17, 54,155, 77,108,109,109, 73,203,150, 45,
- 73,151, 46, 93,200,144, 33, 67,200,196,137, 19,201,154, 53,107,136, 68, 34, 33, 92, 46, 55,175,106,191,186, 56,125, 1, 99, 30,
-143,151, 46, 22,139, 73, 93, 40, 43, 43, 35,133,133,133,228,218,181,107,132,199,227,165,251, 2,198,245,113, 26, 3, 29,188,189,
-189, 11, 10, 11, 11,137, 70,163, 33,233,233,233, 36, 54, 54,150, 36, 36, 36,144,244,244,116, 82, 86, 86, 86,205,157,152,152, 72,
- 92, 93, 93, 11,140,129, 14,117,113,254,151, 81,213, 39,222,223,156,109,109,135,136, 68,162,178,179,103,207,146,172,172, 44,114,
-228,200, 17, 66, 7, 54,188, 95,174, 62, 78, 54, 48,176, 71,143, 30,250, 71,143, 30,145,231,207,159,147,229,203,151,147, 65,131,
- 6,145,193,131, 7,147,160,160, 32,146,153,153, 73, 50, 51, 51,201,144, 33, 67,244,108, 96, 96, 67,253,179,182,177, 41, 0,156,
- 3, 2, 2,202, 52, 26, 13, 73, 73, 73, 33,109,218,180,201,100, 0,147,120, 64,235, 94, 0,167,161,254,233, 0,152,219,217,217,
-229, 60,122,244,136,132,133,133, 17, 23, 23,151, 2, 6, 48,205, 12,104, 97, 6,180, 96, 0,211, 90,180,104, 81,240,232,209, 35,
- 82, 84, 84, 68,156,157,157,115, 28, 0,243, 63,208,151,232, 0, 14,173, 8,218, 76, 94,103, 42,201,138,160,205, 4, 64, 58,169,
-240, 30,189, 65,245, 72, 10, 20,254,123,120, 95,139,252,227,159, 43,132,252,118,213, 97, 64, 64, 0, 13,192,157,250,118, 42, 99,
- 48, 54,110,217,178,133, 89, 94, 94,142,131, 7, 15,202, 63, 30, 51,230,116,175,158, 61, 83,154,187,184, 72,104,116,122,131,217,
-134, 11, 56,156,133, 91,182,108, 17,170,213,106, 68, 69, 69,161, 99,199,142, 16,137, 68,224,243,249,224,243,249,176,177,177,129,
-167,167, 39,242,243,243, 97,106,106,138,165, 75,151, 10, 10, 56,156,133, 13,241, 26, 12,132, 9, 0,122,131,129,109, 4,204,118,
-237,212, 41,106,237,218,181,116, 75, 75, 75, 88, 88, 88,128,207,231, 35, 33, 33, 1,106,181, 26, 38,198, 38,141, 10,210, 74,167,
-211,233,124, 62, 31,183,110,221,194,130, 5, 11,208,173, 91, 55, 8,133, 66,152,154,154,162, 77,155, 54, 24, 56,112, 32,102,205,
-154,133,148,148, 20,208, 26,225, 84, 18,207,100,206,155, 53,107,150,141,175,175,111,173,191,151,151,151, 67, 34,145,160,160,160,
- 0,142,142,142, 8, 12, 12,180,137,103, 50,231,213,197,103, 9,136, 28, 61, 60, 46, 60,125,250,212,138,199,227, 33, 52, 52, 20,
-231,206,157,195,213,171, 87,113,249,242,101,132,135,135,227,252,249,243, 40, 40, 40, 0, 0,120,120,120,224,212,169, 83, 86,124,
- 27,155,112, 75, 64, 68, 13,233,198,225, 93, 94,222,245, 54,185,185, 86,147, 38, 78,188,167, 80, 40, 48,105,210, 36,108,220,180,
-105, 37, 11, 88,212,152,253, 61, 1,129,133,157,221,225,205,155, 55,211,115,115,115, 49,106,212,168,194,109,155, 54,205,136,190,
-118,205, 77,124,245,170,219,198,144,144, 25,189,122,245, 42,204,204,204,196,209,163, 71,233,182,206,206,135, 61, 1, 65, 83,235,
- 41, 7, 22,236,220,185,147, 91, 94, 94,142, 1, 3, 6,164, 24,226,226, 60,117,192,207, 10, 32,225, 14,160,105,104,255, 28, 96,
-222,210,165, 75, 69, 28, 14, 7, 95,126,249,101, 97,233,187,119,109,117,192, 79, 82, 32, 77, 10,164,233,128,159,228,169,169,109,
-167, 76,153, 82,200,225,112,176, 99,199, 14, 81,206,175, 73,183, 27,139,142, 0, 46, 0,184, 11, 32,123,218,236, 5,211,124,253,
-186,226,232,129,189,248, 38,100,217, 97, 0, 31,211,104,180, 99, 0,150, 80, 61,143, 2,133,255, 38, 26,163, 69,254,166,152, 93,
-215, 15,204,154, 74, 18, 64,239,250, 88,204, 45, 45, 59,182,109,219, 22,145,145,145,240,246,246,126, 42, 20, 10,117, 70, 28, 14,
- 88, 44, 22,136,161, 65,157, 5, 99, 30,175, 95,255,254,253,153,143, 31, 63,134,171,171, 43,140,141,141,193, 98,177,126,179, 25,
- 25, 25,193,206,206, 14, 50,153, 12,253,250,245, 99,237,222,189,187, 31, 84,170,175, 27,124, 32, 38,197,242, 11, 30,111,158,248,
-191, 35,135, 91,248,251,251, 67, 42,149,193, 96, 48,192,196,196, 4,106,181, 26, 76, 38,179, 98, 10, 72, 75,100,141, 57, 99,122,
-189, 94,207, 96, 48,224,234,234,138,141, 27, 55,162,188,188, 28, 70, 70, 70, 0, 0,153, 76, 6,137, 68,130,216,216, 88,164,165,
-165,129, 52, 34, 34,153,169, 64, 48,116,236,216,177,181, 38,252, 85,169, 84,144, 74,165,144, 74,165,144, 72, 36, 40, 47, 47, 71,
-215,174, 93,217,151,194,195,135,162,168,104, 91,173,251,112,185, 99,142, 30, 61,106,195,102,179, 81, 86, 86, 6,185, 92,142,140,
-140, 12,188,123,247,174, 60, 63, 63, 95,103,106,106, 74,119,113,113,161,115, 56, 28,206,200,145, 35,105, 50,153, 12, 52, 26, 13,
- 1, 1, 1,150,199, 67, 67,199, 66,173,222, 78, 13,233,198,225, 58,160,234,160, 86, 15,235,236,231,119,235,233,179,103,190, 11,
- 23, 46, 68, 76, 76,204,102,147,147, 39,239,150, 2, 47,234,219, 55, 5,152,247,109, 13, 1, 67,222,189,243,214, 0, 5, 53,138,
-164,185,164,166, 94,157, 50,101,202,203,152,152, 24,171, 29, 59,118,136, 62, 30, 53,106, 30,128, 13, 77,169,163,169, 64,208,201,
-206,206, 14, 87,174, 92, 65,250,219,183,203,116, 64, 89,147,204, 75, 12, 70, 15,127,127,127,156, 63,127, 30,153,239,222, 45,211,
-253,182,142, 21, 47, 74, 64, 1, 51, 37,101,217,225,195,135, 15, 77,159, 62, 29, 12, 38,179, 7,116, 77,154, 56,252,157,227,251,
-244, 57, 11,113,120,255,238,195, 0,102, 2, 48, 0,120, 74,245, 56, 10, 20,254,219, 86,173,134,180,200, 63, 72,108,237, 7,208,
- 52,139,150,141,141,141, 3,159,207, 71,118,118, 54, 90,121,121,229,115, 56, 28,176, 89, 44,112,217,236, 70,213,160,180,180,212,
-219,222,222, 30, 82,169, 20, 86, 86, 86, 48, 50, 50,170,222,216,108,118,245,223,166,166,166,160,211,233,112,118,118, 70,105,105,
-169,119,131,188,121,177, 54, 39,119,207,253,236,209,221, 43, 45, 70,141, 26, 13,115,115, 11, 56, 57, 57,194,198,198, 6,198,198,
-198,112,114,114,130,155,155, 27,217,182,109, 27, 76,108,124, 26,117, 35,175, 41,158,152, 76, 38,244,122, 61,242,242,242,240,250,
-245,107,196,196,196,224,209,163, 71,120,254,252, 57,228,114,121,163, 34,191,150,150,149,181, 99, 50,153,181,138, 44,137, 68, 2,
-137, 68, 82, 45,180, 10, 10, 10,144,150,150, 6,133, 82,217,190, 30,209, 59,186,109,219,182, 12, 0, 48, 54, 54, 70,251,246,237,
-177,111,223, 62,221,197,115,231,198,181,126,244,200,194,233,218, 53,225,255,126,252,113, 92, 96, 96,160,254,241,227,199,144,201,
-100,120,245,234, 21,172,173,173,153,108, 46,119, 44, 53,156,155, 6, 49,160,180,146,203, 7,119,235,214, 45, 85, 42,149, 98,235,
-214,173,116,150,169,233,254,144, 58,166,248,170,193, 96,116,247,247,247,199,133, 11, 23,144,253,238,221,242,119,181, 8,152,119,
- 64, 65,122, 74,202,242,195,135, 15, 99,224,192,129,160, 49,153, 77,118, 84,234,210,165, 75, 91,131,193,128,151, 47, 95, 66, 8,
- 60,105,234,254,110,238,238,190, 85,150, 95, 30,112,175,174,114, 60,224, 94,116,116, 52,140,141,141,209,170,117,235, 14, 77, 60,
-204, 54, 26,141,150, 51,125,206, 66,132, 93,125, 0, 0, 56,188,127,119, 94, 13,145, 69,129, 2, 5,202,162,245, 79,181,104, 85,
- 9,171,154, 27,126, 35,180, 26, 41, 62, 0, 0, 44, 22, 11,108, 14, 7,108, 54,187, 66, 32,113, 56,141,230,160,209,104,224,114,
-185,213,194,170,166,192,170,249,183,137,137, 73,163, 67,215,151, 36, 95,237, 57,115,198,116, 54,135,195,129, 90,173, 2, 33, 4,
- 28, 14, 23, 66,161, 16,174,174,174,144,201,100,232,214,189,151, 42, 67, 98, 20,110,217,106,100,204,135,156, 61,157, 78, 7,165,
- 82,137,146,146, 18, 20, 23, 23, 67, 38,147,161,172,172,172,209, 75,209, 13, 6, 3, 35, 35, 35, 3, 63,255,252, 51,138,138,138,
- 0, 84, 56, 90, 87,137,171,170,207,212,212, 84,132,134,134,226,237,219,183, 77,186, 62, 61,123,246, 68,120,120, 56,163,119,191,
-126, 7,110,184,184,100,223,112,113,201,238,221,175,223,129, 11, 23, 46, 48, 28, 28, 28,144,150,150,134,168,168, 40,148,148,148,
-128, 16, 66,173,159,255, 0,188, 1, 74, 74,139,139,167,175, 92,185,146,240,249,124,108,253,246,219,118, 27,128, 9,141, 21, 48,
-130,122, 4,140,224,143, 9, 24, 16, 66, 96, 48, 24,160,215,235, 63,168,109, 52, 26,141,198, 98,177,154, 26, 90,161, 41,133,171,
- 29,223,151,174,217,136,203,231,207, 84,125,159, 68,137, 44, 10, 20, 40,252, 11, 80,167, 35, 60,179,134,130,172,254,172, 11,121,
-121,121, 89, 74,165,178,133,139,139, 11, 50, 51, 51,109,156,157,157,223,177, 89, 44, 24,177,217,160,209, 27,214, 4, 38, 38, 38,
- 47,179,179,179,187, 59, 56, 56, 64,167,211, 85,139,170,247,167, 14,171,172, 52,207,159, 63,135,137,137,201, 75,148,215, 27, 57,
- 1,122,117, 73,179, 14, 29, 58, 84, 91,134,132, 66, 33,132, 66, 1, 56, 28, 46, 86,173, 90,101,216,177,109,219, 94,231,190, 33,
-210, 79, 22,173, 36, 43, 55, 28,248, 83,207,108, 99, 31, 76, 38, 38, 38, 47,157,156,156,186, 10, 4, 2,132,133,133, 33, 45, 45,
- 13, 37, 37, 37, 40, 45, 45,133, 74,165, 66,105,105, 41,212,106, 53,184, 92, 46, 90,183,110, 13, 51, 51, 51, 68, 68, 68,188,132,
- 74, 85,187,184, 44, 42, 10,123,249,242,101, 87, 63, 63,191,106,139, 74,159, 62,125,104,125,250,244,177,170,182,162,149,150,162,
-176,176, 16, 79,159, 62, 69, 68, 68, 4,104, 52, 26,146,146,146,244,170,178,178, 19,212,152,248, 48,148, 3, 15, 25,135, 15, 31,
-250,244,211, 79,103,116,239,222, 29,122, 96, 8,128,208,255,143, 2, 6, 0,240,232,209,163, 88,189, 94,223,189,101,203,150,144,
- 0,157, 1,156,111,146,136, 76, 78,142,214,233,116,253,218,181,107,135,176,211,167,123, 2, 72,171,173,156, 18,232,233,235,235,
-139,178,178, 50,188,138,143, 23, 55, 65,100, 29, 88, 17,180,121,218,148,153,243,112,244,192, 94, 28,222,191, 59,227,208,190, 93,
- 78,104,132,255, 24, 5, 10, 20,254, 83,214,172, 6,181,200,223, 20,179,235, 18, 95,204,166,176, 72, 75, 74,196,209,209,209, 45,
- 58,116,232,128, 3, 7, 14,248,117,235,218, 53,203,136,205,214,177,141,140, 64,111,196,131,164, 76,169,188,121,243,230,205,206,
- 35, 71,142,100, 62,126,252, 24, 34,145,168, 90,104, 85,125, 50,153, 76, 16, 66, 96, 98, 98,130, 95,126,249, 69, 83,166, 84,222,
-108,208, 90,164, 55,232,233,149, 66,143, 16, 2,137, 68, 2, 35, 35, 35,108,223,190, 3,123,182,109,155,168, 7,206,120,240,172,
-191, 2,192,253,255,246,128, 46, 45,189,117,249,242,229,142,107,215,174,101, 57, 58, 58, 66, 34,145,160,164,164, 4, 69, 69, 69,
-144,201,100,144,201,100, 40, 41, 41,129, 68, 34, 1,151,203, 69, 76, 76,140,182,188,180,244, 86, 93,124,156,242,242,179, 83,167,
- 78, 93, 26, 29, 29,109,199,100, 50,161,213,106, 97, 48, 24, 96, 48, 24,160,209,104,144,156,156,140,184,184, 56, 36, 36, 36,160,
-184,184, 24, 44, 22, 11, 12, 6, 3,207,159, 63, 47,225,105,181,167,213,212,152,254, 96,176,128,176,251,247,239,207,152, 60,121,
- 50,236, 29, 29,123, 33, 51,179, 81, 2,230, 92, 61, 2, 70,250, 97, 2,230, 87, 1, 36,151, 63, 75, 77, 77,237,222,187,119,111,
-216, 57, 58,110,110,157,153,121, 35,190, 9,126, 90,122,157,238,222,253,251,247,251, 77,153, 50, 5, 7, 14, 28,216,108,157,154,
-122,181,224,189,105, 78,107,192,186,185,155,219,230,105,211,166,225,250,245,235,208,235,116,247,234,161,172, 25,241,189,217,180,
-217, 11,156,222,115,124,223, 71,163,209,230, 3,216, 74,245, 40, 10, 20, 40,252,155, 45, 90, 77,154, 58, 52,214,235, 87, 44, 89,
-178, 68, 75,167,211, 49,122,244,104,211,243, 23, 46, 4, 62,127,241,194, 53, 63, 63, 95,168,215,235, 27,228,178, 86,169,118, 45,
- 89,178, 68,162, 86,171,225,233,233,137,226,226, 98,232,245,122, 48,153, 76, 48,153, 76,208,104, 52,208,233,116,240,249,124, 68,
- 71, 71,227,208,161, 67, 50,107,149,106, 87,131, 15, 9,189,254,101,104,104, 40, 24, 12, 6,225,114,185,160,209,104, 96, 50,153,
-216,177, 99, 71,254, 30, 32, 12, 0, 24,116,186, 26, 0,232,116, 90, 99,189,119, 27,156,183,100,179,217, 48, 84, 44, 2,104,176,
-172,185, 74,181,115,203,150, 45,242, 87,175, 94, 65,169, 84, 86, 91,223, 20, 10, 69,181,115,189, 68, 34, 1,141, 70,131, 82,169,
-196,133, 11, 23,228,230, 42,213,206,186,248,138,128,220,204,164,164,225,126,126,126, 69,169,169,169,144, 74,165,120,249,242, 37,
- 34, 34, 34,112,234,212, 41, 92,191,126, 29,201,201,201,208,233,116,112,112,112, 0, 33, 4,231,206,157,147,234,228,242, 33, 69,
- 64, 46, 53, 38,234, 70, 51,145,168,159,173,141, 77,186,181,149, 85,102, 51,145,168,223,251,191, 11,128,196,196,196, 68,232,116,
- 58,184,186,186, 90,212,231,167, 69,116,186,251,247,239,223,199,148, 41, 83,224,212,162,197, 38, 23,192,250,253, 50, 46,128,181,
-139,155,219,166, 42, 1, 67,116,186,251, 77,173,179, 41,176,251,171,175,190, 42, 51, 50, 50,194,201,147, 39, 93,181,238,238, 9,
- 76, 96, 2, 31,240,234, 13, 24, 53,180,191, 29,176,119,205,154, 53,185, 52, 26, 13,199,142, 29,179, 18,184,185,197, 50,129,169,
- 2,160,153, 0,104,198, 4,166, 10,220,220, 98, 79,158, 60,105,165,211,233,176,104,209,162, 92, 59, 96,111, 61,148, 11, 8, 33,
-195, 8, 33,254,132, 16,167, 67,251,118,225,242,249, 51, 85, 34,107, 38, 42,156,222, 39, 3,136,165,122, 28, 5, 10, 20,254,205,
-168,213, 12,197,244, 91,159, 7, 16,155, 94, 93,124,240,236,197,107,169,149,185,217,181,170,223,138,227,206,180,236,235,109,230,
-243,253,247,223,131,197, 98, 33, 35, 35, 3,241,241,241, 48, 51, 51,195,196,137, 19, 85,101,114,249,240, 26,185, 14,251, 3,136,
-168,228,172,200,167, 38, 77,226,187, 49, 99, 90, 92,189, 28,206, 16, 8, 4, 80, 40, 20,160,211,233,224,114,185, 48, 49, 49,129,
-177,177, 49,162,162,162,240,209,176, 17,250, 2, 19,255, 95, 3,150,254,154, 79,173,154,179, 42,214, 80,103,192, 36, 26,248,210,
-198,222,126,201,234,213,171,141, 7, 13, 26, 4, 35, 35, 35, 56, 54,243,200,117, 29,188,117, 55,157, 78,211,101, 22,201, 86,185,
- 53,179, 23,196, 39,165, 1,160,229,107,159,174,182,175,145,235,240,119,245,116, 86,223,117,253,229,167,109,102,237,219, 87,248,
-163, 75, 36, 18,228,229,229, 33, 63, 63, 31, 18,137, 4, 74,165, 18, 0, 16, 30, 30,142,203,145, 9,178, 50,199,192,148,186,234,
-249,107,219, 95,155,218,107,158, 52, 63, 30,250, 19,195,218,218, 26,121,121,121, 40, 40, 40,128, 68, 34, 65, 89, 89, 25,244,122,
- 61,138,139,139,113,240,240, 79,250, 34,190,255,219,234,128,144,245,113, 42, 51,140, 45, 20, 15, 28,124, 91,187,144, 25, 51,102,
-152,154,153,153,193, 96, 48,160,164,164, 4,233,233,233, 72, 77, 77, 69,100,100,164, 50, 95,162,134,210,106, 64,102,117,192,210,
- 90, 56,255, 68,252,227, 56,107,198,173,178,183,179,203,126,247,238,157,141, 94,175,135,131,131,131, 78, 82, 92,188,137, 13, 92,
- 55, 5,114, 0,144, 66, 96,245,206,221,187,167,143, 24, 49, 2,157, 58,117,202,200,205,203,107, 94, 91, 95, 34, 0,195, 19, 16,
-148, 58, 58,198, 61,125,250, 84,148,158,158,142, 41, 83,166, 20,190,123,243,102,121,149,191,150, 20,232,233,226,230,182,233,228,
-201,147, 86, 45, 90,180,128,183,183,119, 46, 55, 61,189,205,107, 64, 90, 71,255,172,115,108, 74, 18, 47, 53,159, 59,170,109,167,
-207, 62,251, 12, 58,157, 14,145,145,145,120,242,228, 9,222,189,123,135, 7, 15, 30, 72,204,120,188,113, 53,114, 29,214,218, 63,
-135,120, 40, 93,143, 29, 11,165, 25, 25, 25,225,240,225,195,136,142,142, 6, 0,248,250,250, 98,218,180,105,208,233,116,152, 52,
-105, 50,185,244,218, 56,165,190,254, 9,160, 45,128,111, 81, 33,242, 58, 17, 66,184, 52, 26, 45, 27,128, 19,154,230,147, 69,245,
- 79,138,147,226,252,239,112,254,171, 80,111, 82,233,154,249,212,214,255, 0,193,111,211,124,204,202, 62,179, 47,132,217,163,167,
-191, 87, 72,112, 16,221,207,207, 15, 78, 78, 78,240,245,245, 69,122,122, 58, 71, 40, 20, 54,148, 79, 77,225, 63,120, 66,170,143,
-143,143,112,249,242,229,130,129, 3, 7,178,156,156,156, 64, 8, 65,116,116, 52,194,194,194, 52, 7, 14, 28,144,149,218, 14,147,
-136,111,255,172,104, 76, 62,181, 39, 64, 41,128,117,142,217,217,251,231,205,157, 27,212,190, 67,135, 25,193,193,193,116,190,137,
- 49,107,227,170,153, 92, 0, 88,255,221, 41,193,136,192,137,216,233, 14,244,154, 80,123, 30,185,154,245, 76,207,156,245,110,232,
-168,126,238, 95,206,159,174, 31, 59,118, 44,207,204,204, 12, 78, 78, 78, 48, 55, 55, 71, 74, 74, 10, 50, 51, 51,201,197,139, 23,
- 21,143,158, 39,178,206, 93,127,246,142, 43,176,107, 76, 94, 66,185,255,160,143,223, 14, 29, 58,212,124,234,212,169,166, 29, 59,
-118,100,113, 56, 28,112, 56, 28,228,229,229, 33, 57, 57, 89,115,241,226, 69, 69,169,205,144, 18,241,237,147,242, 70,230, 58, 44,
-243, 31, 31,146,124,239, 70,240,162,184,151, 47, 39, 27,128,118, 26,141,198, 65,175,215,211,232,116,122,142,193, 96,120,169,145,
-203, 15,169,124,131,119, 80,185, 14, 27, 7,189, 94,111,164,215,235, 33,145, 72,112,227,198, 13,230,155, 55,111, 86,191,120,241,
- 98,117,118,118, 54,180, 90, 45,198,140, 25, 3, 95, 95, 95,220,190,125, 27, 5,121,121, 23,235,227,122, 13, 72, 57,153,153,211,
-102,205,154,117, 37, 52, 52,148,254,226,197, 11,171,195,135, 15, 31,172, 77,192, 76,158, 60,217,144,151,158, 62, 77, 5, 72,235,
-233,159,245,141,205,194,171, 39,247,188, 24, 57, 58,176,117,240,218,213,172,110,221,186,193,202,202, 10, 61,123,246,132, 70,163,
- 17,182,106,213,170,161,177, 41,247, 31, 60, 46,165, 93,187,118,188, 29, 59,118,136,166, 79,159,142,249,243,231, 3, 0,202,202,
-202,112,253,250,117, 44, 90,180, 40, 55,157,217, 89,217, 80,255,172,180, 84, 85, 9,176,187, 0,252, 1,164,128,114,124,167, 64,
-129,194,191, 19, 85, 73,165,237, 80,145, 88,250, 18, 42, 94,206, 27,206,117,120,239, 73, 44,106,166,249,168,128, 93,188,206,121,
-234,155, 57, 75, 54,121, 51,180, 50,115, 22,173,220, 44, 41, 49,145,214, 80,206,195,234,124,106, 2, 15,133,101,234, 9,191,141,
-235,215, 47,220,185,115,103,191,170, 16, 14, 38, 38, 38, 47,203,148,202,155,214, 42,213,174, 82,129,199,205,166,230,230,203, 4,
-242, 0,204, 53, 23,139,119, 7,140, 24,179,133,107,225,202, 90,185,225, 64, 57,131, 78, 87, 39,103, 23, 96,167, 59,192,107,196,
- 2,201, 82, 53, 16, 39,177,211,229, 89, 6,190, 94,243,213, 87, 95,174, 95,183,206,143,207,231,247,210,232,116, 30, 6,131, 1,
- 48, 24,146, 74,149,202,187, 68,163,121,170,242, 93,187,141, 43,176, 35,141,206, 75, 40,108, 37,183,120,123,198,239,200,161, 67,
- 11, 78,159, 62,253,187,182, 91,170, 84,187, 75,133,173, 34, 26,211,246,154,101,202,129,135,200,207,127, 88,159,233,146,202,117,
-216, 56, 48, 13,134,217,230,230,230, 71,251,245,235,199,237,223,191, 63, 62,250,232, 35,116,235,214, 13, 6,131, 1,132, 16,200,
-229,114,156, 58,117, 10, 91,182,108, 73,106, 14,172,107,136, 79, 5,220,228, 92,190, 60,164, 93,187,118,135,235, 19, 48,149, 34,
-171, 65,159,196,250,199, 38, 39, 73, 39, 24,158, 54,126,222, 70,119,181, 44, 71,104,105,162, 19,197,197,190,164, 55,126,108,122,
-202,245,209,167, 58,143, 25, 53,106, 30,131,201,236, 89,185, 2,146,188,138,143, 23, 87, 37,149,134,239,180, 27, 77,236, 75, 85,
-177,235, 40,199,119, 10, 20, 40,252,219,133,214, 71,168,240,215,170, 78,201, 83,103,174,195, 42,171, 15,147,201,204, 79, 57, 55,
-103, 98,125,236, 44,160, 95,165, 37, 11, 13,230, 58,172,252, 59, 13,144, 67,165,250,250, 55,193, 72,107,172, 46,100,189, 87,190,
- 41, 97, 17, 75,128,215,208,169, 2,144, 31, 15, 92,152, 91,193,231,183,126, 89,205, 54,213,249,144,253,205,113,141,138,203,129,
-123, 80, 40,238, 65,161,168,213,105,151,197, 52, 42,110,168,158,239,183, 61, 29,144,253,209,182,191,207,217,160,120,248, 3,231,
-243,191,134,172,194,194,115, 0,248,142,225,225,182, 87,195,195,199,126,185,120,241, 24, 59,123,123, 55, 43, 43, 43,115, 83, 83,
- 83,250,227,199,143, 83,117,229,229,187,219, 3, 71, 42,173,169, 13, 66, 5,220,244, 76, 79,111,243,241,168, 81,243,104, 76,102,
-143,154, 2,134,232,116, 15, 92,129,189,245, 89,178, 62,116,108, 58,113,236,250, 85, 90,178,192, 0,102, 53,166,111,100, 86,212,
- 99, 3,116,186, 13,136,137,169,165,207, 55,185, 47,173,167,209,104,114, 80,142,239, 20, 40, 80,248,247,162, 42,223,225,165,255,
-235, 3,247,167, 56, 41,206,127, 17, 39, 3, 21,171,232,168,243, 73,113, 82,156, 20, 39,197, 73,161, 94, 84,229, 58,100, 82,167,
-130, 2,133, 70, 67,143, 95,167,193, 40, 80,160, 64,129, 2,133, 42, 84,249,102,213,196,126,160,194,117,167, 46, 85,218,148,213,
- 4, 31,162,108, 35, 40, 78,138,147,226,164, 56, 41, 78,138,147,226,252,207,113, 54,196,253, 79, 92,205, 88,229,147, 85,237,155,
-213,216,236, 54,127, 20,148, 89,149,226,164, 56, 41, 78,138,147,226,164, 56, 41,206,127, 59,236, 42, 69, 86,245, 86, 53,117, 72,
-167,206, 13, 5, 10, 20, 40, 0,193,193,160, 19, 2, 26, 33,193,116, 66, 78, 51, 8, 9,100, 16,130, 63,148, 10, 36, 48,176,246,
- 96,182,159, 79, 52, 55,165,206, 56, 5, 10,255, 42,228,160,142,164,210,148,143,214,255, 95, 56,139, 68,162,125, 0,104,185,185,
-185,179, 1,164, 83,167,228,239, 7, 11, 11,139,126, 58,157, 14, 50,153,236,230,191,177,125,173,221, 48,138,208,209,170,250, 11,
-130,244, 87,201, 56, 90, 91,217, 86,238,152, 2,218,175,177,184,104, 6,188,138,127,131, 95,154,112, 56,250,144,254, 78,123, 1,
-224, 74, 68,198, 60,252, 53,113,181, 90, 90, 91, 91, 95, 99, 50,153, 76,189, 94, 63, 55, 63, 63, 63,188,110, 33, 20,200, 0, 0,
- 22,185,189, 66,146,107,179,252,139, 79,105,172, 82,213, 33,137,170, 76, 41,101,176, 24,111, 57, 44,209,253, 57,211,233, 87, 74,
- 20, 93,227,107,219,255,204,153, 51,117,102,241,110,227,142, 33,116,125,235, 97,190,109, 83, 83,190,221,229,183,179,151,171, 21,
- 43, 53,227, 57,127,243,143,210,125,108,161,203,176, 41, 99,105,225, 76, 19,218,228, 67,135,138, 20,212, 40,107, 60, 54, 2, 22,
- 26,192,155,197,225, 56,233,117, 58, 91, 26, 64, 24, 76,102,158, 86,165,202, 48, 2, 98, 86, 0,146,127, 59,167, 17,135,227,168,
-215,233,108, 1,224,239, 88, 79, 10,191, 69,157, 66,139,207,231, 71,209,233,116,199,154,201,112,171,242, 9, 86,125, 87,243, 55,
- 26,141, 6,189, 94,159, 89, 82, 82,210,177, 9,199, 55, 3, 48, 22, 64,213, 18,245,227, 0, 78,225,195, 29,142,205,140,140,140,
-150,240,120,188,190,101,101,101,109, 0,192,216,216, 56, 78,169, 84,222,210,104, 52,223,126, 32, 47, 19,192,199,124, 62,191, 15,
-157, 78,239, 67, 8,161, 17, 66,110, 43, 20,138, 91, 0, 78, 3,248,144, 72, 9,198, 54, 54, 54, 27, 44, 44, 44, 38,172, 88,177,
-162,200,210,210,210,115,209,162, 69,207,138,139,139,127, 46, 44, 44, 92,133, 38,228,168,251,139,225, 38, 18,137,142,179, 88, 44,
- 70, 70, 70, 70, 31, 0,112,114,114,186,173, 86,171,245,249,249,249, 19, 1,188,105, 34, 31, 15, 64, 23, 62,159,223,145,207,231,
-251,235,245,250, 86,149,249, 25, 95, 41, 20,138, 72,141, 70, 19, 5,224, 49, 0,229,223,104,140,152, 50,153,204,208,202,190,238,
- 1, 64,254,111,187, 9, 16, 58, 90,197,199, 37,120, 86, 11,175, 54, 94,117, 23,166,193,185,150,178,141, 22, 90,125,123,217, 13,
- 27, 62,124, 0, 29, 0,212,218, 43,195,110,221,205, 57,255, 39, 55,167,229,232,209,163, 31,134,134,134,154,171, 84, 42,204,158,
- 61,251,120, 68, 68,196, 94,153, 76,182,162,222, 27, 7,223,124,209,214, 29,215, 77,104, 52, 58, 0,216, 24, 12,122,155,172,172,
- 55, 30,241,177, 15, 7,199,197, 61,218, 88,150,112,235,177,129,198,154,163, 65,207,132,198, 84,162,149, 43, 2,134,141, 25,245,
-209,186,117,193,152, 48,110, 66,179,184,184,114, 99, 7,179, 20,118,113, 25,207,221,210,218,102,248,186,245,103,104,247,239,157,
- 27, 30,122, 56,228,214,244,233,150,125, 41,177,213, 40,208,214, 51,153, 93, 4,238,238,254,227,206,157, 3,223,201,137,201,228,
-112,232, 0,160, 83,169,156, 20, 25, 25,118, 39,135, 15,239, 28,156,152,120, 39, 24,120, 66,113,254,127,225,164,208, 20,161, 69,
-167,211, 29,179,178,178,108,120, 60, 94,197,205,152, 16,232,245,122,232,245,250,234,228,197,132,144,234, 79,157, 78, 7, 47, 47,
-175, 70,189,209, 2,232, 11,224,147,222,189,123, 7,126,251,237,183, 44,111,111,239,170,148, 33, 61, 87,174, 92,249, 93,116,116,
-244, 89, 0, 71, 80, 17,188,177,177,111,188,131,120, 60,222,177,173, 91,183,154, 13, 24, 48,128,105,111,111, 15, 26,141,134,220,
-220,220, 46, 17, 17, 17, 29, 23, 45, 90, 52, 87,169, 84, 78, 2,112,173, 9,231,167,173,169,169,233,153, 81,163, 70, 57,246,234,
-213,139,219,186,117,107,232,245,122, 60,127,254,124,122, 84, 84,212,248,179,103,207, 6,201,229,242, 64, 52, 62, 95, 27,141,207,
-231, 79, 53, 51, 51,219,176,118,237, 90,139, 73,147, 38,177, 99, 99, 99, 75, 92, 93, 93,105,247,239,223,183, 62,117,234,212,220,
- 77,155, 54,125, 44,147,201, 86, 41, 20,138,159,208,136, 28,138,166,166,166, 81,116, 58,221,177, 49, 66, 24, 64, 83,196,112,251,
-230,205,155,159,186,119,239, 94,243,180,180, 52,253,200,145, 35,143, 2,192,173, 91,183,188,181, 90, 45,109,224,192,129, 87, 50,
- 51, 51,199, 2,120,222,200,182,251, 88, 88, 88,156,159, 48, 97,130,133,155,155,155, 73,243,230,205,105, 60, 30, 15, 12, 6, 3,
- 82,169,212, 62, 54, 54,182,255,147, 39, 79,202, 34, 34, 34,138, 85, 42,213,112, 0, 49, 77,184, 78,221,108,108,108, 38,179, 88,
-172,182, 58,157,206, 1, 0,152, 76,102,150, 86,171,141,205,207,207, 15, 5,240,240, 67, 7,136,173,173,237,158, 13, 27, 54, 88,
-229,231,231,147, 77,155, 54,237,145,203,229, 83,255,173, 55,131,227, 63,159, 70,212,179, 39, 64, 69,218, 28, 90, 45,253,143, 6,
-192,232,139, 47, 22,163, 99,167,206,152, 56,225,227, 6, 57,135,246,115,220,202, 98, 27, 89,150,151,151, 63,148,150,170, 78,243,
- 76,184, 99, 39,140, 15, 72, 2,128, 43, 87,239,140,245,243, 51,191, 45, 48,225,124,204,229,114,187,105,213,154,162,203, 55, 51,
-191,106,138,168,114,112,112,184,102,110,110,110, 82, 92, 92,156, 91, 80, 80,240,195,176, 97,195,214, 31, 57,114,196, 60, 53, 53,
- 21, 25, 25, 25, 88,184,112, 33, 63, 51, 51,115, 94, 76, 76,204, 35,181, 90, 93,167,101, 75, 46, 47,222,181,114,249,136,181, 2,
-129, 21,131,103, 98, 6, 83,129, 5, 92,221,218,161, 75,183, 97, 24,242,209, 12, 36, 39, 69,119, 57,114,120, 93,116, 86, 86,196,
- 55,124,139, 22,235, 37,146,230,117,222,151, 90,183, 68,175,225,163, 42, 68,214,218,181,193, 72, 76, 72,144,167,189,165,127,126,
-233, 28,211,100, 72, 63, 47,142, 78,157,155,118,255,222,185,230, 61,122,142, 4,128,142,161,135, 67,110,125, 62,209,188,223,158,
-227, 37,114,234,145, 84,247,189,115, 29,139, 53,117,208,142, 29, 54,190,115,231, 26, 41,222,190,213,164,252,248, 99,105, 94,100,
-164,158,201,225, 16,167,193,131,105,214,125,250,112,231,190,122,101,244, 96,211, 38,127, 86, 72,136,235, 42,141,230, 24,197,249,
-127,202,249, 95, 71,149, 19,124,205,213,135,251,235, 21, 90, 52, 26, 13, 60, 30, 15, 39, 79,158, 4,139,197, 2,147,201, 4,139,
-197,170,243,111,103,103,231,198, 84,100,180, 72, 36,250,110,239,222,189,182,131, 6, 13, 2,151,203,173,254,129,193, 96, 96,192,
-128, 1,232,223,191, 63, 43, 59, 59,123,252,201,147, 39,199,111,220,184, 49, 79, 34,145,204, 71,101, 98,232,122,208,199,211,211,
- 51,236,250,245,235,198,229,229,229,136,140,140, 68, 73, 73, 9,216,108, 54, 28, 29, 29, 49,112,224, 64,102, 66, 66,130,197,128,
- 1, 3,194, 18, 19, 19, 3, 0,220,110, 68, 93, 59,218,216,216,220, 61,125,250, 52,183, 93,187,118,180,228,228,100,248,250,250,
- 2, 0,164, 82, 41, 70,142, 28,201,157, 52,105,146,219,248,241,227, 31,231,231,231,247, 2, 16,213, 0, 95, 7,145, 72,244,211,
-168, 81,163,236, 55,110,220,104,102,106,106,138,180,180,180, 28,145, 72,228, 81,117,190,199,143, 31,207, 30, 54,108,152,221,150,
- 45, 91,118,157, 57,115,230,171,252,252,252,169, 0,196,245,170,214, 74, 65,108, 98, 98,130,188,188, 60, 28, 63,126, 28,243,230,
-205, 3,131,193, 64,126,126, 62, 78,157, 58,133,207, 63,255,188, 74,208, 52, 74, 12,155,152,152,244,119,119,119, 63,120,235,214,
- 45, 71,161, 80, 8,123,123,123,250,154, 53,107,218,186,186,186, 26, 55,107,214,140,145,147,147,131,176,176, 48,215,201,147, 39,
-159, 79, 79, 79,159,174, 82,169, 26,156, 82,179,181,181, 61,116,233,210, 37,231,184,184, 56,252,248,227,143, 40, 46, 46, 6,155,
-205,134, 80, 40,132, 72, 36,130,135,135, 7,109,249,242,229, 38,195,134, 13, 51,153, 63,127,254, 33,181, 90,221,190, 17,215,168,
-157,141,141,205,190, 62,125,250,184,134,132,132, 8, 69, 34, 17,170, 94, 12,164, 82,169, 99, 90, 90, 90,151,181,107,215, 6, 70,
- 69, 69,165,230,231,231,207, 1,240,162,137, 3,167,125,235,214,173, 3, 70,142, 28,201,200,201,201, 65,104,104,104,128, 92, 46,
-111,223, 4,113,249,143, 66,212,179, 39,152,253,217, 66,133,189,147,147,209,245,107, 7, 71,159,249,165,229, 51,161,113, 69, 66,
-106, 73, 25, 52,129,163, 18, 59, 13, 28, 52,195,104,232, 71, 35, 21,251,191,223,197,111,140,208, 98,177,141, 44,143, 31,219,158,
-126,239,126, 84,219, 27, 17, 79, 6,143, 30, 62,156, 24, 25, 9, 93, 1,224,171, 69, 95,176,194, 46, 92, 56, 60,160,127,231,236,
-158, 61, 58,166, 79,156,180,216,185, 9,213,109,217,178,101,203, 59,209,209,209,182, 28, 14, 7,197,197,197,150,251,247,239,223,
-222,163, 71, 15,122, 74, 74, 10, 18, 18, 18,240,246,237, 91, 72,165, 82, 12, 24, 48,128, 47, 22,139,127, 0, 80,167,208,210,208,
-251,110,176,111,166,221,109,105,204,107,174,209,203,108,136, 54,167,245,141, 75, 55,124, 78,132,150,249,218,218,121,121,124, 50,
- 45, 8,235,214,159,101,253,124,124,243,218,155, 17, 39, 0,122,243,186, 51, 2, 16,116, 91,185,106, 5,100,114, 21, 38, 77,152,
-133,201, 19,102, 89, 18,168,237,136,190,156,167, 46, 43, 17,154, 26,189, 10,223,123, 96,251, 40, 0,142, 53,196,214, 77, 74,108,
-213,141,117, 76,102,231,128,239,190,179,110, 59,115, 38,231, 69, 72,136,178, 48, 50,178,204,125,232,208, 18,223, 79, 63, 85, 1,
-128,252,237, 91,163,196,160, 32, 19,107,127,127,227,174, 75,150,152,235,213,106,209,186,117,235,252,214, 86, 36, 47,111, 18,167,
-243,216,177,250,181,135, 15,119,138, 92,188,184, 55, 77,171,101, 12,238,218,245,249,166,208,208,172, 63,194,249,103,214, 51,251,
-238, 93, 85,177,171, 43,124, 71,142, 44,114,182,177, 81,253,153,109,255, 35,245,164, 80,141, 42, 95,173,217, 53,223, 80, 17, 30,
- 30,222, 11,192, 29, 0, 33, 1, 1, 1,193, 0, 32, 16, 8,242, 36, 18,137, 77, 88, 88, 88,131, 34,139,197, 98,193,206,206, 14,
- 30, 30, 30,249,249,249,249,182,245, 84, 32,195, 96, 48, 56, 18, 66,170,173, 47,117, 65,165, 82, 33, 41, 41, 9, 62, 62, 62,153,
-168, 72, 68, 91,167, 81,199,196,196, 36, 37, 33, 33,193, 42, 62, 62, 30, 81, 81, 81,112,117,117,133,185,185, 57, 88, 44, 22,180,
- 90, 45,100, 50, 25, 60, 61, 61,193,225,112,208,161, 67,135, 66,165, 82,233,218,192, 20, 16,135,199,227, 37,221,189,123,215,201,
-215,215, 23, 79,159, 62,133,147,147, 19, 68, 34, 17, 0,224,237,219,183,184,127,255, 62,134, 14, 29,138,232,232,104,140, 25, 51,
- 38, 67,169, 84,122, 0, 80,213, 69,104, 97, 97,145,115,235,214,173, 76,111,111,239,114,165, 82, 73,207,203,203, 99, 69, 70, 70,
-234,228,114, 57, 95, 42,149,178, 36, 18, 9, 75, 38,147, 49,149, 74, 37,139, 78,167, 27,149,149,149,177,110,222,188,201,208,104,
- 52,245, 6,200,172,186, 78, 23, 46, 92,128,183,183, 55,194,194,194,240,229,151, 95,226,193,131, 7,112,114,114,194,233,211,167,
-177,100,201, 18,188,126,253, 26, 86, 86, 86,104,221,186,117, 67,215, 8,110,110,110,201, 47, 95,190,116, 51, 50, 50,170,202,235,
- 88,149, 47, 15, 5, 5, 5,120,243,230, 13,178,178,178,224,238,238,142, 9, 19, 38,188,201,202,202,114,111,168,231, 57, 56, 56,
- 20,196,197,197, 89,249,248,248, 32, 47, 47, 15, 66,161, 16, 2,129, 0, 66,161,176,250,111, 87, 87, 87, 44, 94,188, 24, 34,145,
- 40,191,188,188,220,182, 33, 17, 79, 8, 2,211, 0, 0, 32, 0, 73, 68, 65, 84,228,237,237,125,237,230,205,155, 86,102,102,102,
-200,205,253,127,236, 93,119, 92, 20, 87,219, 61,179,189,209, 97,151, 38, 88,136,116,108, 65,141, 45,246, 10, 70, 99, 73, 51,209,
-196,110,140, 61, 70,163, 81, 99,138, 61,182,104,108,177, 98, 98, 98, 15, 86, 84,196,110, 20, 80,233, 32,210,148,133, 93,218, 46,
-108,223,217,153,239, 15, 89, 94, 36,192, 46, 70,243,189,241,221,243,251, 45,187, 59,220, 57,123,239,204,157, 59,103,158,251,220,
-231, 41,130, 82,169, 4,139,197,130, 80, 40,132,155,155, 91,141,144,207,204,204, 68, 68, 68, 68, 73,118,118,246,192, 38,136, 36,
-134,187,187,123,218,253,251,247,253,105,154, 70,126,126, 62,210,211,211, 49,109,218,180, 76,173, 86, 27,132, 87, 40,103, 95, 45,
-191, 43,206,216,143, 39,113,222, 30,214, 85,159,154, 28, 77,240,168,116,180, 15,115, 80, 0, 64, 98,146,210, 81,199, 8, 68,112,
-104, 36,125,236,196, 13,238,190,189, 59,216,160,224, 14, 2,233,169,153,248,166, 33,238, 1,189, 61, 39,204,154,245, 73, 88,175,
-238, 61, 25,149, 42,149,228,167,159,214,191,158,157,157, 42, 1, 0, 63,191, 96,217,212,169,179,227,237, 69, 34,217,229,107,113,
-212,134, 13,187,147,206,199, 74,119, 89, 81,101, 63,127,127,255,155, 39, 79,158,116,147, 72, 36,112,116,116,132, 74,165,130,193,
- 96, 64, 74, 74,138,246,208,161, 67, 70, 7, 7, 7,251,162,162, 34, 84, 84, 84,128, 32, 8,156, 60,121, 50, 31, 64,243,186, 68,
-102, 31, 45, 0,152, 54, 56,152, 29,210,199,223,153,195, 35, 5, 2,118,134, 39, 8, 19,143,160,237,220,207,156, 75,108,123, 38,
-230,207, 15,222, 30, 49, 87,220,163,231,219, 88,178,120,148,177,176, 48,191,131, 1, 61,210,234,243,209, 10,106,141, 62,195, 71,
-190, 61,122,249,242,101, 88,182,228,107, 68,159, 60,174,176, 19, 49,116, 14, 78,108,199, 55,223,232,166,157,243,233,176,130,170,
-170, 66,159,229,171, 15,189, 31, 49,108, 78,179,238, 61,134,227,218,213,227, 56,176,231,235,187,132,128,182, 77, 35,214,193, 50,
-192,217,201,207,111,242,140,204, 76,206,189,101,203,170,200,194,194,242,240,217,179, 75,234, 43,251, 56, 38, 70,196,245,242,114,
-112,126,235, 45,151,141,205,155,211, 70,153,108,123,125, 62, 70,245,113, 94,176,179,115,250,245,204,153,190, 52,155,221,115,254,
- 23, 95, 8, 34, 35, 35,161, 84, 42,113,228,200, 17,108,223,182, 77,231,233,233,249,192, 43, 41, 41, 33, 76,169, 92,108, 45,103,
-248,236,217, 37, 38,147,137, 24, 61,111, 94,255,228,156,156, 62, 69, 50, 89, 11, 0,240,116,113, 41, 8,247,243,187,187, 59, 58,
- 58,125,115,203,150,148,181,245,220,121,246,172,251,225,220,220, 9, 46, 46, 46,130, 98,153,140,197,227,114, 75,223, 8, 9,249,
-125,235,162, 69,151,201,251,247, 57,252,102,205, 28, 28, 35, 35,155,220,246,240,217,179, 75,202, 42, 43, 89, 51,190,253,182, 91,
- 94,113,113,139, 42,157,174,117, 69,101,165,135,201,104,100, 56, 8,133,165,173, 2, 3,101,154, 43, 87,164,173,212,234,153,187,
- 0,217,203, 58,215,245,105,145,127, 17,234,198,209, 58, 69,211,244, 51,185, 14, 47, 71, 70, 70,254,101,117, 13, 77,211, 86, 89,
-179,216,108,246, 51,211, 84,141,128, 67, 16, 4,226,227,227,225,234,234, 10, 15, 15, 15,240,120,207, 38, 31,148,203,229,184,126,
-253, 58, 82, 83, 83,209,174, 93, 59,243, 52, 70,195,138,136,199,155,181,122,245,106, 39,189, 94,143,187,119,239, 34, 60, 60, 28,
- 60, 30, 15, 28, 14,231, 25, 17, 40,147,201, 16, 26, 26,138,249,243,231, 59,126,255,253,247,179,116, 58, 93,131, 79,164, 44, 22,
-107,250,196,137, 19, 37,102, 11, 86, 65, 65, 1, 94,127,253,245,154,255,139,197, 98, 36, 38, 38, 34, 60, 60, 28,205,154, 53,195,
-168, 81,163, 36, 7, 14, 28,152, 78,146,228,218,134, 56,185, 92, 46,163, 77,155, 54, 29, 1, 64, 36, 18,129,193, 96,100, 56, 56,
- 56,136,221,221,221, 69, 14, 14, 14,127,105,227,158, 61,123, 42, 24, 12,134,209,162, 26, 96, 48, 80, 84, 84,132,176,176, 48, 40,
- 20, 79, 51,184,168, 84, 42,180,110,221, 26, 74,165,178, 70,180,122,121,121, 65,163,105,220,245,171,109,219,182,203,130,130,130,
- 6,136, 68, 34, 30,155,205,198,189,123,247,208,161, 67, 7, 28, 58,116, 8,190,190,190, 16, 10,133,200,204,204, 68,155, 54,109,
- 16, 23, 23, 7,177, 88,140,208,208, 80,158, 68, 34,185, 90, 86, 86, 22,155,151,151,183,172,145,122, 50,236,236,236, 16, 23, 23,
-135,221,187,119, 35, 39, 39, 7,133,133,133,176,183,183, 71,251,246,237, 17, 18, 18,130,174, 93,187, 34, 51, 51, 19,132,229,206,
-228,225,239,239, 31,253,231,159,127,186,209, 52,141, 3, 7, 14,160,170,170, 10,122,189, 30, 12, 6, 3,124, 62, 31,206,206,206,
-232,211,167, 15,196, 98, 49,252,253,253,241,219,111,191,185, 13, 30, 60,248,180, 76, 38,107, 15,160,200,210,113,117,118,118,158,
-185,116,233, 82, 31,137, 68,130,220,220, 92, 40, 20, 10,184,187,187,163, 87,175, 94,222, 23, 46, 92,152,105, 52, 26,215,191, 42,
- 55,178, 90,142,239,196,249,115, 63,143,240,111, 85,222,166, 93,160,208,231,104,180,187,207,161,104, 89, 40, 0,132, 5,187, 39,
-143,136, 20, 22,220, 75,142, 46, 56,127,238,248,221,212, 12, 28,133, 21, 83,219, 10,181,238,247,152, 11,183, 7,117,104,247, 58,
-181,122,213,188,136, 79,167, 77,224, 73,220,199,163, 56,255, 56, 46, 92,138,247,157, 55,119,162,120,237,186,157,103, 98, 46,220,
-102, 40,212,186,197,214,153,178,124, 55,239,221,218,213,173,178,228, 48,178,210,184, 16,216,135,193,207, 47, 0, 74,165, 18,124,
- 62,159,255,254,251,239,155, 22, 46, 92,168,118,112,112, 16, 18, 4,129,216,216, 88, 25,128,129,150,120,181, 18,103,218,100, 48,
-146, 52,151, 73,209,132,189,134, 48,149,113,147, 82, 30, 97, 64,191,222,197,221, 59,135,125,191,112,249,186, 47,253, 3, 58,136,
- 63,153,240, 53,251,219,101, 31,108, 3,129, 30,245,241,164,101,225, 18,241,251, 49, 1,128,136,229,223, 44, 67,118,118,166,243,
-164,113, 21, 95,179,120, 2,175,160,230,221,236,183,237,142, 29,212,186,117,203, 22,115,166,143, 58,245,195,143, 63, 68,212,182,
-108,237,221,179,244, 4,128,190,214, 28,219,255, 33,180,253, 48, 58, 26, 85,249,249,198,178,171, 87,181,125,127,252,177,196,103,
-224,192,245,122,131,193,205, 60, 84, 48, 8, 2,132,217,117,130,162, 8,214,252,249, 12,154,197,130,209,217,121, 28,202,203, 3,
- 44,113,206,149, 74, 71,124, 48, 97, 66,196,137,179,103,209,178,101,203,154,251,153,147,147, 19,230,205,155,135,217,179,103,243,
- 18, 19, 19, 59, 29, 62,124,184,211,218, 53,107,220, 1,140,176,166,158,231,111,221,114,158,178,124,249,162,118,225,225,190,251,
- 15, 30,228,189,246,218,107, 0,128,135, 15, 31,250,175, 90,185,178,121, 88,155, 54,197,223,207,154,181, 55,121,225,194, 80, 0,
- 87, 27,227, 44,186,114, 69,127, 56, 55,119,194,165,216, 88,167,176,176, 48, 0, 64,122,122,186,100,227,198,141, 19, 67, 71,141,
- 26,179,124,234,212,197,145, 90,109,133,131, 92,206,139,220,188,153,245,235,232,209, 22, 57,205,245, 4,128, 94,159,124, 50,171,
- 71,239,222, 33, 35, 38, 76,112,241,245,245, 37,236,236,236, 96, 48, 24, 80, 88, 88,232,156,156,156,252, 90,116,101,165,242,216,
-173, 91, 7, 96, 50,245,127,137,231,186, 94, 45,242, 47,179,100,253, 85, 83, 84,191,247,138,142,142,166, 1,244,138,140,140,140,
- 51,223,192, 77, 38,147, 85, 34,139,197, 98,129, 32, 8,107,197, 22,104,154, 70, 73, 73, 9, 74, 74, 74,106,166,142,100, 50, 25,
- 46, 93,186,132,204,204, 76,176,217,108,112, 56, 28, 24, 12,150,115,208,138, 68,162,126,253,250,245, 99,221,186,117, 11,126,126,
-126, 16, 8, 4, 53,245, 50,191, 56, 28, 14, 60, 61, 61,161, 84, 42,209,183,111, 95,246,166, 77,155,250, 53, 38,180, 28, 29, 29,
-135,188,243,206, 59, 92,243,247,170,170, 42, 48,153,204, 26,209, 82, 85, 85,133,178,178, 50, 84, 84, 84, 64,171,213,162, 75,151,
- 46,220,232,232,232, 33,165,165,165,107,173,105,191, 90,173,174,146,201,100, 78, 61,122,244,112,222,187,119,111,122,151, 46, 93,
- 2,159,233,105,151, 47,107,181, 90, 45,155,193, 96, 88,149, 71, 47, 42, 42,170,230,216, 63,121,242, 4,219,182,109,171,249, 95,
-102,102, 38, 54,109,218, 84,147, 10,160,177,115, 20, 20, 20, 52,248,192,129, 3,225,251,247,239, 47,103, 50,153, 72, 79, 79,199,
-193,131, 7, 65,211, 52,196, 98, 49,212,106, 53,138,139,139, 17, 27, 27, 11,146, 36, 97,103,103, 7,111,111,111,254,244,233,211,
-187,127,253,245,215,236,198,132,150,201,100, 50, 49,153, 76, 52,111,222, 28, 75,150, 44,129, 86,171, 5,135,243, 84, 95, 42,149,
- 74, 84, 84, 84, 32, 33, 33, 1,185,185,185,160, 45, 68,121,227,243,249,163,246,239,223, 47,225,114,185,208,104, 52,168,172,172,
- 68, 65, 65, 1,242,242,242,180, 50,153,140,180,183,183,103, 52,111,222,156,193,227,241,120,195,135, 15, 39,204,130, 51, 50, 50,
-210,245,192,129, 3,239,234,245,122, 75, 34, 73,236,225,225,241,229,196,137, 19,249,181,251,108, 81, 81, 17, 70,140, 24, 33,188,
-113,227,198, 66,165, 82,121, 16,128,252, 21,187,161,209,135,143, 5,220,185,123, 33,189,205,209,104,119,159,188,199,166,110,243,
- 62, 95,199, 2,128, 29,219, 87,116, 59, 26,253,228,122, 80,203,226,130,195,199, 2,238, 56, 59,167, 90, 18, 2,140, 62, 61, 61,
-135,138,132,252,119, 70,188,245, 22,253,211, 79,235, 95,255,116,218, 4, 94,243,128,121, 79, 45,156,108, 9,250,146,223, 16,106,
-205, 67,254, 79, 63,173,127,125,196, 91, 35, 19,114,114,114,183,247,233,201,251,237, 82,156,244,143,198, 44,134, 18, 87,190,183,
-144,167,130,183, 95, 8, 2,131, 69, 72,188,151,142, 35,191,223, 68,112,232, 27,208,233,116, 32, 73, 82, 52,116,232, 80,245,161,
- 67,135,180, 25, 25, 25,149, 26,141,166, 39,128, 12, 75,141,127,252, 56,133, 10,244,120,195,192, 17,240,200, 74, 5, 71,189, 96,
-241,225,209,175,119, 30, 16,238,236,233,205, 22,139,168, 63, 6,247,239,116,112,247,174, 37,179, 23, 47, 61,136,142,157, 6,116,
- 73, 77,191, 26, 2,224, 65,189,226, 53, 27,209,140, 35,199,200,236,172,172,136,188,220,220,199, 1,238, 30,250,135, 21,180,113,
-230,130,157,253,123,244, 28,213,246,181,224, 55,185,169, 41,113,196,146,249,239,254,178,124,245, 15,239,155,197,214,197,152, 95,
-122,142, 27,119,147,187,119,111,195,214,241,255, 53,112,120,188,102,118,205,155,179,114,246,238,213,248, 13, 29, 90, 14, 0,122,
-131,193, 45, 39, 55,215, 81, 40, 20,130,166,105, 24,141,198,103,124,136,205,126,195, 97,129,129,238,214,112,230,124,245, 85,219,
-249,243,231,163,168,168, 8, 36, 73,130,205,102,215, 29,179,161, 82,169, 48,110,220, 56,108, 94,179,230, 13,107, 56, 77, 38, 19,
- 49,101,249,242, 69, 95, 44, 90,244,218,228,201,147, 25,181,199, 94, 23, 23, 23, 28, 62,114,132,187,101,203,150,102, 95,110,222,
- 60,238, 3, 30, 47, 27, 58, 93,163,156, 37,173, 91,195,165,184, 88, 96, 22, 89, 0, 16, 24, 24,136,109,219,182,241,198,143, 31,
-207, 29, 58,116,232,186,196,118,237, 54,174,239,222, 61,203, 53, 32,192,129,203,227, 53,179,196,105, 62,158, 0, 80,169,213,134,
-173,223,184,209,249,246,237,219, 40, 46, 46, 70, 81,209,211,231, 81,130, 32,208,177, 99, 71,226,195, 15, 63,116,108,229,227,211,
- 9, 38,211,203, 60,221,127,209, 34,255, 34, 76,170,103,219,127,124,180,170, 27, 68, 84, 55,144,168,117,115,124, 70,176, 88, 18,
- 90,207,131,138,138, 10, 84, 84, 84, 96,215,174, 93,224,112, 56, 53, 55, 95, 0,208,235,245,214,136,150, 54, 94, 94, 94, 80, 40,
- 20, 8, 8, 8,120,198,146,197,225,112,192, 98,177,192,225,112,192,227,241,160,211,233,224,235,235, 11,181, 90,221,166, 49, 78,
-141, 70,211,222,197,197,165,230, 6,171,171,238,172, 58,157,174,166,190,122,189, 30,229,229,229,168,170,170, 66,101,101, 37, 84,
- 42, 85, 7,107,218, 75, 81, 20,146,146,146, 30, 6, 6, 6,182,103, 50,153,176,179,179, 19,169, 84,170, 26,223,162,178,178, 50,
-236,219,183, 79,245,209, 71, 31,185,157, 60,121,210,162,208, 34, 8, 2,159,125,246, 25,120, 60, 30,212,106, 53,126,250,233, 39,
-204,152, 49, 3, 28, 14, 7,149,149,149,216,182,109, 27,230,204,153, 3, 22,139, 5,189, 94,143,141, 27, 55, 54,200,149,146,146,
-146,115,235,214,173, 14,175,191,254,186,243,177, 99,199,228,253,251,247, 23, 15, 28, 56, 16, 2,129, 0, 26,141, 6, 70,163, 17,
-111,188,241, 6,130,130,130, 32,147,201,112,230,204,153, 18,127,127,127,183,219,183,111, 83, 69, 69, 69,121, 22,196, 53, 93,203,
- 98, 8,147,201,132,226,226, 98, 84, 84, 84, 64, 46,151,163,176,176, 16,143, 31, 63, 6,139,197,178, 24, 77,215,213,213,117,100,
- 88, 88, 24, 19, 0, 4, 2, 1,218,183,111,143, 69,139, 22,145, 26,141,230, 29, 0,103,170,139, 13,222,185,115,231,177,107,215,
-174,177,188,188,188,144,150,150, 6,177, 88,204,226,243,249, 22,133,150,135,135,199,158, 63,254,248,195,197, 44,174,205,199, 89,
-173,126,122, 58, 70,140, 24,225,178,127,255,254, 61, 36, 73, 14,121,213,110,106, 78, 2,112,218,135, 57, 40, 14, 69,203, 66,231,
-125,190,142, 21, 20,246,244,225,117,210,100,176,214,174,153, 27, 58,102,152,195, 41, 39,129,146, 99,137,103,112, 63,159, 45,111,
-189,213,159,241,254,123,145,153, 28,142,147,223,246, 29, 95, 75, 36,238,227,107,201, 48, 7,184,186, 57,192,175, 57,151, 56,124,
- 42, 85,178, 96,225, 55,186,168,253, 63,100,255,242,107,244, 32, 46, 59,102,192,153, 11, 5, 83, 27,226,206,120, 88,113, 82,173,
-227, 7, 43, 75,239, 19, 46,238,221,208,190, 93, 32, 36,226,114,236,220,115, 8, 45, 91,117,132, 78,167,131,131,131,131,208,100,
- 50, 25,152, 76,102,148, 53, 34, 11, 0, 46, 94,172,160, 66, 67, 43,244,204, 74,138,252,116,198,218,183,251, 15,126, 43,164, 79,
-159,126,212,249,152,243,134,110, 29, 12,210,193, 3,219, 23,159,141,217,146, 41, 45,124,228, 31,218,166, 59, 82,146, 99, 7,209,
- 52,146, 8,162,126,235, 83,114, 22,206,106,169,148,216, 67,135, 38, 81, 26, 42, 65,240,237,119, 15, 6, 71, 68,140, 13,123,179,
-199,155, 84,204,133, 75,122, 46, 74, 82, 29,186,119,125,242,233,132,193,199,126,142,218, 56,224,236,153, 61,173, 21,202,188,104,
-155,200,170,243,144, 70,146,238, 44, 30,143, 33,143,141, 37,219,140, 31,175, 51, 95,143, 66,161, 16, 39, 78,156, 0,151,203,173,
-121,113, 56,156,154,207,238,238,238, 32,170,151,145, 90,195, 9, 0, 82,169, 20, 69, 69, 69,112,116,116,132, 88, 44, 70, 81, 81,
- 17,110,220,184,129,140,140, 12,176,217,108, 12, 26, 52, 8,140, 6,124,155,235,114,142,158, 55,175,127,112,155, 54,190,117, 69,
- 22, 0, 24, 12, 6,148,149,149, 97,216,176, 97,140, 51,103,206,120,156,205,207,127, 11, 64, 84, 99,156, 29, 34, 34, 74,139, 15,
- 31,174,247,183, 95,127,253,117,226,250,245,235,188, 65, 3, 7,206,158,251,221,119, 91, 54,239,223, 95, 96, 34, 73,143,166,180,
-157,193, 96, 48, 8,130,128,143,143, 15,202,202,202, 80, 85,245,116, 6,219,206,206, 14,206,206,206, 48, 26,141,160,104,154,253,
- 50,207,117, 67, 90,228, 95,130, 29,181, 4,215,142,191, 88,180,170, 27, 5, 0,189,106,223, 88, 40,138,178, 74,100,177,217,108,
-139, 62, 87,214, 88,185,234,194, 26,161,101,174, 43,159,207,175,185,208,106, 11, 44,115, 61, 25, 12, 6,152, 76,166, 85, 33,241,
- 41,138, 98, 86, 86, 86,226,200,145, 35,232,217,179,103,205,180,148, 66,161, 64, 69, 69, 5, 20, 10, 5,180, 90, 45,114,114,114,
-112,241,226, 69,180,110,221, 26,128,117,193, 95,179,179,179,239,182,108,217, 50,220,124, 19,239,221,187,119,179,189,123,247, 22,
- 14, 25, 50,196,139,166,105, 44, 94,188,184,228,141, 55,222,112,171,125,147,183, 4, 38,147,137, 27, 55,110,160,117,235,214,160,
-105, 26, 28, 14, 7,233,233,233,144, 72, 36,160, 40, 10, 44, 22, 11,114,185, 28,246,246,141,199, 72, 76, 74, 74,250,248,147, 79,
- 62, 41,116,116,116,108, 91, 90, 90, 42,229,241,120, 61,174, 92,185,226, 99, 48, 24,224,224,224, 0, 7, 7, 7,156, 62,125, 26,
- 78, 78, 78,152, 53,107, 86,190, 70,163,185, 33, 18,137,220, 53, 26,205,253,162,162,162,197, 77, 57,223, 36, 73, 66,165, 82,161,
-188,188, 28,101,101,101, 80, 42,149,208,106,181, 22,235, 88, 31,122,244,232,129,232,232,104,230,138, 21, 43,126,206,206,206, 6,
- 0,248,249,249, 97,214,172, 89, 76,111,111,111,228,228,228,224,238,221,187, 48, 24, 12,160,105,186,209,139,151,197, 98,245,254,
-232,163,143,186,251,250,250, 18, 6,131, 1, 20, 69, 65,167,211,193,252, 57, 63, 63, 31,193,193,193,140,230,205,155,119,201,206,
-206,238, 13,235, 22, 86,216, 0,160, 56,255, 56,188,217, 18,128,225, 0, 90,115, 28,165, 37,207, 23,197, 69, 38,147,125, 55,255,
-171,235,227, 55,175, 54,184, 63,150, 2,129, 97,195,225, 31,210, 23, 31,127, 72, 98,197,154, 35,240,109, 30,136,188,188, 60,244,
-238,221,155, 83, 88, 88,248, 73, 85, 85,213, 60,107,185, 99, 98,110,153,206,159, 62, 51,106,244,187, 99,195,251,245, 27, 66,158,
- 59,119, 26, 73,247,207, 37,127,242,238, 72, 25, 77, 85, 17, 46, 78,130,132,244,180, 59,254,109,219,247,130,158, 52,245, 0,150,
-173, 6,150,209, 13, 95,239,208,159, 58,229,201, 56,117,124,207,135,239,143, 25,215,174,111,223, 1,198,115, 49,127,224,238,205,
-152,123,235, 86, 79,140, 91,177,241,183,222,253, 7,141, 12, 21,187,223, 56, 29, 22,160,155,224,227,234,248,112,231,222, 50, 91,
-103,169,239,218,228,243, 41, 84,143,139, 12,130, 0, 77,211,207,136,172,186, 66,139,193, 96, 88, 52, 0,212,230,172,125, 47, 50,
- 63, 80,111,223,190, 29, 60, 30, 15, 92, 46, 23,108, 54,219,162,251, 69,109,206,228,156,156, 62,251,162,162,120,245,137,172,210,
-210, 82,148,150,150,162,170,170, 10,239,189,247, 30,231,235, 59,119, 94, 71,181,235, 71, 67,156,190,158,158, 58,145, 64, 80,156,
-146,146,226, 21, 18, 18,242, 76,125,149, 74, 37, 4, 2, 1,162, 14, 30,228, 68, 70, 68, 76,235,123,250,244, 58, 88,136,127, 85,
- 95,219, 9,130,128, 68, 34,129,179,179, 51, 8,130, 0, 73,146, 40, 42, 42, 66,114,114, 50,238,220,185, 3, 38, 65,144, 47,243,
- 28,215,167, 69,254,133, 86,173, 29,245, 78, 29, 54, 52, 39,218, 20,161,197,100, 50,159,219,170,213, 16,172,153, 58, 20, 10,133,
- 15, 10, 11, 11,187,121,123,123,131, 36,201, 26,161, 85,119,234,208,108,253, 72, 76, 76,132, 80, 40,124,160,213,106, 27,229,164,
-105,186, 75,167, 78,157,112,244,232, 81,196,198,198,226,209,163, 71, 80,171,213,208,233,116,208,104, 52, 72, 78, 78, 6, 69, 81,
- 8, 11, 11,131, 72, 36,130, 80, 40,124,160,211, 53,254, 32,170, 82,169,164,108, 54, 59, 80, 32, 16,212,108,243,244,244, 68,105,
-105, 41,101, 52, 26,177,111,223, 62,165,135,135,135, 72, 32, 16, 88, 45, 92, 9,130,128, 76, 38, 67,179,102,205,106,124,180, 42,
- 43, 43, 33,145, 72,204,194, 2, 58,157, 14,246,246,246, 22,167, 14, 1,104,179,178,178,230,214,250,222,113,244,232,209,191, 28,
- 58,116,168,213,133, 11, 23,112,251,246,109,136,197, 98,124,255,253,247,143,114,115,115,223, 7,112, 71, 38,123,177,126,145,214,
-244,161,210,210,210, 35, 15, 30, 60,232,210,169, 83,167,154, 81,162,119,239,222, 68,239,222,189,221,106,155,250,229,114, 57,254,
-252,243, 79, 92,184,112, 1, 4, 65, 32, 51, 51,211,164,209,104,126,105,108,150,194,219,219,123,239,162, 69,139,236, 72,146,172,
-233,219, 2,129, 0,124, 62, 31, 28, 14, 7, 76, 38, 19,185,185,185, 24, 54,108,152,227,143, 63,254,184, 71,167,211,189, 6,192,
-128, 87, 4, 21, 26, 24, 18,147,148,142, 97,193,238,201, 59,182,175,232, 54,105, 50,204, 83,135,100, 88,176, 36, 57, 49,169,216,
- 49, 92, 98,185,189,103, 46, 20,124,170, 55,158, 25,122,230,236,229,119, 62,159, 61,139,237,231, 23, 44,187,112, 41,222,183, 47,
-249, 13,225,234,230,128,210, 18, 37,114,243,139,145,157,167,167,253,252,130,101,119,255,124,192, 91,179,126,131,191, 74,173, 53,
- 79, 29, 54,218, 79,175,222,120, 52,124,221, 38, 94,220,216, 79, 58,114, 5, 2, 47,148,149, 60,128,175,175, 24,195, 34,219, 98,
-247,254, 27,112,116,116,129,187,187, 59, 24, 12,134,200,218,182,151,148,148, 16, 71,126,189, 58,254,163,113, 19,223, 24, 56, 32,
-130, 60,123,238, 20, 43,246,252,201, 27,123,118,124,121,140,102,170,132, 4, 93, 41,104,209,210,227,254,195,172,196,247,251,244,
-123, 15, 2,142,125,107, 32,168,222, 14, 91,179,192,128, 70,254,209, 67,203,248, 31,141,155,212,117,224,192,183,200,115,231,142,
-227,220,233,253,183,150, 46,109,113,250,209,147,131,156,155,119, 30,243,135,143,154, 90, 30,125, 38, 85, 63,114,104,203, 12, 47,
- 81,123, 13,240,200,166,170,106, 63, 72,178, 88,197,164, 78,231,211,108,224, 64,166, 58, 47,143,109,231,238, 78, 2,128,209,104,
-180, 40,180,208,192, 20,116, 93, 78,107,235,162, 86,171, 65, 53, 16, 59,177, 46,103,145, 76,214,162,250, 33,188, 6, 70,163,177,
- 70,100,149,150,150,162,162,162, 2, 34,145, 8,114,157,206,221, 26,206, 1,157, 59,239,251,122,217,178,121,135,143, 28,225,212,
- 22, 89,230, 23,155,205,198,170,213,171, 57, 51, 62,255,124,234, 52, 22,107, 38, 72,210,234,227,105,126,104,103, 50,153, 96,177,
- 88,200,203,203, 67,126,126, 62,242,242,242,144,151,151, 7,129, 64, 0,250, 37, 47, 2,250, 23,251,103,153, 69, 86,237,247, 26,
- 43, 87,163,225, 29,154,226, 12,111,173, 48, 48, 53, 97,126,215, 26,161,165, 82,169, 46, 92,188,120,177,243,240,225,195, 89,183,
-110,221,130,135,135, 71,141,208, 50,191,155,167,163,132, 66, 33,142, 29, 59,102, 80,169, 84, 23, 44, 92, 76, 23, 79,159, 62, 29,
-190,100,201, 18,246,199, 31,127,140,148,148, 20, 76,158, 60, 25, 21, 21, 21, 80, 42,149, 40, 45, 45,133, 90,173, 70,231,206,157,
-193,231,243,113,255,254,125,163, 90,173,190,104,193, 98, 71,203,100,178, 42,177, 88,236, 89,247,127,163, 70,141,114,223,186,117,
-171, 58, 45, 45,205,216,173, 91, 55, 7,107, 5,135, 25,191,254,250,107,141,165, 46, 35, 35, 3, 91,183,110,173,241,201,138,143,
-143,199,218,181,107,107, 98,159, 53, 17,119, 74, 74, 74, 72,163,209,136,214,173, 91,195,219,219, 27, 90,173, 22, 27, 54,108, 32,
- 1,220,249,255,234,205, 90,173,246,240,216,177, 99,191, 72, 72, 72,240,100,177, 88, 79, 77,218,213,237, 51, 24, 12,200,202,202,
- 66,114,114, 50,210,210,210, 80, 86, 86, 86,243, 32,144,152,152, 88,110, 52, 26,127,107,136, 87, 44, 22, 47,222,189,123,183,135,
- 80, 40,124,166, 63,155,173,161,102, 43,169, 92, 46,135,147,147, 19,250,246,237, 43,185,120,241,226, 98,157, 78,183,228, 21,185,
-167, 17,163,222,206,232, 56,227,211,225, 24, 17, 41, 44, 56, 26,253,228,250,218, 53,115,171,157,225, 37,201, 35, 34,189, 11,238,
-165, 59, 97,212,219,199, 59, 2,120,140,198, 29,182,169, 75,113,210, 19,157, 58, 57,199, 30, 61,121,114,207,194,249,179,227,231,
-205,157, 40, 86,107, 30,242,253,154,115, 9, 0,200,206,211,211,247, 83, 40,237,218,117,179,227, 87,172,254,145, 81, 92, 90, 49,
-249,207, 63, 27, 14,111, 80, 91,188, 48, 24,224,251, 5,245, 44,244, 15,232,222,242,214,141, 40,216, 9, 53, 8, 12,234,136,129,
- 3,186, 32,246,114, 34,138,228, 90, 72,165, 82,232,116,186, 70,195, 37,164,221, 63,246, 33, 77,208,190, 4, 77,228, 19, 12,154,
-255,225,216, 9, 61, 34, 34,222,162,163,163, 79,146,199,143, 69, 93,251,237,192,166,195, 12, 14,155,165,209, 59,234, 9, 66,171,
- 0, 35, 41,165, 74,245,244,129,134,205,227, 52,108,126,173, 14,236, 26, 18, 26,228,241,225,216,201,142, 67, 6, 15,163, 79,159,
- 62, 78,253,118,104, 95,236,111,187,218, 68, 81, 12, 37, 71, 90,160,230, 41,148, 70, 5, 77,112,157,170,148,148,186, 56,251, 53,
-173, 87,196, 40, 3,112,216,166,174,106,223, 7,116,186,199, 85, 5, 5,158, 46, 61,123,242,178,150, 45, 19,186,119,238,172, 37,
-170,125,136, 27, 19, 90, 76, 38, 19, 96, 48, 40,107, 56,173,173,139, 70,163, 1, 5, 24,159,135,147, 36,201,103, 68,150, 89,104,
-153,175, 23,107, 56,119, 44, 93,122,203,119,224,192,178,203,151, 47,187,247,234,213,139,168,172,172, 68,101,101,229, 51, 98,203,
-203,203,139, 8, 9, 11, 19,254, 26, 27,235,103,237,241,180,166,237, 12, 6,227,165, 11,173,127, 57,118, 52,104, 61,108,108, 47,
-179, 69,203, 26,161,101,165, 69,203,104, 52, 26, 33,145, 72, 80, 82, 82,210,224,141,159,193, 96, 64, 32, 16,152,231,136, 27, 93,
-121,167,211,233, 54,204,155, 55,111,250,224,193,131,221, 2, 3, 3, 33,151,203,225,238,238, 14, 62,159, 95,227, 59,102,230,139,
-143,143,199,238,221,187,149, 58,157,110,131, 5,206,245,171, 87,175,254,116,196,136, 17, 46, 30, 30, 30,112,118,118,198,253,251,
-247,225,236,236, 12,165, 82,137,244,244,116,216,219,219,215,248,237,156, 60,121,178, 82,167,211,173,183, 32,222,232, 43, 87,174,
- 24,236,237,237,239,203,229,114,102, 89, 89, 25,171,188,188,156,165, 84, 42,217, 10,133,130,125,246,236, 89, 55, 71, 71, 71,245,
-165, 75,151,228,190,190,190,204, 71,143, 30, 49,141, 70,163, 69,245, 74, 16, 4,102,206,156, 9, 14,135, 3,157, 78,135, 13, 27,
- 54, 96,222,188,121, 53, 62, 89,171, 87,175,198,162, 69,139,106,132,243,206,157, 59,155,212,115,104,154,134,193, 96,128,209,104,
-132,209,104,180, 74,252,254, 29, 88, 41,216,139, 50, 51, 51, 35, 59,117,234,116,254,247,223,127,119,173,142, 73,134,226,226, 98,
- 20, 23, 23, 67, 46,151,163,170,170, 10, 36, 73,194,219,219, 27,197,197,197, 56,126,252,184,162,178,178,114, 32, 26, 89,113,200,
-100, 50,199,246,232,209,131, 85,183, 14,230,167, 60,179,120,231,241,120, 40, 44, 44, 68,239,222,189,185,151, 47, 95, 30, 11,224,
- 95, 45,180,106,135,119, 24, 48,112, 60, 39, 56,180,171,254, 94,114,116, 65, 80,203,226,130, 49,195, 28, 78, 1, 64, 98, 82,177,
-227,189,116, 39, 4,135, 70,210, 3, 6, 58,135, 23, 23,237,104, 3,192,208, 88,186, 30, 0,112, 20,242, 70,247,239,215,185,208,
- 94, 36, 98,172, 93,183,243,204, 79, 63,173,127,253,240,169,255,132,119, 88,187,238,105,120,135,254,253, 58, 83,105,169,105,163,
- 1,236,178, 86,188, 68, 70, 14, 77,216,189,119, 55,210,146, 47,121,125, 49,179, 45,183,172,216, 8,129,157, 15,194,219,187, 99,
-199,222, 7,184,119,239, 94,145, 94,175,239,221,104,255, 38,104,223,228,148,164,128, 54,161, 33, 30, 31,142,157,228, 16, 25, 57,
- 12,209,209, 39,112, 96,223,174, 43, 35,223, 27,241,243,147,114, 37, 83,194, 22,114,132, 52,197,101,114, 28, 89, 28,158, 64,166,
-215, 63, 93, 3,193,102,243, 29,128,209,141,222,120,166, 76, 26,227,216,167,223, 48,156, 58,125, 2, 7,246,237,136,251, 42,116,
-212,174,150, 29,130,137,206,175,175,153,218,178, 85,203,230,170,170, 98, 37,131,224, 26,180, 90,202,126,205,190,220, 31,178, 23,
-141,205, 6,176, 14,182, 85,135,181,113,255,192,144, 33,157,102, 60,124,200, 17,119,239, 46, 40,140,141, 21, 86,103, 34,105, 84,
-104,177, 88, 44,208, 13, 79,117, 61,195, 73,236,223,207, 0,208,232, 34, 44, 14,135, 3,181, 90, 13, 99,195, 22,236,103, 56, 61,
-207,157, 43,120,248,240,161,191,139,139,203, 51, 34,171,172,172,172,230,179, 86,171,133, 90,173,134, 64, 32, 72,214,212, 63, 35,
-242, 12,103,241,149, 43,218,149, 51,103, 46,121,255,189,247, 54, 93,184,120,145,239,234,234, 10,133, 66,241,140,208,210,235,245,
-232,211,183, 47,103,117, 66,194,135, 80, 42,151, 90,115, 60,221,123,247,182,232, 15,204,100, 50, 65,189,228,169,195, 87, 0,147,
-234, 19, 94, 12, 75, 83, 56,214,174, 58,108,224, 6, 89, 55,187,247,162,240,240,112,109, 70, 70, 6,124,125,125,107,196, 74,237,
-223,116,112,112,128,147,147, 19,226,227,227,241,221,119,223,105, 0, 44,178,192, 89,169, 86,171,223,237,223,191,191,134,197, 98,
- 33, 40, 40,168, 38,126, 22, 69, 81,224,114,185, 16,137, 68, 72, 72, 72,192,208,161, 67,213,106,181,250, 93,252, 53,134, 86, 93,
- 78,133, 90,173,254, 96,192,128, 1,234,148,148, 20,244,232,209, 3,247,238,221, 67, 85, 85, 21,170,170,170,144,147,147,131,144,
-144, 16,168,213,106,108,221,186, 85,163, 86,171, 63, 0,160,104,140,179,178,178,114,232,188,121,243,152,191,252,242, 75, 75,111,
-111,239,208,142, 29, 59, 6,246,237,219,247,181,183,223,126,187,249,144, 33, 67, 60,253,253,253,181, 3, 7, 14, 20, 15, 30, 60,
- 88,172, 86,171,217,215,175, 95,151, 26,141,198,193, 22,234, 89, 35, 78, 50, 50, 50,106,166, 10, 89, 44, 22, 74, 74, 74,106, 34,
-247,155, 7,165, 6,132,112, 63, 75, 98,219, 44,176,204,130,203, 10, 63,183,250, 56, 45,238,196,229,114,205, 22, 79,218, 10,206,
-196,212,212,212,254, 61,123,246, 76, 28, 63,126,124,101, 81, 81, 17,236,237,237,225,231,231,135,128,128, 0,184,185,185,193, 96,
- 48,224,216,177, 99,170,227,199,143, 63, 80, 40, 20,189,241,215, 24, 90,253,234, 28,199,156,250, 6, 89,179, 53,203, 44,180,248,
-124, 62,188,189,189,205,199, 54,167, 41,199,243, 57,241,114, 57,171, 5, 76,223, 62, 3, 91, 13,137, 24,238,120,236,196, 13,238,
-166, 45,199, 31,132,247,195, 78,215, 22,202,147,174, 45,148, 39,195,251, 97,231,166, 45,199, 31, 28, 59,113,131, 59, 36, 98,184,
- 99,223, 62, 3, 91,165, 36,167, 5,214,206,123, 88, 95, 61,249,124,126,215, 30,221,195,203, 47, 95,139,163, 86,172,254,145,209,
-167,247,200,132, 93, 63, 31, 59,182,235,231, 99,199,250,244, 30,153,176, 98,245,143,140,203,215,226,168, 30,221,195,203,249,124,
-126, 87,107,218, 62,101,210, 24,199,136, 33,195, 16, 29,125,140, 60,252,235,214,213,135,142,100,246,156, 48,253, 74,113, 70,198,
- 61, 90,246,248, 28,216,140, 60,164,166,166, 42,170, 69, 86,134, 53,156,147, 39,142,169, 45,178,174,186,122,244,216,153,154, 10,
- 83, 76,204, 31,198,139, 23, 19, 52, 87, 19,101,138,187, 41, 37,101,133,242,178, 71, 74,101,169,158,162, 76, 48,153, 76,204,175,
-191,174,113,216,173,247, 28,117,235,214, 11,151, 46, 28,196,190,189,219, 21, 20, 5,237,232,195,135, 77,163, 71, 47,163,155,183,
-104,209, 60,234,215,131, 68,228, 91,195, 29,105,128, 26, 58, 98,152,211, 47,135,126, 33, 90,181,110,213,194,207,175, 38,164,205,
-191,175, 47,189, 4,206,101, 64,185, 50, 47, 47, 46,254,199, 31,117,238,239,190,235,194,117,119,119,128,201, 68,152,199,247,134,
- 94, 44, 22,171,174, 5,166, 65, 78,111, 55,183, 39, 39, 79,158, 68, 64, 64, 0,188,189,189, 81,219, 71,214, 28,144,219,213,213,
- 21, 71,142, 28, 1,253,108,112,234, 6, 57, 59,180,108, 25,191,106,229, 74, 61, 69, 81, 40, 47, 47,255,139, 53,171,188,188, 28,
- 20, 69,225,244,169, 83,122,229,211, 76, 32, 86,181,189, 55,147, 89,245,254,155,111,174,136,136,136, 48, 60,124,248, 16, 20, 69,
-161,182,101, 75, 38,147,193,206,206, 14, 90,157,206, 7,128,208, 26, 78,217,217,179, 34, 88, 24,215,235,177,104,189,140,243,254,
-111, 23, 89,181, 19, 74, 79,178,202,162, 69,146, 36,124,124,124,158, 73,233,194, 96, 48,158,121, 53,113,197,225,254,148,148,148,
-115, 3, 7, 14, 92,242,198, 27,111, 76, 89,178,100, 9, 51, 48, 48, 16, 10,133, 2,206,206,206,144, 72, 36, 72, 79, 79,199,201,
-147, 39, 77, 37, 37, 37,219, 0, 44,135,117, 75,232, 99, 51, 51, 51, 35,219,182,109,123,104,193,130, 5,142, 3, 6, 12, 96,251,
-248,248,128,166,105, 36, 36, 36,224,232,209,163,134, 93,187,118, 41,171, 69,150,181,206,203,231, 11, 11, 11, 71, 14, 30, 60, 56,
-106,236,216,177,246, 38,147,137,157,147,147, 3,157, 78, 7,163,209,136,252,252,124, 67,116,116,116,149, 90,173, 30, 3,224,188,
- 21,124,241, 21, 21, 21, 33, 49, 49, 49, 99,175, 95,191,254,221,248,241,227, 93,251,246,237,203, 33, 73, 18,215,174, 93,147,119,
-232,208, 65, 34,147,201, 12, 71,142, 28, 41,213,106,181,139, 76, 38,147, 85, 41,120, 8,130,128, 82,169,132,155,155, 27,116, 58,
- 29, 40,138,130, 94,175,135,157,157, 93, 77,218, 36,154,166,209, 20,231,250, 58,125,128,105, 48, 24,240,222,123,239,129,162, 40,
-108,216,176, 1, 36, 73, 54,153,204,209,209,241,110, 98, 98, 98,100,251,246,237,107,196,139,185, 15,241,120, 60,184,185,185,193,
-213,213, 21,209,209,209, 96,179,217,119, 45,249,187, 85,227, 94, 73, 73, 73,135,152,152,152,174, 15, 30, 60,248, 8, 64,123,131,
-193,224,109, 50,153, 8, 6,131, 33,165,105,250,190, 82,169,252, 25, 86,166,224,145,201,100,223,141, 27, 55,174,195,193,131, 7,
-237, 88,172,255, 92, 26, 44, 22, 11, 60, 30, 15,230,224,152, 52, 77, 67,175,215, 99,241,226,197, 74,149, 74,245,221,171, 50, 74,
-132,119,236,140, 29, 91, 55,218, 93,188,116, 78,158,154,137,163,245,132,112,120, 92, 92,180,163, 77, 97, 65,129, 93,120,199,206,
- 86,113, 26,245,134,210, 15,198,204,241,173, 78,193,179, 56, 39, 39,119,123,212,254, 31,178, 1, 96,205,250, 13,254,197,165, 21,
-147,211, 82,211, 70,111,223,254,107, 87,163,222, 80,106, 13,231,127,196, 75,148, 2, 52,180, 0,110, 39, 60, 40,110, 57,244,221,
-179,139, 90,183,114,120, 75, 86,170,121, 82, 85,165,254, 12, 64,182,181,109,239,222,173, 39, 46,157,255, 5, 7,246, 69, 41,105,
-138,169,117,115,115,163, 1, 32, 53,213,141, 78, 77,173,160,255,227, 87,236,164, 98,211,247,150,207,249,172,239, 28,133,178,108,
-253,134,173,141, 79,165,180,109,247, 6,218,182,123, 3,211, 63,251,210, 49, 36, 52,200, 23, 0, 14, 31,134, 41,180,117,202, 31,
- 75,190, 90,246,214,242,229,203,160,172,212,193,156,174, 39, 61, 41,229, 84,118, 54,244,182,123,214,179, 88, 66,146,183, 49,103,
-142,191,186,172, 76,220,253,139, 47,220, 88,159,127,206,104,204, 25,190,246,245,107, 13,231,157,251,247, 79, 77,158, 48,225,201,
-210, 37, 75, 6,110,219,190, 93,208,166, 77, 27, 20, 21, 21, 33, 40, 40, 8,222,222,222,136,137,137,193,145,223,126, 83, 85, 84,
- 86, 46, 2,240,147, 53,156,251, 79,159, 78, 15, 12, 13, 45,217,190,125,187, 87, 68, 68, 4,161, 82,169,160, 80, 40,160, 80, 40,
-160,211,233, 80, 29, 16,154,206,200,204, 76, 53, 26,141,219,172,109,187, 73, 46,231, 47,239,220,249, 49,135,162, 86,141, 28, 49,
- 98,222,242,111,190,225,181,106,213,138,208,233,116, 53, 86, 45,131,193, 0, 59, 59, 59,131, 94,175,119, 5,160,182,134,147,183,
-107, 23, 41,151,203, 33, 22,139,107,194, 53,213,142, 75, 88, 89, 89, 9,154,166,109,193,116,159, 3, 13, 42, 36,103,103,231,187,
- 44, 22,171, 89,109,235, 86,125,185,243,106,111, 51, 26,141,143, 75, 74, 74,194,235, 40,222,134,252,161,252, 0,124,223,167, 79,
-159,145,115,231,206, 37, 46, 95,190,140,227,199,143,211,217,217,217,135,171,173, 88,217,141, 60,233, 52,196,105,207,227,241,102,
-137, 68,162,126,230, 16, 14, 66,161,240,129, 74,165,186, 80, 61, 93, 88,249, 28,156, 14, 60, 30,111,166, 72, 36,234, 95,157,126,
- 5,246,246,246,137, 42,149, 42, 70,167,211,109, 68,195,137,170, 27,227, 20, 56, 58, 58,126,231,230,230,246,193,231,159,127,238,
-122,229,202, 21,233,165, 75,151, 56, 21, 21, 21, 7,245,122,125, 99, 73,165,255,194,233,226,226,114,151,201,100, 54,123, 73,231,
- 8,109,219,182,141, 30, 58,116,104,196,152, 49, 99, 96, 52, 26,241,211, 79, 63, 33, 38, 38,230, 84, 86, 86, 86,164,133,167,209,
-186,156,110,205,154, 53,187, 60,101,202,148,230,239,189,247,158,208,217,217, 25, 44, 22, 11, 42,149, 10, 89, 89, 89, 72, 72, 72,
-160, 79,156, 56, 81, 21, 31, 31,255, 88,173, 86,247, 2, 80,210,132,227,249,119,158,154,159,225,100,177, 88, 61,125,124,124,126,
- 93,186,116,169,125,255,254,253, 5,174,174,174, 96, 50,153, 48, 26,141,144, 74,165, 72, 74, 74,194,185,115,231, 84,135, 15, 31,
- 86,149,150,150,190, 7, 32,238,255,163,158, 47,146, 51,216, 31, 95,213, 73, 20,221, 96,180,119, 11,101, 45,214,179, 79, 79,207,
- 97,163, 71, 14, 30, 4, 0,191, 31, 57,115,214,138,164,210, 13,214,211, 82, 93, 57, 2,187,231, 0, 0, 32, 0, 73, 68, 65, 84,
-173,225, 12,106,205, 88,154,156,146,244, 76, 64,203,208,144,176,140,224, 54, 35,190,181,134,168, 86,100,248,103,218, 94,107, 58,
-182,182, 77,247,153,105,214, 96, 63, 68, 14, 27,253,118,196,151,139, 22,226,251,239, 86,224,196,239,199, 78,165,102, 63,147, 38,
-232, 95,215,151, 94, 50, 39,241, 45,139,245,134,208,211,243,205, 13, 20,181,240, 94, 82,146, 93,237, 7, 54,179,229,185,246, 67,
-165,151,151,151, 76, 42,149,186, 91,195, 25,185,121,179, 65, 45, 18,241, 22,174, 90,213,179, 74,171,237,185,124,249,114,214,157,
- 59,119,176,245,199, 31, 73,237,227,199, 81,114, 96,102, 3,179, 33, 13,114, 54,159, 57,147, 63,127,235,214,143,253, 90,183,150,
-124,244,209, 71,108, 54,155, 13,149, 74,133,130,130, 2,156, 63,119, 78,159,146,154,154,162, 84, 42,223, 2, 80,104, 45,103,228,
-230,205, 6, 39, 63, 63, 8,197, 98,250, 98,108,172,227,228, 89,179,166,180,104,217,210,113,224,160, 65,108, 7, 7, 7,148,151,
-151, 35, 39, 39, 7,199,142, 29,147, 85, 85, 85,121, 1, 48, 89,195, 25,117,253,122,219,211,113,113,163,190,253,246, 91,110, 88,
- 88, 24, 28, 29, 29, 81, 89, 89,137,164,164, 36,196,197,197,233,182,109,219,166, 80, 40, 20, 83, 76, 38,211,201,151,120,222, 95,
- 5,171,150, 25, 59,204,179, 63, 47,219,195,223,154, 19, 17, 14,224,171,234,207,223,192,114,206,192, 87,105,240,241,117,113,113,
-217,161,213,106,105,141, 70, 51, 25, 64,254,127, 97, 61, 89,225,225,225, 91,101, 50, 89, 87,154,166,225,232,232,120, 35, 57, 57,
-121, 26, 26, 88,121, 99,129,147, 9,160,171,157,157, 93,103,123,123,251,158, 58,157, 46,184,122,250, 45, 85,165, 82,197, 25, 12,
-134,219,213,214, 39,211,255,115,219,153, 0,250,123,121,121, 77,160, 40,170, 53, 65, 16, 78, 38,147, 9, 70,163,177,130,162,168,
- 44,133, 66,177, 11, 64,204,127, 65, 61, 95, 8,103,200,107,120,155,102, 32,184, 33, 65,240,140,208,170, 35, 32, 8, 10,169, 41,
- 15,113,172, 9,245,100, 12,238,231,179, 5,120,186, 50, 17,150,157,107,255, 35,180,172, 16, 47, 77, 22,153,175, 49,199,209, 4,
-253, 12, 39, 65, 19,249, 65,109,223, 62,240,119,132,150,181, 8, 9, 64, 79,208,232, 74,209,184,157,150,133, 75,175,240, 88,247,
-194, 56,191, 7, 92,126,116,118,190,193, 96,177, 60, 0, 48,170,173, 47, 20, 69, 16, 38,154, 32,200,218,211, 91,117, 30, 44, 27,
-229, 52, 0,109,216, 60,158,143,137, 36,221,139, 0,187,211, 38,211,235, 90,154,174,106, 6,124,149, 8,164, 63, 79, 61, 13, 64,
- 27, 38,143,231,123,154,166,135,201, 69,162,182, 50,141, 70, 12,128,182, 19,137, 82,149, 42,213, 62,173, 86,187, 5,127,157,185,
-176,200,201,225,241,154,153, 72,210, 29, 0, 24, 44,150,236,144, 78,231,243,216,193,225, 35,173, 78,215,220,206,206,206,168,215,
-235,149, 90,173,118, 12, 73,146, 23,155,210,246, 44,146, 12,185,206, 96,244, 48,136, 68,174, 6,130, 16,233, 73,210,160, 55, 24,
- 10,180, 90,237, 3, 0, 63, 0,120,248,146,207,251, 43, 5,107,194, 73,189,168,139,197,198,105,227,180,113,218, 56,109,156, 54,
- 78, 27,231,203,231, 20, 2,240,173,126, 88,252, 55,182,253,149,178,110,153, 87,255,179,108,199,194, 6, 27,108,176,193, 6, 27,
- 94, 9,168, 81,143, 79,150, 13,255,191, 32, 26, 81,165, 77, 49, 9, 62,143,178,189, 96,227,180,113,218, 56,109,156, 54, 78, 27,
-167,141,243,127,142,211, 18,247,191,113, 74,242, 47,185, 14,105,154,222,241, 79,252,176,205,252,107,227,180,113,218, 56,109,156,
- 54, 78, 27,167,141,243,127, 14,230,169, 67,134,237, 80, 52, 8,247,234,215,139, 46,107,195,171,221, 23,254, 9,120, 87,191,154,
- 82,222,211,118, 26,109,176,193, 6, 27,254,121,252,127, 8, 45,107,111, 90,127,231,230,246,119,111,140, 43, 8, 2,133, 4,129,
- 66, 0, 43, 94, 96, 89, 75,240,114,115,115,155, 17, 18, 18, 18,229,238,238, 62, 29,128,164,137,251,251, 11,133,194,141, 34,145,
-232,178, 72, 36,186, 44, 20, 10, 55, 2,240,127, 65,231,141, 0, 48,153,199,227,197,122,122,122, 62,225,114,185,177, 0,166,224,
-249, 87,174, 6,226,105,156,180,111, 0,180,109,202,142,146,208, 97,191,137, 67,135,221, 23,135, 14, 75,114, 13, 27,234, 47, 14,
- 29,150, 36, 14, 29,118, 95, 18, 58,236,183,151,208, 95,255,214,249, 37,136,167,175,166, 28,100, 11,229, 87, 16, 4,242, 9, 2,
-249, 86,214,231, 7, 2, 40, 32, 8, 60,126, 1,253,211, 6, 27,108,176,193,134,151, 9, 47, 47,175,145,158,158,158, 23, 60, 61,
- 61, 99,188,188,188, 70, 90,177, 75,191,122,110, 18, 38,130,128,201,194,160,223, 88, 57, 75,230,202,218,251,174,181,178,105,181,
- 57,221, 9, 2, 38,186, 26, 4, 1, 74, 34,145,108,242,244,244, 92, 81,247, 37,145, 72, 54, 17, 4,168, 90,101, 77,181, 4, 94,
- 83,205,170,238, 31,126,248,225,239,229,229,229,209,122,189, 62, 58, 51, 51, 51,186, 87,175, 94,135,234, 88, 34, 26,228,228,243,
-249,239,119,234,220, 53, 62,238,218,237,204,140,172,220,194,148,244, 71,185,127,156,189,120, 39,172, 77,219, 63,249,124,254,251,
- 77, 56, 71, 4,128,201, 44, 22, 43,214,206,206,238, 49,139,197,138, 5, 48,149,201,100,158, 92,185,114,101,110,114,114,114,241,
-245,235,215, 43,226,226,226,158,140, 31, 63, 62,139, 32,136, 63,234, 17,236,253,172,176,192, 44,201,203,203, 59, 43,149, 74,207,
- 9, 4,130,239,172, 40, 95,195, 41, 14, 29,118, 95,166, 48,208, 50,133,129, 22,135, 14,163,107,125,190,223,196, 99,110,233, 28,
-253,165, 47,240,120, 60, 95, 11,130,190, 95,109,145,101, 54, 29, 91, 35,182,248, 60, 94, 67,229,251, 53, 84, 31, 0, 30,213,255,
- 11, 7,176,185,250,101, 94,206,238,193,231,241, 94, 84,255,124, 17,199,211,198,105,227,180,113,218, 56, 95, 85,116,168,126,247,
-196, 83,127, 45,207,231, 93,117,248,105,102,102,166, 29, 0, 4, 4, 4, 76, 3,112,164, 41, 66,130, 32, 48,159,162,104, 6, 0,
- 48, 24,196, 23,189,123,247,233, 32, 16, 8,158,137,130,172,209,104,184,177,177,151,250, 82, 20, 77, 84,151,155, 79,211,216, 8,
-160,216,218,223,208,235,117, 12, 54,155, 11, 6,131,152, 19, 22,214,166, 69, 73, 73,201, 21, 6,131, 17,245,228,201,147,242,166,
- 91, 36, 8,236,220,185, 51,192,211,211,243, 47,209,154,165, 82, 41,119,216,176,183,154,196, 55, 14,224,233,120,188,206, 28,130,
-240, 52,145,164, 19, 0,176, 88,172,242, 59, 92,110,248,247,223,126, 43, 36, 8,130, 42, 45, 45,133, 70,163,193,236,217,179, 5,
- 41, 41, 41,195, 75, 74, 74,182, 88,160, 13,104,219,174,195,236,115,231,206, 6, 43,203,202,181, 59,215,111,143,215,176, 56,234,
-150, 33, 65,156,173, 59,246, 57, 79,250,120,204,103,105,105,201,137,168, 63, 29, 73,109, 48, 0, 28,155, 53,107, 86,104,100,100,
- 36,183,178,178,146,175,209,104, 90, 68, 69, 69, 45, 14, 15, 15,183,107,223,190, 61,247,215, 95,127, 37, 20, 10, 5,104,154, 22,
- 6, 5, 5,209,239,188,243,142,246,208,161, 67,211, 1,108,106, 68,248,206,127,122, 44, 25, 27, 2, 3, 3,151, 2, 64,102,102,
- 38,167,214, 49,102, 7, 7, 7,139, 0, 32, 61, 61,253,107,154,166,102, 1, 0, 77, 99, 53,128,133,245, 88,125, 50, 67,187,143,
- 6, 8,180, 78,190,246, 59, 63,180,199,104, 45,104,100, 17, 64,102,245, 3,193,114,160, 86, 92,168,103,145, 90, 88, 88,248, 92,
-185, 9, 35, 34, 34, 9,130, 32, 14,199,199,199, 31,145,201,100, 45, 41,202, 52,177,177,122,214,237, 71,174,174,174, 40, 41, 41,
- 9, 16,139,197,231, 76, 38,147,238,234,213,171, 1,193,193, 79,171, 41,110,251,118, 87, 87,123, 81, 95,183,208,225, 87, 74,146,
-143,199, 89,217, 55, 9, 87, 87,215,113, 37, 37, 37, 43, 0, 76, 72, 77, 77,237, 0, 0,193,193,193, 28, 0,119, 29, 28, 28,186,
- 25,244,122,194, 54,254,217, 96,131, 13, 54,252, 35, 66, 43, 1, 64, 4,254,147,130,103, 7,128, 38, 11, 45, 46, 0, 92,185,114,
- 5, 0,120,207, 81, 17,162,246,141,103,230,204,153,240,244,244,172, 43, 94,112,249,114,236,223,105,236, 51,191,241,205, 55,223,
-216, 85, 84, 84,244,251,249,231,159,223,164,105,122,109, 97, 97,225, 45, 11,251, 23,211, 52, 86, 51, 24,196, 23, 4, 65,128,199,
-227,103, 76,153, 50, 37,161,250,127, 45,254,248,227, 15,225,208,161, 67,213, 0,114, 1,128,199,227,123, 51,153,140,128,167,202,
- 21,171, 27, 19,132,163, 0, 63,146,203,237, 51,121,243,102,242,245,161, 67, 89, 34,177,152, 0,128,220,180, 52,215,213,107,214,
-116, 43,207,206,230,106, 92, 93, 75, 75, 85, 42, 77, 70, 70, 6,120, 60, 30,193,100, 50, 95,183,212, 96,145, 72, 52,227,219,239,
- 87,137,148,101, 21, 26,173,178, 82,207, 36,141, 58,123,129,208, 84, 92, 36, 43,181, 19,136,212, 95,124,181,140,251,233,196,177,
- 51, 84, 42,213, 52, 11, 84,211,231,204,153, 19,220,169, 83, 39,239,223,126,251,141, 80, 40, 20, 96,177, 88,118,237,219,183, 71,
-120,120,184,233,210,165, 75, 68,203,150, 45, 17, 22, 22,134,107,215,174,225,198,141, 27, 68,135, 14, 29,132, 71,143, 30,253,208,
-104, 52,110,178, 36,174,153, 76,198,236,160,160,160,246, 34,145, 72, 31, 16, 16,128,137, 19, 39,130,166,105,244,235,215, 47,204,
-206,206,238,136, 74,165,226,166,167,167,189,105, 73,100,203,146, 79,188, 99,182,108, 1,104, 3, 26, 89,242,228, 19,181,167, 31,
-131,211,211,211,223, 40, 47, 47,175,177, 16,153, 19,152,191,249,230,155, 77,233, 75,197, 52,141,213, 67,135, 70,126, 1, 16, 68,
-191,126,253, 42,166, 79,159,206, 72, 75, 75,251,224,237,183,135,135,101,102,102,161,177,122,210, 52,192, 96, 60, 77,101, 49,110,
-220,199,216,189,123,119,192,128, 1, 3,174,157, 62,125,218, 53, 32, 32, 64,206,225, 60,213,154, 18,137, 4,238,174, 78, 3,227,
-142,110,152,241,221,198,168, 32, 73,200,219, 21, 52,141, 7, 22,250, 38, 49,110,220,199,197,118,118,118, 35, 14, 31, 62,156, 46,
-149, 74, 89,102, 62, 0, 76,137, 68, 34, 14, 8, 8,152,234,226,226, 34, 99, 50, 24, 18, 26, 52,109,169,127,218, 96,131, 13, 54,
-216,240,220, 56, 85, 45,174, 78,213,253, 7, 11, 0,162,163,163,107,194,151, 70, 70, 70, 54,248, 4, 76,211,116,241,189,123,247,
-124,212,106, 53,104,154,182,102,192,174,189, 68,179,152, 32, 24, 91, 25, 12, 98, 26, 65, 16, 8, 11,107,243,104,195,134, 13,245,
-229,244,210,135,133,181,121,196,100, 50, 90, 61,157, 66, 97,252, 68,211, 84,113, 3,156,245,222,136,184, 92,222,124, 0,240,240,
-240,204, 62,115,230,140,126,212,168, 81, 88,179,102, 13,103,193,130, 5,243, 88, 44,214,244,252,252,252,162, 70,234, 9, 0, 11,
-197, 98,137,112,231,206,157, 1, 83,166, 76, 73,144, 74,165, 11, 1,192,211,211,115, 5,128, 16, 0,185,181,182, 97,219,182, 67,
- 79, 38, 78,156,152, 33,147,201, 22, 54,196, 57, 2,120,205, 39, 40,168,207,242, 43, 87,104,134, 78, 71,148, 92,189,170,148, 23,
- 23, 27, 31,202,229,194,189,119,239, 70, 46, 94,177,130,237,227,235,139,203, 39, 79,186,149,168,213,114,133, 78,167, 45, 46, 46,
-166, 73,146,188, 97, 69,219, 67, 37, 98,137,112,251, 15, 63,221,177,103, 51, 41, 73, 51,111,130,237,226,194, 98, 8, 29,184, 76,
- 22, 67,215,170,133, 63, 23, 64,168,165,115,196,225,112, 62, 28, 48, 96,128,240,208,161, 67, 68, 88, 88, 24,156,156,156,112,245,
-234, 85, 36, 38, 38,162,188,188,156, 97, 52, 26,209,177, 99, 71,172, 90,181, 10,190,190,190,168,168,168, 64,126,126,190, 27,151,
-203, 21, 27,141,198,134,142,231, 51,253,105,254,252,249,240,244,244, 4, 73,146, 40, 43, 43, 3, 73,146,176,179,179, 3, 0, 60,
-126,252, 24, 39, 79,158,176,166, 47, 89, 4, 77,211,232,210,165, 75, 37, 65, 16,169,117, 45, 90, 77,225,244,246,246,254, 85, 46,
- 47, 25,220,167, 79, 31,148,151,151, 27,151, 45, 91,134,182,109,219, 34, 32, 32,192, 98, 61,189,188,188, 38,147, 36,185, 4, 0,
-142, 31, 63,190,215,211,211,243,147, 3, 7, 14,184,154, 83,132, 76,157, 58, 21,226,182,111,119,117,177, 23,245, 45,150,149,150,
-223,184,147,156, 62,103,242,168, 94, 87,110, 37, 21, 24,216,195,242, 21,247, 79, 40,234,225, 92, 88, 90, 90,250,115,243,230,205,
-127,152, 57,115,166,167,139,139, 11,116, 58,221,226,162,162, 34, 76,157, 58, 21, 0, 48,100,200,144,182,108, 54,251,204,248,241,
-227,209,178,101,203, 39,101,101,101,249,241,241,241, 19,217,175,245, 75, 82,220, 63,241, 92,199,211, 74,216, 56,109,156, 54, 78,
- 27,231,115,195, 90, 45,242, 95, 10,169,217,130, 85,141, 29,207, 8,173,200,200, 72, 34, 58, 58,154,182,162, 97,165,205,154, 53,
-243, 17, 8, 4, 0, 80,218,212, 90, 80, 20, 53,221,213,213, 85,182,112,225,194,238, 1, 1, 1,250,233,211,167, 39,229,230,230,
- 46,170, 93,166, 69,139, 22,223,253,248,227,143,200,200,200,200, 93,177, 98,197,181,210,210,210,166,230, 49, 91, 64,211,216, 80,
-109, 29, 43, 57,121,242,100,219, 43, 87,174, 76, 91,191,126,189,248,211, 79, 63,229,204,152, 49, 99, 12,128, 53,150, 72,152, 76,
-166,186,190,233,194,250,224,233,233,169,103, 50,153, 13, 6,137,139, 4, 4,124, 46,183,247,242, 43, 87,104,125,110,174,122,247,
-186,117,246,219,255,252,115,169,145,166,221, 37, 18, 9,122,116,235, 86,197,103, 50, 75,100, 69, 69,148,228,181,215,152, 57,103,
-206,184,105,184,220,194, 67,135, 14, 41, 74, 75, 75,143, 91, 52,225, 17,132,146,162,105,189, 93, 51, 95,227,168,225,253,195,238,
-220, 78, 76,179,151,184, 49, 58,180, 15,107,155,150,145, 27, 15,138, 50, 16, 4,161,180,196,227,232,232, 24, 80, 90, 90, 10,165,
- 82, 9,177, 88,140, 13, 27, 54,192,195,195, 3,106,181, 26,201,201,201,116,179,102,205,136, 43, 87,174,160, 89,179,102,144,203,
-229,208,235,245,168,172,172,148,233,116,186,134,114, 51, 22, 51, 24,204, 61, 12, 6,241, 49, 65, 16,104,213,202, 47,111,203,150,
- 45,122,138,162, 16, 28, 28,140,183,223,126, 27, 71,143, 30, 69,114,114,178,217,242,164,111,222,188, 69, 30,131, 65, 52,175,214,
- 74,207,109,129, 49,167,246, 41, 44, 44, 28,241,156, 23, 13,195,203,203,107, 76,235,214,173,167,189,255,254,251, 70, 46,151, 11,
-149, 74,101, 62, 22,198,193,131,135, 84, 12, 29, 26,233,120,234,212,169, 6,235,105, 48, 24,150, 60,121,242,196, 83,163,209, 96,
-208,160, 65, 51,214,174, 93, 43,226,114,185, 0, 0,147,201,132,159,126,250, 9, 35,167,174, 28, 24,119,116,195,140,111,215,239,
- 63, 55,107,201,150,216,115,191,174,242,250,118,193, 39,189,198, 76,255, 46, 22,192,217,122, 56, 81, 89, 89,153,237,227,227, 51,
- 97,206,156, 57, 81,219,182,109,115, 94,180,104, 17, 40,138, 2, 77,211, 32, 73,178, 38,145, 56, 69, 81, 56,118,236, 24, 30, 62,
-124,248,221,177, 51,113, 73, 99,166,191, 50,249,175,109,176,193,134, 87, 16, 77,208, 34,255,141,240,196,211,105, 67,212, 21, 91,
-255,120,100,120, 38,147,185,253,252,249,243,237,223,124,243, 77, 86,223,190,125,195,206,158, 61, 27,246,228,201,147,164,106,235,
- 65, 88,223,190,125,195, 36, 18, 9, 54,110,220,168,102, 50,153,219,159,243,103,106,110,122, 69, 69, 69, 9, 0,214, 30, 61,122,
-116,245,228,201,147,225,225,225, 17, 34,149, 74,255,209, 54, 59,240,120, 29,198,111,216, 64,178,141, 70,198,230,181,107, 29,214,
-197,198,174,254,237,247,223, 89, 93,186,116, 33,104,154,198,131,251,247, 5,171, 54,109, 18,190, 55,124,120,110,122,118, 54,121,
-226,220, 57, 99,241,147, 39,101, 79,228,242, 37, 0,202, 44,241, 27,141,198,155,153,153,153, 94, 61,122,118,241,142,251, 51, 41,
-113,212,240, 33,125,216, 44, 6,145,149,251,248,174,167,135,155,227,229,216, 11, 26,163,209,120,211, 18,143, 74,165,202, 33, 73,
-210,133,166,105,241,229,203,151, 33, 22,139, 81, 94, 94, 14,163,209, 8,189, 94,175, 87,171,213,252,210,210, 82,104,181, 90,232,
-116, 58, 56, 56, 56,224,193,131, 7,197, 36, 73, 94,106,136,211,100, 50,141,231,241,120,223,176,217,108, 46,135,195, 41,188,123,
-247, 46,148, 74,101, 11, 39, 39,167, 53, 36, 73,162,176,176, 16, 87,174, 92,249,220,193,193, 33, 23, 0,248,124, 62,184, 92,158,
-171, 78,167, 35, 1, 60,121,222, 99,254,119,114, 76,121,120,120,248, 10, 4,130,229, 95,124, 49, 63,184, 93,187,246,144,203,229,
-160, 40, 10, 34,145, 8,106,181, 26, 14, 14, 14,232,218,181,107,206,242,229,203,165, 52,141, 73,141,136, 65,102,245,249,193,228,
-201,147, 69, 14, 14, 14, 40, 40, 40, 64, 80, 80, 16, 76, 38, 19, 72,146,132, 84, 94,250,224,250,157,164,180, 57, 83, 70,247, 60,
-120, 50, 54,245,220,229,187,169,195, 7,117,107, 71, 16,116,139,198,234,152,156,156, 44,111,215,174,221,244,201,147, 39,127, 19,
- 16, 16,208,138,166,105,248,251,251, 99,192,128, 1, 56,115,230, 12, 50, 50, 50,160, 82,169, 76,183,110,221,250,229,203,239,182,
-252, 17,226,223, 28, 4, 65,219, 70,114, 27,108,176,193,134,151,131,191,248,102, 61, 99,209,250, 39, 33,147,201,228,105,105,105,
-103,227,227,227, 35,223,121,231, 29, 92,190,124,121, 28,128, 57, 0,192,227,241,198,189,243,206, 59,136,143,143, 71, 90, 90,218,
- 89,153, 76, 38,127, 17,191,201,229,114,181,122,253, 83,227, 20,159,207,231, 55,113,247, 22,213, 83,134, 0,208,162,145,109, 13,
-155, 70, 88, 44,207, 54,131, 6,177,202, 19, 19,149, 59,111,223,254, 38, 42, 42,138,213,189,123,119,194,104, 48,192, 68, 81,240,
-243,243, 35,250,246,235, 39,218, 19, 21,229, 98, 82,169,174,124,251,197, 23, 87,119,140, 31, 95,149, 89,237, 7,102, 9, 58,157,
-110,211,180,169, 19,250,197, 94,190,234, 29, 18,244,154,203,217,243,177, 9,174,174,142,194,128,214,173, 69,165,229,101,166, 69,
- 11, 62,103,233,116,186,205,150,120, 52, 26,205,177, 11, 23, 46, 12,247,241,241, 17, 39, 37, 37, 65,175,215,195,100, 50,161,111,
-223,190,160,105,154, 7,128, 98,177, 88, 72, 75, 75,131,193, 96,144,101,102,102, 22,102,101,101,241, 0,172,180, 80,191, 60,157,
- 78,135,212,212,167,179,118,205,154, 53,235, 31, 17, 17, 1,146, 36, 49,104,208, 32,156, 56,113,162,127,106,106,234,186,218,154,
-239,239,158,243,106, 11, 89,176,151,151,215,209,234, 77, 86, 57,193,123,123,123,135,249,249,249,109, 91,185,114, 37,167, 89,179,
-102,160,105, 26,206,206, 78, 80,171,213, 40, 41, 41, 69, 72, 72, 8,124,124,124,176,114,229, 74, 0,248,165, 49,139, 27, 69, 81,
-144, 74,165,200,201,201, 65,118,118, 54,124,124,124, 64, 16, 4, 42, 43, 43, 65,146, 36, 40,138,130,176, 82,121,234,199, 61,127,
-244,254,125,219,146,208,206,109,252,125,111, 39,164,200, 62, 28,209, 95,232,223,210, 55, 64,158,180,140, 1, 44,163, 26,226, 28,
- 55,110, 92, 86,239,222,189,223,153, 49, 99, 6,167,162,162, 34,188,127,255,254, 27,251,245,235,135,132,132, 4, 92,189,122,245,
- 61, 30,143, 39, 51, 24, 12,228,119, 95, 78,155,244,253, 34,194,129, 50, 24, 14, 2,203,164,192, 50,219,144,104,131, 13, 54,216,
-240, 98, 97,246,209, 66,173,247,166, 89,180,130,131,131, 69,185,185,185, 31,181,104,209,130, 11, 0, 2,129, 32,196,207,207,111,
- 94,118,118,118,101, 83,107,163, 86,171,127,139,138,138, 26,240,195, 15, 63,112,134, 12, 25,242,218,209,163, 71, 59, 1,192,144,
- 33, 67, 94,179,183,183, 71, 84, 84,148, 65,173, 86,191,176,152, 72, 70,163,241,205,142, 29, 59,162,172,172, 12,185,185,185, 73,
- 77,217,247,143, 63,254, 16,226,169, 95, 86,163,219, 26, 3,169,215, 59, 59,121,123, 51,158,196,198, 26,202,148, 74,207, 55,123,
-246, 36,140, 6, 3, 24, 12, 6, 74, 75, 75,145,159,159, 15, 71, 39, 39, 34, 45, 51,211,110,215,252,249,127,180,104,215,142,107,
-210,235, 93,155, 80, 77, 85,137,172,248,227,207,166,127,122,236,224,193, 95,196, 21, 74,229, 67,129, 64,168,227,241, 56, 30, 51,
- 63,251,204, 84, 86, 86, 54, 22, 64,149, 21, 60, 43, 15, 30, 60, 56,104,208,160, 65,247,125,125,125, 37,114,185,220,163,162,162,
-194, 84, 86, 86,198, 68,117,136, 39, 0,136,141,141,133, 82,169, 36, 77, 38,211, 21, 60,141,133,165,183,182,162,205,155, 55,119,
- 12, 15, 15,239, 37, 22,139,161, 80, 40,224,234,234,138,246,237,219,247, 98, 50,153, 63,231,229,229, 41, 94,100,175,143,137,137,
-177,167,105,250, 13,154,166, 49,104,208, 32,171,246, 49,153, 76,159, 68, 68, 68,112, 8,130,128, 70,163, 6,159, 47,128, 72,100,
- 7,123,123, 7, 4, 4, 4,162,176,176, 16, 3, 7, 14,212, 63,124,248,112,171, 84, 42,253,205, 2, 23, 10, 11, 11, 33,151,203,
-145,159,159,143,146,146, 18, 0, 64, 73, 73, 9, 40,138, 2, 73,146, 77,110, 83,125,156, 10,133, 98, 88,215,174, 93,231, 78,157,
- 58, 21, 36, 73, 98,216,176, 97, 40, 40, 40, 88,151,147,147,115,200,203,203,107,204, 39,159,124, 34,118,117,117,197,220,185,115,
- 5, 0,190,182,141,135, 54,216, 96,131, 13, 47, 28,117,125,180,254,106,209,106,108, 78,212,195,195,163, 7, 65, 16,139, 53, 26,
- 13,215, 60, 37, 67, 16, 4, 87, 44, 22,159,208,104, 52, 43,164, 82,105,147,156,226, 42, 42, 42,148,143, 30, 61, 58,113,243,230,
-205,209, 35, 70,140, 64, 76, 76,204, 88, 0, 24, 49, 98, 4,110,222,188,137, 71,143, 30,157,168,168,168, 80,190,136,150,123,123,
-123, 15,238,217,179,231,136,142, 29, 59, 34, 58, 58, 26, 38,147,233, 70, 83,246,175,189,194, 16,245,172, 58, 52,111,179,138,140,
-201, 4, 65, 16, 53, 55,216, 18,185, 28, 25,233,233, 40, 43, 47,135, 78,171,133, 74,173, 54, 5,180,108,169, 81,232,245,108, 2,
-104,234, 60, 79, 94,252,157, 91,249,106,149, 74,226,234,236,162, 17, 10,121,168, 80, 42, 56,119,239,220,170, 2,240,208, 74, 14,
- 61, 77,211, 61,207,156, 57,179,132,201,100,190, 99,103,103,135,105,211,166, 49,123,245,234, 5, 14,135, 3,157, 78,135,138,138,
- 10, 68, 69, 69,201, 77, 38, 83,171,234,125,236,132, 66,225, 62, 38,147,249,184,178,178,114,177,197, 31,208,235,135, 68, 70, 70,
-178,244,122, 61,190,253,246, 91, 44, 93,186, 20,131, 6, 13, 98,221,185,115,103, 8,128,131, 47,170,199, 83, 20,133,254,253,251,
-215,118,134, 79,181,102, 63, 54,155, 29,214,186,117,107,200,229,114,200,229,114,136,197, 98,120,121,121,193,195,195, 3,235,214,
-173,163, 55,110,220,120,214, 96, 48,108, 45, 41, 41, 41,182,166, 14,217,217,217, 53,150, 65,173, 86, 11,149, 74,133,130,130, 2,
-152, 76, 38,196,198,198, 66, 35,114, 24, 52,253,227,161,237, 84, 26,141,250,246,131,204,252,197, 51,198,116, 81,105, 52,234,204,
-156,252, 12, 96, 19,101,137,115,222,188,121,147,198,141, 27, 55,105,244,232,209,168,170,170,194,205,155, 55,209,173, 91, 55,172,
- 94,189,218,243,202,149, 43,115, 58,118,236, 8, 54,155,141,203,151, 47,131, 36,201, 2,155, 53,203, 6, 27,108,248,111,198,191,
-212, 63,171, 81, 52,106,209,242,241,241,113, 50,153, 76,159, 71, 68, 68,244, 31, 62,124, 56, 6, 14, 28,248,204,255, 15, 30, 60,
-104,127,228,200,145, 21,155, 54,109, 26,100, 48, 24, 86, 54,101,170,143,162,168, 99, 7, 15, 30, 28,210,165, 75, 23, 97,239,222,
-189,253, 0,128,199,227,233, 15, 30, 60,168,166, 40,234,216,115,180,197, 28,136,177, 24, 0,188,188,188,218,178, 88,172, 17,131,
- 7, 15,110,251,241,199, 31, 35, 57, 57, 25, 81, 81, 81, 89, 1, 1, 1,215,138,139,155,228, 95,157,107, 97,213,225, 10, 75,214,
- 45, 38,151, 91, 90, 81, 84,228,100,231,235,203,118,182,183,151, 70, 71, 71,251,244,235,215,143, 40, 40, 40, 64,121,121, 57,180,
- 90, 45,238,220,185, 67,177,128, 60,150,179, 51,145,119,243, 38,193,228,114, 75,241,236, 74, 62,139,240,241,116,246,255,106,193,
-148, 22, 90,157, 54, 84,161, 80,144, 44, 54,155,221,204,195,169, 32,253, 97,147,102,226,116, 66,161, 48, 28, 0,139,162, 40,181,
-139,139,139,240,252,249,243,224,114,185, 32, 8, 2,109,218,180, 1,159,207,231,208, 52,157, 15, 0,246,246,246,220,237,219,183,
- 59,142, 25, 51,230,170, 37,226, 14, 29, 58,176,121, 60,222, 91, 1, 1, 1,184,121,243, 38,146,146,146,242,110,222,188,217,188,
- 67,135, 14,240,245,245,125,203,211,211,243,247,132,132, 4,227,139,232,216, 79, 87,172, 54,221, 25,222,100, 50, 81, 4, 65,128,
-193, 96,128,162, 40,200,229,114,180,106,213, 10, 91,182,108,193,134, 13, 27,190,149, 74,165, 39,155,192,101, 82, 42,149, 16,137,
- 68, 72, 74, 74,210, 69, 68, 68,240, 24, 12, 6,178,178,178, 96, 50,153,176,102,205, 26, 72,252, 7,134,116,235, 24, 22,244,237,
-250,253,231, 68, 60, 30,111, 96,175,240,224,148,204,188,199, 52, 77,228, 54,100,209,170,197,201,105,223,190,253,216,209,163, 71,
- 35, 59, 59, 27, 43, 86,172, 40,145, 74,165,177,231,206,157, 27, 57,117,234, 84,102,183,110,221, 80, 90, 90,138, 61,123,246,144,
-119,239,222,221, 93, 84, 84,180,223, 54,140,219, 96,131, 13, 54,252,151, 8, 45, 31, 31,159,209, 28, 14,103,238,187,239,190,203,
- 12, 12, 12, 68,113,113, 49, 28, 28, 28,140, 4, 65,176, 1,192,201,201,201, 40, 16, 8, 48,101,202, 20,180,107,215,174,199,252,
-249,243,187,177, 88,172, 45,133,133,133,251,172,249, 97,153, 76,166,102, 48, 24,135,167, 77,155,182, 50, 49, 49,161, 21, 0,252,
-249,231,159,143, 10, 11, 11, 23,200,100, 50,117, 19,219, 97, 14,138, 73,240,120,252,219,254,254,254, 57,225,225,225, 14,195,135,
- 15,135, 88, 44, 70,124,124, 60, 86,173, 90,149,169,215,235,151,196,197,197,145,255,244, 65, 38,117,186,162,187,199,143,219,247,
-250,224, 3,135,153, 17, 17,107, 63,157, 54,237,135,175,190,250,138, 21, 24, 24, 72,168,213,106,220,190,125,155, 62,114,228,136,
-113,207, 55,223,108,128, 72,196,190,121,228, 8, 87,175,215,231, 53,209,114,215,179,251,155, 61, 2,215,254,176, 9, 90, 77, 21,
-110,223, 56,133,242,114, 57,182,239, 56, 26,232,237, 77,247,124,242,228, 73,156,181, 92, 4, 65, 4,196,196,196, 72,104,154, 6,
-151,203,197,242,229,203,225,229,229, 5, 7, 7, 7, 84, 86, 86, 98,206,156, 57,142,179,102,205,114, 4,128,228,228,228,154,240,
- 12,150, 80, 88, 88,216,117,202,148, 41,246, 36, 73,226,236,217,179,122,130, 32, 22, 95,184,112,225,231, 54,109,218,112,123,244,
-232, 97,191,127,255,254,110, 0, 46,191, 40,161,245,156,251,101,157, 63,127,190,227, 59,239,188, 67,179,217,108,162,162,162, 2,
- 78, 78, 78,216,178,101,139, 74, 42,149,158,106, 34,215,242, 5, 11, 22, 44,169,254,188,119,241,226,197, 19, 86,174, 92, 41, 46,
- 42, 42,122,234, 8, 47,149,130,116, 46,187,212, 53,226, 51, 83,105,133, 66,191,123,253,252, 81, 2, 62,143,187,120,229,238,203,
- 70, 38,110, 53,212,174, 5, 11, 22,152,175, 81,174, 80, 40,228,210, 52,141,195,135, 15, 35, 47, 47,239,147,210,210,210, 34,147,
-201,116,244,243,207, 63,159, 23, 24, 24,216, 50, 61, 61, 61,175,178,178,114,181, 79,251,183,115,180,146, 34,212, 10,239, 96,131,
- 13, 54,216, 96,195,139,131,217, 9,222,188,250,240, 20,158, 78, 39, 54,156,235,208,100, 50, 77, 57,119,238, 28,243,163,143, 62,
-194,189,123,247,176,103,207, 30, 90, 40, 20, 46,246,244,244, 20,250,249,249,241,248,124,254,188,137, 19, 39, 82, 89, 89, 89,232,
-209,163, 7,110,222,188,201, 0, 48,182, 14, 77,163, 33,250, 21, 10,197,157,132,132,248, 86, 38, 19, 69,152, 76, 20,145,144, 16,
-223, 74,161, 80,220,177,208,152,186,156, 53, 65, 49, 41,138, 38,244,122, 93,231,229,203,151,139, 39, 79,158,140,226,226, 98, 44,
- 95,190,156,250,250,235,175, 47,210, 52,189, 88, 42,149,106,172,228,124, 17,168,225,228,146,100,252,129,121,243, 88, 85,106, 53,
- 61, 97,238,220,202,239,199,143,159,177,101,211,166,188, 15, 62,248,192,240,197,130, 5,250,107,113,113, 89, 59,150, 47,159, 60,
-232,173,183,170,146,227,226,184,137, 49, 49,108,177,209,120,175, 41,245,124,242,228, 73,220,229,203, 87,177,119,231, 15, 56,176,
-103, 51,174,196, 94, 70,242,253, 84,148,148, 42, 96, 65,100,253,133,147, 36, 73,197,200,145, 35, 43, 70,141, 26,165, 63,124,248,
- 48,100, 50, 25,170, 67,122, 64,169, 84,226,212,169, 83,136,137,137, 65, 76, 76, 12,206,157, 59, 87,227,228,110,169,158, 34,145,
-232,173,110,221,186, 33, 47, 47, 15,201,201,201, 23,165, 82,105,105,114,114,242,197,130,130, 2,116,236,216, 17, 34,145,104,104,
- 83,234,249, 2,132,214, 95, 56, 5, 2,193,130,163, 71,143, 70,205,152, 49,131,124,244,232, 17,218,183,111, 15, 0,168,172,172,
- 84, 3, 48, 53,133, 83,163,209,108,215,106,181, 94, 90,173,214,203,215,215,119, 81,110,110,238,155,115,231,206,149,155,195, 47,
- 0,128, 60,229,228,205,180,107,123,191,151,184, 57, 11,186,118, 12, 13,252, 97,251,225,203,249, 5,197, 81,181, 98,104,213,229,
-132, 86,171,133, 86,171,173,105,167,209,104, 4, 69, 81,112,113,113, 81, 85, 63,196,228, 60,124,248,112, 90,110,149,235,192, 59,
-241,137, 83, 62,252,116, 89, 78,126, 65,113, 93,145,101, 75, 29, 98,227,180,113,218, 56,255,219, 56, 95, 5,152, 87, 31, 70, 88,
-180,104,209, 52, 77, 82, 20,133,203,151, 47,227,232,209,163, 38,131,193, 48, 73, 42,149,214,142, 86,189, 41, 62, 62, 62,102,228,
-200,145,251,210,211,211,153, 41, 41, 41,160,105,218,212,148,218,104,181, 90, 99,221, 28,112, 90,173,246,111, 79, 29,237,221,187,
- 23, 69, 69, 69,134,130,130,130, 11, 36, 73, 30,251,155,171, 23,255,246,170,195,189,128,238,125,189,254,194,210,238,221,251, 47,
-137,137,225, 77,248,242, 75,221,184,143, 63,254,220,164,215, 27,153, 28, 14,197, 21,137, 24, 38, 30,143,157, 28, 23,199,223, 56,
-117,170,139, 70,167, 59, 27,213, 4, 7,115,179, 69,171, 87,175, 30, 24, 55, 97, 54, 52,181, 44, 90, 55,239,100, 64,103, 64,147,
- 44, 90, 58,157, 46, 84, 42,149,130,207,231,231, 3,240,248,232,163,143, 64, 81, 20, 52, 26, 13, 42, 43, 43, 81, 88, 88,168,248,
-248,227,143, 77,213,226,137, 53, 98,196, 8, 7,107,120,253,252,252,188,216,108, 54,206,158, 61, 11, 54,155,125, 10, 0,216,108,
-246,169,152,152,152, 33,239,189,247, 30,188,189,189,253,178,179,179, 9, 88,240, 79,147,132, 14,251,141, 6,252, 65,160,245, 83,
- 19, 28, 90,139, 67,135,221, 39,128,204,234,168,241,169, 29, 58,116, 0,172,244,203,170,141,234,197, 29, 27,140, 70,227,239,243,
-231,207,159,214,185,115,231, 1, 75,151, 46, 37, 80, 29,170,225,239,224,221,119,223,205, 56,116,232,208,155, 11, 23, 46, 60, 71,
-211,180,174,246,255,100, 37,101,151,186, 68, 78,167, 43, 42, 20,137,242,212,147, 15,154,194, 75,146,100,189,194, 82, 86, 82,134,
- 46,145,211, 81, 81,161,128, 60,245,164,109,248,179,193, 6, 27,108,120,249, 86,173,191,160, 65,161, 69, 16,196,142,158, 61,123,
- 78, 2,192, 36, 8, 98, 91, 97, 97,225, 95, 6,127,169, 84,154,225,229,229,181,166,101,203,150,147, 1,208, 4, 65,236,104, 98,
-165,138,105, 26,171, 24, 12, 98,254, 83,113,247, 92, 1, 42,205,105, 73,230, 3, 32, 24, 12,230,190,132,132,132, 47,243,243,243,
-229, 86, 90, 32, 26,197,139, 88,117, 8, 0,191, 0, 57,239,230,229,157,155, 27, 22,214,111,208,212,169,104, 59,104,144,131, 87,
-243,230, 38,141,193, 64, 61,184,118,141,184,113,248, 48, 39, 49, 38,134,173,209,233,206, 30, 3,242,155, 90,207, 39, 79,158,196,
- 93,138,141, 59, 63,106,196,144, 1,126, 45,189,158,138,134,156, 66,148,148, 41,206, 55, 69,100,213, 17,189,195,182,108,217,114,
-146,195,225,176,106,167,178, 49, 24, 12,101, 58,157, 46, 20, 0,202,203,203,189,118,236,216,241, 43,131,193,200,179,196,151,146,
-146,114, 98,201,146, 37, 35,114,115,115,207, 23, 20, 20,228, 2, 64,126,126,126,174,209,104,220, 39,149, 74, 71,228,229,229, 29,
-129, 21,139, 0,104,192, 63,249,218,239,109, 0, 32,180,251,104, 36, 95,251,157, 15,160, 77,104,247,209, 0,128,231,205,101, 88,
- 27,165,165,165, 82, 0,139,111,222,188,121,112,192,128, 1, 19,241, 55, 98,122, 1,128, 94,175,135, 70,163,193,245,235,215, 51,
-214,172, 89,211,252,193,131, 7,200,203,251,207, 33,147,167,156,188, 41, 7,110, 54,145,211,168,209,104, 72,147,201,196, 50, 24,
- 12,180, 94,175,127,230, 33, 69,158,114, 18,114,219,192,103,131, 13, 54,188, 34,160,105,186, 35, 0,177,121,136,171,126, 23,215,
-249,172, 71,117,186, 64,243, 80, 89,253, 93, 78, 16,196,157, 90, 28, 53,219,173,216, 23, 0, 74, 0,220, 39, 8,162, 33, 35,200,
-142,134,190, 55, 40,180, 10, 11, 11,143,192,138,164,209,214,150,107, 4, 11,171,243,196, 1,207,159,135,173,134,195,100, 50, 21,
-231,231,231,255,237, 19,202, 96, 48,114,134, 14, 29,218,164,242,150,202, 28, 2,242, 62,211,233,246, 71,111,222,220,254,236,182,
-109,222, 38,146,116, 37, 0,154,201,229,150,234,245,250, 92,177,209,120,175,169,150,172,103,172, 49,143,158, 12,204,126,244, 4,
-173, 91,183,166,179,178,178,158,218,122,254, 30,238,169, 84, 42, 31, 75, 93, 64,173, 86,247,176, 82, 12,254,242,228,201,147, 95,
-234, 17,236,191, 74,165,210, 95,173,173, 84, 77, 82,105,128, 65, 17,212,168,208,238,163, 15, 3,160,204, 73,165, 95, 36,138,138,
-138,210, 81, 29,231,237,239, 32, 47, 47, 15, 4, 65, 96,213,170, 85, 72, 76, 76, 68, 97, 97, 33, 94, 0,167,142, 32,136, 3,171,
- 86,173,250, 48, 49, 49,241, 80, 97, 97,161,206, 54, 20,219, 96,131, 13,175,178,200, 34, 8, 34,186,250,123,100,181, 81, 40,186,
-238,103,115, 25,115,185,218,101,204, 28,117,183, 55,182, 47, 0, 44, 88,176,224,203, 21, 43, 86, 8, 1, 88,155,140,249,185,147,
- 74,191, 44, 20,255,151,112,212, 22, 5, 59, 95, 70, 67, 55, 3,122,144,228, 45,212,142,161,100, 52,190,208,223,200,202,202, 34,
- 94,229, 11,206,156, 84,186, 22,194,254, 13,245,206,205,205,133,175,175,239, 11, 17, 89,181, 56,183,248,250,250,110, 47, 44, 44,
- 36, 97,131, 13, 54,216,240,234, 66, 92,159, 48,106, 64,148, 69, 54,246,255,103, 30,220,235, 41, 87,223,119,130, 32,162, 87,172,
- 88, 17,217,132,250,214, 88,180, 24,182,115,103,131, 13,255, 28,226,226,226, 94, 6,167, 77,100,217, 96,131, 13, 54, 60, 7,234,
- 90,177,204,226,171,238,247, 5, 11, 22,124,137,198,103,156, 60,241,212,138,229, 89,253,189,198, 95,139, 64,195, 43, 7,154, 18,
-132,244,121, 86, 31, 92,176,113,218, 56,109,156, 54, 78, 27,167,141,211,198,249, 63,199,105,137,251, 66, 61,130, 40,162,161,169,
-190,198,166, 17,235,126,182,180,175,165,178, 4, 65, 52, 20,230,199, 60, 85, 88,243, 78,211,244, 14,252, 3,176, 45,125,181,113,
-218, 56,109,156, 54, 78, 27,167,141,211,198,249,183, 64,211,116, 71,154,166, 35,240,116,193, 20, 77,211,116, 4, 77,211,131, 22,
- 44, 88,176,208,188,109,193,130, 5, 11,105,154,238,107, 46, 87, 93,166,102, 31,243,182,186,239,117,183, 53, 86,182,145, 42, 78,
-170,243,121,146,121, 17,217,127,139,143,150, 13, 54,216, 96,131, 13, 54,216, 96, 67,189, 48,175, 24,172,101,109,146, 3,120,176,
- 98,197,138,242, 90,190, 83,114, 0,247, 0,180,171, 46, 39,175, 22,105,181,125,171,244,213,223,245,245,148,209, 91, 83,182, 1,
-236,104,224,179, 77,104, 53,132,118, 30,140,111,124,155, 73,194,171, 79, 0,104,234,105,218, 57,170, 58, 94, 17,109, 14, 92, 68,
- 81,160,105, 26,133,178,138,248, 7, 50,124,245,188,191, 23,224, 5, 23, 9,159,191,129,162,233,238,213,155,226, 20,165,186,217,
-201, 74, 84, 88,203, 17,228,142, 96, 62, 3,159, 83, 52,218, 2, 0,131,192,125, 45,133, 53,105,197, 77,143, 39, 85, 95, 63, 15,
- 21, 99, 18, 87, 32,124,215,209,201,185,117,121,121, 73,166, 65,171,251, 61, 69,142,237,104,122, 94, 70,248, 57,227, 13,138,198,
-151, 0, 24,108, 6,214,101,150, 89,189,146,195, 54,224, 16,230, 39, 60, 43,203, 87,255,121,206, 96,249, 54,216,240,202,129,166,
-105,230,223,187, 6, 9, 83, 61,156,196,223,228,180, 93,161, 86,136,173,122, 54,255, 89,207,182, 59,255, 77,245,110,146,208, 10,
- 17, 99, 42, 8, 44, 3, 64,131,198,215, 41,114,252,212,164,253, 61,209,143,207,100,238, 2,192,212, 26, 76,115,105, 10, 87,234,
- 61,152, 12,188,201,231, 48,215, 1,160,180, 38,211,248, 20,169,245,254, 98,161,222, 24,196,162, 24, 7, 40,154,102,155, 40,122,
- 40, 53, 96,187, 0, 0, 32, 0, 73, 68, 65, 84, 31,104, 68,219,113,112,253,214, 19,104,155, 82, 87,223,102,146,240,227,127, 74,
- 7,196,254, 52, 19,157,219,190, 6,218, 68, 2,148, 17,194, 30,159,227,226,250,143,208, 57,216, 23, 52,101, 4, 40, 18,118,131,
-215, 98,112,152, 35,253, 64,246,124,121,176, 3,188,224,210,220, 77,146,180,115,231, 46, 15, 47,191, 16,130, 34, 13, 72,255,243,
-252,152, 89,243,151,244, 9,133, 34,204, 26,177,213,214, 19, 19,124, 91, 4,126, 62,123,217, 15, 76, 79, 47, 31, 17,101,212,145,
- 69, 57,169, 29, 54,173, 94,114,132,195,200, 91,119, 95,138, 93,214,246,229, 16, 49, 38,179,120,220,209, 2,190,168,181, 90, 93,
-153,101, 50, 24,127,103,176, 89,131,214,172,221,208,190, 87,255, 33,118,166,202, 34,134,145, 66,200,111,135,126,109,190,121,203,
-214, 33, 73, 82,211, 91, 0,168,166,180,153,162, 49, 63, 99,255,164, 33,108, 22,147, 8,254,100, 39, 19, 32,159, 75,104, 5, 75,
-240, 62, 65,195, 98,120, 9,154,192,213, 84, 25,126,121,158,223, 8,146,224,103,130, 70, 0, 8, 28, 38,104,252,154, 34,135,236,
-255, 83,100, 81,212,211,241,152,193, 32, 44,138, 39, 62,143, 7, 77,117, 20,121,107,202,219, 96,195,255, 42, 24, 12, 70, 44, 69,
- 81,189, 95,176, 48,120,131,166,233, 91,182,163,251,191,141,166, 89,180, 8,124,155,252,176,192, 25, 38, 3, 66, 3,252,190, 1,
-154, 38,180,248, 76,230,190, 59,153,197, 30, 32, 13,216,249,221,180, 67,122, 35, 64, 26, 13, 48,145, 70,152, 72, 35, 72,210, 0,
-147,209, 8,218,168,195,146,221,177,128,190, 18,225, 97,254,251, 0,147,167,181,191,193,166, 25, 7,226,175,157,119, 33,244, 10,
-252,242,211,138,207, 10,228, 85,159, 93,184, 95, 88, 18, 34,209, 44, 76,145, 97, 79, 83, 4, 65,236,182,153,136, 58,118,234,241,
-198,159, 85,105, 20, 77,195,197, 65, 16, 56, 38, 50,217,103,255,137,216,130, 13,251,180,105, 0,224, 40,226, 6,142,189,159,233,
-251,119, 78,130,132,207,223,176,125,235,102, 15, 79, 87, 1, 65,222, 88, 9,210,100,130, 79,243, 8,230,194,233, 99, 60,191, 93,
-191,107, 61,148,186,113,141,237, 31, 40, 65, 72,139,150,193,115,247,157,186,225,171, 82,202,244,231, 15,126,249, 16, 58, 24, 61,
-188,131,217,223,172,248,129,185,232,139,153,115,244,166,199,183,211,101, 72,177, 52,214, 4, 75,112, 98,197,202,181,109,251, 12,
-142,180,163,170,228, 76,173,170, 42, 96,231,238, 93,203,130,218,118, 18,246, 8,107,198,145,253, 62,133,208, 84,150,193,192,224,
-243,250,132,246,115,208,124,248,158,113,231,222,168,233, 41, 50,108,106, 74,155, 77,181,166,173, 41,234,249,163,174, 19, 52,122,
- 36,222,138,157,108, 42,188, 3,218,100, 4, 76,134,154,119,152,140,160,169,167,239,157,167,236, 6,240,124, 66,139, 65, 99,192,
-133,107,119, 60,139,139,164, 29,215,175,253,126, 33,125,231,206, 25,152,112, 32,181, 12,113, 77, 21,152, 0, 2, 90,185, 50,207,
- 25, 77,208, 21, 84,152, 2, 0,160, 79, 0, 15, 0,186,122,218, 17,125,243, 21,196,149,171, 15, 53,113, 86, 14,226,112,117,117,
- 69, 73, 73, 9, 0,212,164, 66, 10, 14, 14, 6, 0, 56, 56, 56,192,160,215,219, 70, 57, 27,108,176, 94, 24,145, 52, 77,179, 94,
- 48,231, 16,154,166, 79,255, 77,154,207, 1, 76,168,254,188, 11,192,154, 23, 80,181,102, 0, 60,170, 63, 23, 1,120,108,235, 1,
-127, 11, 53,113,179,234,126,111,106,135,226,131,166,128,195,195, 1, 64,208,212, 90,208, 0, 31, 4, 19, 48,170, 48,108,112,127,
-184, 73, 60, 0,163, 26, 48,168, 1,163, 6, 48,170, 0,163, 6, 37,210, 60,192,160, 2,178,207,128,164,105, 94,147,155,171, 83,
- 0, 25,191,163,111, 7, 95,136, 29,249,152, 57, 44,196,109,199,217,140, 93,187,206,167,247, 75,145,225, 93,171,234, 74,211,232,
-220,166, 53, 54,238, 82,165,253,145, 32, 31, 8, 0, 67,218,185,158,237, 28,210,220,103,195, 62,109,218,233, 7,229,131, 0, 96,
- 80,168,195,153, 78,129,158,190, 20,158,223, 84, 64,209,116, 15,175, 22,173, 9, 83,226,118, 80,202,199, 80, 42, 53,120,156,179,
- 31,206,222,175, 51, 76, 20,122, 90,218, 95,192,196,130, 25,139, 86,177,213,202, 98, 61,101,144,155,196,204,114, 38,139, 75, 17,
-120, 18,167,171,162, 42, 76,179, 39,125, 68,206,253,234,187, 5, 0,198, 52,106,113,148, 96,250,186,117, 27,218,116, 11, 15,146,
- 20, 29,153, 73, 84,149, 23,131,100, 10,121,195,186,116,131,147,127, 8, 85,124,121, 29,193,245,235, 7, 39, 87, 63, 60,185,113,
- 16,185,183,142, 18,221, 59,140,224,237,249, 63,246,206, 59, 60,138,170,109,227,247,148, 45,201,166,247,158,144, 80, 18, 2,161,
- 73,239, 40, 69, 32,188, 20, 65,154,212,151, 34,162,136, 40, 42, 40, 32, 42,197, 6, 40, 29, 84,154,180,128,148,128,148, 40,189,
- 68, 19, 74, 42,129, 36,164,247,158,108,182,206,204,249,254, 72, 49,129,148,221, 4,245,149,111,126,215, 53,215,108,189,119,102,
-206,236,156,123,158,115,158,115, 14, 74, 95, 3,116,117, 26,173,214,246,232, 59,172,127,247,195, 45, 61, 93, 93, 8, 17, 32, 8,
- 4, 68,224, 81,166,214,227,195, 35, 9,224,121, 30,175, 12,235,251,146,153,140, 34,130, 32,128, 16, 1,169, 89,249,229,191,133,
-198,190,148, 80,136, 80, 67, 34, 85,157,122, 14,234,123, 63,252,118, 91,125,220,105,116,157,186, 54,150, 2,174,215, 56,231,250,
-222, 57,255, 99, 91,224,135,166,123, 57, 10,124,210,185,117,240,236, 63,151,217,113,240,156, 67,113,110,250,244, 99,251,182,142,
-223,182, 99,199,129,216, 28,204, 55,198,100,189,221, 95,118,125,195,111, 37,118,189, 90,154,229,166, 86,198, 41,125,108,104, 0,
- 24,182,253,108,244, 91,183, 86,247,104,187,252, 12, 41,186, 26,175,142,168,251,188,172,136, 76, 81, 20,133, 25, 51,102,194,220,
-220, 28, 65, 65, 65,200,204,204,132, 84, 42,253,211,188, 59, 58,194,215,215, 23,182,182,182, 96,104, 26, 4, 68,140,102,137,136,
- 24,112,221,127,214,102, 43, 57, 57, 57,163, 57,102,203,205,205,173,127,122,122,250, 23, 85,189, 85, 40,138,250,162, 69,139, 22,
- 43,254,188, 81,173,117,175, 87,204,243,252,212,244,244,244,171, 13,105,142, 28, 57,210,245,204,153, 51,222, 53, 52,189, 1,120,
-215,245, 89,107,107,107,190,119,239,222, 73,103,206,156,201, 16,207,144, 38, 25, 46,163,141, 86,108,202,209, 69, 93, 52,153,101,
- 0, 16,107,192,231,107, 53,249,169,245,252,186, 61,171,166,173,107,223,194, 22,165, 74, 45, 46,132, 37,129,231,245,224, 57,174,
- 50,178,197,129,231,244, 24,214,201, 30,189,213,243,241,109,240, 3,112,188,176,182, 33,205, 39,209, 17, 97,114,231,193,175, 30,
- 17, 4, 34,147, 75,232, 98, 95, 15, 59,199, 37,175,116,162, 23,141,110, 15,149,142,123,245,167,203,241,191,197,228, 96,151, 65,
-154,194,211,195, 19,145,186, 94,227,185, 70,247,189,129,104, 84,143,193, 3,251, 89, 18, 77, 49,244,121, 9, 40, 45,215, 35, 33,
- 95,143, 44,117, 17,228, 84,166, 65,154, 2, 65, 71,119, 55, 23,197,141,195,239, 63,182, 99, 74, 88, 71,134,147,202,104, 14,188,
- 64, 24, 82, 20,173,177,109, 59, 68, 82,213,111,171,161,237, 52, 85, 88, 76,235, 63,116,164, 85,202, 79,115, 41, 83,223, 97,112,
-236,226,129,199, 87,247, 32, 39, 44, 24,249, 25, 73,148,165,186, 8, 78,118,173, 48,124,234, 68,124, 57,177, 27, 74, 75, 74,193,
-100,198, 91,201, 36,114,107, 64, 87,167, 38,225, 49,245,235,245,159,187,176, 12, 93,113, 60,171, 22, 94, 15,149, 70, 3,240, 28,
- 76, 88, 1, 20,169,122, 79, 15, 94,175, 83,116, 28,247,254, 2,128, 15,109,108,223, 99,114,112,176,157, 3,250, 65,208,183, 37,
-122, 21, 40,224,122,116,238,159,230,199,223, 17,147, 95, 24, 54,179, 31,161,112,173, 41,101, 20, 96,135,192,174,222,230,102,102,
- 37,177, 72, 11,122, 19,241, 48, 33, 78,125,254,139,201,179, 22, 42,118,238,220, 57, 10, 32,175,163,118, 31,181, 16, 0,104,235,
-196, 0,192, 60, 61,143, 21, 0,160,210,147, 61, 22, 50,106,214,215,135,110,217,129,169,152,209,161, 42,146,165,214,147,151,210,
- 75, 72,161,238,210, 71, 15,122, 46, 9, 30,216,225,238,192, 84,138,146,167, 92,121,164, 41,174,107, 59,165, 82, 25,188,188,188,
-176,104,209, 34,216,218,218, 66,163,209, 32, 43, 43, 11,175,191,254, 58, 0, 96,196,136, 17,144, 72, 36,152, 61,123, 54,188,189,
-189, 81, 80, 80,128,240,240,112,148,151,151, 27,125,126, 26,137,168, 41,106,214,194,210,210,210,167, 69,139, 22, 43,244,122,125,
-127,169, 84,234,164,211,233, 32, 8, 66,150, 76, 38,187,150,148,148,180,186,164,164, 36,241,127,109,223,239,223,191,111,140,217,
-106, 84, 83, 34,145,224,193,131, 7,143,140, 48, 91, 33, 79,124,127,255,245,235,215,113,228,200, 17, 0, 64, 92, 92, 28,218,180,
-105, 99, 86,215, 23, 31, 63,126,108, 54,112,224,192,253, 0, 60, 26,210,140,136,136,240, 57,125,250, 52,130,130,130, 0, 0, 15,
- 30, 60,128,175,175,111,157, 27,115,253,250,117,102,202,148, 41, 62, 0, 50,254,134, 50,122, 30, 76, 86,205,245,159, 70, 43, 56,
- 56,152, 4, 6, 6, 82, 79, 62,174,131, 4, 79, 27, 89, 23,168,121, 0, 72, 48,118, 11, 98,178,177,126,211,190,243, 47,255, 26,
-180,165,191,137,148,198,202, 93, 75, 82,115, 11, 74,123,178, 84, 69,243, 11, 71, 64,219,152,203,110,173,157,222,201,179,176, 76,
-141, 83,191,167, 95,141,206, 49, 46, 68, 26,157,137,139,128, 96, 93,241,140,135, 90,149,227, 59,253,203,139,135, 14,125,240,114,
-199,197,163, 59,226,228,205,164,197, 0,215,232,168,239, 68, 16, 64, 4,174,186,243,123,229,173, 3, 32,212,158,192, 87, 0,169,
-120, 77, 48, 46, 92, 48, 0, 96, 11, 29, 49,220, 66, 33,219, 60,111,222, 28, 75,125,238, 67, 20,104,165, 72, 45, 84, 35, 75, 37,
- 65, 25,235,136,244,216, 8,158,166,112,177,209,144, 11,133, 18,194,169,173,109,100,230,116,192,144, 5,110, 37,231,150, 21,202,
- 40,142,177, 28,251,153,117,222,175,223, 36,113,202, 92, 37, 69,161,209,225,231,173,172,172,219,168,243,147,152,226,194, 60, 88,
- 59,183,199,203,175, 6,226,147,145,237, 80, 90,162, 68,110,193, 45,210,218,197,146, 74,190,118, 0,203,135,251, 35, 63, 59, 19,
- 26, 61, 64, 41, 53, 5,106,173,186,172,222,227, 72, 99,199,219,239, 46,157,236,229,226, 96, 86,149, 84, 64, 4, 30,157,252, 91,
- 98, 72,255, 30,184,120,253, 6,254,136,136,131, 80,153, 84, 64, 4, 1,105, 57,133,217,106, 29,191,199,168, 3,202,115, 32,122,
-117,157, 70, 12, 77,104, 50, 12,112,132,130, 7, 62,238,230, 99, 49,251,131, 64, 47, 11, 51, 57, 5,181,158,135, 90,171, 71,233,
-141,205,176,107,209, 1, 10, 19, 19,170, 11, 84,236, 29, 60,125,108, 43,167, 70, 95,145,152, 89,228,130,178, 44, 76, 25,210,254,
-173,189,107,223, 48,163, 76, 42, 78, 77, 61, 95, 59,146,117, 99, 85,183,243, 83, 62, 61,113,233,200,209, 73,174, 95,190, 55,109,
-224,176,119,246, 92, 2,112,174,174,109,211,106,181, 40, 46, 46,198, 59,239,188,131,237,219,183, 99,249,242,229,213,199,143,227,
- 56,240, 60, 95, 61, 47,229,207, 63,255,140,248,248,248, 39, 77,150,136,200, 95,202,248,241,227, 77,178,179,179, 47,123,120,120,
-180, 27, 50,100,136,162, 95,191,126, 80, 42,149,184,112,225, 2,148, 74,165,151,135,135,135,215,133, 11, 23,198,165,164,164, 68,
-187,187,187, 15, 12, 10, 10, 50,184, 15,109,165, 1, 98,170, 47,193, 0, 71, 85,100,136, 48,168,200,253, 16,208,140,121,110,101,
- 50, 89,213,148, 89,207, 52,178,149,158,158,254,168, 41,145,173,178,178, 50,169,155,155, 27, 28, 28, 28,192,243, 60,148, 74, 37,
- 78,156, 56,129,226,226, 98, 8,130, 0, 83, 83, 83,124,246,245, 46,196,222,185,140,208,208, 80, 20, 23, 23, 75, 27,211, 76, 75,
- 75,163, 58,117,234, 4,141, 70, 3,142,227,160, 86,171, 17, 18, 18, 82,253,156,101, 89, 44,253,116, 3,226,194, 46,227,238,221,
-187, 72, 75, 75,251, 91,102, 27, 49,194,139,252, 47, 82,239,152, 89,127,123,214, 33,207,115, 31,238,220,123,232,214,135,243, 39,
- 98,225,164,193, 30,171,183, 28, 31, 28,147,135,189, 0,224,111,143,233,175, 13,106,237,105,173,144,224,147,159,194, 0, 66, 62,
-108,238,239, 69, 21, 32,174,157,147,176,248,231,208,228,203,203, 38,118, 65, 75, 23,203, 54,133,178, 2, 89, 66,130, 1,115, 10,
- 10, 28,108,204,229,126, 35, 58,217,157,131, 32,192,218, 66,222, 22, 60, 7,107,115,185,223,203,237, 45,127, 1, 0, 75,133,164,
-109, 93,145,175,250,232,234, 33,153,171,144,179,115,205, 44,172, 61,103,140, 26, 98, 58, 98,212, 56, 83,115, 9,135,252,208, 11,
- 40,145,184, 67,111,235, 5,141,190, 0,105,137,241,252,175,183, 99,210,243, 74, 53, 75, 26,221, 76,130,171,233,137, 15, 28,124,
- 58, 14,177,201, 11, 94,158,227, 51,243, 39,111, 26, 2, 93,122, 96,108,182,153, 99,119,211,223, 19, 18,203, 4, 82,103, 68,167,
- 22, 37,197,197, 73,122, 30, 46, 42,158,181,136,191,244, 35, 62, 24,222, 1,133, 5, 57, 80,235, 56, 20,171, 56,157,179,181,137,
- 92,147, 24, 9,141,142,131, 86, 47, 64, 98,237,134, 11,183, 34,242, 4,189,254,151,250, 52, 19,242,113, 55,225,196, 93,243,154,
-175,181,180, 71,167,247, 45, 77,239, 66,175, 66,114, 90, 6,246,158,185,213, 37, 33, 31,119,155, 83,206, 68,224, 42,154,159,107,
- 68,178, 40,130,126, 77,233, 4,223,214, 17,221,165, 38,210,239,190, 88, 60,165, 93, 47, 95, 91,185,144,118, 11,148,160,131, 25,
-207, 66, 37,227, 97,229,209, 18,130,182,148,148,171,213, 69, 81, 64, 67,133,207, 0, 0,209, 41,241,229,180,246,102,148, 77, 75,
-240, 9,231,192,118,158, 11,189, 0,196,231, 11, 0, 16,161,187,244, 81,108,239,119, 79, 15,248,244,226,160,152,140, 51, 43, 99,
-220,198,111,238, 4,236,105,209,208, 54,230,228,228,128,101, 89,204,155, 55, 15,190,190,190, 32,132,160, 77,155, 54, 24, 58,116,
- 40,126,249,229, 23,196,197,197, 65,169, 84,226,246,237,219,200,204,204, 20,107,126,145,191, 13, 63, 63, 63,231,244,244,244,168,
-119,223,125,215,118,236,216,177,248,249,231,159, 81, 82, 82,130, 61,123,246, 96,227,198,141, 88,181,106, 21,244,122, 61,118,238,
-220,169, 56,118,236, 88,247,173, 91,183,166,121,122,122,182, 79, 73, 73,201,106,196, 96, 81, 0,228, 0, 36,149,117, 23, 5, 64,
- 56,123,246, 44, 70,140, 24,129,179,103,207, 10,149,175,241,168,184,249,105,210,220,159, 50,153, 12, 50,153, 12,197,197,197,207,
-196,108, 73, 36, 18,152,155,155, 67, 38,147,161,180,180,212,104,179,197,113, 28,147,150,150,134,226,226, 98, 12, 25, 53, 10, 27,
-214,174,197,160, 65,131, 48,100,200, 16, 16, 66, 16, 18, 18,130,193,125, 2, 48,241, 63, 3, 17, 19, 19, 3,142,227, 12,218,222,
-172,172, 44,100,103,103,227,229, 81,163,176,107,235, 86,244,232,209, 3,126,126,126,224, 56, 14,151, 47, 95,198,248, 97,125, 96,
- 50,102, 48,226,226,226,196,147,218,240,104,214, 51,233,163,213,108,162,114,113, 91, 56,121, 37,120,210,176,238,129,163,250,182,
-195,174,195,191,126, 14,135,146, 67, 0, 96,167,145,127, 54,109, 80, 75, 68,167, 20,226,215,187, 25,193, 49,121,120, 38,217, 26,
- 2, 15,123, 59, 75, 5,192,200,160,210, 9,156,101, 66,227, 29,152, 5, 66,160,232,255, 62, 94, 27, 21,237,209,163,157,135, 71,
- 85,214,161,249,136,111, 48, 61,226,145,103, 55, 63,103, 79,240,122,128,215,195,114,226, 79,192,167,102,141,110, 71, 31,111,217,
-197,183, 23, 45,234, 61,124,204,171,166, 50,133, 21,248,146, 84,232,179, 34,144,255,240, 42,148,138, 54,200, 74, 78,192,145,243,
-161,197, 15,211,242, 75,104, 26, 23,178,139, 53,239, 37, 20,162,172, 49, 93,181, 30,107, 87, 44, 95, 50,242,200,161,195, 22,242,
-150,125,169,248,205, 35,138,101, 44, 39,119,240,126,129, 46, 55,177, 39,107,246, 28,182, 84,106,177,174, 49,157,114,101,201,241,
-144, 11,231, 38,182,246,233,107,241,248,143, 51, 80,169, 53,208,232,129,246,221, 7,130,231,137,140,162, 41,193,146, 97,168,156,
-252, 66, 80,122, 62,251,218,189,199,153,215,239, 37, 48, 26, 11,172,107,112,116,145, 39,221, 61,197,188, 53,106, 96,103, 64,175,
-194,127,250,119,192,134, 3,191,190, 9,240, 51,155, 87,200, 21, 17, 45, 2,244,109,231,128,237,132,160,111,216,137,141,109,187,
-142,121, 27,198, 68,180,218,219, 99,184,191,143,235,143, 27, 62,123,223,214,206,189, 13, 67, 9,122, 16,231,142, 64, 73, 26,161,
-210,110,193,202,173, 7,120,215, 62,216,249,237, 87,101,130, 64, 14,161,158,161, 45,248,202, 51, 76, 72,185, 2, 62,246,103, 36,
- 36, 36,192,222, 43, 12,160,104,144, 22,143,161,227, 8, 52, 58, 2, 0,103, 54,237, 57, 61,232,189, 23,215,182, 31,213,150,245,
-188,117, 47, 62,231,213, 89,174,138,158,158,140,111,116,166, 25,157,167, 84,214,123,174,102,100,100, 32, 35, 35, 3, 57, 57, 57,
- 40, 42, 42,194,144, 33, 67, 48,120,240, 96,220,185,115, 7,215,174, 93,131, 92, 46,135, 78,167,131,179,179, 51, 40,138,130, 78,
-167, 67,126,126,190,120, 57, 20,249, 75, 81,171,213,199,215,175, 95,111, 27, 24, 24, 88, 21,145,193,173, 91,183,176,123,247,110,
-152,153,213,190, 78,142, 24, 49, 2,132, 16,219,149, 43, 87, 30, 7,208,171, 62,205,222,189,123,143,186,123,247,110, 70,231,206,
-157, 19, 42,205,150, 20, 0, 29, 25, 25, 73,167,166,166, 82, 54, 54, 54,196,213,213, 85,159,145,145, 33, 0,224,103,205,154,197,
- 28, 61,122,180,181, 82,169,188,210, 84,163, 37,147,201,158, 73,159, 45,137, 68, 2,138,162, 32,147,201, 32,149, 74, 65, 8, 49,
-202,108,241, 60,207,158, 61,123, 22, 97, 97, 97, 88,213,185, 51, 22,187,185,193,214,214, 22,151, 47, 95, 6, 33, 4,102,102,102,
- 40, 40, 40,192,161, 67,135,240,226,139, 47,130,227, 56,169, 33,186, 65, 65, 65, 8, 15, 15,199,167, 93,187, 98,177,149, 21,204,
-205,205, 17, 18, 82,209, 26, 40,151,203,145,156,156,140,144,144, 16, 12, 28, 56, 80, 60,169,155,137,193, 39,207, 0,128, 45,160,
-224,172,211,170, 64, 56, 2, 80,112,245,247,135, 52, 38,166,118,231, 28, 67,160,105, 44,255,118,111,240,200,111,222, 30, 69,205,
- 29,221,197,117,245,143,151, 94, 7,128,217,175,248,186, 41,228, 44, 54,157,140, 38, 52,141,229,207, 98, 7,253,253, 33,165,242,
-241,250,144, 30,126,200, 40,210, 34, 62,163,232,183, 24,192,160, 89,156,127,253,230, 53,236, 59,117, 57,117,227, 62,117, 44, 33,
- 4,214,230,114,191,233,247,227, 61,127, 60, 27,158,242,245, 17,117, 44, 17, 8,172, 21,146,182, 51, 99,250, 52,154,117,216,213,
- 67, 50,247,157, 37, 75,250,140,158,249,174, 9, 23,123, 20,218,248,243, 16,116, 42,148,232,164, 40, 98,156,145,150,146,130, 53,
- 59,131, 83, 75,148,218,137, 81,185,198, 25,204,135,249, 40, 99,169,146,177,107, 62, 89,118,113,237,103, 43,205, 85, 9,151,203,
- 24,138, 83, 49, 45, 6,176,159,173,250,134, 42,213,104, 95, 77, 40, 68,105, 99, 58, 26, 11,172, 91,255,245,183, 35,231, 76, 29,
- 23,235,219,102,128, 29,159,145,104,167, 46, 41,201,249,233, 92,184,115,229,157, 34, 5, 0,241,105,249,200, 45, 86,114, 60,167,
-191, 98, 33,193,234,104, 67,162,131,149,248, 56,194, 33,176,111,251, 41, 14, 22, 82,168,202,138,224,104, 33,193,176, 30,173,166,
-232,127,143,123, 63, 49,199, 24,187,246,164,209,210,131,232, 85,184,189,238,197,182,132,215,183, 5,175,135,238,254,126,227, 35,
- 99, 20, 22, 47,236,111,110,105,163,125, 76, 67,105, 6,152,218,131,178,244, 2,172,188, 41,137,255,171,200, 72,136,226,222,156,
- 50, 53, 63, 49, 41,237,123,123,211,250,155,181,245,149, 77,201, 66,210,101,148,101,199, 35, 50, 67,135,246, 57, 21,173,237,150,
-217,119,192, 63,195,142,233,197,197,197,232,221,187, 55, 94,127,253,117,112, 28,135,209,163, 71, 35, 53, 53, 21,143, 31, 63,134,
-171,171, 43,102,205,154, 5, 59, 59, 59, 44, 89,178, 68,188,226,137,252,229, 36, 39, 39, 79,251,240,195, 15,175,247,232,209,195,
-201,222,222, 30, 29, 58,116,192,169, 83,167,240,238,187,239, 86,127,166,115,231,206, 32,132,160,160,160, 0,235,215,175,207,202,
-200,200,152,214,224, 13,122, 84, 84,236,190,125,251,250,183,107,215, 78, 39,149, 74,139, 0,200,139,138,138, 76, 10, 10, 10, 40,
-181, 90, 13, 65, 16, 4, 43, 43, 43, 62, 35, 35, 67, 63,113,226, 68,205,205,155, 55, 91, 41,149,202,228,230, 68,180, 60, 60, 60,
- 34,243,243,243,139, 41,138,106,246,208, 15, 85, 38,203,222,222,222,161,172,172, 76, 0, 80,216,148,161, 31, 56,142, 67,215,174,
- 93,113,254,234, 29,156,253,245, 38, 74, 50, 30,224,245, 57,211,208,161, 67, 7,156, 63,127,190,201,101,214,169, 83, 39,156, 11,
-185,142,235, 97,247,144, 28,119, 31,111,190, 62, 7,237,219,183,199,185,115,231,196, 19,218,112,206,160,118,223,172, 51, 79, 26,
-173,129,193,193,193, 85,151,254,167,236,107, 91,123,116,146, 88,203,246,175, 28,222,202, 95, 50,100, 37, 40,137, 41,142,182, 57,
-215,103,249,154,205,177,140, 99,242,212,200,156,198,179,195,106,253,105,114, 16, 69, 66, 99, 15,222,139,105, 59,229, 63, 61, 60,
-176,235,148,226, 99, 0,120,181,159, 15,126,127,152,139,208,184,156,131,209,185,136,106,238, 94, 7, 56, 66,193,231,225,224,250,
-183, 70, 15,244,114,119,198,238,159,175,131,162,112,220,160, 10,151, 16,210,163,157, 23, 54,238,123, 50,195,208,217,243,235, 35,
-234,216, 11, 81,165,195, 1, 96, 72, 91,197, 47,221, 90,217,120, 18,210,112, 78,151,169,140,157, 55,124,220,107, 38, 92,220, 41,
- 32, 41, 4, 20,167,129, 74, 39, 32, 51,175, 20,229, 86, 30,184,124,235,158,170, 88,173,125, 59, 58,183,105, 81,188,152, 60, 36,
- 72,255,184,151, 82,166, 84,185, 40, 28, 90,169, 25, 90, 16,202, 52, 4,191, 71, 39,149, 68,103,225,129, 33, 26, 9, 9,208,246,
-116,227,250,109,223,123,100,133, 68, 42,123,149,161, 64, 57, 90,155, 57,108,255,230, 83, 88, 88,152, 67,208,150, 1,202, 92,140,
-125, 99, 77,110,100,134,222, 7, 0,218,216,193,188,159,143,100, 47, 75, 83,105,151,226,117, 31, 53,246, 27,148, 30,243,167, 14,
-235, 44, 17,180, 74,188,181,254, 48,118,188, 63, 26,175,189,228, 47, 57,115, 35,110, 62,128,213, 77, 45,107,194,115, 32,122, 21,
-122, 45,187, 26, 75, 1,215, 9,208, 55,236,200,103,109,129, 59, 6,107,116, 1, 36, 60, 75,249,119,244, 52,147, 10,105, 55, 32,
-164,221, 32,140, 71, 31, 80,158,253, 41,202,185, 43,249,238,139, 85,202, 93,187,118, 95, 16,104,124,210,216, 80, 25, 85, 17,173,
-188,184,235,208,106,181,208,243,128, 90,173,134, 82,169,132, 89,252, 57,232,121, 64, 42,161, 0,224,229, 69, 51, 70,117, 34,101,
- 25,229,167, 99,185,148,221,115,218,246, 34,101, 25,229,183, 83,248,184, 60,165,166,209,200,171,155,155, 27,166, 79,159,142, 9,
- 19, 38, 84, 71, 14,250,244,233,131, 47,190,248, 2, 87,175, 94, 69,183,110,221, 32,145, 72,112,249,242,101,112,156, 56,247,180,
-200,223, 66, 66, 70, 70,198,203, 35, 70,140,248,245,252,249,243,182, 1, 1, 1, 0,128,176,176,176,138,155,206,174, 93,225,235,
-235,139,236,236,108, 76,154, 52, 41, 47, 51, 51,243,101, 52,210,231,183,180,180, 52, 49, 40, 40,200, 73,169, 84,118,254,232,163,
-143,114,188,188,188, 74,212,106, 53, 85, 84, 84, 36,112, 28, 7, 27, 27, 27, 89,231,206,157,209,187,119,239,178, 91,183,110,181,
- 72, 77, 77, 45, 5,144,212,148,141, 31, 61,122, 52,174, 94,173, 72,218,123, 22,227,106, 73,165, 82, 4, 4, 4,184, 37, 36, 36,
-164, 87,214, 45, 70, 95,227,107, 86, 47,247,238,221,195,149, 59,105, 96,181, 42,200,114, 51,112,251,231, 32,140,154,183,160, 89,
-255,239,123,247,238,225, 68,200,109,152,201, 89, 60,120, 16,133,160,160,160,234, 27,183,191,153, 6,189,200,255, 56,153,168,167,
-159, 22, 11, 0,129,129,129, 87,170,162, 21, 53,105,217, 18, 50,121, 25, 86, 14,233,226,182,244,213,190,173, 24,125, 73, 6, 4,
- 94, 0, 35, 1, 28,237, 45,177,127,255, 65,159,131,135, 15,223,218,186,101,235,183, 2,199, 45,143,204,129, 49, 61,110, 87,126,
-115,248,250,171,251,151, 12,100, 95, 31,222,214, 22, 0,164, 44,141, 77,167,162, 56, 0, 43,155,179,183, 61,221, 96, 82,166,199,
- 92, 71, 59,171,143, 63,252,239, 72,219,129, 93,125,113, 37, 52, 18,223, 6,221,186, 42,203,193, 62,131, 79,110, 65,143, 39,253,
- 83, 93, 89,135, 16, 26,239,119,201,243,196, 89,106,102, 3, 93,210, 37, 64,167,134, 90,163, 67,106, 62,143,212, 2, 53, 88,133,
- 20, 97,113,105, 42,187, 44, 4, 55, 99,183, 41, 51,133,137,235,138,207,191,118, 87,171,202,184,146,194, 60, 78, 42,187, 45, 81,
-152,202, 51,141,233,170,112, 59, 29,234,254,222,146, 23, 0,129,145,153,144,242,101,239,204, 48, 75,143, 62,143,214,116, 6, 40,
- 66, 96,234, 63, 18, 22,166,140,180,111, 11, 73, 10, 0,152,153, 41,100,235, 63,121,215,234,237,247, 63,105,180, 15,152, 63, 32,
-245,109,233,252,118,128,151, 13,174,134,199,226,106, 68,114,212,213,176, 7,237, 7,117,112,133,175,187,245, 34, 89, 97,209,186,
- 24, 24, 31, 33,173, 40, 24, 14,208,171,171,179, 14,253, 29, 49,185,219,171, 31,213,151,109, 88, 39,222,128, 16,199, 19, 80, 12,
- 3, 80,116, 69, 6,100,234, 13,176,214, 45,201,193, 35, 39,202,119,239,222,247,105, 76,158, 97,201, 25,250,138, 83,130, 47, 41,
- 41,129,153,153, 25,206,197,113,154,215,134, 73,229, 52, 77, 35, 53,238, 78, 69,103,120, 91, 26, 0,218, 73, 7,125,214,246,198,
-170,110,231, 45,100,148,220,117,228, 39,254, 92,196,190, 52, 67, 42, 9,127,127,127,248,248,248, 96,194,132, 9, 72, 72, 72,192,
-218,181,107,145,153,153,137,243,231,207,227,245,215, 95, 71,159, 62,125,144,159,159,143, 31,127,252, 17, 97, 97, 97,200,202,202,
- 18, 45,128,200,223, 66,113,113,241,253,152,152,152, 97, 29, 59,118,220,243,214, 91,111, 89, 76,157, 58,213,117,206,156, 57, 52,
- 0,100,103,103, 11, 27, 55,110,204,248,238,187,239,138,243,242,242,102,234,245,250, 8, 67,254,225,153,153,153, 55,191,255,254,
-251,220,107,215,174,181,239,222,189,187,252,133, 23, 94, 16,108,108,108, 88,185, 92,206,107,181, 90,117, 92, 92, 28,159,144,144,
-224, 82, 84, 84,244, 8, 64, 60,154, 48, 99, 69,101,244,106, 53,195, 48, 43, 8, 33, 1,207,162,143,150, 66,161,112, 5,240,136,
-162,168,214,198, 54, 27, 62, 85, 97,179, 44, 10, 11, 11, 81,158, 21, 5,147,180,135,232,104, 70,163,157,141, 57, 44, 45, 45,155,
-101,138,138,139,139, 1,101, 58,174, 95,191, 7,112, 28,172,172,172, 96,101,101,245,183, 27,173,250,188,200,191,132,185,117,188,
-214,112, 31,173,118, 14,120,221, 84,139,141,243, 70,182,146,122,123,186, 67,147, 22,134,123,169,101, 88,222,179,123, 52, 35,183,
- 80,207,155, 54,186,235,184,241, 45, 48,176,119, 55,202,219,197,106,209,186,111,182,189,209, 14,121,239, 70,231, 96,147, 33, 91,
- 20,157,139, 68, 1, 57,187, 47,221, 79,155,239,174, 80, 65, 16, 8, 46, 69,100, 34, 34,169,112,119,108, 46, 18,141,217,187,118,
- 46, 24,204,130, 62, 76, 8, 49,177, 50, 51, 43,109,231,235,110, 63,184, 87, 39,250,229, 1, 93, 33,101,128,235,191,223,195,226,
-111,142,223, 22, 4, 50,242,142,129,205,134, 21, 25,134,181, 13, 84, 69,134,161,190, 86,134, 33, 33,132, 84,100, 29, 54, 28,124,
- 96, 24, 42,171, 60,249, 15,103,137, 93, 27,168,226, 47, 33,169, 80, 64,114, 78, 41, 74, 88,103,104,210,211, 1, 34,164, 92,105,
-184, 99,117,131,216,219,219, 59,250,180,243,109,181,121,111, 16,116,229,197, 72,188,188, 7,101,133,153,248,108,251,169, 86,110,
-110,118, 3,210,211,211,175, 24,113,177,241,253, 53,248,160, 35, 8,192, 72,228, 56,179,245, 8,242,236, 76, 97,175,144, 66, 80,
-229, 98,222,219, 83,173,134, 15,153,106, 5, 0,201, 15,238,194, 75,161, 50, 72, 87,103,135,113,175, 14,242,179,134, 94,133,189,
-231,238,170,105,224,229,125, 23,162,226, 7,181,181, 54,121,181,175,151,205,234,140,162, 87,144,223,180, 65, 69,171, 34, 90,213,
- 17,190, 38,100, 27, 6, 1,124, 91, 1,241,135,111,230,152,141, 31,242,130, 66,202, 82, 20, 41, 75, 7, 49,181,199,182,189, 71,
-203,100,122, 24, 60, 19,123,229,217,176,186,199,218,196, 21, 21,231, 9,246, 12, 95, 27,246,223,139, 31,247,116,200,202,202,130,
-142, 39, 72, 44, 16, 0,224,183,105, 67,218,241,105,197,130,246,194,186,177,227, 41, 83, 7,217,123, 95,238,187, 76,208,120,100,
-147,227, 56, 40, 20, 10, 16, 66, 16, 20, 20,132,228,228,100,228,231,231,131,231,121,188,247,222,123,240,243,243,195,131, 7, 15,
- 80, 90, 90,138,156,156, 28,136,136,252,157,168, 84,170,112,149, 74,213,225,189,247,222,155,188,108,217,178,254,102,102,102, 62,
- 0,160, 84, 42, 19,245,122,253,213,202,255,167, 49,217,129, 4,192,163,248,248,248,196,248,248,120,167, 3, 7, 14, 88, 3, 48,
-169,124, 79, 13,160, 8, 64, 54,154,145,113, 88,101,170, 40,138, 90,241,172,142, 67,149,169,162, 40,170,117, 83,190, 79,211, 52,
- 79, 81, 21, 99,231,201,229,114, 92,187,118, 13, 19, 70, 14, 65,204,153, 34, 4, 88,155,163,251,204,121, 56,124,241, 34, 24,134,
- 1, 69, 81, 96, 24,198,168,122,132,101, 89, 92,191,126, 29,175, 77, 26, 15, 57, 11, 88, 89, 89,225,189,247,222,195,201,147, 39,
-193,178,226, 44,125, 70,176,179,134,225, 50,112, 28, 45, 10,171, 47,238, 89, 35, 5,175,199,233, 61, 95, 33, 56,178, 76,251, 32,
- 23,203,253,114,177, 49, 8,165, 66,238, 55,251,230, 95,188, 30,249,229,172,137,129,138, 23, 7, 13,193,139, 3, 7,177,237,187,
- 13,248, 24,168,101,180, 6,163,129,177, 54,120, 1,159,238, 60, 23, 59,239,240,229, 56, 10,186, 82, 76, 28,218,141,240, 2, 62,
-109,100,103,158,210,180, 50, 53, 63,124,253,214, 45, 27,232,202,144,116,247, 55,147, 22, 62,173, 0, 94,135, 71,143, 30,226,187,
-189, 63, 11,151,127,127,176, 95,203,225,173,132, 66, 40, 13,213,172,168, 45, 57, 88,153,201,252, 94,110,111,249,139, 0, 2,107,
-133,180, 45, 17,120, 88, 43, 36,109,135,180, 85,252, 66, 8, 33, 22,166,146,182,132,215, 55,170,169,210,114, 59,246,254,176,251,
-235,217,179,103,155,229,165,101, 33,163, 36, 18,101, 50, 55,232, 21, 30,136,191,123, 85, 85,174,225, 12,169,196,235, 61,158,121,
-121,121, 57,225,161, 5, 56,188,125, 45,244, 90, 13,114,210, 42,188,106, 70, 94, 9, 44,237,221,110,165,167,167, 27,172,169,227,
-132,226,113, 83,231, 74, 77, 45, 96,250,218,184, 64, 89,124,190, 6, 93, 92, 45, 42, 46, 26,101,185,136, 9,185,142,129,149,125,
- 76, 19, 82,105,120,117,114, 53,104, 59, 45, 76,164,111, 13,127,193, 13,137, 41,153,184, 22,149,190, 55,177, 0, 25,124,108,230,
-222,248,140,162,249,163,123,122, 98,195,201,232, 55, 1,253, 65, 99,246,221,223, 17,147, 9, 65,223,138,206,240, 42, 16,160,175,
-191, 35, 38, 27,152,105,248,148, 38, 43,197,148,175,127, 73,254,232,232, 31,121,163,151, 78,233,103,217,187,247, 8, 25, 56, 45,
- 74, 85, 26,125, 76, 17, 74, 12,213, 44, 81, 9, 0,176,163,114, 1, 0,132,167, 9,251,251,173,188,117,245,224, 28, 15, 7,129,
- 0, 87,227, 53, 0,112,107, 86, 15,211, 91, 62,182,244,199,210, 65,159,249,221, 90,221,227,124, 68,166,112,224,106,124,245, 24,
- 90, 13,150, 59, 33, 4,122,189, 30,130, 32,192,214,214, 22,249,249,249,200,201,201, 65, 78, 78, 14,226,227,227,155,116, 46, 53,
- 3, 81, 83,212,124,234, 50, 15, 96,191, 94,175,223, 95, 84, 84,244, 44, 53, 51,240,244,184, 78,205,218,247,154,205,132,132, 16,
-182, 50,154,213, 88,103,248, 6, 53,107, 54, 19, 18, 66,206, 86, 70,179, 26,139,106,213,210, 20, 4, 33,163,107,215,174,182,163,
- 70,141, 2,207,243,120,248,240, 33,146, 83, 83, 49,120,254,155,176,182,182,198,213,251,247,241,224,193, 3,172, 88,177, 2,122,
-189, 30, 39, 78,156, 72,107, 76,147,101, 89, 93,171, 86,173,164, 99,198,140, 1,199,113, 72, 72, 72, 64,122,122, 58, 22, 47, 94,
- 12, 43, 43, 43,132,135,135, 87,107,230,229,229,129,101, 89, 93, 29,209,173,191,226, 92,250,183,243,148,201,106,216,104, 1, 60,
-120, 61,138, 47,174,196,166,107,208,233,244,104, 27,157,139,199,209,127, 70,164,182, 49,161,247, 79,223,143,140, 77, 12,191,241,
-162, 12, 57, 17, 48,246, 78,226, 97, 62, 50, 45, 76, 74, 75,161, 43,181, 68,194, 47,120,156, 93, 90,246, 48, 31, 70,231,162, 19,
-129,167,160, 43, 7, 50,195,112,243,234, 21, 92,190,125, 15,127, 68,196,242, 55,195,227, 14,211, 2, 62,141,201,199,195, 38,220,
-133,192,124,228, 6,204,136,120,228,217,205,215,201, 19, 60, 7, 34,232, 97, 53,241, 32,102, 70,247,246,236,214,210,218,179, 34,
-146,165,135,205,127,127, 3,190, 54,105, 80, 47, 44, 85,191, 83,118,242,252, 43,165, 69,249, 61, 95, 26,208,203,204,202,127, 56,
-242, 30,197,225,225,189,235,170,240,200,248,155, 97,169,250,157,205, 41, 93, 55, 55,183,254, 47, 13,240,195,196,121, 31, 66, 87,
- 94,140,132,203, 63,160,172, 32, 11,215,110,153, 35,182,164,164, 23, 0,131, 35, 90,183, 82,184,246, 72, 41, 68,159, 22,146, 20,
- 11,104,156,167, 5,142,130,156, 82, 67,208,148,128, 42,207, 67,124,186,182,248,149,237,169, 60, 0, 40,228, 20,107, 70,138, 45,
- 13,138, 60,122,217,181, 81, 48,122,236,187, 24, 5, 65,168,152,190, 73, 16,176,109,223,111,241,243, 63,125,173, 11,218,121,218,
-116,186,155,158, 67,193,136,144, 63, 69,208,239,143,195,159,180, 85,255,250, 49, 32,232,112,125,145,109,219,126,155, 10,250,161,
-137,211,237, 68,102, 32, 29,192,124,176,229, 59, 22,109, 58,247,113,215,139,209,125,151,252,119,180, 37,200, 51,201,208,141,139,
-206,226,251,247, 88,151,124, 94, 32,127,182,231,254, 25,217,242, 39, 25, 37,228,238,213,120, 77,132, 49,162, 28,199,129,136,195,
-190,139,136, 60,151,148,149,149,205,155, 57,115,230, 14,137, 68,226, 0,128, 18, 4, 1,130, 32,176, 95,126,249,165,132,231,121,
-154,166,105,158, 97, 24,238,236,217,179,122,158,231,115,213,106,245, 60, 3,174, 25,241, 11, 22, 44,104,213, 88,134,226,161, 67,
-135,170, 76, 86,188, 88, 18, 6,153,172,154,235,234, 40, 23,219, 64,144,246,147, 62,175,173, 92, 9,128, 2,193,170,232, 92, 60,
-126,242, 35, 17, 5,200,104,199,232, 22,183,239, 54, 96,101,213,119,140,221, 50, 53,207,143,239,214,193,247, 16, 0,104, 8,255,
- 90, 83,246,174, 68,163,122,181,115,183, 94,135, 5, 66, 88,142,144,221,180,128, 99,106, 14, 49,134,100,218,213, 71, 70, 78, 81,
-248,240, 0, 43, 2, 84, 52, 25, 86, 55, 23, 86, 14,227, 64, 8, 33,213,205,133, 95,153, 32,175, 88,211,232, 56, 80, 55, 30,107,
-135,104,185, 63,230, 94,184,113,119, 30,207, 19,103,134,161,178, 84, 90,110, 71,115, 77, 22, 0,164,167,167, 95, 9,185,152,126,
-225,126, 39,167,161,246,138,202, 40, 87, 57,144, 87,142, 11,233,185,101, 87,154,162, 89,168,212,143, 94,182,241,228, 41,153,132,
- 97, 65, 72,197,128,162,132, 64,173,227, 11,110,165,112,237, 1,160,131, 45, 92,223, 59,193, 29, 98, 24, 42,185, 49,189,208, 7,
-153, 27, 38,174, 11,121, 55, 42,169,112,119, 82, 17, 34, 1, 32,169, 8,145, 71,174, 63,254, 56, 62,171,244,221,200,228,194,175,
- 96,100,191, 10, 66,225, 90,183,137, 43,159,122,173,185,199, 51, 54, 19,247, 0,140, 5,210,134, 76, 92,242,221, 18,138,194,179,
-154,126, 34, 78,165, 35, 94, 53, 95,168,138,108, 85, 46, 6,163,213,106,161, 82,169,192,243, 60,116, 58, 29,180,226,188,134, 34,
- 34,207,140,170,168, 22, 77,211,171,159,161,230, 89,138,162, 70, 0,120,100,196,215, 66,203,202,202, 58, 60,227,221,203,231, 56,
-206,160,177, 94,196, 36, 26,131,217,249, 79,253,240, 96, 81,243,239,215,108,221,186, 53, 49,194,176,136,199,243, 95,172,217,162,
- 69, 11, 4, 6, 6,194,213,213, 85, 60,158,162,166,168,105,160, 38, 33,132,105,206, 82,143, 38,213,156, 69, 44,163,127, 61, 79,
-118,134,159, 91, 21,156,160,197, 99,243,252,241,232,209,163,234, 49,175, 68,158,111,146,146,146, 80, 86, 86,134,140, 12,113,190,
- 87, 17, 17, 67,161, 40,138,111,206, 82,143, 38,105,206, 34,150,202,115,107,184, 68,163, 37, 34,242,111,231,202,149, 43,226, 65,
- 16, 17, 17, 17,249,223, 49, 89,181,204, 22,133,111,195, 47,213, 0, 0, 32, 0, 73, 68, 65, 84,250,195,127,198,100, 19, 52, 37,
-132, 24, 34,106,138,154,162,166,168, 41,106,138,154,162,230,255, 59,205,198,180,159,139,108,198,191, 43, 73, 73,236, 15, 32,106,
-138,154,162,166,168, 41,106,138,154,162,230,243,142,216, 71, 75, 68, 68, 68, 68, 68, 68, 68,228,239, 70, 28,246, 85, 68, 68, 68,
- 68, 68, 68, 68,164,121, 52, 58,169,180,136,136,136,136,136,136,136,136, 72,211,104,120, 82,105, 17, 17, 17, 17, 17, 17, 17, 17,
-145, 38, 99,252,164,210, 34, 34, 34, 34, 34, 34, 34, 34, 34, 6,177, 83, 60, 4, 34, 34, 34, 34, 34, 34, 34, 34,127, 15,181,179,
- 14,131,131,131, 73,205,181,136,136,136,136,136,136,136,200,223,201,243,234, 69,196,166, 67, 17, 17, 17, 17, 17, 17, 17,145,230,
- 49, 87, 52, 90, 34, 34, 34, 34, 34, 34, 34, 34,127, 13,245,246,209,170, 26,176,116, 96,101,168,110,160,120,172, 68, 68, 68, 68,
- 68, 68, 68,254, 1,158,111, 47, 34,246,207, 18, 17, 17, 17, 17, 17, 17, 17,189,200,179,161,170, 51,188,136,136,136,136,136,136,
-136,136, 72,243, 16,231, 58, 20, 17, 17, 17, 17, 17, 17, 17,249,155, 13,215, 95,110,180,196,153,205, 69, 77, 81, 83,212, 20, 53,
- 69, 77, 81, 83,212,252,255,100,178,106,153, 45, 49,235, 80, 68, 68, 68, 68, 68, 68, 68,164,121, 52,154,117, 40, 34, 34, 34, 34,
- 34, 34, 34, 34,210, 52,230, 2, 8,172,124, 28,136, 26, 81, 45, 49,162, 37, 34, 34, 34, 34, 34, 34, 34,210, 60,118, 2,112,169,
- 52, 88,103, 0,100,138, 70, 75, 68, 68, 68, 68, 68, 68, 68,228,217, 80,179, 95,214,200, 26,230, 75, 52, 90, 34, 34, 34, 34, 34,
- 34, 34, 34,205,164,222, 62, 90, 20,234,207, 28, 8, 49,226, 7,154,146,125, 16, 34,106,138,154,162,166,168, 41,106,138,154,162,
-230,255, 59,205,198,180, 67,240,239,227,169, 97, 29, 8, 33, 59,255,142, 31, 22, 83, 95, 69, 77, 81, 83,212, 20, 53, 69, 77, 81,
- 83,212,252,127,199, 95, 54, 96,105, 23,192, 84, 60,188,207, 37, 78,149,139,136,136,136,136,136,136, 72,195,252, 53, 89,135,254,
-192,127,167, 6, 56,108,215, 71,230, 90, 70, 2,229, 13,125,214,193,193, 97,135, 66,161,152, 90, 94, 94,174,164, 40, 74,168,233,
- 0, 1,212,156, 28, 40, 33, 55, 55,183, 95, 99,191, 45,147,201, 54, 58, 57, 57,253,183,172,172,172,156,162, 40, 66, 81, 20, 40,
-138, 2,128,167,214, 60,207,167,229,231,231,119,253,151, 91,101,198,222,201,233,119, 9,195,184, 25,251, 85, 94, 16, 30,231,100,
-103,247, 50,226, 43,107, 41, 10, 75, 43,126, 22, 95, 0,248,240,185,187,243, 0, 24, 67, 62, 23, 0, 88,196, 1, 19,121,154,126,
- 83, 2,108,209, 8,194,118, 0,160, 0,190,169,191,173, 9, 69, 43,138,160, 19, 69,193,138, 16, 20, 19, 10,247,228, 61, 16,255,
- 15, 29,138,113, 18,137,100,180,165,165,165,121,126,126,254, 21, 0,135, 0, 76,178,179,179, 27, 80, 82, 82, 82,166,215,235, 79,
- 2, 56,222, 20,225,126,157,240,190, 76, 42,153,165,214,233,215,223,184,135, 31, 6,116,129, 29, 39, 96,157,137,148,237,167,209,
-114, 95, 92,191,143,221, 70, 74, 82,149, 75,213, 53,195,232, 73,197,142, 26, 88,238, 0,112,194,198,198, 87,238, 96,249,171, 68,
-198, 60, 46,202, 46,155, 58, 62, 39, 39,117, 66, 51,202,253,127, 17,123,123,251, 25, 52, 77,127, 78, 8, 1,207,243,203, 11, 10,
- 10,246, 60, 35,233,229, 0,172, 43, 31, 23, 1,248,188,153,122,201, 0, 60, 43, 31,167, 0,240, 18,235,245, 38,179,237,231,159,
-127,158, 63,104,208, 32,108,216,176, 1,219,182,109, 75,202,205,205, 93, 7, 96, 47, 0,237, 63,160, 35, 82, 31,237,128, 17, 95,
- 14,235,193,235,127,252, 84,168,241,242,224,122,254,204,223, 79,155, 54, 77, 71, 8, 33, 15, 30, 60, 32, 90,173,150,232,245,122,
-194,113, 28,225, 56,142,232,245,250,234,197,205,205, 45,253,137,175, 63,165, 73,211,244,166, 87, 94,121,165,148, 16, 66,194,194,
-194,136, 74,165, 34, 26,141,134,104,181, 90,162, 86,171,137, 74,165,170,181, 56, 57, 57,101, 55,164,105,105,105, 25,102, 99, 99,
-147,109, 99, 99,147,109,107,107,155,109,107,107,155,109,103,103, 87,189,216,219,219, 87, 47, 14, 14, 14,217, 14, 14, 14,217,182,
-182,182, 97,141,109,103, 37,195, 0, 92, 49, 96, 25, 86,199,119, 7,215, 52, 90, 46, 46, 46,217,164, 9,184,187,187,167, 26,176,
-157, 85, 56, 81, 20,248,170,239, 82, 20, 4,185, 92,238, 89,243,125, 60, 29,233,106, 52,164,236,234,234,250,138,139,139, 75,136,
-139,139,203, 69, 87, 87,215, 87, 12, 56,197,106,105, 90, 88, 88,132,217,219,219,103, 59, 59, 59,231, 84, 45, 46, 46, 46,181, 22,
- 87, 87,215,234,197,201,201, 41,219,198,198,166,222, 50, 34, 0, 83,223,114, 25, 96,229,192,139, 44,195, 4, 59, 57, 57,149, 68,
- 68, 68,240,132, 16, 66,211,116,122,213,103,140,217,247, 39, 77, 86,249,117, 44,207,187, 36, 15, 45,123,188,174, 56,239,146, 60,
-180,252, 58,150,107, 66,209,170,169,154, 6, 82,151,230,244,233,211,167,223,203,206,206, 78, 47, 42, 42,202,220,190,125,123,156,
-137,137,201,245,237,219,183,199, 21, 21, 21,101,102,103,103,167, 79,159, 62,253, 30,128, 5, 70,104, 2, 0,122,117, 66,207,217,
-227, 92,202,239,157,120,173,252,197,110,236,221, 62, 1, 8, 28,210, 75,154,190,249, 3,255,242,171,187,250,150, 15,122,129,142,
- 52, 82,147, 98, 89,182,183,167,167,231, 44, 7, 7,135,105,149,203,107, 85,139,179,179,243,107,206,206,206,175,217,216,216, 76,
-104, 72,243, 40,192, 24,178,120,152,152,244,158,224,227, 89,158,188,122, 21,137,120,251, 77, 50,171,165, 71,201,120, 71,199, 22,
-255, 64, 25,253,165,154,142,142,142, 25,122,189,158,232,116, 58, 98,103,103,151,241, 12,183,243, 43, 66,200, 87,132,144,175, 0,
-124,245, 12, 52,171,175,103, 70, 24,236,134, 52, 77, 88,154, 94,162,144,201, 46,202, 89, 54, 71,206,178, 57, 10,153,236, 34, 75,
-211,239, 2, 48,249, 95, 42,163,191, 64,211,220,193,193, 33,113,227,198,141,164,188,188,156,148,151,151,147,141, 27, 55, 18, 7,
- 7,135, 68, 0,230, 70,104, 54, 85,231,121,138, 96,213, 90,170,154, 14,159, 73, 68,203, 31,232,250, 98,167,214,199, 22,205,152,
- 8, 33,104, 35,213,200, 29,211,247,189,186,118,157,181,119,239, 94, 0,192,212,209,163, 49,180,123,119, 88,152,155, 65, 38,171,
-216, 28,138, 80,144, 74,164, 24,179,248, 29, 67,126,254,139, 49, 99,198, 76, 9, 10, 10, 50, 7,128,109,219,182, 97,220,184,113,
-176,181,181,133, 66,161,128, 84, 42,133, 68, 34,169,181,110, 12,134, 97,220,211,211,211, 29, 77, 76, 76,170,163,108,130, 32,212,
- 90,106,206,202,205,113, 28,218,180,105, 99,232,225,250,160,184,184,184,191, 82,169,172,214,168,107,241,241,241, 1,128,243,134,
- 8,126,254,217,167, 16, 56, 37, 88, 22,224, 56, 64,163,163, 33,144, 58,205, 13, 22, 44, 88,208,172,217,196, 71,142, 12,164, 40,
-138, 10, 10, 15, 15, 63,150,147,147,227, 45, 8,252,156, 38, 70,186,222,120,248,240,161, 57, 0,248,250,250, 46, 0,112,204,152,
-237, 96, 89,214,253,254,253,251,142,114,185,188,222,200,101,141, 8, 38,116, 58, 29,186,116,233,194, 25,243, 27, 78,128,103, 1,
- 77,207,233,252,194, 11,115, 87,142, 25, 99,242,251,239,191,155,208, 52, 13,142,227,240,229,151, 95,114,132, 16,235,118,128,101,
- 52, 80,210,128,204, 50, 0, 51, 42, 43,131,221, 0,190,172,229, 22, 8, 58,169,244,242,192,132,178, 49,221,123,180,120, 31,209,
- 81, 17,221, 91,154,159,128, 5,171,137, 7,254,222,168,150,165,165,229,232, 13, 27, 54, 56,236,222,189,187,228,193,131, 7,186,
-237,219,183, 59,204,155, 55,207, 66,167,211, 97,254,252,249,185,126,126,126,210, 13, 27, 54, 56, 28, 63,126,252, 69,165, 82,185,
-213,168,242,162,240,233,164,209, 67,161,214,211,208,235, 57, 7, 23, 7,139,253,139,166, 15,148, 16,162,197,190,147,225,208,115,
-194, 15, 70, 70,178,122,141, 31, 63,190,229,193,131, 7,217,216,216, 88,182,109,219,182, 16, 4, 1, 60,207, 67,175,215, 3, 0,
- 4, 65, 64,235,214,173,155,125, 92,102, 1,190,246, 78,182, 23,123,141, 24,110,234, 98, 34,135,109, 97, 46,102, 75, 89,139, 61,
- 10,205, 1, 0,189,159,171,200, 46, 33, 96, 89, 22,169,169,169,112,116,116, 52, 21, 4, 33, 19,192,170,194,194,194,157,120,126,
-233, 46, 99,217, 99,251,126,216,228,220,163,119,111,198,201,197, 17,113, 15, 83,192, 82,252,224,251,127,132, 15,156,245,250,146,
- 69, 90,142,123, 5,192,239,207,219,142, 59,247, 94, 48,150,162,153,109, 20, 17,240,201,230, 83,165,107,191,216,168,152, 63,103,
- 58,179,120,241, 98,120,120,120,120,143, 29, 59,246, 11, 0,175, 55,170,211, 99,193, 88, 48,244, 54, 16,130,149,223,157, 42, 93,
-243,197, 70,197,235, 77,208,249,151, 83,239,127,164,217, 70,203, 31,104,217,222,195,241,194,218,165,175, 75,200, 47, 63,210,229,
-249, 57,245,126,214,193,193, 97,199,203, 47,191, 60,117,207,158, 63,163,209,189, 2, 2, 48,246,197,190,112,180,179,130,194, 76,
- 86, 81, 29, 9, 20,238, 61,120,108,144, 33,240,240,240,152,127,236,216, 49,243,154,102, 66, 42,149, 86, 47, 53, 77, 86,213, 82,
- 85, 1, 55,132,137,137, 9, 66, 66, 66,192,178, 44, 24,134, 1,203,178,213, 75,205,231, 12,195,192,201,201,168,174, 75,235,172,
-172,172, 58,150,150,150, 90, 22, 21, 21,193,211,211,179, 4,192,253, 26,239,119,204,205,205,181, 52, 70, 80,224,148, 88, 60,219,
- 31, 18,237,109,104, 37,221,161, 98,251,224,230, 31, 49, 8, 62,127, 5,233, 25, 89,232,219,179, 51,166, 77, 30,143,139, 23, 47,
-130,231,141,110,233,200, 38, 4, 95,140, 26, 21,248, 62, 64, 81,131, 7, 15, 46, 90,184,112, 33, 29, 27, 27, 59,101,236,216, 49,
- 1, 15, 31, 62,170,140, 42, 82, 75, 9,193, 38, 0,217, 6,234,202, 0,224,234,213,171, 0, 32,111,202,185, 39,151,203,113,235,
-214, 45, 84, 53, 19,211, 52, 13,154,166,193, 48, 12, 78, 63,178,135, 82, 75,163, 60, 59, 18,111, 6,122,194,199,199, 7, 52,221,
-120,151,196,129,128,201, 77, 96, 44, 37,145, 44,118,113,117,245, 30,208,178,165, 34, 36, 36,132, 1, 0, 47, 47, 47,146,153,153,
- 89,116,242,228,201, 82, 22,216,230, 69,200,222,134, 76,150,135,135, 71,159,244,244,244,207,171,142, 57, 69, 81, 95,180,104,209,
- 98, 69,117,185, 9, 2, 86,253,160,148, 44, 90,244,182,180,199,192,143, 0, 0, 61, 70, 29, 68, 73,194, 90,127,170, 96,153,213,
-223,125,149, 40, 41, 41, 57,220,186,117,107, 38, 63, 63,255, 38,128,100,189, 94,255,193,254,253,251, 29,103,207,158,157,115,224,
-192,129,117, 0, 92,215,175, 95, 63, 80,169, 84, 30, 49, 70,183,111, 71,140,120,161, 99, 64, 79, 79, 15, 15, 92,185,249, 59,164,
- 50,137,245,130, 25,129, 48, 55,103,241,213,238, 51, 66,114, 90,193,194,235,247,177,215, 8,147,213,125,252,248,241,222, 7, 15,
- 30,148, 1,192,253,251,247,145,149,149, 5, 7, 7, 7,152,154,154, 66, 34,145,128, 97, 24, 72, 36,146,103, 98,178,172, 60,236,
- 66, 79,156, 56,105,106,107,107,141,205,239, 44,194,180,156,108, 88, 91,152, 67, 95,166,244,126,206, 42, 10,223,126,253,250,153,
-240, 60, 15,165, 82,137,203,151, 47, 91,153,154,154, 90,185,187,187,175,108,168, 18,169,227,218,153,173, 86,171, 29, 43, 31,231,
-168,213,106, 39, 0, 37,114,185,188,234, 58, 93, 86,185, 54,180, 57, 49, 25, 79, 55, 19,166, 80, 20, 85,243,181,166,210,173,123,
-183,142, 33,199,131,126, 50, 47, 46,205,130,181, 77, 14,104, 20, 99,231,206, 45, 48, 53,181,196,202,149,203,216,199,131, 95,116,
- 27, 54,226,149,144,168,152,184,193,207,157,217, 34,212,206,193,163,166,218,154, 42, 44, 42,235, 18, 61,246,236, 90, 4,154,166,
-177, 98,197, 10,180,111,223,126,110, 84, 84,212, 71, 0, 10, 26,150,193,206, 14,253, 95,181,149,153, 84, 20,177,192,235,177,253,
-208,187, 21, 58, 31,206,195,164, 81, 62,115,223, 27,159,120,174,125, 75,148, 86,222,152,171, 36, 52, 82,168, 30,168, 54, 12,193,
-193,193, 3, 2, 3, 3,175,212,247,252, 95,128, 11,254, 28, 63,171,150,249, 98,131,131,131, 73, 96, 96, 32, 85, 99,231,106, 61,
-111,136, 78,128,189,141,149, 34,100,219,170, 69,230,236,237, 51,140, 42,229, 17, 50,212,181, 42,242, 90, 41,154, 10,133, 98,234,
-158, 61,123,106,133,148, 60,157, 28, 33,149, 74, 32,145, 82,176,238, 87, 49,122,125,209,181, 96, 80, 84,189, 38,171,150,166, 82,
-169, 84,223,189,123,215,124,247,238,221,112,116,116,132,183,183, 55, 20, 10, 5, 76, 76, 76,106,153,171,154,134,171, 14,163, 85,
- 75,179,234,125,150,101, 65,211, 52, 46, 94,188, 8,142,227, 48,126,252,248,167, 76, 22,203,178,245, 25,183,250,210, 83,207, 3,
-184, 79, 8,233, 95, 89, 1,223, 7, 48,160,198,251,195, 28, 28, 28, 62, 0,176,206, 80, 77,134, 33, 96,212, 55, 33,184,111, 4,
-155,186, 8, 90, 73, 39, 92,186, 30,142, 61, 59, 54, 0, 0,188,219,118,195,132,177,129,213,209, 56, 3,183,179, 26, 55, 55,183,
- 67,185,185,121,195, 95,124,241, 69, 20, 22, 22,234, 87,173, 90,133,142, 29, 59,194,215,215,215,160, 50,170,231,206, 57,251,254,
-253,251, 30, 42,149, 10,132, 16, 67,204,217, 83,154, 20, 69, 97,255,254,253, 80,171,213, 79,125,216,102,192, 26,188, 59,206, 11,
- 51,223,220,139, 47, 30, 28,193,214,173, 91, 27,220,119, 5,208, 81,109,213,122,147,140,225, 58,174, 91,246,134,124,218,180,105,
-204,204,153, 51,145,146,146,130,217,179,103,171, 47, 94,188,168,205,202,204, 60, 41, 19,132,205,186,218,198,184, 94, 77,185, 92,
-190,239,252,249,243, 56,114,164,194,151,196,197,197,161, 77,155, 54,102,181, 76,114,193, 81,148, 38,111, 70,232,233, 88,244, 24,
-117, 16,161,167, 39,131, 47, 58, 35,233,218, 6,197,198, 28,207, 38, 80,151,230,145,252,252,252,106, 19,117,224,192, 1,211, 3,
- 7, 14,140, 1,112, 10,192, 17, 0, 40, 40, 40,248,198, 72, 77,128,194,204, 87,199,141, 1, 43,181, 64,236,163, 52, 12,232,213,
- 5, 78,142,142,184, 31, 19,143,228,244,130,108,138,194,140, 97,189,101,235, 84, 42,237, 71,215,238,225,251, 70, 52, 41,119,119,
-119,223,163, 71,143, 74,107, 68,160,171,255,227, 12,195, 84, 63,175, 50,222, 77, 57, 63,171, 76,150,133,187,121,232,167, 91,250,
-152,133, 70, 28, 64, 27,175, 17,176, 25, 17,136,239, 47, 92,192,195,168,104,181,182,156,123,233, 31, 40,163,191, 74,211,119,220,
-184,113, 55,127,250,233, 39,235,212,212, 84, 92,189,122, 21,222,222,222, 40, 47, 47, 55,228,134,183,150,166, 90,173,118,172,250,
- 14, 69, 81,142, 85,129,119,173, 86, 91, 85, 24, 85,127, 68,235, 26,159,179,110, 64,211,179,198,231,170,204,149,215, 51,216,119,
-153,137, 84,122,244,196,241, 67,230,209,177, 87,209,185, 83, 79,152, 91,181,131,192,103, 33,191,160, 12,133,143, 50,240,217,103,
- 95, 96,229,170,229, 56,245,115,144,185,159,127,167, 99, 90,142,107, 13, 64,253,220,148, 59, 69,230,134,156, 62,176,141, 34, 2,
- 84,217,177,114,137, 50, 81, 49,117,242, 43,204,196,137, 19,113,234,212, 41, 68, 69, 69,109,107,192,100,133,212,136,204,207,141,
-188,122,100, 27, 8,129, 42, 39, 86, 46, 85, 37, 42,166, 79,153,192, 76,155, 52, 20,183,127,219,132,161,157, 19, 35, 93, 29, 49,
-182,176,210, 98,179, 12,242,229, 38,184, 65, 66,113,187,134,217,186, 12,128,170, 97,176, 46,227,207, 62,152,255, 6, 70, 86, 26,
-171,185, 79,222,152,176, 77, 49, 88, 0,208, 6, 48,167,100,210,208, 61, 43,223,112, 85,164, 68,177,154,200, 91,200,208, 8,100,
-123, 18, 39,116, 1, 76,239, 0,170, 39,191, 83, 94, 94,174,140,143,143, 55,157, 49,118, 44,122, 7, 4,192,197,206, 14,173,221,
-221, 97, 42,151, 65, 38,149,212,186,101, 53,184, 13,129,162,136,159,159, 31, 70,141, 26, 5,137, 68, 2,133, 66, 1,115,115,115,
-200,100,178, 58,163, 89,134,222,229, 18, 66,192, 48, 12, 34, 35, 35,145,156,156, 12,107,107,107,220,184,113, 3, 47,189,244,210,
- 83, 81,173,154,230,204,152, 16,125, 29, 21,127,149, 17, 59,111,140, 22,207, 83, 40, 35,157, 96,146,180, 16,229, 84, 23,104, 52,
- 28, 52, 26, 13,190,191,174,195,239,241, 74,232,116, 90,104, 52,154,134,126,179, 62,104, 87, 87,215,169,173, 91,183, 94, 48,121,
-242,100,189, 76, 38,131, 82,169, 68,121,121, 57,162,162,162,244,195,135,143, 40, 26, 53, 42,208,234,204,153, 51,164,178,233, 48,
-219, 8,237,124, 55, 55, 55,143,202,230,217,252,166,156,213, 20, 69, 85,155,152, 39,153,241, 77, 52, 88,166,162, 76,182,109,219,
- 6,158,231, 65, 8,169,183,144,212, 20,245,235,170, 53, 95, 91,173,223,248, 3,172,108,157,112,229,202, 21,254,220,185,115,165,
- 20, 16,247, 48, 42,234,155,255, 0,103,143, 2, 58, 99,182,175,176,176,208,212,219,219, 27,238,238,238, 16, 4, 1,122,189,190,
- 58,250,146,159,159, 15,149, 74, 5, 91,179, 34,180,178,115, 7, 87,122, 25,153,145,159,192,197, 60, 22,123,207,107,245, 47,248,
-226,222,255,192,133,227,199,202,165,153,119,205,112,115,116,246, 0, 77,244,200,200,201,199,152,145, 67,193, 72,205,241, 56, 53,
- 15,157,218,181,116,153,242,159, 62, 46, 12,197, 97,233,186,131, 11, 0,225,251,198,228,202,202,202,248,216,216, 88,220,191, 95,
-225,119, 45, 45, 45, 97,102,102, 86,235, 63, 78,211,116,179, 34, 90, 85, 38,107,205,182,151,204,104,137, 18, 37,124, 8,118,239,
- 15, 71, 39,191, 64,108, 15,253, 67,205,103, 23, 12,254, 74,173,142, 59,244, 47, 14,102, 56, 59, 59,207, 19, 4, 97, 37, 33,164,
-168,111,223,190, 78, 7, 15, 30,180, 73, 79, 79, 71,120,120, 56, 86,172, 88,145,203,243, 60, 71, 8,161, 8, 33,159, 60,131,159,
- 19,106, 24,172,103,137, 68, 97,130, 55,237, 45,169,209, 44,109,233,205,149,148, 61,206,211,146,147,229,156,240, 29, 0,125,131,
- 23, 55,154,254,111,208,225,109,174,246, 14, 2, 6, 58,188,136,204,108, 29,214,188, 51, 29,249,249,165,248,126,215, 90, 0, 50,
-232, 56, 6,253, 7,190, 2, 71, 71, 55,204,157, 51,215,121,219,142,237,111,112,130,240, 21,158, 19,178,110,110,253, 25, 64,136,
-131,131, 67,212, 27,115,231, 58,120,123,191, 6, 19, 19, 19, 28, 58,116, 8, 7, 55,111,230, 55, 2, 19,228,192,165,249,192,207,
- 13,234,132,254,169,179,104,254,124, 7,127,255,249,144,203,229,248,237,220,143, 80,103,237, 47, 29,217, 27,186,114, 53, 70,182,
- 24, 69,108,147, 78, 83, 5, 18, 9, 30, 1,128,196, 4,153, 0,158,108, 6,251,183, 25,172, 42,206,224,207, 76,195,185,181, 34,
- 90, 77,190,118, 74,100, 17,187,222,158,228,229, 4, 13,165,189,126, 26,233, 26,129, 95,255, 80,199,220, 41, 38,239,198,212, 97,
-178, 42, 79,108,193,211,211, 19, 47,118,237,138,177,253,250,129,101, 89,152,200,164,176, 48, 49, 5,225, 43, 34, 89, 85, 77,135,
- 13,212,137,168, 43,250,100,103,103, 7,169, 84, 90,109,176,140,136,102,213,169, 41, 8, 2, 88,150,197,253,251,247,209,183,111,
- 95,120,120,120,224,200,145, 35, 24, 54,108,216, 83, 77,137,198,154,172, 42,163,245, 68, 51,222, 48, 0, 85,145, 44,163,140,150,
- 90, 75, 33, 79,219, 9, 20, 21, 0,142, 3,120, 2,104,212,106, 16, 2, 16, 2,232,117, 90,168,213,234,234,223, 52,164, 73,214,
-217,217,217,211,212,212,116,245,251,239, 47,245,239,212,169, 51,114,115,115, 33, 8, 2,204,204,204, 80, 94, 94, 14, 75, 75, 75,
-244,238,221,251,241,234,213,171, 51, 9,193, 92, 35, 77, 86,179,169, 58,230, 23, 46, 92,168,213,108, 88,181, 40, 51,211, 48,243,
-173, 3,144,177, 21, 77, 75, 85,125,120, 26,186,238, 14,234,223, 7, 55,239,196,113,255, 93,186, 73, 35,201, 15, 95,231, 44, 8,
-123,210,154,177, 95,132, 16,228,229,229, 33, 59, 59, 27,163,199,140,193,193,159,126, 66, 82, 82, 18,218,181,107,135, 65,131, 6,
-193,209,209, 17, 73, 73, 73,248,253,154, 6,154,194, 2, 20,104,195,161,176,232,129, 19, 87,226, 53, 43,182,233,226,255,193, 11,
-198,104, 0,211, 45, 45, 45,125,202,203,203, 51, 57,142, 59, 10,224, 40,128, 9, 44,203, 78, 80, 40, 20, 46, 37, 37, 37,137,168,
-200, 38, 58,217,152,152,169,137,137,157,220,196, 18, 2,167, 1,203,178,240,240,240, 6,225,181, 40, 44, 81, 97,198,196, 81,184,
-115, 63, 6,231, 46,221,230,244,122,225, 91, 67, 14, 43,195, 48,196,215,215, 23, 57, 57, 57,144, 72, 36, 48, 53, 53,133,185,185,
- 57, 62,252,240, 67,108,222,188,185,218,100, 53,213,104,205, 2,124, 45, 61,205,111,127,190,165,194,100,101,101,100, 34, 59, 77,
- 2, 7, 59, 39,124,187,121,163,178, 48, 41,171,199, 15, 64,220,191,189,146, 21, 4,225,147,244,244,116, 71,150,101,157, 57,142,
- 67,106,106, 42,194,194,194,176,112,225,194,236,252,252,252,129,104,226, 62,154,152,152,228, 84, 69,178, 42,155, 14,235,107, 78,
- 44,170, 17,201, 42,106, 64,178,190,102,194,150,222,238, 22, 23,119,109, 88,236,217,173, 71,111, 90,193, 90, 22,150, 61,202,234,
-123,253,234,149,222, 11, 55,124,255, 70,114, 97,217, 80, 0, 9,245,137,202, 37,146,225, 61,251,244, 97, 65,178,193,202,250,226,
-139,245, 19,145,155, 87,130,194,130, 82, 72,165,102,208,234, 25,240, 2,133,222,125,251,225,199,189,135,209,126,206,108, 70, 38,
-145, 12,225,180,218,231,198,104, 85,178,246,187,239,190,243,244,243,243,195,158, 61,123,112,105,223, 62, 76, 43, 46,198, 21,154,
-102,244, 18,137,253, 89,189,126, 39, 26, 49, 90, 53,117,218,183,111,143, 31,126,248, 1,251,247,239, 79,153,250, 82,206,177,197,
- 83,225,168,211,225,229,240, 7,176,109, 49, 10, 8,127, 0,219, 23,252,208,154, 99,241,136,162,106, 15, 7, 21, 28, 28, 60,160,
-230,250, 95, 70, 38,234,105, 98,103, 1, 12, 12, 14, 14, 38, 53,215,141, 94, 56, 29,218,204, 95, 59,212,199, 43,160,149, 39,165,
- 63,178, 9,169, 74, 78,251,209, 3,157,236, 97, 25, 89, 28, 3,108,108,224, 14,130, 48, 12, 3, 11, 83, 83, 56, 88, 91, 87,132,
-249,105, 26, 16, 0, 65, 15, 80,124,133, 1, 32, 2, 5,194, 27,117,193,128, 76, 38,171,179,227,187,177,125,179,106,106,150,150,
-150,226,241,227,199,152, 59,119, 46, 20, 10, 69,133,115,207,202,130,151,151, 23, 88,150, 69,122,122, 58,126,251,237, 55,248,248,
-248, 64, 46,151, 27,229,182,106, 68,151, 58,162, 34,203,176, 99,102,102,166,165,139,139, 11,140,142,104, 9, 4,229, 26, 10, 90,
- 45,143,135, 15, 31, 34, 35, 35, 3,143, 19, 31,161,155,178, 4, 4, 12, 8, 33, 70, 69,180,220,220,220, 2, 90,182,108,185,125,
-221,186,117, 82,119,119,119, 16, 66, 96, 99, 99,141,242,242,114,228,229,229,163, 93,187,118,240,240,240,192,186,117,235, 0,224,
-224,223,109,178,158, 56,167,170,141, 86, 77,195,245,214,127, 60, 81, 80, 96, 14,134,161,171,141,115, 35,125,180,164, 0, 48,112,
-232, 56,246,226,185,179,102, 28,176, 58,139, 97, 86,179,141,151,163,158, 23, 4, 69,125,239,167,166,166, 66, 34,145, 32,232,232,
- 81, 20,100,103,163, 83,167, 78,232,222,189, 59, 30, 61,122,132, 59,119,238,192,206,206, 14, 14,238,189,112, 37, 81,135,232, 12,
- 21,172,172,172, 16,159, 70,255,147, 67, 6,204, 25, 60,120,240,138,111,190,249,198,209,217,217, 89,146,155,155,235,183,101,203,
-150, 78, 91,182,108, 89,244,198, 27,111, 56,189,241,198, 27, 54, 14, 14, 14,108, 86, 86,150,239, 59,239,188,243, 66, 72, 72,136,
- 15,128,175, 27, 18, 52, 51,179,176,101,164,102,160, 40, 22,214, 86, 54, 96,101,102, 16, 56, 22,188, 0, 88, 90, 57,224,230,157,
- 32,220,136, 40,157,151,147,143,163, 6,197,199, 42,203,221,206,206,238,169, 72,245,194,133, 11,177,107,215,174,234,102,196,166,
-154,172, 53, 91, 94, 50,167, 42, 77, 86, 86, 42, 11, 74,227,131,211, 63,223, 42, 42, 76,202,234,251, 60,152,172,170,107, 28, 33,
- 4,137,137,137, 40, 47, 47,199,181,107,215,240,201, 39,159,228, 62,105,178, 28, 29, 29,231, 88, 90, 90,174, 42, 43, 43,251, 34,
- 43, 43,107, 83,163, 55,126, 21, 38,170,234,113,213,186,206,230, 68, 3, 55,213,171,174, 72,150,135,139,201,249, 59,215, 14,120,
- 89,145,123, 20,146,231, 2, 15, 75,162, 44, 66, 29,251,143,232, 54,146,238,178,245,211, 22,221,231,125,120, 62,181, 68,237, 87,
- 95,100, 75,224,249, 46,102,230, 22, 0,114, 16, 30,118,185,218,100,229, 23, 20, 67,163, 99,160,209, 82, 80,235,104,188, 56,248,
-101,108,222,190, 31,233, 57, 5,224,121,190,195,115,102,178,108, 3, 2, 2,230, 79,152, 48, 1,171, 87,175, 70,200, 55,223,104,
- 95,167,168, 18, 22, 32,103,120, 30, 2, 33, 20,109, 88, 39,246, 90, 58, 95,125,245,213,207, 0, 38,173, 91,136, 94,133,101,152,
-225, 58,138,216,182, 24, 85,241,193,241,239, 19, 0,176,205, 13,169, 93,101, 6, 6, 6, 82, 85, 45,107,198,182,176,253,175,195,
- 6, 6, 6, 94, 9, 14, 14, 70,205,117, 67, 95,176,112,242, 27,241,222,146, 5,235,187, 13,235, 71,101, 46, 25,130,130, 18, 53,
-183, 44, 90, 39, 75, 83, 53,108,178,106,242,222,150, 45,184, 19, 87,241, 63,118,119,116,196,210, 41, 83, 64, 56,224, 70, 84, 52,
- 14,135,132, 96,226,224,193, 48, 51, 49, 49, 56,178, 33, 8, 66,157, 81,172,154,209, 44, 99,163, 78, 69, 69, 69, 56,122,244, 40,
-186,119,239, 14,133, 66, 1,150,101,209,177, 99, 71,196,196,196,160,101,203,150,160, 40, 10, 39, 78,156,192,216,177, 99,145,144,
-144,128, 94,189,122,153, 39, 39, 39, 27,109,180,162,163,163, 45, 9, 33,253,171,162, 31, 77, 69,163,209, 32, 54, 54, 22,163, 70,
-141,130,141,141, 13,220,220, 14, 34,228,252, 1, 40, 2,166,129,162, 96,148,209,226,121,126,214,200,145, 35,165, 20, 69, 65,165,
- 42,135,137,137, 41,204,204,204, 97, 97, 97, 9, 95, 95, 63,100,100,100, 96,216,176, 97,218,248,248,248,173,153,153,153, 71,140,
-221, 86,127,127,127,179,164,164,164,105, 45, 90,180,144, 1,128,169,169,105,187,150, 45, 91,190,155,144,144, 80,106,108, 84,171,
-202, 96, 81, 20, 5,134, 97,170,141, 22, 75,211,112,113,118,172,126, 94,217, 63,141,106, 64,171, 36, 61, 95, 35, 7, 0, 79, 79,
- 79,108,222,113,138, 30, 57,114, 36, 22, 45, 90, 4,189, 94,143,173, 91, 43,146,236, 38, 79,158, 12,157, 78,135, 99,199, 42,146,
- 36, 89,150,109, 48,108, 18, 22, 22,134,240,240,112,232,245,122, 20, 23, 23,227,151, 95,126,193,149,171, 87,113,232,196,175, 72,
- 74,124,132,142,126, 94,152, 61,123, 22, 36, 18, 9,246,238,221,139,190,125,251,254,163, 23, 4,137, 68, 50,117,215,174, 93, 46,
-123,246,236, 41, 58,113,226,132,178,103,207,158,242,141, 27, 55, 58,110,222,188,217, 65,171,213,226,237,183,223,206,185,125,251,
-182,102,204,152, 49,102, 59,119,238,116,105,213,170,213, 16,142,227,234, 50, 90,102, 0, 38, 2,120,173,176, 84,203, 22,149,170,
- 32,112, 90, 36, 38, 61, 70,113,153, 22, 2,175, 67, 74, 90, 6,202,212, 60,242, 11, 74,209,177,203,208,239, 46, 95,190,188, 92,
-167,211, 45, 3, 16,220,216,118, 70, 69, 69,225,246,237,219, 72, 74, 74, 66, 98, 98, 98,109,167, 56,103, 14,246,239,223,111,116,
- 68,171,110,147,197,128,210,180, 68,240,137,208,162,156, 71,153,207,141,201,170,188, 6,173,116,113,113, 89,233,226,226, 98,114,
-225,194, 5,171, 22, 45, 90,128,227, 56,237,147,145,172,129, 3, 7,126,180,107,215, 46,151,150, 45, 91, 46, 4,176,233,127, 97,
-219,105, 26,115,190,216, 54,223,222, 66,150,146,129,135, 95, 87,142, 37,200, 0,229, 37,192,229,159,192,246,249,248,241,194, 49,
-239,219,124,176,103,245, 28, 1, 66,189, 25,178,241, 9,169,216,182,109, 51, 22,191, 61, 3, 63,126,255, 5, 4,129,133, 70,207,
-192,211,187, 39, 52, 58, 1, 20,205,162, 83,151,174,184,116,249, 26, 36, 52,112,116,207,182,231,204,103,161, 32, 50, 50,114,235,
-137, 19, 39,222, 92,180,104, 17, 4, 65,144,173,218,182, 77,149,155,155,187, 22,198,141,127,245,164,206,216,109,219,182,197,125,
-176, 57,247,231,197, 83,193, 36,157,166, 10,194, 31,192,118,252,251, 4, 65,235, 41,188,224,135, 2, 69,221, 85,252,213, 39,214,
-207,135,209,170,114,146, 53,215,117,209,165,141,207,167, 86,182, 54,179,104, 11, 55,251,165,139, 94,103, 19,178,212, 56,214, 98,
- 74,217,111,251,190, 53,203,226,228,223,197, 67,189,209,152, 31, 62,252,219,111,213,143,191, 60,120,176,206,247, 50,199,143, 55,
-248,206,172,190, 40,150,177,145, 44, 0, 80, 40, 20,214, 67,134, 12,193, 75, 47,189,132, 87, 94,121,165,186, 79, 86,231,206,157,
-113,232,208, 33,140, 27, 55, 14,119,239,222,133,139,139, 11,218,182,109,139,182,109,219,226,236,217,179,198, 94,228,192,243, 60,
- 2, 2, 2,170,178, 14, 59,166,165,165, 89, 54,181, 32, 53, 26, 13,242,243,243, 97,107,107, 11,153, 76,134, 30, 61,186,227,205,
-183,122,192,222,229, 7, 4,248,251, 65,169, 84, 86,167,191, 27, 80,217, 6,180,110,221, 26,185,185,185,200,205,205,133,131,131,
- 3, 92, 93, 93,225,236,236,140,175,191,254,154,108,218,180,233,156, 78,167,219,154,151,151,103,116, 36,203,217,217,185, 31, 69,
- 81, 31,169, 84, 42, 89,141, 59, 92,153,131,131,195, 73,149, 74,181, 54, 51, 51,211,224,142,160, 20, 69, 65,167,211,129,162, 40,
-156, 73,116,133, 82, 75,161, 36, 45, 28,139,254,227, 85,203,120, 73, 36,146, 70,155, 75, 9, 33,202, 73,147, 38, 57,122,120,184,
- 35, 53, 62, 10, 65, 65, 4,223,124,243, 77, 85, 86, 36,226, 42,111, 12,170,158, 15, 26, 52, 8,222,222,222, 32, 70,140,149, 33,
- 8, 2,238,223,191,143,131, 39,175,192,197,203, 31, 41, 15, 99,113,231,236,105,180,112,176, 69,251, 46, 93,161,215,235,155, 53,
-244,198,179, 64,175,215,239,110,211,166, 13,209,106,181, 87, 0,108,142,136,136,152,145,153,153,249,246,169, 83,167, 92, 39, 76,
-152,144,113,250,244,233,141, 0,246, 68, 68, 68,204,255,236,179,207, 94,226, 56,174,206,108, 65,134, 97,126,124,231,157,119, 6,
- 78,152, 48,129,146,210,122,237,133,243,123, 89,142,211, 83,239, 45,219,205, 95,190,126,133,230, 56, 61,245,202,164,119,132,179,
-191, 69,208,243,222,250,146,239,220,115, 36, 34, 35, 35,157, 3, 3, 3, 63,211,235,245, 13, 26,173,170, 72, 85,125, 17, 74,134,
- 97, 48, 99,198, 12, 28, 58,100,120, 15,170,217, 64, 75, 75, 47,243,219,107,182, 12, 54,167,216,178, 26, 38,171, 21,130, 79,132,
- 22,101, 63,204,120,174, 76, 22, 0,228,231,231,239, 0,176, 67, 16,132,108, 51, 51, 51,148,150,150,214,117,254,153, 68, 68, 68,
-152,200,100, 50, 12, 29, 58,212, 54, 36, 36, 36,142,166,233, 77, 25, 25, 25,245, 58,142,186,154, 9,235,106, 78, 68, 51,178, 14,
-109, 28, 16,216,163, 95, 23,139, 7, 86,171, 45, 76, 88,245,221, 22,113, 38,150, 20,128, 98,141, 83,226,205,228,137, 37, 84,142,
-188,115,215, 65, 47,192,146, 53, 11, 44,226, 74,235, 52, 90, 52,195,220, 41, 46, 44, 26, 94, 82,170,197,245, 27,145,152, 52,177,
- 53, 52, 58, 10,130, 64,163, 76,169, 1, 24, 9,104, 0,147,167, 76, 7,161, 88, 20,100,103,128, 97,152, 8,112, 28,158, 51, 62,
-156, 63,127,254,240,101,203,150,249, 44, 93,186, 20, 75,151, 46,245,218,181,107,215,142, 53,107,214, 44,205,205,205,237,128, 70,
- 6, 31,111, 64,167,197,233, 67, 31, 47, 57,121,109,123,241,200,222,170,135, 47,248, 85, 68,190, 94,240, 67,129, 68,130, 71, 44,
-131,124, 66,106,119, 51, 10, 12, 12, 28, 80,115,253, 47,227,201, 78,240,213,207, 13,234,163,213,218,199,237,229, 46,157, 3,222,
- 90,190,108,185, 69,204,205,203,248,224,211,205,164, 77,215, 33,165, 59,174,221,209,150,153,121, 15, 47,203,123,116,195, 80,127,
- 1, 0, 47,191, 56, 14, 29,219,117,127,234,205,190,131, 42, 6,107,191,126, 41, 12,217,185,233, 6, 87,182,149,230,160,206, 62,
- 89,134,164,244, 63,137, 74,165, 42,138,140,140,116, 76, 75, 75,171,213,241,221,219,219, 27, 20, 69, 33, 52, 52, 20,183,111,223,
-198,164, 73,147,192,178, 44, 36, 18, 9,174, 92,185, 98, 84, 52,166, 70,116,169, 42,235,112,152,187,187,123,125,217,134,141,106,
-169, 84, 42, 20, 23, 23,227,252,249,243,104,221,186, 53,214,172, 89, 3, 87, 23, 39, 44, 95,190, 4,130, 32,160,164,164, 4, 60,
-207, 27, 26,209, 18,170,162, 69,130, 32, 32, 55, 55, 23, 62, 62, 62,216,178,101, 11, 54,110,220,248, 89,102,102,230, 41, 99,183,
-209,195,195,195,154,231,249,247, 70,142, 28, 57,100,204,152, 49, 24, 54,172,246,120,172, 63,253,244,147,197,177, 99,199,214,126,
-251,237,183, 47,235,116,186,117, 57, 57, 57,185,134,232,254,240, 67,197,240, 75,138,158, 43,241,193,132, 22,120,109,193, 94,124,
-253,245,113,200,229,242, 90, 21,239,234,213,171, 27, 52, 49, 2, 33,109,164,121, 55, 51,150,188,255,149,227,218,181, 33, 8, 9,
-201, 1, 77,211,112,113,113, 1, 77,211,120,252,248, 49,104,154,134,151,151, 23,104,154, 70,122,122,122, 85,159,192, 66,212,145,
-245, 88,247, 93, 56, 13,181, 90,141,212,148, 36,164,197,199,193,188, 36, 11, 14,150, 10, 20, 70,221, 71,199,217,115,170,199,127,
-250,135,217,175,213,106,247,215,120,254,213,233,211,167,181, 20, 69,189,130,138,126, 26, 85, 17,141,207, 56,142,251,172, 62,145,
-158, 61,123,118, 94,182,108,153,164,106,184, 13, 87,207,207, 57,157, 78, 39, 0,128, 95,199,254,181,220,254,163, 71,143,240,245,
-215, 95, 67,169, 84, 66, 42,149, 74, 13, 57, 14,130, 32, 84,103, 24,214,101,194,140, 49, 89, 0, 96,231,229,254, 93,104,248, 21,
-254, 94,252,118, 85,196,131, 95, 76, 51, 83,104,208,218,231,215,100, 61, 25,217,114,119,119, 95, 41, 8, 2, 33,132,124, 92,227,
- 45,185,167,167,231,181, 11, 23, 46,216,113, 28,135,111,191,253,214, 58, 43, 43,203,186,127,255,254, 31, 0,168,215,104,213,213,
- 76, 88, 87,115, 34,106,100, 29,202,229,114, 91,173,182,222,224,201, 83, 89,135, 60, 15, 95, 75, 11,107, 20, 34, 13, 26,123,125,
-231, 34, 59,174,224, 98,230,156,187,174,201, 93,218,153,241,122, 31,186, 68, 11, 55,133, 53, 4, 66,234, 77,141,214,232,245,191,
-220, 13,191, 51,212,211,163, 53,115, 42,248, 42, 70,143,157, 0,141,134,134, 90, 79,129, 98, 36,160, 24, 41, 58,116,236,130,182,
-237, 59,130, 0, 8,251,253, 38,167,213,235, 47, 62, 79,101,239,210,231,205, 73, 20,133, 77, 32, 2,169, 99, 28, 45,159,177, 99,
-199,174, 5,240, 86, 99, 58,142, 61,223,156, 68,211, 21, 58, 53,199,209,122,231,205,249,136,250, 93, 98,117, 53,124,189,116, 88,
- 79,156,201, 13,161,160, 48,249, 51,235, 80, 66, 55,107,104,142,127,139,225,106,220,104,121,120,120, 88, 91,202, 77,126,120, 99,
-246, 44,139,228,123,183,144, 21, 29,138, 27, 87,227, 10, 15, 31, 59, 94,160,204,207,153,109,132,201,170,110,230,179,115,110, 1,
-111,255,167,141,150,137,185, 3, 0,192,219,191, 59, 24, 51,227,134, 17,170, 43,154,213, 20,147, 85,243,130, 93,215, 24, 90,243,
-230,205,195,174, 93,187,208,167, 79, 31,180,105,211,166,250, 98,111,108,212,172,142,232,146,209,217,134, 53, 41, 45, 45,133,151,
-151, 23,118,238,220,137,136,136, 8, 88, 88, 88, 96,210,164, 73, 40, 45, 45,173, 54, 88,134,118,134, 39,132, 60,186,112,225, 66,
-183, 87, 95,125,149, 72, 36, 18,170,168,168, 8,214,214,214,216,178,101,139, 50, 51, 51,243, 76, 19, 76,214, 4,169, 84,186,100,
-226,196,137,140,159,159, 31,178,179,179, 97,105,105,169,167, 40, 74, 2, 0,214,214,214,122, 83, 83, 83,204,159, 63, 31,157, 58,
-117,234,183,116,233,210, 62, 44,203,110,201,200,200,216,219,208,185, 68, 81, 84,117,133, 58,123, 83, 44,180,218,138, 10,122,235,
-214,173,168,236,235,246,103, 19, 65,124, 60, 96, 64, 38,139,185,185, 57,218,180,105, 83,103,217,247,235,215, 15, 97, 97, 97, 21,
- 77,147, 44, 11, 71, 71, 71,220,184,113,195,160, 76,170,170,129, 32, 35, 35, 35,225,239,109,143,136,144, 11,176, 87, 72,208,201,
-213, 25,238,253, 6, 32, 46, 46,238,159,140,102, 81,168,232,135, 49,184,242, 28,220, 13, 96, 94,141,231, 91, 0,124,103,140, 32,
-199,113,132,166,105, 42, 53, 53, 85,167, 80, 40, 40, 91, 91, 91, 86, 46,151, 67,163,209, 84, 27,174, 71,143, 30, 33, 56, 56, 24,
-105,105,105,176,181,181,165,173,172,172,160,211,233, 10, 13,209,247,245,245,133,179,179,115,173,142,239,179,103,207,110,146,201,
-154, 1, 4,236,250,124, 93, 11, 57,205, 88,249,219,191,140,196,216,199,106, 90, 11,147,255, 15,167, 78,133,254, 0, 0, 32, 0,
- 73, 68, 65, 84, 38, 11, 0,138,138,138,118, 0,216, 81,245,220,222,222,126, 38,195, 48,203, 53, 26,141,213,149, 43, 87,172, 29,
- 28, 28,168,189,123,247,234, 63,254,248,227, 34,134, 97, 10, 41,138,218,240,207,155, 67, 68,231, 21,199,123, 73,108, 92,133,123,
-106,114,243,237,212, 15,218, 22, 74, 90, 59, 80,237, 3, 48, 54, 39,230,250, 76, 46,190,119,118,102, 22, 77, 32, 68, 55,112, 13,
-222,253,193,178,213,239,197,197,222,241, 52,177, 52,193,188,249,203,112,230,220, 37, 80,180, 4,215,110,134, 66,171,227,145, 87,
- 80,140,137,147,167,194,221,197, 30,209,183,207,231,114,130,176,229,249, 50,217,194,230,161,163,103,218,200, 77, 21,149,199,132,
-199,254,239,151,128,166, 55, 97,197,138, 21, 8, 8, 8, 88, 16, 25, 25,249, 9, 26, 25, 71,139,162,132,205, 29, 6, 76,182,145,
-202, 43,116,136,192, 99,231,209, 15, 42,199,209, 90,140, 45, 59,142,117,104,239,157,184,170,161,113,180,158, 35,147, 85,115,221,
-176,209,242,242,242,146,155, 73, 48, 87,194,176, 75,223,152, 50,198, 33, 39, 62, 10,105, 49,119, 42,154, 23,116, 42, 93,214,195,
- 24, 67,134, 66, 31,140,218,227,119,144,134,154,174,212,106,131,238,232,107,105, 86, 85,184, 79, 70,179,140, 52, 89, 79,105,214,
- 52, 91, 53,199,205,242,240,240,192,218,181,107, 13, 25, 71,235,201,125,175, 98, 24, 42, 58,192,215,236, 12, 63,204, 64,147, 85,
-167,166,131,131, 3,242,243, 43, 70, 72, 24, 56,112, 32, 6, 14,252, 51,159, 65,167,211, 85, 71,177, 44, 44, 44,234,138,104, 61,
-165,105,106,106,250,193,241,227,199,103,221,188,121,243,213,119,223,125, 87,242,210, 75, 47, 85,153,185,114, 24, 54,183, 91, 45,
- 77,158,231,231,159, 63,127,158, 17, 4, 1, 59,119,238, 68, 88, 88, 24, 81, 40, 20, 31, 41, 20,138,205,166,166,166,188, 74,165,
-154, 55,103,206,156,169,171, 86,173,162,251,245,235,135, 91,183,110,209, 62, 62, 62,211,129, 90,131, 88,214,185,239,161,161,161,
-160,105, 26, 92, 65, 10, 22,124,112, 24,102,166, 44, 98, 99, 99, 81, 80, 80,240,212, 32,166,134, 28,207,154,145,146,170,165, 95,
-191,126,213,205,144, 61,122,244, 0,195, 48,184,123,247,110,125,205,176, 53, 53,137,157,157, 93,245,249, 33,149, 74,113,233,210,
- 37,124,250,233,167,240,180,181, 70, 97, 76, 4,156, 7,190,136, 33,179,230, 96,210,164, 73, 96, 24, 6,182,182,182,213,145, 95,
- 3,206,165,230, 80, 83,115,150,191,191,255,244,232,232,104,247, 14, 29, 58,184, 68, 70, 70, 14, 10, 8, 8,240,138,136,136,168,
-122, 46,135, 97,125,115,170, 53,255,248,227,143,160,205,155, 55,207,159, 49, 99,134, 84, 16, 4, 62, 57, 57, 89, 15,128,114,118,
-118,102,254,248,227, 15,225,212,169, 83, 80,169, 84,112,119,119,167,221,220,220,168,139, 23, 47, 10, 49, 49, 49,161,132,144,101,
-134,236, 59,207,243,181,134,113,168,122,252,211, 79, 63, 25,253,127,111,209,214,119,205, 75,253,253, 60,242, 50,238, 34, 51, 61,
- 30,124,177,131, 46,248,196,105,141,145, 38,235,175, 46,163,191, 83,115,245,195,135, 15,221, 52, 26, 13,100, 50, 25,182,110,221,
-170, 91,187,118,109,116, 94, 94, 94, 95,212,157, 81, 94, 75,179,137, 89,135, 5, 13,104, 62,149,117, 88,156,143, 51, 39, 78,254,
-209,205,124,236,110, 44,200,200,173,238,216, 72, 40,202,246,184, 83,187,190,138,238, 29,210,233,179, 43,233, 82,190,252, 76, 3,
-251,174, 85,105,181, 19,198,142,155,252,235,161, 67, 7,205, 63, 94,185, 18, 55, 66, 35,144, 95, 84, 6,129, 48, 16, 40, 10,203,
-151,127, 12,103,123, 91,148,100, 60, 44,215,232,116, 99, 81,123, 12,173,127,125,185, 83, 20,189,240,226,169,189,155,104, 10,130,
- 50,251,129,156, 41,141, 87,188, 54,105, 44, 59, 97,194, 4, 28, 63,126, 28,145,145,145,219, 27, 48, 89,213,154,132,208, 11, 35,
-174, 28,222, 68, 1,130, 42,247,129,156, 45, 75, 84, 76,159, 50,150,157, 52,105, 18,126, 14,190,137, 67,167, 19,183, 29, 58,141,
-211,120,190, 49,126,100,120, 11, 22,145,125,219,181,116,235,215,165,189, 9,203,171,144, 22, 19,143, 2,165, 26, 23,163,146,139,
-104, 66, 55,121,108,157,138, 11,164, 20, 41, 41, 15,235,184,179, 50,169,172,208,213, 70,105,210, 52, 93, 43,154,213,156, 72, 86,
-205,237,116,114,114,170, 53,157, 75,205,138,187,170, 15, 80, 19,134,118,248, 32, 37, 37,197, 50, 37, 37, 5,132, 16,132,134,134,
- 90,246,232,209,227,131,230, 68,179,150, 44, 89, 82, 29,181,122,114, 93,215,107,141, 81,217, 41,125,163, 94,175, 63,186,116,233,
-210, 5, 61,122,244, 24,186,114,229, 74, 10, 70, 76,192,251, 68, 52,135, 19, 4, 1,151, 47, 95,198,241,227,199,121,157, 78, 55,
- 55, 51, 51, 51,162,198, 71,190, 13, 15, 15,191, 56,110,220,184,189, 15, 30, 60, 96,162,163,163, 65, 72,227,121,167, 42,149, 10,
-109,218,180, 1,199,113, 88,191,192, 3,165,165, 29,192,113, 28,120,158,135,153,153, 89,117, 20,175,166,121,110,236, 60,226,121,
-254, 41,163, 21, 26, 26, 10,134, 97,208,183,111, 95,220,185,115,167, 58,162,213, 88, 4, 74,167,211,165, 56, 57, 57, 57,173, 94,
-189,186,122,187,114,115,115,113,225,194, 5,244,236,213, 27,237,230,206, 67, 70, 70, 6, 54,108,216, 0, 87, 87, 87,172, 89,179,
- 6, 5, 5, 5,224, 56,238,239, 14,167, 15,143,142,142,118,159, 50,101, 74, 78, 68, 68,132,123,112,112,176,117, 96, 96,160,217,
-228,201,147,115, 34, 34, 34,220, 41,138,234, 13, 35, 59, 65, 11,130,240,225,242,229,203,207,173, 89,179,230,131,183,222,122,171,
-199,140, 25, 51, 36, 18,137, 68, 72, 79, 79,231, 14, 30, 60, 72,181,105,211,134,150, 74,165,212,249,243,231,133,223,127,255,253,
- 54,199,113,235, 1, 92, 51, 38,226, 92,211,100, 49, 12, 99,168,201,170,197,219,142,242,233, 22,116,110,223,205, 91,215,210,126,
-222,238,186,125, 7, 47,164, 94,187,245, 48,129,209,112,111,255,208,192,208, 0,207, 51, 12,195, 28,241,247,247,159,185,112,225,
- 66,211, 97,195,134,201, 87,173, 90, 85, 92, 90, 90, 90,159,201,170,227,134,249,111,201, 58,252,254,195,119,131,223,126,167,195,
-204,150,255,117,110,129, 16,101, 14, 10, 89,134,182,180,166,209,197,139, 65,105,222, 35,135,211,191,238,121, 12,160,177,113,217,
-254, 8,191, 31, 57,184,125,135,206,199,214,175, 89,239,248,209,251, 75, 37,199,130,127, 1,225,116, 8,189,114, 5,230, 82,158,
-196,132,135,100,107,116,218, 49,120, 14,167,224,201,188,241,221, 33, 0, 39,109,109,109,239,205,154, 49,163,141,191,255,100, 40,
- 20, 10, 4, 5, 5, 97,255,183,223,242, 27,129, 87,229,192,157,249,141,140,167,151,115,187, 90,231,238,156, 89,179,124,187,116,
-249, 47, 20, 10, 5,142, 30, 61,138,189, 27, 55, 26,172,243, 47,167,106,100,248, 51,248,115,132,248, 70,250,104,209, 84,233,237,
-135,201,101,161, 15,147,203, 32, 16, 34, 16,162,161,105,164, 42,117,186, 53, 15, 19,211,155,100, 10,170,154, 14, 63,251,124,225,
-179,107,243,168, 97,126,154,154,210, 93,135,201, 74,171, 57, 71, 90,205, 74,186,190,199,122,189, 62,205, 64,249,117,158,158,158,
- 79,189,214,244,208, 47, 49,202,100, 25, 58,142, 22, 0,228,231,231,103, 2,248,232,214,173, 91, 63, 13, 29, 58,116, 14,128,244,
- 38,150,209,206, 1, 3, 6,204, 5,192, 80, 20,181, 61, 35, 35, 35,226,169, 63,124,102,102,156,171,171,235,151,222,222,222,243,
- 42,110, 76,169,157,141, 84,228,137, 29, 58,116,208,213, 85, 22,245, 61, 23, 4,161,209, 50, 42, 42, 42, 66,247,238,221,159,154,
-211,146, 16,130,228,228,228,170,136, 83,245,177,111,200,192,149,149,149,205,123,243,205, 55,119, 72, 36, 18, 79, 0, 84,149,201,
-229,121,158,249,238,187,239,254,143,189,235, 14,139,226,106,191,103,182, 87,154,116, 1, 17, 81, 32, 40, 86,212, 24, 49,216,177,
- 27,187, 81, 99,239,189, 99,212, 88, 98,141, 26, 91, 44, 81, 99,193,222,141,216, 69,177, 97, 23, 4, 69, 80,233, 44, 75, 95,202,
-246,221,217,153,223, 31,148, 31, 42,101, 65, 83,190,239,219,243, 60,243,236,238,148,179,119,238,157,153,123,230,125,239,125, 95,
-190,193, 96, 96, 2, 32, 24, 12, 6,201,102,179,213,103,207,158, 37, 73,146, 76,214,104, 52, 19,255,230, 7,196, 41,162, 40, 21,
-131,226,245,235,215, 94,197,150,172,212,168,168,168,240,227,199,143,219, 2, 56, 81, 67,222,123, 74,165,242,222,218,181,107,219,
-237,220,185,115,209,196,137, 19, 91, 13, 29, 58,148,213,190,125,123, 92,186,116,201, 16, 26, 26,250, 88,165, 82,173,171,142,192,
- 42,110,203,124, 23, 23,151, 82,193, 85,197,189, 92,233, 64, 94,107, 87,222,111,195, 39,215,230,239, 89,119, 93,158,157,166, 13,
-211,203,181, 63, 30, 4,162,240, 63,140,140,140,140,121, 0,150,110,222,188, 57,173,105,211,166, 60, 14,135,163, 53, 86,100,253,
-141, 32,169, 60,121,143, 95,187, 12,188,224,191,120,186, 91,151, 14,126, 66,151,186,118, 78,209,239, 51,240,238,225, 37, 69,196,
-197,213,137,180, 70,214, 23,128, 49, 35,215,159,104,116,186, 6,115, 23,204,157,194,101,179,187, 26, 12,134, 38,157,110,156,167,
-153, 76,102,164, 86,175,191, 81,236, 46, 84,255, 23, 55,249,170, 13, 27, 54,120,120,123,123,227,244,233,211,184,113,228, 8,134,
-100,103,227, 54,147,201,100,112, 56,214, 23,117,186,141, 48, 78, 32,173,218,180,105,147,167,143,143, 15, 78,158, 60,137,107,135,
- 14, 97,112,205,120, 42,234,235, 90, 2,176, 45,254,153, 13, 32, 6, 64, 11, 0, 2, 0, 26, 20,165,118,178, 41,219,133, 21,111,
- 43,217,126,151, 32,136,191,114, 32,108,213,145,225, 63, 70,212,187,196, 22, 95,186, 20, 42,149, 42,215,195,195,163, 90,115,174,
-245,122,125,165, 62, 92,146, 36, 83,221,221,221,141,182, 90, 24, 35,138,114,115,115,125,255,194,198,248,172,177, 88, 31,116, 34,
- 20,149,232,232,232, 72,149,116,250,229,137,176,242,214,209, 64, 66,117,254, 39, 61, 61, 61, 6,192,156,154,150, 51, 45, 45,237,
- 12,140, 72, 26,109,236,126, 0, 32,147,201,190,120, 50, 95,130,166, 37,203,151, 47,175,150,192, 6, 77, 87, 38, 62, 35,229,114,
-121,107, 99,254, 91,167,211,225, 31,196,201,226,133, 17, 21, 21, 53,158, 32,136, 0, 20,185, 4,118,227,203, 68,243,190, 87, 80,
- 80,112,239,151, 95,126,105,183,103,207,158, 89, 52, 77,163,160,160, 96, 75,117, 5, 86,233,219,115,102,230,165, 47,117,226,185,
- 25,218, 91,199,118,167,118, 84,229,233,102,237,149,107, 15,193,132, 82, 99, 20, 77,211, 7, 70,140, 24,241, 53,128,131,159, 75,
- 86,193,172,195,207, 69, 2, 37,203,111,122,123,238,207, 99,110, 91,154,245,132,129,229, 5, 45,227, 34,180, 57,151, 0,236,135,
-113,195, 28, 74,207,151,164,168, 77,164, 86,187,169, 76,231,242,191,208,206,181,124,124,124,102,141, 30, 61, 26, 75,151, 46,197,
-181,141, 27,117,147, 9, 34,159, 13,208, 87,139, 94, 52, 25, 4,176,208, 88,158,145, 35, 71, 98,233,210,165,184,188,126,125, 77,
-121, 42,131, 45, 65, 16,193, 0, 16, 24, 24,248,227,218,181,107,173, 22, 45, 90,212,100,221,186,117,107,138,127,191, 42,217, 94,
-220,215,245, 90,180,104, 81,163, 50,219, 11, 1, 60,253,139,235,179,220,200,240,127, 53, 58,155, 56, 77,156, 38, 78, 19,167,137,
-211,196,105,226, 52,113,126, 14,104,154,238, 89,244, 81,241,103, 69,223,203,124,226,111, 46,115,209, 68, 40,211,139,155, 9, 38,
-152, 96,130, 9, 38,152,240,159,136,178, 86,172,154,108,255,130, 40, 25,163, 85, 22,123,128,162,105,221, 21,169,210,234,204,122,
-168,137,178,189,105,226, 52,113,154, 56, 77,156, 38, 78, 19,167,137,243,127,142,179, 42,238, 79,142,167,105,186, 39, 65, 16,193,
- 52, 77,247,170,232,179, 68, 88,125,252,189,204,231, 23, 27,118, 80, 14, 74,198,102,149,142,209,250,187, 66,246,152,204,170, 38,
- 78, 19,167,137,211,196,105,226, 52,113,154, 56, 63, 11, 37, 46, 64, 0,116, 96, 96,224,162,127,161,235,208,177, 88,100,149, 46,
- 85,186, 14,105,250, 20, 83, 34,129, 57,151, 43,228, 0,128, 86,171,212, 57, 57,161,128, 32, 6,253,147, 9,111, 77,248,207, 68,
-201,116,239,140, 47,188,175, 9, 38,152, 96,130, 9,255, 27,200, 42,177, 84, 1,200, 2, 64, 20,255,214, 22,127,102, 21, 11,178,
-143,191,127,176,253, 47,132, 20, 21, 12,126,103, 85, 36,178,178,179,133, 54, 44,150,204,211, 96, 80,127, 5, 0, 44, 22,227, 77,
-118,182, 85, 44, 77,159,202,174,137,216,178,177,179,123,206,102, 50,157,140,217, 87,111, 48, 72,178, 51, 50, 62, 12, 29, 79, 16,
-255, 13, 2,207, 88, 17,241, 57, 98,227, 47, 23, 42, 54, 54, 54,246,246,246,246,125,204,205,205,219,228,229,229, 61,201,202,202,
- 58, 87, 73,222,195,181, 4,129, 5, 69,215, 21,126, 1,176,168, 18,234,234,236,251, 49, 60,132, 66,225, 20,130, 32,124,138,111,
-176, 40,165, 82,185, 19,192,219,255,193, 7,146, 0,192,119, 44, 22,107,164,141,141, 77,171,244,244,244,229, 0,106, 26,205,155,
- 5, 96,174,165,165,229, 16, 75, 75, 75,247,220,220,220,184,130,130,130,147, 0, 54, 1,168,114,170,244,242, 25,142,109,218, 7,
-180, 95, 18,122, 45,116,213,242,109,210,135,159,108,159,235,104,221,181, 75,219,165,161, 23,195, 86,254,184, 35, 45,183,154,101,
- 99, 20, 47, 64,209,236, 72, 26,159, 6,123,253, 92,176, 1,244, 6,208, 30, 64, 40,128,139,198,156,119, 5,248, 26,192,143,197,
-101,222, 4,224,246,191,252, 58, 18,217,219,219,175, 7,208,155,197, 98,189,150, 72, 36, 19, 0,164,254,195,101, 98, 1,104, 9,
-192, 7, 69, 97, 56,158,194,184, 16, 14, 85,194,218,218,186, 23,139,197,154, 82, 28,218,101,103, 78, 78, 78,240,191,181, 97,184,
- 92,238, 22, 7, 7,135,113, 42,149, 74, 73, 16, 4, 93, 54,222, 35, 73,146,169,217,217,217,190,255,109, 15, 53,130, 32,158,254,
-203,139, 56,161,156,117, 21,199,209,146, 72, 96,206, 98,201, 60, 51,211, 35,135,164, 73, 95, 14, 6,128,218,142, 77, 78,218, 57,
- 52, 62, 33,145,112,117, 14, 94,253,196,108, 33,107, 39,147,201,110,166,214,106,108,216, 44,118,182,142,212,135, 51,180,244,148,
-244,152,115,229, 6, 91,100, 51,153, 78,137,177,183,237, 72, 93, 46,216,252,218, 96, 11,234, 84, 88,218,218,181,107,215,232, 44,
-173,172,220,205,116, 60,254, 44, 54,155,217,133,162, 73, 31,154, 2, 24, 4, 59,138, 52,232, 67, 56, 26,205,175, 50, 89, 92, 97,
- 77,107,208,203, 26, 14, 52, 48, 20, 4,186,128,198, 13, 2, 56, 30,147,131,244,106, 80, 24, 43, 34, 62, 71,108,148, 61,118, 51,
-128,121, 95,250, 74,114,114,114,178,234,213,171,215,150,159,127,254, 89, 32, 22,139,137,228,228,228,128,133, 11, 23,126,251,236,
-217,179, 57, 18,137, 36,237, 99,209, 71, 16, 88, 64, 81, 52, 3, 0, 24, 12, 98,161,173,173,157,144,201,100,126, 18,219,200, 96,
- 48, 8,179,178, 50,167, 81, 20, 77, 20,239,187,128,166,177,213, 24,193,200,231,243,191,247,105,220,108,206,250, 13,155,196,246,
-118,118, 34,210, 64,233, 18,146, 18,133, 75, 2,231,181,126,255,238,237, 86,181, 90,125,172, 38,247, 53,147,201, 28,194,227,241,
-122, 1,240, 46, 94, 23,173,209,104,130, 13, 6,195, 9, 99, 59,116,123,123,251,187, 76, 38,179,110,117,254,216, 96, 48, 36,103,
-100,100,248,213,176,137, 6,213,169, 83,103,191,191,191,191,176, 85,171, 86,224,114,185, 88,186,116,233, 92,169, 84, 90,149,208,
- 98, 1,152, 43, 20, 10,135,136, 68, 34,119,185, 92,254, 94,165, 82,157,225,114,185,157,183,110,221,234,210,182,109, 91,179,140,
-140, 12,130,201,100,218, 95,190,124,249,135, 45, 91,182, 4,144, 36,217,169,170, 78, 46,255, 61,189,132,215,219,187, 93,254,251,
-219, 75, 0,116,255,120, 59,169,230,143,164,153, 46,189, 84,244,139,148, 98,241, 97,180,200, 98,179,217, 91, 29, 28, 28, 70,171,
-139, 98, 5,208, 31,119, 56, 0,160,213,106,101,121,121,121, 94, 53,185,229, 1,140,181,180,180, 28, 61,127,254,124,171,238,221,
-187,227,200,145, 35, 83,247,238,221, 43, 43, 40, 40, 56,128,162, 64,152, 49,213,228, 92,144,158,158,222,131,205,102, 19, 46, 46,
- 46, 76,149, 74, 85, 29,161,229,137,162, 36,204, 79, 1,236, 68, 81,232,130, 14, 64,209,253, 14,224,151, 18,225,198, 96, 48,118,
-122,121,121,245,137,142,142,222, 5, 96, 85, 77,239,117, 7, 7,135,223,119,236,216, 49,184,111,223,190,204,172,172, 44,167,166,
- 77,155, 30, 77, 79, 79,111,247, 5, 30, 35, 99,120, 60,222,236, 38, 77,154, 52,140,137,137,137, 45, 40, 40,216, 84, 92,159,149,
-221, 83,206, 0, 58, 91, 90, 90,118, 90,188,120,177,184, 87,175, 94,216,179,103, 79,143,189,123,247,202, 11, 11, 11, 67, 80, 52,
-166,231,179, 68, 32,139,197,154,146,154,154,106, 67,211, 52, 28, 29, 29,167, 0,248, 87, 10, 45, 6,131,177,181,127,255,254,163,
-143, 30, 61, 42, 76, 76, 76, 20, 58, 57, 57,149, 6,207, 38, 8,162,198,253,167, 9,159,141, 61,101, 4, 87,213,113,180,184, 92,
- 33,199, 96, 80,127,149, 38,125, 57,248, 91,255,237, 22, 0,112,247,206,244,193,118, 14,141,162,184, 92, 97, 44,207,156,127,182,
-127,239,206,205, 6,246,242, 39,156, 29,237,144, 42,205,180,255,227,248,181,110,193,215,110,159, 69, 81, 0,177,114, 65,234,114,
- 33,208,221, 68,204,253,109,176,105,159,134,223, 46,167,226, 97, 68, 2,148,249,217,168,235, 32,192,134, 89, 93,225, 96, 37,172,
-217,171,151,157, 71, 7,146,197, 59, 49,236,251, 17, 22,125,190,243,102,187, 58, 56,128,166,121,136,125, 47,255,230,202,245,219,
- 45,207,156, 58, 54, 69,196,246, 24,162,200,124,107,244,195,173,185, 35, 4, 10, 29,190, 99, 49,137, 31,218,250, 54,236,244,125,
-143,118,140,134,222, 13,240,250, 85,116,215, 11,183, 30,111, 96,132,189, 10, 33, 13,116,144,136,131,243, 47,164,149, 6,244,251,
- 68,112,116,234,212,185, 29,143,199,251, 32,120,146, 70,163,225,132,132,220,252,186, 38, 98,163,228, 63,180, 90, 13,131,205,230,
-130,193, 32,230,248,248, 52,246,206,206,206,190, 77, 16,196,254,180,180,234, 89, 11,166, 3, 92, 25,139,213,130,193,227, 57, 26,
-180, 90,107, 0, 32,184, 92, 89, 2,131,209,120,241,143, 63,138,153, 76, 38,149,147,147, 3,165, 82, 73,140, 31, 63,158,255,254,
-253,251,254, 18,137,100, 91, 21,111, 36,216,187,119,175,167,163,163,227, 39,217, 99,165, 82, 41,183,111,223, 62, 53,105,122,207,
- 38, 77,155,207,190,118,237,170,119, 65,174, 76,189,119,243,239,207,245,124,161,166,158,183, 23,123,231,158, 67, 22, 19, 70, 15,
-159,254,230,205,171,112, 84, 47, 95, 93, 29,129, 64,112,118,227,198,141, 62, 29, 58,116, 96,219,217,217, 33, 35, 35, 3,209,209,
-209, 62,183,110,221,250,238,208,161, 67,115, 85, 42, 85,127,192,168,132,168, 30, 33, 65,251,237, 68,181,172, 97,208,235, 81,187,
- 73,243,210, 1,146,239,110, 93, 7,169,211,129,210,235,225,221,235,187, 98,107, 50, 13,111,111,239,154, 70,221,173,221,168, 81,
-163,195,107,214,172,225,104, 52, 26, 60,126,252, 24,183,111,223,166,164, 82,105, 85, 1,113, 89, 4, 65, 92, 95,182,108,153,179,
-159,159,159, 89,118,118, 54, 12, 6,131,205,249,243,231,167, 52,107,214,204,220,197,197,133, 27, 20, 20, 4,185, 92, 14,146, 36,
-107,185,187,187,215,250,254,251,239,181, 65, 65, 65,115, 1,172,175,200,146, 85,240,158, 94, 34, 37,220,187,121,181, 24,137,116,
-226,106,183,217,221,112,197,188, 62, 81,106,217,234,230,238,110, 86, 32, 17, 46, 20,155, 55,174, 85, 32,185,185,176,155,187,251,
-222,171,113, 70,189, 12, 49,138, 59,155, 97,199,143, 31, 23, 70, 71, 71, 11,189,189,189, 65, 81, 84,105, 4,254,146,128,179, 30,
- 30, 30, 53,169,199,117,147, 38, 77, 90, 56,120,240, 96, 52,105,210,164, 52, 40,234, 79, 63,253,132,133, 11, 23, 90,221,189,123,
-119,238,177, 99,199,230,158, 59,119,110, 61,128,192,106, 90, 99, 74, 80,221, 54, 94, 17, 31, 31, 63,232,236,217,179,195, 23, 44,
- 88,224, 1, 96, 26,128,165, 57, 57, 57,254,197,214, 24,110,177,208, 26, 51,119,238,220,201,129,129,129,232,209,163,199,210,199,
-143, 31,175,174,161,149,143, 73,146,100,143,190,125,251, 50,245,122, 61, 68, 34, 17,244,122,125,253,207, 53, 74, 0,216, 49,113,
-226,196,201,147, 38, 77,130,149,149, 21,244,122,189,231,241,227,199,247, 46, 93,186,180, 13,128,177, 21,148,117,228,228,201,147,
- 7,140, 24, 49, 2,190,190,190, 96,177,138,170,113,227,198,141, 88,185,114,165,248,250,245,235,223, 5, 5, 5,125,119,225,194,
-133, 51,248, 48,109, 87,181, 64, 81, 20, 88, 44, 22, 82, 82, 82, 96,103,103,199,163, 40,234, 26, 65, 16,123,114,115,115,207,253,
-139, 58,243, 95, 6, 13, 26, 52,236,232,209,163, 98, 0,216,176, 97, 3,102,207,158, 13,123,123,123,136,197, 98,147,212,249,247,
- 88,180, 38, 84,105,209,170, 10, 74,165,178,249,162, 25, 63,128,193, 40,122,107,108, 80,175, 14,214,254, 56,129,184, 16,124,173,
-121,165, 54,120,126,109,196,220,223, 6,158,203, 44,104,244, 36, 30, 69,196,227,198,134,128,162,222,178,251, 98,104,116,157, 74,
- 58,155, 90, 92,129,224, 23,173,193,240, 0, 14, 14,143,145,148,148, 85,149,200,178,117,176, 15,222,189,123,189,192,167,190, 23,
-116,164, 30,146, 76, 9, 8,130, 7,103, 39, 51,140, 25,217,157,237,239, 95,219,102,197,138,223, 47,165, 83,232,167,204,126, 91,
-101,192, 80, 79, 27, 28,108,238,227, 49,248,251,158,126,188,198, 62,141,192,225, 9, 74,183,181,240,245, 69, 11, 95, 95, 70,160,
-188,176,203,147,167,207,187,156,190,254, 72,163,212, 39,157,140,205,198,168, 42, 30, 50,165,130, 99,230,204,153,176,183,183,255,
- 96,135,140,140, 12,220,186, 21, 82,238, 49,213,120,144,149,254,199,234,213,171,205,100, 50, 89,247,125,251,246,117,164, 40,106,
-117,122,122,250,125, 99, 72, 70, 0,117,243,121,188, 78,163, 55,109,162,154,245,233,195,180,116,112, 96, 80, 6, 3,145, 22, 23,
-103,189,121,219,182,246,185,239,222, 9, 20,181,106,229,202, 84, 42,101,108,108, 44,248,124, 62,193, 98,177, 90,150, 67,149, 65,
-211,248,133,193, 32, 22, 18, 4, 1, 30,143, 31, 59,105,210,164, 23,197,219,234, 94,188,120, 81,216,187,119,111, 37,128, 68, 0,
-224,241,248, 78, 76, 38,195,179,104, 0, 33,126, 49, 70, 96,138, 68,162, 25,171,214,172, 23, 21,228,230,169,116, 10,133,222,214,
- 92, 76, 16, 98, 51,102, 65,126, 97,161, 68,154,165, 89,188,124, 37,115,226,152, 17, 51, 20, 10,197, 20, 99, 69, 86,211,166, 77,
-159,156, 61,123,214,206,218,218, 26,121,121,121,200,201,201,193,147, 39, 79, 64, 81, 20,250,247,239,207,251,166,117,171,230, 63,
- 46, 94,242, 48, 69, 34,105, 99,140,216, 18,213,178,193, 6,191,102, 69,157,117, 98, 78,105,251,236, 25,212,171,116,159,149,169,
-249, 37,214,185,207, 73, 33,213,166, 83,167, 78, 28, 0, 24, 59,118,108, 65, 97, 97,225, 90, 0, 71, 81,117, 68,255,185, 75,150,
- 44,113,170, 87,175,158,235,209,163, 71, 33,151,203, 1,192,174, 94,189,122,240,244,244, 52,132,134,134,194,211,211, 19,102,102,
-102,184,123,247, 46, 30, 62,124, 8, 95, 95, 95, 51, 14,135, 51, 88,167,211,149, 43,180,218, 7,180, 95,194,235,237,221,206,171,
-197, 72,136,205, 29,177,247,216, 9,196, 60, 63,212, 78,163,139, 94,194, 49,220, 25,161,162,121,163,178,146,197,129,117,125,253,
-173, 27, 52,234, 3,215, 22, 47,108,212,134,123,241, 75,186,212, 91,199,226,171, 15, 45,223, 36,205,169, 72,100, 1,216,208,191,
-127,255, 65,199,143, 31,183, 4,128,200,200, 72,100,100,100,192,214,214, 22,124, 62, 31,108, 54,187, 52, 63,105, 13, 49,106,231,
-206,157,165,162,141, 36,201,210, 44, 0, 66,161, 16,223,126,251, 45,154, 53,107,134,115,231,206,141,170, 64,104,249,181,110,221,
-250,136,171,171,171, 75,217,149, 10,133, 2, 67,135, 14, 5, 0,248,251,251,119, 18, 8, 4,116,137, 32,148, 74,165,242,167, 79,
-159,118, 1,240,184, 2,101,169,146, 72, 36,152, 63,127, 62, 18, 18, 18,166,238,222,189, 59, 9, 0,159,203,229,150,190, 31, 3,
-240,108,212,168,209,214,217,179,103,227,253,251,247,120,253,250,245, 19,212,220,149,106, 16,137, 68,239,244,122,189, 47, 73,146,
- 80,169, 84,232,215,175, 31,255,204,153, 51, 25, 76, 38,243, 77,118,118,246,112, 20,141, 73, 49, 22,124, 0,155, 38, 77,154, 52,
-121,193,130, 5, 8, 9, 9,193,133, 11, 23, 48, 98,196, 8,204,154, 53, 11, 98,177,120,244,172, 89,179, 30,162, 40,161,249,199,
-232,180,115,231, 78, 24, 12,134, 79,238, 13, 62,159, 15, 63, 63, 63, 52,108,216, 16, 23, 46, 92,232,244, 25, 66,203,213,207,207,
-143, 75, 81, 20, 20, 10, 5, 66, 67, 67,197, 2,129, 64,236,236,236, 60, 30,192,191, 70,104,185,186,186, 78, 58,126,252,184,184,
-172,247,135,199,227,161,204,117, 96,194, 63,111,209,170,244, 13,171, 20, 90,173, 82,199, 98, 49,222,212,118,108,114,242,238,157,
-233,165,174, 67,128,241, 70,171, 85,234, 0,192, 64,209, 40, 80,146, 16,240, 24, 72, 76, 47,196,171,184,236,242,168, 62,152,162,
-201, 22,212, 1,175, 85, 34,104,154,134, 86,103,128, 38, 63, 29,107, 47, 41, 17,157,170,134, 86, 33,131, 86, 87, 52, 12,203,198,
-198,134,117,237,218,149,217, 55,111,222,154,124,224,192, 1,102,170,133,197,235, 66,160,121,121,156, 86, 86,238,102, 20,151,123,
-114,215,238,165, 2,154, 25,135,216,100, 5, 26, 56,183,130,141,165, 11,210,179, 21,120,240,250, 50,222,188, 13, 70, 61, 71, 87,
-204,154,209,141,191,106,205,209, 19, 28,210,173, 78, 94, 94, 66, 65, 69,229, 44,121,139,250,253,106, 44,200,220, 56, 24,114,222,
-195, 80,152,246,201, 14, 98,219, 58,104,209,193, 9,182, 46,245,121,163,102,173, 28, 9,124, 32,180,202,114,102, 16, 4, 99, 23,
-131, 65, 76, 38, 8, 2, 77,154, 52, 77,221,180,105, 83,121,161,192,117, 77,154, 52, 77,101, 50, 25,206, 69, 15,118,198, 78,154,
-166, 50,170, 40,231, 7,162,134,203,229, 45, 40, 50,251, 59,166, 92,186,116, 73, 55,104,208, 32,108,220,184,145,187,112,225,194,
-197, 76, 38,115,108, 57,238,189, 15, 56,251, 1,117, 44,235,215,239,186,250,193, 3,154,173,215, 19,185, 79,158, 20,228, 73,165,
-100,122, 97, 33,247,212,155, 55, 61,198,205,155,199,117,113,113,193,253,224, 96,235, 44,133,130,206,211,104, 84,121,121,121, 52,
- 73,146, 79, 42,224, 92,100,107,107, 39,220,187,119,175,231,164, 73,147, 94, 72,165,210, 69, 0,224,232,232,184, 22, 64, 67, 0,
-137,101,214, 97,247,238, 19,146,241,227,199,199,102,102,102, 46,170,172,156,101,208,200,206,214, 78,120,236,247,160,151,181,204,
- 4, 12, 91,231,218, 12,182,165, 37,139,228, 10, 56, 20,160,170,231, 82, 95, 4,160, 81, 5,199,126,204, 73, 8, 4,130,179,127,
-254,249,167, 29,155,205,134,193, 96,128,173,173, 45, 18, 18, 18,144,151,151,135,194,194, 66,196,191,137,134,155,139, 11, 86, 4,
- 46,116,156,182, 48,240,172, 82,169,244,253,168, 51,251, 52, 1,178, 94,247,137,101,175,188, 44, 6, 31,187,189,140,108,247,178,
- 72, 72, 78, 78,134, 88, 44,134,143,143,143,248,193,131, 7,247, 42, 17, 89,101,147, 0, 15,110,219,182,173,217,209,163, 71,225,
-235,235, 11, 11, 11, 11,132,134,134, 34, 50, 50, 18, 58,157,142, 33,151,203, 33, 22,139,177,110,221, 58,212,169, 83, 7,133,133,
-133, 72, 76, 76,180,102,179,217, 54, 31, 69,180, 47,229, 12,189, 22,186, 42,255,253,237, 37,233,196,213,110,123,143,157,192,248,
-239,135,192,129,142,187,103, 81,159, 88,213,181,119,219,159,104,166, 75, 47,145, 89, 19, 43, 15,159,222,224,112,197,152,182, 96,
- 37, 98,163, 46, 90, 41, 11, 95, 78, 37, 12, 41, 46,203, 55,157,154, 89,206,185, 19, 0, 24, 46, 46, 46,227, 78,157, 58,101, 86,
-106,122, 97, 50, 75,115, 30,150, 77, 2, 95, 73,194,247, 42,235,147, 32, 8, 36, 36, 36,192,206,206, 14, 98,177,184, 52,129,120,
-116,116, 52, 30, 61,122,132,146,108, 20, 21,112, 14,191,121,243,166,139, 72, 36,250, 96, 7,154,166,145,157,157, 13,146, 36, 33,
- 20, 10, 97, 48, 24,160,211,233,160,215,235,161, 86,171,197, 13, 27, 54,156,162,215,235, 31,151,199, 73, 81,212,156,193,131, 7,
-183,125,252,248,177,251,182,109,219,160,213,106, 55,164,167,167, 99,192,128, 1,160, 40, 10,157, 58,117,250,154,166,233,152,197,
-139, 23, 3, 0,102,207,158,173, 87, 40, 20,147,106,114,238,197,104,216,162, 69, 11,247,144,144, 16,180,107,215, 14, 26,141, 6,
- 27, 55,110, 52,223,189,123,183,121, 80, 80,144,237,130, 5, 11,246,103,101,101, 5, 84,193, 73, 0,216,224,224,224, 48,185,125,
-251,246,130,226, 28,166, 56,116,232, 16, 86,172, 88,113, 28,192,226, 43, 87,174, 44,187,112,225,194,200,113,227,198, 97,197,138,
- 21,179,242,242,242,246, 85,196, 25, 31, 31, 15, 91, 91, 91,152,155,155, 23, 61, 44,117, 58,132,135,135,227,198,141, 27,248,234,
-171,175,140, 57,167,138,202,233,218,191,127,255,253,199,142, 29, 51, 75, 73, 73,193,221,187,119,225,230,230, 6,165, 82,105, 76,
-110,216,155,127, 65,135, 93, 33,167, 74,165, 82, 39, 39, 39,139,215,175, 95, 15, 71, 71, 71,184,186,186,130,207,231,131, 32, 8,
-232,245,250,202,194, 9, 84, 89, 78,127,127,176,178, 37, 86,125, 45, 44,173,166,210, 52,205,202,207,151,253,174, 67,222,233,184,
- 56,104,255,198,115,255, 79, 70,115, 0, 47,240, 97,206, 67,105,169,208, 10, 14, 14,166,123,245,234, 69,148,124, 58, 57,161, 32,
- 59,219, 42,214,206,161,241, 9, 59,135, 70,197,121,191, 24,111,152, 76,171, 88,123,123,101, 1, 0,232, 72, 26, 97,111,242,240,
-242, 93, 58, 34,223,165, 67,196, 51,206,248,162,209,145, 69, 35, 86,105, 26,106,249,255,191,180,234,148, 50,104,116, 69,195, 61,
-180, 26, 37,242,179, 94, 19,131,250,117,225, 79,158, 60, 17,142,142, 78,182, 21,241,233,120,252, 89,211,102,247,176,172,101,201,
- 70,240,131,171,248,250,171,126,224,243,216,200,201, 87, 3, 4,240, 54,238, 6, 64,153, 33, 42, 54, 25,173, 27, 9, 17,208,213,
- 91,124,238,116,204, 60, 0, 75,141, 41, 47,153,250, 4, 28,143,238, 96, 27,244,208,103,199,128,202, 75, 2, 68, 14, 80, 17, 98,
-228, 72,147,240,230,222, 25,163,222, 25, 41,138,154,106, 99, 99,147,183,120,241,226,246, 13, 26, 52,208, 77,153, 50, 37, 34, 41,
- 41,105,206, 71,111, 43,191,238,220,185, 19,239,222,189,147,172, 94,189, 58, 52, 59, 59,123, 73, 53, 27, 58,144,166,177,165,216,
- 21,151,125,254,252,249, 22,119,238,220,153,181,101,203, 22,251,233,211,167,115,167, 79,159, 62, 6,192,207,149,185, 11, 11,120,
-188,206,171,239,222,165,201,212, 84,205,225,237,219,185, 59,194,194, 22,235, 40,170,182,141,157, 29,241, 77,235,214, 10, 33,131,
-145,157,147,145, 65,218,186,187, 51, 19,110,220,176,166, 5,130,180, 43, 87,174, 20,200,229,242, 10, 83,231, 48,153, 76,101,121,
-238,194,242,224,232,232,168, 45,111, 12, 87, 37, 29, 98, 1, 69,211, 58,203,122,245,232,174,157,218, 52,120, 23, 19, 23,199,183,
-180,100,122, 52,112,243,122,245, 38,225, 9,109, 48,168, 9,130, 40, 48,202, 87,194,100, 14,217,178,101, 75, 99,115,115,115, 80,
- 20, 5, 11, 11, 11,100,101,101, 65,171,213,162,160,160, 0,218,194,124,104,243,243, 17,153,148,128,182,237,219, 99, 80,183,174,
-222, 65,231,255, 28, 98, 48, 24,142, 87,234,207,107,210,188,212,146,181,178,174,245,255,251,130, 82,242, 74, 69,215,250,230, 30,
-224,136,197,232, 50, 39,240,115,110,244, 23,151, 46, 93,186,220,191,127,255, 30,243,230,205, 99, 72,165,210,171, 9, 9, 9,109,
- 1,188,174,236, 32,177, 88, 92, 63, 59, 59, 27,114,185, 28, 22, 22, 22,216,178,101, 11,236,237,237,161, 84, 42,241,244,233, 83,
-218,217,217,153, 8, 13, 13,133,179,179, 51,114,114,114,160,211,233,160, 82,169,210,181, 90,109,133,238,242, 98,247, 96,247,217,
-221,112, 37,230,249,161,118, 78, 68,252,211,193,115,253,223,197, 68,190, 73,190,126,227,193,207,164,154,159,146,151,122,115, 97,
-189,150, 47,108,166,206, 95,129,223, 54, 44, 67,204,227,187,185,246,117, 10,118, 8, 8,205,193,202,202,171, 80, 40,212,111,222,
-188, 49,139,136,136, 0, 65, 16,176,176,176,128, 80, 40, 44, 87,108,213, 0,140,178, 22, 40,133, 66, 1, 14,135, 3,107,107,107,
-236,219,183,175,180,227,117,115,115,171,140,227,247, 46, 93,186, 12,169, 83,167,142, 89,217,149, 45, 91,182,196,196,137, 19,177,
-107,215, 46,132,133,133,125,144, 79, 51, 61, 61, 93,170,215,235, 43, 59,239,188,140,140,140,110,253,250,245,123,126,239,222, 61,
-243,125,251,246,129, 36,201,114,151,189,123,247,226,209,163, 71, 75, 1,188,169,225,117,244,213,128, 1, 3,238, 30, 57,114,196,
- 50, 43, 43, 11, 37,215,134, 66,161,128,193, 96,128,151,151, 23, 65,146,100, 85,227,222, 24, 76, 38,243,252,246,237,219,123,143,
- 31, 63, 30, 44, 22, 11, 90,173, 22,219,183,111,199,194,133, 11, 51,138, 95, 74,117, 0, 22, 31, 60,120,112,100,159, 62,125,208,
-180,105, 83,239,219,183, 43, 30,217, 33,151,203, 33,151,203,193,102,179,225,224,224,128, 85,171, 86, 65,171, 45,122,172,120,122,
-122,150,222,198, 0,126,247,244,244,236, 29, 27, 27,187, 17, 69, 99,215, 62,129,131,131, 67, 63,154,166, 39, 24, 12,134,194,118,
-237,218, 89, 31, 59,118,204, 76, 34,145,224,249,243,231, 88,186,116,169,140,162, 40, 3, 69, 81,132, 74,165,138,183,179,179,123,
-206,227,241, 4, 74,165, 50, 55, 39, 39,103, 13,128,171,255, 84, 79, 78, 16, 4,193,102,179, 49,118,236, 88,176, 88, 44, 8, 4,
- 2,168,213,106,232,245,250, 82, 49,143,106,186,165, 27, 52, 16, 91,179,192, 25,111,101,214,112,214,160,153,189,108, 29,107, 59,
-193,210,156,135,232,232,215,109,111,133,220,216,206,101,197,236,166,180,250,221, 49,137,249,127,121,178,251,143,181,200,127,168,
-208,250, 36,231, 33,171,252,198, 28,100,160,233, 83,217, 18, 9, 87,199,229, 10, 99, 75,172, 92,246,246,202, 2,130, 24,100,176,
-109,212, 23,164, 78, 95,252,160,160,139, 23, 35,133,150,222,128,119, 49, 81,184,119,253, 79,216, 40, 37,200,142,111, 6,112, 26,
- 67,171,202,135, 90,171, 43, 22, 37, 6, 68, 60, 15, 65, 65,126, 46,124,124,123, 1, 12,198,163,138,248, 44,172,137, 94,223,180,
-104,194,124,151, 28,133,150,158, 3,225,238,220, 14, 73,210, 2,228,201, 53,144, 21,168,209,204, 39, 16, 89, 50, 21, 10,148,106,
-188,126, 23, 4,167,218,238, 12,130, 21,215,201, 88,161,165,121,125, 22,154, 55, 23,192,113,109, 11,174, 87, 31, 48, 93,253,144,
-252,242, 54, 34,174,108, 70,234,171,251,160, 41, 3, 28, 61, 91, 25,123,147,108,191,122,245,106,171,182,109,219,178, 58,119,238,
-220,244,242,229,203, 77,165, 82,105, 68,177,192,104,218,185,115,231,166,182,182,182,216,186,117,171,138, 32,136,237, 53,108,236,
- 82, 11, 88,102,102,230, 19, 0,171,207,158, 61,187,125,226,196,137,176,179,179,107,156,150,150, 86,225,129, 89,108,118,211, 81,
-107,214,208,108, 38,147, 62,254,219,111,156, 21, 87,175,110, 58,112,240, 32,167, 99,135, 14, 4, 77,211, 8, 15, 15, 23,174,255,
-237, 55,225,176,190,125, 19,147, 50, 51,201, 59, 97, 97, 58,105,106,106, 97,166, 66,177, 66, 42,149,166,255, 19, 87,182, 94,175,
-127, 24,159, 16,239,228,219,186,153,237,139,232,248, 87, 1, 29,191,249,134,193, 96, 48, 98,226,146,194,108,109,205,133, 55,174,
-223,208,233,245,250,135,198,112,241,120,188, 94, 29, 59,118,100,201,100, 50,212,174, 93, 27, 89, 89, 89,144, 72, 36, 69, 22,135,
-124, 25,116,249,249,208, 23,228,193,160,144, 35,254,233, 19, 52,115,175,199, 59,197,227,245, 82, 42,149,149, 10,173,146,183,204,
-242, 18, 93,151,172,227,154,153,129, 43, 22,131,168,190,219,176,175,165,165,229,194,188,188,188,203, 0, 86,233,116,186,105, 11,
- 23, 46,108,185,109,219, 54,155,213,171, 87,155, 79,152, 48,225,148, 92, 46,111,134,162,164,170, 21,117, 96,239, 73,146,180, 6,
- 96, 31, 18, 18, 2, 59, 59, 59,228,231,231,151, 88, 90,180, 74,165,146,159,147,147, 3,141, 70, 3,173, 86, 11,115,115,115, 60,
-123,246, 44,151, 36,201,139, 85, 21,206,188, 62,177, 74,163,139, 94, 98,237, 45, 74,211,145, 86,254,153,185,148,108,249, 38,233,
- 74, 0,155,186,185,187,239,213, 81,119,227,223, 70, 93,180, 74,120, 26,154,155,246, 86,225,190,239,114,124,101, 99,180,104, 0,
- 20, 65, 16,180,145,103,230,210, 0, 0, 32, 0, 73, 68, 65, 84,167,167, 39,178,178,178,192,100, 50, 33, 20, 10, 33, 22,139,177,
-104,209, 34,108,223,190,189, 38, 66,139, 47, 18,137,214, 48, 24,140, 33, 12, 6,195,214, 96, 48, 32, 48, 48, 16,189,123,247, 6,
-151,203,133, 78,167, 43,181,104,150, 88,169,170,176,116,132, 63,122,244,200,252,209,163, 15, 30, 91, 29,108,108,108,110,105, 52,
- 26,196,197,197,225,252,249,243,237, 1,220,169,102, 91,199,133,135,135,119,243,243,243, 59,212,162, 69,139,250, 52, 77,163,113,
-227,198, 24, 58,116, 40,130,130,130, 16, 17, 17,129,252,252,124,234,198,141, 27, 7, 0,108,172,110, 31, 94, 92,191, 94, 3, 6,
- 12,184,127,244,232, 81,171,156,156, 28,168, 84, 42, 40, 20, 10,156, 58,117, 10,109,219,182,133,141,141, 13,142, 28, 57, 66,210,
- 52, 93, 89,219, 51, 24, 12,198,190,221,187,119,247, 30, 55,110, 28,118,236,216,129,227,199,143,163, 79,159, 62, 24, 50,100, 8,
-178,178,178,236, 55,108,216, 48,178,216, 77,184,108,232,208,161,144,203,229,120,250,244,105,180,145,247, 60,242,242,242,144,151,
-151, 7,129, 64, 80,246, 30, 35, 0, 4,109,222,188,249,251, 89,179,102,193,221,221,125, 89,124,124,252,102,148, 51, 75,148,162,
-168, 73, 18,137,196,138,197, 98, 89,147, 36,137,148,148, 20, 60,123,246, 12, 83,167, 78,205,205,205,205,157, 8, 32, 9,192,226,
-177, 99,199,174,154, 51,103, 78,233,181, 52,103,206,156,224,203,151, 47,119,251,187,173, 57,158,158,150,141,184, 76,222, 76, 89,
- 33,211, 90, 38,147,149, 62, 59,180, 90, 45, 52, 26,205, 7,150, 44, 14,135,109,221,178, 89,157, 75, 42,101,225,143,175,223,230,
- 85,152, 32,221,187,190, 69, 19,161,200, 98, 86,219,118, 29,135,119,237,246, 29,147,212,235,113,237,218, 69,252,241,199, 78,116,
-240,243,132,123,131,198,152, 62, 99,166,133, 70, 75, 6,222,184,113,117,161,229,163,123, 87, 11, 11,242, 22, 85,198,249, 63,142,
- 75,197,226,234, 82,185,174,195,242, 20,100,113, 8, 7, 89,241, 79, 27, 43, 43,171,223, 12, 6, 67, 7,115,115,115, 80,121,177,
-120,253,236, 49,114,101,108,104, 84, 6, 80,116,145,216, 50, 74,184,104,180,184,123,237, 2,182,108,222,132,156,156, 28,248,125,
-219, 30,114,150, 11,234,184,212,129, 90,165, 44,190,105, 0,157, 86, 15, 91,123, 87,188,120, 17,161, 47, 80, 40, 42,124, 32,113,
-248, 58,239, 58,246,158,208,232,218,128,207,229, 34,191, 80, 11, 89,177,200, 58,114,122, 48, 52, 74, 21, 72,173, 14,164, 86, 15,
-219, 58, 3,240,149,125, 71, 80,134,139,141,170, 85,125,148, 1,186,132,187,208, 37,220,133,160,205, 12,252,185,246,251,143, 58,
- 82,227,242,238,102,101,101,101,190,122,245,234, 98,120,120,120,191,193,131, 7,227,246,237,219, 19, 0, 76, 46,118,223, 76, 24,
- 60,120, 48,194,195,195,241,234,213,171,139, 89, 89, 89,153, 95,162,229,185, 92,174, 74,163, 41,234, 99,133, 66, 33,191,138,125,
-157, 90,246,239,207,200,127,241,162, 96,243,131, 7,203,246,238,219,199,233,220,169, 19,161, 39, 73, 80, 6, 3, 26,120,120, 16,
- 93,187,118, 21, 5,157, 60,105,205,212,235, 31,205,159, 54, 45,100,215,136, 17,133, 79, 20, 10, 99, 7,154,215, 45,118, 25, 2,
- 64,221, 74,214, 25, 13,141, 70,179,109,210,248,209,157,239,220,189,239, 82,199,197,201,252,218,141, 59, 17, 60, 1,151,225,238,
- 86,159, 41,203,207,101,173, 92,246,163, 64,163,209, 24, 43, 90,189,109,108,108,144,158,158,142,119,239,222, 65,163,209, 64,175,
-215,131, 82, 42,160,149,229, 65,155,159, 11, 66,173, 2,207, 96,128, 58, 59, 3,117,221,235, 1,255, 63, 35,177, 74, 87, 84,121,
- 66,171,228,147,111,110, 14,142, 72, 12, 6,155,109,116,114,116, 0, 45, 90,181,106,117,242,204,153, 51,156, 49, 99,198,180,190,
-121,243,230,111, 0,146, 36, 18, 73,167,165, 75,151, 62,249,237,183,223,120, 19, 39, 78,244,218,184,113,227, 72, 0,191, 87, 68,
-162, 86,171, 79, 94,186,116,105,152,171,171,171,125,100,100, 36,212,106, 53, 40,138, 66,247,238,221,129,162,177, 53, 0,128,152,
-152, 24,149, 90,173,206,140,138,138, 42, 72, 74, 74,210,193,136, 89,130,203,183, 73, 31, 22,164,223,237,111,239,224,244,136, 47,
-168,235, 70,203, 95,244,155, 61,208,105,195,230,211, 18,245,213,184,184,194, 37, 93,234,173, 83, 20,190,156,106,233, 44,223,113,
- 53, 56,222,152,129,240,165,179, 11,173,173,173,193, 98,177,192,102,179,193,225,112, 64, 16, 4,102,204,152,129, 61,123,246, 84,
-229, 58,252, 64,100,153,153,153,189, 90,177, 98,133,243,196,137, 19, 57,124, 62, 31, 50,153, 12, 71,142, 28,193,216,177, 99,241,
-199, 31,127,148, 59,254,197, 8,151,210,199,214,210, 89, 35, 70,140,128, 86,171,197,208,161, 67,177,119,239,222, 89, 6,131,225,
- 78, 13,110,233, 71, 17, 17, 17, 30, 17, 17, 17,230, 0,250, 12, 25, 50,228,224,128, 1, 3,112,231,206, 29, 92,188,120,177, 61,
-138, 38,125,168, 0,172, 5, 96, 87,252, 89,217,253, 41,178,183,183,223, 73, 81, 84, 31, 91, 91,219, 8, 79, 79, 79,159,163, 71,
-143, 90,102,102,102,150, 76,126, 64, 66, 66, 2,246,239,223, 47,221,183,111, 95,129,193, 96,176,102, 48, 24,151,242,242,242, 22,
- 85, 34,216,246,109,222,188,121,116,177, 59, 16,103,206,156,161, 55,109,218, 68, 44, 93,186, 20, 50,153, 12, 29, 58,116,192,238,
-221,187,103,202,229,242,166,155, 54,109, 26, 63,104,208, 32,172, 92,185, 18, 10,133, 98,115, 85, 47, 43,149,136, 47, 2,192, 55,
-155, 55,111,118,157, 53,107, 22,206,156, 57,131, 22, 45, 90, 8,226,227,227,119, 1, 24, 87, 94,251,209, 52,141,248,248,120, 40,
-149, 74,220,191,127, 31,203,150, 45,147,149, 17, 89, 51, 39, 79,158,188,106,230,204,153, 88,179,102, 13, 29, 25, 25,153, 57, 96,
-192, 0,251, 61,123,246, 48, 27, 52,104, 48, 83,169, 84,254,109, 66,203,171, 65,173,117, 45, 91,180, 91,232,232,212, 0, 71,142,
- 30, 67,110,110,110,105,157,148,212, 11, 77,211, 40, 44, 44, 68,122,122, 58, 44,204,205,176, 97,227,170, 30, 83, 38,140,118, 65,
- 81, 24,140, 79, 77,150,238, 86, 27, 7, 12, 25, 51,119,232,176,209,136,140,120,142,160,131,191, 35, 42, 50,188,148,143,212,235,
- 16, 27,253, 12,177,209,207, 96,239,224,138,174,157,219, 19,223,127,255,125,247, 17,195,134,216, 2,248,203, 66, 71,252, 7, 91,
-179,128, 79,227,104,237,249, 64,104, 85, 97,174,179,177,178,178,122,117,226,196, 9,107, 63, 63, 63, 38, 73,146,184,122,237, 26,
-166, 78,254, 1, 35, 71, 4, 66, 7, 43,144, 90, 14, 40, 14,223,168,146,168, 84, 74,208,160,161, 80, 40, 16, 22, 22, 6,154, 34,
- 17,180,103, 19,104,154, 42, 21, 90, 0, 13,173, 78, 7,167, 58, 94,216,185,119, 53, 9, 54,251, 9,244,229,135,174, 41,200, 97,
- 26,244, 36, 13, 73,102, 50,146,165, 81,176, 48,171, 3, 22,187, 14,114,242,148, 96, 49, 28,160, 87,199,192, 80,124,172, 82,145,
- 10,149,238,243,218,207, 80,142,245,148,174,198, 67, 87,165, 82, 29, 62,124,248,112,143, 95,127,253,149,219,179,103, 79,207,211,
-167, 79,127, 3, 0, 61,123,246,244, 52, 55, 55,199,225,195,135,181, 42,149,234,240, 23,180,248,116,108,213,170, 21,100, 50, 25,
- 18, 18, 18, 34, 42, 61, 55,173,214, 90,108,103,199,204,188,125, 91,159, 37,147,185,116,236,216,145,208,147, 36, 24, 4,129,220,
-252,124, 36, 37, 38,194,210,210,146,120, 21, 19, 35,222, 62,125,250, 57, 79, 31, 31, 86,201,140, 68, 99,112,241,226, 69, 33,138,
-198,101, 85,186,174,154, 80,100,102,164,143,158, 54,109,218,185,195,135,143, 88,100,100,102,196,242,184, 92, 82, 44,230,215, 30,
- 49,124, 10, 43, 47, 47,111, 24, 0,185,177,100, 50,153, 12,241,241,241, 16, 8, 4,224,176,217,160, 84, 74, 24, 20,114,168,115,
-179,192,212,105,193, 53, 24, 80, 75,200,131,139,189, 61,234,216,218, 24,197,249,238,214,245,210,129,239,101,221,133, 27, 90,121,
-131, 43, 18,131,107, 38,198,148,224,208,226,183, 81, 14,176,244,103, 99,104,109,156,156,156,254, 60,122,244, 40, 39, 43, 43, 11,
-225,225,225, 17, 0,242, 1,152, 1,160,162,163,163,111, 70, 69, 69,245, 42,158,117, 87,213,108,177, 77,103,207,158,237,226,231,
-231, 71,186,185,185,137, 50, 51, 51, 93,100, 50, 25, 37,149, 74, 63, 48, 9, 93,191,126,157, 87, 88, 88,168,160, 40,234, 92,177,
-200,170, 50,126,209,236,129, 78,252,176, 23,152,225, 31, 80,183,177,185, 77, 19,228,146, 47, 26, 63,138,144,206,152, 61,208,105,
-219,230,211, 18,181,128,208, 28, 36, 12, 41, 46, 44,190,218,216, 65,204, 52, 80, 52, 86, 42, 44, 44, 12, 73, 73, 73,136,143,143,
-255, 64, 80, 77,152, 48, 1, 65, 65, 65, 70, 89,180, 68, 34,209,154,229,203,151, 59,207,154, 53,139, 83, 70, 20, 97,218,180,105,
-200,207,207,199,222,189,123, 49,109,218,180,106,119,252, 31,161, 94,199,142, 29,123, 58, 58, 58, 34, 39, 39, 7, 14, 14, 14,240,
-243,243,235,125,231,206, 29, 55, 0, 9, 53,188,238,167, 4, 4, 4,172, 90,177, 98, 5,244,122, 61,198,142, 29,139,183,111,223,
-158,124,251,246,237,150, 58,117,234,204, 88,176, 96,129,189,189,189, 61, 6, 15, 30, 44, 34, 73,178,127, 69, 36,181,106,213, 90,
-251,251,239,191, 15,235,217,179, 39, 67,167,211,125,123,235,214, 45, 36, 38, 38, 66,171,213,130, 36, 73,188,127,255, 30,211,166,
- 77,147, 22,207,110,124,111, 68,185,198, 44, 94,188,120,244,140, 25, 51,176,126,253,122, 44, 95,190,252,128,133,133,133, 79,179,
-102,205,154, 47, 95,190, 28,243,231,207,135,171,171, 43,172,173,173,191, 90,186,116,169,247,156, 57,115,176,109,219, 54, 44, 91,
-182,236, 0,128,253, 53,169, 8,138,162,136,117,235,214, 53,221,188,121,179, 99,137,200, 98, 48, 24, 56,113,226, 4, 94,188,120,
-209, 59, 46, 46,174,188, 99,118, 59, 56, 56, 76,112,116,116,228,222,184,113, 67,236,234,234, 10,146, 36,245,197, 34,107,123,157,
- 58,117,166,190,127,255, 30, 61,123,246, 68, 92, 92,220, 97, 0, 35, 45, 44, 44, 20,115,230,204, 17, 10, 4, 2, 11,165, 82,249,
-119,117,222, 96, 50,136, 81,107, 86,206,199,211, 23, 49, 56,123,150,131,167, 79,159,194,222,222, 30, 60, 30, 15, 52, 77, 67,163,
-209, 32, 43, 43, 11,122,157, 6,141, 27,213,195,161,125,235,144,153,153, 5, 48,136, 10,135,220, 16, 12, 98,248,232, 31,250,225,
-222,253,107,216,181,235,119,200,229,138, 10, 94,190,249,104,224,233, 13,167,218,118, 72, 73, 77, 1,193,128,205, 95,121,174,255,
-225,174,195,210, 71, 16,140, 9,239, 80, 22,150,150,150, 91,142, 31, 63,110,221,161, 67, 7,166, 66,161, 0, 69, 81,104,231,231,
-135, 25,179,102,225,226,209,163,240,104, 61, 20,132, 86, 12, 82,104,220,172, 7,181, 74,137,134,205,191,193,160,193, 67,144,156,
-148,132,128, 94, 3,160, 86, 43, 75,223, 48, 74, 44, 90, 90,173, 14, 54,118, 46,184,126,253, 58, 19, 99,199,190,198,246,242,141,
- 18, 6, 29,247,101,236,123,117,219, 60,213, 11,132, 61, 13,130, 78,163, 67,227,198, 75,161,163,172, 97,231, 60, 1,122,253,121,
- 20,100,221, 42,114, 99, 88,119, 64,106,114, 50, 24, 76,206,171,154,214, 32,165,200,250,172,135,110,126,126,126,126,124,124,252,
-233,176,176,176,225,253,251,247,199,245,235,215,199, 3, 64,255,254,253, 17, 22, 22,134,248,248,248,211,249,249,249,249, 95,162,
-181, 29, 29, 29,251,180,111,223,126,104,203,150, 45, 17, 28, 28, 12,154,166,239, 25,117, 99,179,217, 52,131,193, 0, 69, 81, 32,
- 0,228,228,229,225,237,219,183,200,201,206,134, 94,175,135, 66, 46,167,188, 61, 61,229, 52, 69,153, 85,167, 60,101,103, 24,162,
-156, 89,135, 37,235,106,112,170, 73, 79, 30, 61, 72, 46,148,203,109,173, 44,173, 10,185, 92,174, 65,150,151,151,255,250, 85,164,
-214,200,206,161, 4,209, 81, 81, 81, 62,105,105,105, 72, 78, 78, 6,169, 40, 4, 83,163, 5, 67,163, 68,167,111,218, 64, 0, 26,
-124, 80, 96, 83,122,176,153,108, 20, 22,205,206,171,210,221, 97, 40,243,146, 80, 34,178, 8,130, 40,114, 23,138, 68,224,138,205,
- 62,176,112, 25,115, 61,241,120,188,163,167, 78,157,114,116,114,114,194,202,149, 43,225,236,236,252, 85,237,218,181,149, 22, 22,
- 22, 2,123,123,123, 52,108,216, 16,223,124,243, 13,174, 92,185, 2, 35,234,128,164,105,186,235,189,123,247,230, 62,120,240, 96,
-144, 72, 36, 34,166, 79,159,206,234,222,189, 59,120, 60, 30,148, 74, 37,100, 50, 25,142, 29, 59,150, 77, 81, 84,201,164, 20,107,
-161, 80,184,159, 32,136, 4,133, 66, 49,235, 99,194, 67,191, 54,174,157,153, 75,141,165,229,194,126,254, 1,117, 27,119, 12,232,
-140,122, 30, 29,209, 49, 32, 25, 0,214,213, 98, 37, 14,253,101,177,229, 57, 75, 51, 98,255,245,171, 55,150,249,249,119, 92,188,
- 80,126,123,213,250, 61,121, 85,142,167, 35, 8, 2, 20, 69,125, 16, 59,232,227,237, 35, 71,142,196,137, 19, 39,170,172, 71, 6,
-131, 49,100,226,196,137,156,143, 44,207,144, 72, 36,232,213,171, 23,250,247,239,255,129,208,178,177,177,129,131,131, 3, 18, 19,
- 19, 1, 32,199,200,235,106,198,152, 49, 99, 8,149, 74,133,113,227,198, 97,239,222,189, 24, 58,116, 40,113,231,206,157, 25, 0,
-102, 85,247, 98,103, 48, 24, 27, 22, 44, 88, 48,119,218,180,105,200,205,205,197,229,203,151,209,189,123,119,156, 56,113,194,246,
-242,229,203,107, 58,116,232, 0, 38,147,137,224,224, 96,144, 36, 89,105,172, 47, 14,135,211,167,103,207,158,140,148,148, 20,112,
- 56, 28,248,250,250, 34, 53, 53, 21, 74,165, 18, 18,137, 4, 51,103,206, 76,207,201,201,105,111,236,125,196,225,112,102,205,152,
- 49, 3,199,143, 31, 71, 96, 96,224, 65, 0,227,242,243,243, 7, 61,120,240,224,120,223,190,125, 33,145, 72,112,238,220, 57, 44,
- 91,182,140, 24, 57,114, 36,118,236,216,129,153, 51,103, 30, 40,182, 58, 85,116,225, 23,102,102,102, 90,212,175, 95, 31, 25, 25,
- 25,144,203,229, 56,119,238,156,221,149, 43, 87,220,156,156,156,204,227,227,227, 13, 63,255,252, 51,119,214,172, 89,216,178,101,
- 11,194,195,195, 17, 20, 20,132,142, 29, 59,146,113,113,113,229, 90,201,138, 67, 54,156,163,105,250,134, 72, 36, 66, 97, 97, 97,
-201,125, 55, 47, 48, 48,112,218,218,181, 69, 70,246,180,180, 52,140, 26, 53,106, 68, 72, 72, 8,213,161, 67, 7, 33,135,195,129,
- 90,173, 86,252,157,189, 54,101,160, 0, 80,112,115, 17,227,218,197,125,120, 30, 17,135,231, 17, 81,224,242,138, 6,193,171, 84,
- 74, 52,111,220, 0,173,125, 91, 33, 77, 42,193,225,160,125,168,101,227, 84,233,115,132,166,105,112, 88, 6,120,123, 58,224,104,
-208,239, 8,190, 28,130,160,195,199, 74,199,188,177, 88,108, 52,107,222, 26,190,190,126,136,139,127,143,125,251,118,193,214,206,
-197,228, 28,172, 33, 74, 93,135,101, 63, 63, 82,254, 29,253,252,252,152,114,185, 28,106,181, 26,233,233,233, 72, 76, 76,132,165,
-149, 37,226,210, 18,208, 94,168, 67, 58, 85,128,232,136, 87, 6,130,201, 14,175,234, 15,123,250, 55, 3,252,155, 97,234,152,161,
-149,188,178,210, 16,153,219, 20,185,110, 72,242, 29,182,109, 35, 43, 18, 90,164, 65,127,243,218,141, 91,173,198,140,236,195,190,
-126,107, 47,244, 90, 10, 42,189, 5, 20,106, 45, 20, 58, 54, 24, 22,221,129,236, 59, 96,178,120,248,186,105, 3,156, 59,123, 69,
- 71,147,250, 16,163, 43,200,222, 7,100, 70, 84, 25,161,149,249,145,223,161,150,209,174,195,210,142,215, 96, 56,113,228,200,145,
-239,218,180,105, 35,236,208,161, 67,253,226,142, 83,119,228,200, 17,101,113, 48,204,234,226,131,104,240, 14, 14, 14,205, 57, 28,
-206,208,238,221,187, 55, 31, 61,122, 52, 94,191,126,141,195,135, 15,199, 54,104,208,224,182, 84, 90,241,140,108, 38,151,155, 35,
-207,204,180, 20,187,185,177,172,204,204,210,174, 92,190,236,218,185, 75, 23, 34, 57, 57, 25, 57, 57, 57, 80,171,213, 8,143,136,
-160,217, 76,102, 42, 97,110,206,136,121,241,130,193,228,114,115, 42,178, 54,150,131,196, 42,102, 29,174,173,169,117,203,197,209,
-170,254,178,192, 73,245,212, 26,181, 79, 65, 65, 1,201, 98,179,217,206, 14,150, 73, 49,239,141,127, 38,106, 52,154,224,155, 55,
-111,126,215,185,115,103, 94,236,203,112,144,249,249,208,230,203,192,161, 12,168,213,188, 41,152, 58, 13,160,213,195,201,155,134,
- 58, 79,136, 59,143, 99,244, 26,141,166,202,160,134, 37, 66,139,241,145, 48,224,138,197,224,153,153,131, 39, 22,127, 44, 24,170,
-122,147, 19,118,237,218,181,211,215, 95,127, 13,154,166,177,103,207, 30,232,116, 58,174, 78,167,131, 86,171,133, 78,167, 67, 65,
- 65, 1,130,130,130,176,115,231,206, 7, 0, 14, 24,113,250,164, 64, 32,232, 75, 16,132, 29,139,197, 82,218,218,218,138, 78,156,
- 56, 81, 26,110,162, 89,179,102, 48, 51, 51,227,160, 56, 40,164,157,157, 29,251,143, 63,254,176,236,221,187,247,221,114,221, 29,
-141,191,154, 95,143,180,242,231, 11,234,186,153,219, 52, 65, 61,143,142, 0,128, 46,189,198,160, 94,131, 58, 40,200,126,233,166,
- 86, 37,246,227,176,100, 86,175,182, 73, 94, 11,122,250,140, 86,100,134,190, 69,249,211,251,203,237, 40, 24, 12, 70,133,238, 88,
- 99, 68, 86,145,102, 97,216,150,140,243, 1,128,156,156, 28, 72,165, 82, 68, 71, 71,195,203,203, 11,185,185,185,112,114,114,130,
- 86,171, 69,203,150, 45,161, 82,169,176,121,243,102,220,191,127,255, 1,128,153, 70,252,135,192,195,195, 99, 84,243,230,205,113,
-249,242,101, 60,125,250, 84,114,237,218, 53, 39, 63, 63, 63,184,185,185,141, 78, 72, 72,248,177,216,213,103, 44, 68,126,126,126,
-211,167, 77,155,134,168,168, 40, 76,154, 52, 41, 39, 37, 37,229,220,201,147, 39,199, 45, 91,182,140, 17, 16, 16, 0,169, 84,138,
- 13, 27, 54, 24,238,223,191,191, 17,192,202, 42,234,241, 77, 74, 74,138,179, 90,173, 70,110,110, 46, 72,146,132, 82,169,196,149,
- 43, 87, 16, 20, 20,148, 81, 44,178,222, 25, 91,184,166, 77,155, 54,100, 48, 24, 56,126,252, 56, 0, 44, 65, 81,196,254,115,253,
-250,245,147,252,252,243,207, 78,139, 22, 45,194,248,241,227,161,211,233,176,126,253,122, 44, 90,180,232, 82,177,200,170,236, 33,
-250,171,131,131,195,132, 73,147, 38,125, 53,103,206, 28,132,133,133,217, 61,123,246,204, 55, 60, 60, 28, 46, 46, 46,200,201,201,
- 97, 89, 91, 91, 99,203,150, 45,152, 61,123,246, 25, 0,217, 15, 31, 62, 28, 18, 31, 31,191, 22,192,134, 42, 68,251,110, 39, 39,
-167, 9, 52, 77,211, 74,165, 50, 49, 48, 48,112,195,234,213,171, 49,123,246,108,188,122,245, 10,249,249,249, 48, 51, 51, 35, 22,
- 44, 88, 48,106,201,146, 37, 24, 59,118, 44,173, 80, 40,118,254,221, 29, 53, 77, 27,160,148, 69,193,160,177, 66,179,198, 94,104,
-230, 83, 23,215,110, 61, 7, 0,116, 26,224, 7,165,162, 16, 7, 15,238,193,187,119,111,193, 98,179, 97, 89,203,193, 24, 75, 32,
-180, 5,111,144,167,147,162,115, 7, 95,116, 15,104,143, 3,135, 78,128,212,235, 48,110,204, 48,200,242,242,112,232,208, 62,196,
-197,191, 7,139,205,134,181,205, 95, 31, 8,181, 50, 45,242, 31, 47,180,140,112, 63,129,162, 40, 72, 36, 18, 60,123,246, 12, 9,
- 9, 9, 16, 10,133, 80,145, 6,106,215,205,251, 20, 65,112, 82, 41,154,126, 64,147,165, 81,138, 63,229, 48, 24, 36,101, 34,214,
- 90, 88, 89, 89,113, 53, 26, 21, 72, 82, 95,166, 87, 33, 0, 2,224,176, 0,199,218,245,144,146,156, 66,171,213,234,208, 74,223,
-160, 52,234, 45, 23,206,157,154,246, 77, 91, 63,155,238,157, 86,224,220,249,165,144, 21, 20, 64,173, 99, 67,161,214, 65,169, 6,
- 44,107,121,162,101,227, 38, 72, 75,203,193,203,167,119,228, 44,141,210,152,129,162,111,183, 47, 30,227, 49,102,234,124, 8, 92,
-219, 66, 19,125, 14,148, 60,163,212,162,197, 23, 91,161, 86, 29,111,228, 41, 52, 56, 21,242, 28,168, 70,170,151,204,204, 76, 37,
-147,201, 60, 50,109,218,180,245,207,159, 63,115, 6,128,231,207,159,167, 74,165,210,133,153,153,153,213,181, 73,151, 68,131, 39,
-248,124,193,243, 6, 13, 26,164,249,250,250, 90,244,235,215, 15, 54, 54, 54, 8, 15, 15,199,218,181,107,223,232,116,186,249,119,
-238,220,169,212,213,163,213,106, 37,207,207,159, 55,111,255,195, 15,150,243,123,247,222, 48,109,218,180, 45, 43, 87,174,100,123,
-120,120, 16,122,157, 14,145,145,145,244,209, 35, 71,244, 59, 23, 45,218,204, 21,137, 88, 79, 46, 92, 96,147, 26,141,228,159,190,
-136,157,156,156,252,253,190,109,231,189,241,215,109, 80,171,228,120, 28,118, 9, 50, 89, 22,126,223,115,214,219,201,137,246,151,
- 72, 36,119,140, 21,192,251,247,239,159,219,186,121,243,230,238, 46, 46,136, 76, 74, 0,151, 50,128, 67,146, 96,234, 52, 96,144,
-106,184,248,208, 32, 24,102,144,166, 23, 96,245,241,211, 81,198, 8,227,175,122,244,193,202,212,124, 16, 4,129, 77,109,124,192,
- 53, 19,131, 35, 18, 99,202,159,183, 74,133, 65,240,202, 69,224,138,197,168,223,218,168,128,240,202,219,183,111, 63,139,140,140,
-108,233,227,227,131,185,115,231, 34, 49, 49, 17, 20, 69, 33, 35, 35, 67, 45,149, 74, 37, 89, 89, 89,137, 40,138,255,179,183,138,
- 78,172,172,234,112,186,115,231, 78,169,187, 33, 36, 36, 4,181,107,215,134,133,133, 5, 10, 10, 10, 48,113,226, 68,203,159,126,
-250, 9, 0,240,236,217, 51,148, 21, 40, 31, 35,242,121,244,198,188, 66, 90, 70,203, 95,244,203, 37, 95, 52,238, 24,144,130, 46,
-189, 70,227, 70,240, 1,220,186,118, 19,181, 88,137, 9, 16, 21, 94,201, 78,200, 46, 72, 85,120,236,246,110, 49,142, 41, 85, 92,
-219, 61,189, 79, 44,211,209,145, 58,181,104, 87, 65, 94,101,101,245,240,240,128,189,189,125,233, 24, 45, 22,139,133,177, 99,199,
-130,166,105, 99, 69, 86,113, 95, 67,101,169,213,106,123, 62,159,143,244,244,116,188,127,255, 30,113,113,113,165,161, 3, 40,138,
-210,207,155, 55,143, 61,125,250,116,236,218,181, 11,161,161,161, 15, 0,172, 0, 96,236,203,218,176,193,131, 7,155,105,181, 90,
- 28, 59,118,140, 4,208,235,212,169, 83,207, 90,182,108,201,234,214,173,155,217,142, 29, 59,134, 21,183,145,209, 66,203,220,220,
-156,163,211,233,176, 99,199, 14,164,164,164,248, 3,136,126,242,228,201,238,193,131, 7,239,244,241,241,105, 16, 21, 21,245, 86,
- 46,151, 79, 1,240,178, 42,178,140,140,140, 49,190,190,190,167, 40,138,114,237,220,185,179,232,215, 95,127, 53,143,137,137,129,
-179,179, 51, 40,138,138, 68, 53, 83, 88,189,125,251, 54, 90, 42,149,122,183,111,223, 30, 87,174, 92, 89,103, 48, 24,214, 0, 88,
- 63,121,242,100,167,164,164, 36, 52,111,222, 28,181,106,213, 66, 76, 76, 76,161, 84, 42,221,137,162,148, 68, 85,153,112,227, 1,
- 44,220,189,123,119,147,221,187,119, 15,173, 85,171,214,215,225,225,225,184,119,239, 30, 54,110,220,136,159,126,250, 9,237,218,
-181,195,220,185,115,179, 1, 12, 5, 64,198,199,199, 27, 21, 55,175,196,178, 5, 0, 45, 90,180, 72, 91,187,118, 45,198,141, 27,
- 71,255,241,199, 31, 91,143, 28, 57, 50,107,216,176, 97,165,125,224,168, 81,163,232,195,135, 15,143, 66, 81, 26,166,191, 19,122,
-157, 78, 11,243, 90,245, 32,207, 75, 70, 86, 74, 24,132,102, 14, 8,232,216, 20, 74,149, 22, 23, 47,156,193,203,200, 8, 48, 24,
- 12,216, 59,184,192,210,202, 6,177,177,111,129,202,103, 27,235,117, 58, 29,204,172,234, 66,158,159, 2,109,230,115, 8,196,118,
- 24,253, 67, 63, 40, 85, 58,156, 61,119, 6, 81, 81, 47,193,100, 50,225,224,232, 2, 11,203, 34, 78,130,174,124, 6,179, 9, 0,
-202,137,167, 85,165,208, 98, 50,153,183,175, 94,189, 58,176,117,235,214,172,119,239,222,225,221,187,162,151, 27,153, 76, 70, 18,
- 48,156,206,140,188,240,125, 37,135,119, 70,241,236,140,178,185, 11,197,102,102,146,152, 55,209,246,178,220, 12, 68,188,184,143,
-119,177,145, 72,136,139,134, 78,167, 6,147,193, 0,131,201, 64,221,122,141,112,255, 65,152, 86, 77,146, 97, 21,113, 22,149, 35,
-174, 80,100,231, 49,100,213,202, 31,131,103,207, 95, 46, 24, 52,112, 23, 94,198,188,134,156,116, 0, 77, 3, 14,214, 34, 52,115,
- 95, 0, 73, 90, 22,142, 31,216,161,164,116,186,225, 31,197,208,250,132, 19, 0,236,179,209,112,231,158, 3, 99,247, 6, 29, 93,
- 62,127,250, 68,251,190,253,135,131,155,251, 26,250,180,231,168,215,178, 59, 8,158, 37, 46, 95,191,133, 59,207, 94,103, 80, 6,
-122,185,125, 14,254,136,173,130,179, 44,242,242,242, 30,166,167, 75,157,203, 68,129,119,230,241,248, 85,205,142,251,152,243,131,
-136,243, 76, 38,163,197,170, 85,171,244,246,246,246,186,168,168, 40,236,218,181,139,122,254,252,249,117, 6,131,177, 93, 42,149,
-170,171,226,180,213,235, 35,142, 6, 6, 54,108,213,191, 63,253,253,244,233, 74,240,120, 51, 54,108,218, 20,152, 37,147,213,166,
- 41, 10,182,181,106,165,110, 88,180,104,237,192,193,131,101,175,238,223, 23,132,157, 63, 47,224,146,228,115, 35,202,249, 37, 80,
- 33,167, 68, 34,185, 19, 26,122, 15, 7,247,254, 10,157, 78, 3,169, 36, 9, 0,144,157,147,143, 42, 68,214,199,156,180, 82,169,
-236,191,228,167,159, 30, 45,153, 61,203,225,219, 78,157,145, 28, 17, 14, 93,110, 22, 8, 61, 9, 54,193,130, 34, 83,136,204, 12,
- 57, 22, 30, 62,153, 41, 87, 42,251,151,211, 73,148, 91,206, 18,139, 21,207,220, 12, 28,145, 24, 92,177,217, 7, 86, 44,190,185,
- 57,184, 34, 49, 88, 92,110,121, 3,184, 63,225,148,203,229, 3, 6, 14, 28,248,242,201,147, 39, 86,227,198,141,195, 55,223,124,
-243, 66,165, 82,117, 0, 80, 88,211,250,164, 40, 74,242,237,183,223, 50, 8,130, 16, 15, 31, 62,156,151,149,149, 85, 26, 89, 93,
- 46,151,227,202,149, 43,240,242, 42,154,213,255,234,213, 43, 52,106,212,168, 66,206,241, 11,163, 36, 0, 86,206, 30,232,180,225,
- 81,132,116, 6,128,117,245, 26,184,224,214,181,155,184,119, 43, 44,240,107, 31,106, 91,143,225, 45,127, 22,118, 24, 60,223,187,
-197, 56,166,216,220, 17,135,206,158, 97, 70, 63,223,183, 90,169,140,172,143, 93,231,230, 85, 84, 78,130, 32, 64,211,244, 39,161,
- 28,152, 76, 38,142, 28, 57, 82,221,115, 63,185,119,239,222,201,147, 38, 77,226, 72,165, 82,188,121,243, 6, 10,133, 2,124, 62,
- 31,215,174, 93, 35, 1,236, 56,114,228,200,181, 35, 71,142,116, 67,209,108,162,144,234, 92,159, 34,145,104, 90, 64, 64, 0,222,
-188,121,131,167, 79,159,158, 1,240,242,197,139, 23,103,222,189,123, 55,164, 93,187,118, 56,112,224,192, 52,149, 74,181,183, 58,
-156, 20, 69,149,141,153, 84,146,241, 33, 66, 46,151,127, 29, 22, 22, 86,221,118,151,230,228,228,180, 45, 22,214, 41,246,246,246,
-230, 17, 17, 17,168, 83,167, 14,116, 58, 93,235,234, 94, 75,249,249,249,191,110,223,190,253,143, 49, 99,198,224,231,159,127, 30,
-126,242,228,201,225, 61,122,244, 64,207,158, 61,177,127,255,126,188,124,249,114, 29,140, 75, 43, 86,222,185,191, 4,240,210,222,
-222,126,170,139,139, 11, 54,110,220,136,200,200,200,181, 43, 87,174, 92,244,242,229, 75,120,121,121,241,162,163,163,201,154, 60,
- 67, 0,192,220,220,220, 92,175,215,227,252,249,243,143, 1,204, 30, 62,124,184,221,150, 45, 91,134,138,197, 98,228,230,230,170,
-162,162,162,134, 1,184,240,119, 63,235,104,130, 88, 60,110,252,140,221,227,199, 13,227,251,182,104, 6,101, 65, 42, 84,242, 12,
- 40, 11,211,177,125,239,117, 16, 4, 3,182,182,142,176,115,112, 70, 82, 82, 50, 30, 92,186,172, 85, 40, 85, 91,184,122,106, 93,
-229,156,211,139, 56,155, 23,113, 42, 21,153, 80,201, 51, 75, 57,237,236,106, 23,115, 38,225,126,216,101,181, 74,161,248, 85, 75,
- 19,191,252,197,231,254,159,140,234,229, 58, 44, 11,153, 76, 54,115,226,196,137, 29, 22, 46, 92,104, 77,146, 36,179, 86,173, 90,
- 72, 74, 74, 34, 79,159, 62,157, 43,151,203,103,214,164, 52, 44, 54,251,165,135,167, 87,135,190,125,251,146,125,250,244,230,140,
- 24,211,141,101,107,103,135,252,188, 28,196,190, 9, 71,204,235,231,240,240,106,138,101, 43, 55, 3,150,150, 85, 38,146, 44, 78,
-171,211,107,197,146,121, 39,218,250,119, 53,247,106,212,148,211,172,190, 5,116,122, 18,169,169,169,184,112, 62, 66, 23,245,236,
- 94, 1, 69,106,135, 40,179,141, 75,193,115, 7, 32,145,131,223,125,236,116, 71,214,108,216, 62,119,199,239, 7,231, 47,156, 49,
- 78,212,206,175, 11, 34,111, 30,192,153,224, 19, 10,181, 70,187,129,195,196,166,168, 28, 40, 99,171, 89, 7,106,181, 90,247,113,
-127,170, 86,171,117,159,219,210,251,247,239, 71, 70, 70,134, 54, 49, 49,241, 42, 73,146, 39, 43, 73,246,252, 9,182, 3,218,126,
- 26,205,205, 37,126,126,221,150, 92,187,198, 31,181, 96,129,118,248,136, 17,243,160,209,232,192,229,210, 44,145,136, 1, 30,143,
-253,234,254,125,193,214,201,147,107, 17, 90,237,141,131,149,132, 13, 40, 7, 95,124,214, 97,137, 69,171,125,251,118, 24, 53,110,
- 54, 84,101, 44, 90, 15,159,198, 66,163,131,209, 22,173, 98, 36, 39,166,164,124, 61, 99,241,146,179, 67, 2, 58,121,251,184,214,
-229,217,186,213,133,216,193, 1, 57, 89, 89,184,255, 52, 70,191,242,196,217,168, 98,145,101, 84, 92, 25,138,162,138, 6,185, 3,
-232, 52,115, 33, 8, 38, 19, 40, 14,227, 80, 50,115,200,173,229, 55, 32, 88, 44, 24,104, 10, 26,141,198,152, 65,127,169,239,223,
-191, 31, 48,124,248,240,144,224,224, 96, 70, 64, 64, 64,179,115,231,206, 81,159,115,237,168, 84,170,175, 1,128,207,231, 39, 88,
- 90, 90, 58,141, 25, 51, 6,122,189, 30, 74,165, 18,249,249,249, 72, 77, 77,205, 27, 51,102,140, 14, 0, 4, 2, 1,119,224,192,
-129,230, 85,113,110, 62, 45, 81,207, 30,232,180,173, 22, 43,113,104, 65,246, 75,183, 90,172,196,132,175,125,168,109,155, 79, 75,
-212,230,181, 21,171,178, 19,239,196, 74, 21,215,118, 31, 58,123,134, 57,178,223, 0,131,179,248,109, 32,223,142, 62, 93, 21, 47,
- 65, 16,159, 4, 39, 53, 82,100,125,128,194,194,194, 69, 75,151, 46,237, 41,147,201,156,187,117,235,198,241,246,246,198,163, 71,
-143, 16, 28, 28, 76, 62,124,248, 48, 69,161, 80,252, 8, 64, 13,224,122, 77,234,212,211,211,211,141,197, 98,149,184,210,126, 43,
- 94,253,219,185,115,231,134,140, 27, 55, 14,117,235,214,109, 24, 29, 29,205, 67, 53,238, 35,154,166, 75,189, 12, 95, 18, 4, 65,
-196,109,221,186,213,201,193,193,129,184,114,229, 10,201,100, 50,107, 98,185,217,191,111,223,190,214,122,189,126,252,132, 9, 19,
-224,239,239, 15,146, 36,113,248,240, 97,236,219,183,207, 88,145, 85, 41, 98, 99, 99,159,167,164,164,124, 59,111,222, 60,108,220,
-184,113,209,188,121,243,144,146,146,130,216,216,216,240,207,225, 45, 40, 40, 80, 37, 39, 39, 11,219,180,105,227, 27, 21, 21, 21,
-213,161, 67,135, 70,227,198,141,195,186,117,235,232,208,208,208,129, 0,174,252, 19,189,119,204,187,220, 32,182,129,117,109,229,
-170, 95,127,170,239,238, 54,105,236,232,193, 76, 79,143, 70, 80,228,167,194,218,198, 30,206, 46,245,144,149,153,141,171, 87,175,
- 24,178,179,243,246, 27, 24,196,138,119,239,114,211, 62,135,211,201,185, 30, 50, 51, 51,113,249,242,101, 67,158,172, 96, 15,244,
-140,149,209, 73,121, 25, 48,193, 24, 75,214, 4, 84, 18, 37,190, 50,216, 88, 89, 89, 29, 51, 55, 55,207, 48, 55, 55,207,176,178,
-178, 58, 6, 24, 53,251,160,115,153,167, 3,243,131,101,224, 64, 62,248,252,175,193, 98,205,177,180,178,186, 98, 97, 97,145,211,
-190,125,123,237,238,221,187,213,209,209,175, 40,137, 36,133,182,176,176,200, 47,221,191, 60,206,143, 96,101,229,110, 38,114,108,
-244,147,133,115,179,251, 98,199,134,133, 98,199,134,133, 22,206, 77, 31,136, 28, 27, 46,183,178,114, 55, 51,170,156, 21,160,158,
- 29,108, 61,108,176,195,203,150, 80,121,216, 96, 71, 61, 59,216, 26,125,238,149,187,253, 12, 4, 1, 3,138,166, 97,163, 6,156,
- 37, 28, 20,147,201, 60,232,236,236,236,136,234, 5,172,251,132,115, 4, 80,119, 4,143, 55,254, 84, 96,224,168,132,208,208,225,
- 5,241,241,223,231,199,197, 13, 14, 63,113, 98,200,111, 67,134,140,248,158,199,155, 48, 16,112, 55,150,211,209,209,113,237,243,
-231,207,131,141, 93,202, 8, 47,163,235,211,189,158,211,181,128,206,173,233,105, 19,251,211,211, 38,246,167, 3, 58,183,166,221,
-235, 57, 93,251,140, 54, 34,152, 76,230, 80,161, 80,120, 76, 36, 20, 70,138,132,194, 72,161, 80,120,140,201,100, 14, 69,229, 99,
-168, 62,224,180,182,182,126,102,111,111,159, 81,157,197,198,198,230, 69, 53,202,249,189,155,155, 91, 10,131,193,216, 92,205,123,
-186, 50, 78, 15,129, 64, 16, 39, 18,137, 82,203, 46, 2,129,160,108, 96, 40,107,161, 80,120, 81, 36, 18,109, 49,134,243,151,197,
-141,126,122,112,125,234,203, 95, 22, 55,250,233,227,109,211,191,179, 26,243, 40,100, 69,206,244,239,172,198, 24, 83, 78, 59, 59,
-187, 80, 59, 59, 59,169,157,157,157,212,222,222,190,210,197,198,198,230,153, 17,156,124, 51, 51,179, 45,102,102,102, 25, 34,145,
-200, 32, 22,139, 51, 68, 34,209,102,148, 9,109, 81,211,250,100, 48, 24,235, 26, 54,108,168,102, 50,153,127,124,180,105, 99,253,
-250,245,213, 44, 22,107, 67, 53, 57,205,219,181,107,103,136,136,136,160,253,253,253,105, 0, 86, 95,176,221, 29,172,172,172,174,
-152,155,155, 39,155,153,153,109, 7, 32,170, 33, 39, 1, 96,168,147,147, 83,120,199,142, 29,149, 78, 78, 78, 97, 0,250,126,193,
-114,246,252,238,187,239,168,228,228,100,154,166,105, 58, 57, 57,153,254,238,187,239, 40, 20, 5,138,252,156,103,242,226,201,147,
- 39,211, 15, 31, 62,164, 31, 62,124, 72,135,133,133,209, 61,123,246,164, 0,252,240,153,207,121,124,169,115,247,174,103,227,254,
- 85, 3,171,147,195, 6,248, 81,215, 47,108,166,151,253, 56,137,238,226,223,136,246,170,111,117,214,195,195,218,227, 75,112,254,
-244,227, 68,186,243,183, 13, 41,111,119,171, 19,222,245,108,220,255,230,115,255,175,178,106,149,188, 72,255,213, 3,206,254,223,
-180,248,161, 88, 42, 31,181,107,215, 70, 78, 78,107, 62,139,229,199,227,241, 58, 48,152,204,219,185, 89, 89,179,138, 95,183, 12,
-127,151,169,182,210, 14,221, 29,220, 74, 82, 18,212,132,243,131,129,236, 53,228,172, 14,135, 81,156, 21, 37,149,166, 52,154, 52,
-107,146,124,182, 29,149,214,193, 7,156, 78, 78, 78,227, 41,138,114, 51,182, 64, 12, 6, 35, 65, 34,145,236,173, 73,125, 54,104,
-208,128, 46,118,111, 19, 95,178,221,255,138,107,233,127,137,243,208,175,141,107,123, 53,254,106,126,228,243,232,141,197,110,197,
- 82, 44,159,110,101,230,215,177,253,210,251,183, 66,127, 94,190, 93, 86,248, 15,159, 59, 3, 70,142,105,251, 2,156, 37, 65, 66,
-171,197,201,102,179,119,183,106,213,106,252,163, 71,143,254, 48, 24, 12, 19,254, 71,175,207,158, 76, 38,115,158,167,167,103,179,
-216,216,216,112,131,193,176, 17,229, 4,138,172, 65, 57,127,116,115,115,155,194,225,112,120,114,185, 92,150,150,150,182, 20,192,
-201,127, 91,125,122, 55,168,229, 75,211,165, 65,183, 87,191,121,159,251,228,139,113,210,148,129,162,153,171, 98,227,115, 94,252,
- 3,237,254, 95, 35,178,138,133,214,158,191,227,143, 59,155, 56, 77,156, 38, 78, 19,167,137,243,139,115, 10, 76,245,105,226,252,
- 47,228,252,175, 66,137, 69,139,101,170, 10, 19, 76, 48,193,132,255, 56,168, 76, 85, 96,130, 9,255, 58,148,181,106,149, 90,179,
-136, 74, 84,105,117, 76,130, 53, 81,182, 55, 77,156, 38, 78, 19,167,137,211,196,105,226, 52,113,254,207,113,254,183,138,172,178,
-174,194, 9, 38,215,161,137,211,196,105,226, 52,113,154, 56, 77,156, 38,206,127, 19,231,127,186,208,194, 71, 66,203,228, 58, 52,
-225,239,193,182,126,112, 2,128, 25,231, 32,249, 43,246, 55,193, 4, 19, 76, 48,193,132,127, 24,123, 80,129,235,240,223, 32,180,
-106, 3,248, 26, 69,137,111, 99, 0,220, 3, 32,251, 12, 62, 27, 0,131, 9,130, 24, 4, 0, 52, 77,159, 66,209,172,145,108, 99,
- 14,230,243,249, 25,106,181,218,174,248,123,166, 90,173, 46,155,203,128,192,167,179,217,232, 50, 75,185,112,115,115,203,208,104,
- 52,118, 70,252,125, 62, 77,211, 47, 25, 12, 70,164, 88, 44,190, 21, 27, 27, 27, 92,157, 19,239,208,161,195, 40, 38,147,185, 26,
- 0, 12, 6,195,226,219,183,111, 31,252, 11,219,173,181, 75,109,132,110,109,220, 0, 0, 32, 0, 73, 68, 65, 84,135, 3, 58,189,
-142,204,200,202, 93,138, 79, 3,249, 1, 0,118,244,194, 90,130,196,252,226,239, 27,166, 6, 87, 30, 71,167,186,251, 87, 2, 95,
- 54,155, 61,205,222,222,190,123,106,106,234, 51, 0, 11,128,170,163, 26,187,184,184,252,192, 98,177,134, 27, 12, 6,119, 38,147,
- 25, 71,146,228,145,148,148,148, 32,211, 51,196, 4, 19, 76, 48,193, 4, 35,196,214, 39,168,150,208,242,178,134, 3, 13, 12, 5,
-129, 46,160,113,131, 0,142,199,228, 32,221,216,227,123,120, 65,175, 39,139,254,147,195,128,225,202,123,198,158,238,221,187, 59,
- 79,159, 62, 29,223,124,243, 13, 30, 61,122,212,102,255,254,253, 99, 78,158, 60,249,146,162,168,219, 0, 30, 1, 70,133, 82, 16,
-161, 40, 78,203,176,238,221,187,119, 94,189,122, 53,179, 81,163, 70, 80,169, 84, 8, 13, 13,245,219,176, 97,195,150, 7, 15, 30,
-220, 4,112,180, 88, 16, 84,152, 0, 79,173, 86,219,149, 36,227, 36, 8,194,110,224,192,129, 79,202,138,171,226,252,106, 4, 77,
-211, 15, 9,130, 8, 51, 24, 12,143, 78,159, 62,157,226, 5,180,158,232,198, 57, 61, 43, 65,231,252, 49,167, 70,163,177, 59,255,
-203, 26,176,120, 60,104, 10, 11,208,102,244,255,139,222, 27, 63,205, 7, 65,145, 96,130,150,117, 88,181,229, 37,128,200,180,180,
-180,151,254,254,254, 9,213,109, 97, 38,147,185,250,234,213,171,142, 52, 77, 35, 32, 32, 96, 53,128,191, 74,104,241,190,246,109,
-122,251,226,153, 99,124,121,110, 6,186,245, 29,114,228,109, 74,230, 40, 0,103, 62, 16, 77,221, 97, 79, 16,152, 63,121,205, 81,
- 38, 0,236,252,113,216,130,205, 93,177,109,246,117,164, 3,232, 80, 44,126, 0,224, 23, 0,183,119,116,135, 61,128,133,147,215,
- 28, 37, 0, 96,215,143,195,230,239,232,142,173, 83,175, 84, 59,108,197,148, 81,163, 70,109, 91,189,122, 53,211,209,209, 17, 18,
-137,164, 91,195,134, 13, 61, 11, 10, 10, 26,162,146, 65,196,117,235,214, 61,209,174, 99,239,122,253, 7, 13, 21,218,218, 88, 33,
- 77,154,109,126,226,216, 31, 19,153, 15, 67,187, 39, 38, 38, 14, 49, 61, 67, 76, 48,193, 4, 19, 76,168, 0, 53,143, 12,223,220,
- 17, 2,133, 14,223,177,152,196, 15,109,125, 27,118,250,190, 71, 59, 70, 67,239, 6,120,253, 42,186,235,133, 91,143, 55, 48,194,
- 94,133,144, 6, 58, 72,196,193,249, 23,210,202,103,194,232, 73,176,174,159, 63, 90,212, 19,142, 25,198,124,242,228, 73,131, 22,
- 45, 90,148,166,134,233,212,169, 19, 58,117,234, 68,236,220,185,179,233,245,235,215,155,238,219,183, 79, 23, 18, 18,114, 0,149,
-199, 71,153, 86,191,126,253, 13,219,182,109,227,249,251,251,131,199,227,149,110, 16,139,197,232,221,187, 55,122,247,238,205, 76,
- 75, 75, 11,184,120,241, 98,192, 47,191,252,162, 77, 74, 74,154,135,255,143,210, 92, 41,150, 46, 93,234, 91,206,234,171, 4, 65,
-188, 39, 73, 50,188,105,211,166, 41,158, 64,131,137, 61,190,185, 49,165,173,135,104,214,162,253,229,242,176,184, 92, 28, 26, 85,
-212, 87,151, 21, 90, 9,183,174, 64,108,110,150, 35, 52, 51,123, 9, 32, 18,192, 75,154,166, 35,227,226,226,162,191, 2,154,126,
-109,197, 56,240,135,140,106, 82, 13,177,133,148,148, 20, 88, 88, 88, 8,252,253,253,165, 4, 65, 44, 15, 13, 13,253,210, 3,242,
- 90, 47,159, 63,133, 35, 75,124,137,244, 55, 15, 49,103,144,159,112,214,246, 63,127, 86,107,245,103, 42, 59,136, 32, 24,140, 95,
-194,168, 64, 20, 37,227, 93,154,147,147,227, 15, 0,214,214,214, 92, 0,183, 55, 63, 70,143,217,109,137,207,137,237,198, 97, 50,
-153, 59,246,239,223, 63,238,135, 31,126, 40, 74, 29,113,255, 62,196, 98, 49, 86,174, 92, 89,119,238,220,185,107, 73,146,156, 89,
-145, 37,171, 93,199,222,245,182,110,252,185, 97, 97,110,190,230,247, 29, 39,159,214,246,241, 98, 76,158, 54,215,108,171, 78,227,
- 96, 48, 24,126, 48, 89,182, 76, 48,193, 4, 19, 76,168,142, 53,171, 74,161,229,105,131,131,205,125, 60, 6,127,223,211,143,215,
-216,167, 17, 56,188,255, 15,221,210,194,215, 23, 45,124,125, 25,129,242,194, 46, 79,158, 62,239,114,250,250, 35,141, 82,159,116,
- 50, 54, 27,163,140, 45, 85, 73, 82,218,213,125,237, 59, 42,242, 50,249, 0, 32,178,180, 83,255,120, 62,253, 86,219,182,109,225,
-236,236,204, 9, 9, 9, 25, 91,133,208,250, 49, 38, 38,134,199,100, 86, 30, 15,181,118,237,218, 24, 56,112, 32,188,188,188,184,
-237,219,183,255,177, 34,161,197,231,243, 51, 9,130,176, 3,128, 90,181,106, 25,150, 47, 95, 30, 78, 23, 1, 0,104,154,166, 31,
- 50, 24,140, 71, 20, 69, 61,254,243,207, 63, 83, 27, 2,118,221, 90,120,221,155, 50, 98,160,144, 62,189,165, 66,145,160, 46, 40,
- 40,119,189, 80, 44,202, 18,136, 68, 47,121, 66,126, 36,138,114,121, 69, 58, 59, 59, 71, 55, 4,156, 91,121,185, 93,223, 57,123,
-152,217, 31, 19,126,174,178, 46,155, 55,111,238,217,164, 73, 19,190,193, 96,128, 66,161,192,174, 93,187, 44, 4, 2,129, 69,247,
-238,221,151,149,189, 0,188,129,198, 3,106, 51, 39,172, 72, 51, 76,173,193,133,100,217,174,141,111,226,192,222,221,205,125,191,
-110,135,183,183, 15, 35, 55,183, 16,249,121,114, 80, 20,245, 73, 92,159,169, 87,144,177,163, 23, 54,236, 92, 52,108, 33,193, 96,
- 16, 77,251, 45, 64, 31,135,252, 25,187,119,239,126, 5,128,205,229,114,203, 94,135,181, 5, 78, 62, 27, 26,116,109,135, 93,139,
- 71,128,166, 40, 26,192,134,106, 88,179,236,204,204,204, 46, 92,191,126,189,117,203,150, 45,241,232,209, 35,196,199,199, 99,202,
-148, 41,218,169, 83,167,114, 70,142, 28, 73,204,153, 51,103,250, 47,191,252,114, 26,192,131, 79,110, 4, 22,107,120,223,254, 67,
-184,242,188, 2,181, 86,163,211,214,178,177,164, 52, 10,181, 50, 91, 86,160, 30, 50,108,188,246,213,139,199,195, 1,124, 34,180,
- 62,179, 62, 77, 48,193, 4, 19, 76, 48, 2, 52, 77,183, 4, 96, 11, 32,139, 32,136,167,101,127, 23,239, 82,146,173,229,227,223,
-217, 40,242, 74, 89,151,161,203, 70,209,112, 31, 91, 0, 6, 0, 79, 8,130,144,125,102, 17, 43, 79,189, 19, 28, 28, 76,151,253,
- 44, 35,180,104,154,166,105,125,206,123, 90, 19,123,133, 86, 62,221,251,201,162,122,117,134,150, 62, 57, 73, 63, 62,250, 19,237,
-105, 83,121, 22,246, 30, 94,208, 15,107, 2,122,114, 75,208, 51,219, 91,170,159, 60,121, 18, 66, 81, 84,112, 96, 59,208,244,235,
-163, 52,253,250, 40, 61,187, 13,232,211,167, 79, 95, 93,187,118,109,112, 80, 80, 80, 48,128,170,198, 41,101, 20, 62, 13,163, 31,
-219,129,174, 8, 49, 49, 49,244,238,221,187,233, 69,139, 22,209,127,252,241, 7,141, 42, 34,168, 7, 4, 4,132, 70, 69, 69,209,
- 35, 71,142, 12, 71, 37,129, 1,189, 1,209,240,186, 14,111, 52, 39,182,232,180, 63, 52,166,101,223,242,203, 61,127, 71, 71,199,
- 15,202,179,206,195,129,254,173,149, 7,125,176, 75,139,116,154,166,175,210, 52,189,142,166,233, 33, 52, 77,123, 1, 64,115,192,
-188,175,163,245, 59,245,201,173, 42,237,132,175,171,204,123,215,188,121,115,207,121,243,230,229,106,181, 90, 58, 33, 33,129,254,
-253,247,223,233, 27, 55,110,208,231,207,159,167,253,252,252,210,202,148,215,126,140,151,107,134,118,223, 10, 77, 77,174, 34, 54,
-147,249,219,211, 27,167,233,119,247, 78,209, 79,142,175,165,143, 44,249,158,158,222,183,181,206, 92,192, 83, 3,232, 88,209,113,
- 83,219,162,129, 87, 93,219,216,164,164, 36, 90,167,211,209,163, 71,143,166, 3, 2, 2,232,174, 93,187,210,157, 59,119,166, 59,
-117,234, 68,119,236,216,145,190,117,235, 22,157,150,150, 70,119,110,215, 66,209,203, 27,190,213, 40,154,143,171,171,107,122, 66,
- 66, 2,173,211,233,232,144,144, 16,250,240,225,195,116, 72, 72, 8, 29, 24, 24, 72, 3, 56, 56,121,242,100,149, 76, 38,163, 3,
- 2, 2, 82, 81, 78,212,120, 87, 87,215,232,168,216,148,148,205,107,246,222, 58,244,219,177, 91,103, 79,223,184,117,225,218,147,
- 75,231,175, 61, 61,249, 56, 34,238,188,171,171,107,116, 57,237,255, 89,245,105,130, 9, 38,152, 96, 66,213, 90,164, 88,104,245,
- 44, 54,118,244,164,105,186,243, 71,191,123, 22, 11,167, 79,126, 7, 6, 6, 46, 42,251,187,100,159,192,192,192, 69, 0,232, 54,
-109,218, 28,163,105,186,193, 23, 40,254,132,143,151,106,205, 58, 36, 83,159,128,227,209, 29,108,131, 30,250,236, 24, 80,121, 73,
-128,200, 1, 42, 66,140, 28,105, 18,222,220, 59, 83,121, 34,137, 98, 92,142, 1, 27, 64, 72,116,116, 52,222,188,121,131,148,148,
- 20, 8,133,194, 79,246,187,127,255, 62, 4, 2, 1, 28, 29, 29,141, 83,186,218, 15,251,185,151, 45, 92, 33,110,227,143,236,239,
- 39, 33, 36, 36, 4,153,153,153,224,112, 56,224,114,185, 32, 73,178, 74, 62, 6,163, 40,227,111,137, 21,171,188,125,252, 1, 22,
-175,150,248,226,206,101, 51,221, 24, 15,131,217,170,228,119, 72, 83, 27,140,179,228,137, 69, 16,138,132, 82,129, 64, 88,234, 46,
- 4, 16, 73, 16,196,219,230, 0, 91, 36,230, 95, 60,176,106,142, 3,243, 69, 8, 95,245,238,101,185, 28,157, 59,119,158, 8, 96,
- 25, 77,211,121, 77,154, 52,177, 95,189,122,181,149, 68, 34,193,235,215,175,113,242,228,201, 44,178,232, 68, 9,154,166, 87, 0,
-192,215, 0,223,210,214,242,218,111, 63,205, 52,195,237, 19,220,154, 92, 69, 22,222,189, 47, 13, 24, 57,121,234,182,153,189,161,
- 40, 84,225,232,141, 23,184,250,252,125, 31, 0,247, 81,201,184,183, 29, 15,240, 14,200,234,212,191,127,255,240,187,119,239,218,
-236,219,183, 15, 36, 73,150,187,236,219,183, 15, 55,239, 61,159, 1,224,153,145,197,170,237,230,230,118,243,241,227,199,182, 66,
-161, 16, 55,110,220, 64, 94, 94, 94,169, 37,107,212,168, 81, 68, 94, 94,222,208, 93,187,118, 13, 72, 76, 76,220,120,239,222,189,
- 28, 20,229,130,252,224, 66, 96, 50,153,239, 73, 82,247,149,163,119, 3,214,160,222,237,218,201,115, 94, 66,108,221, 4, 15, 35,
-222, 95,204,147,229,168,152, 76,230,251,178,251,127,137,250, 52,193, 4, 19, 76, 48,161,122, 32, 8, 34,152,166,233, 94, 4, 65,
- 4,127,188,238,227,239, 37,251,173, 93,187,182,244,119,201, 49,235,214,173, 91, 83,230,183,242, 11, 21,175,210,193,240,237,139,
- 21,100,251,242,118,210,188, 62, 11,205,155, 11,224,184,182, 5,215,171, 15,152,174,126, 72,126,121, 27, 17, 87, 54, 35,245,213,
-125,208,148, 1,142,158,173,140, 45,136,250,171,175,190,130, 90, 93, 52, 52, 75,163,209,128, 35,178, 82,207,153, 48,140, 15, 0,
- 20,139,175, 41,163, 96,141, 34, 52,107,219, 1,173, 50,104, 60,177, 47, 50, 84,180,202, 40, 58,110,213,232,209,224,112, 56,224,
-112, 56, 32,138,135,254, 24, 35,180,136,226,157,169, 34,247, 85,121,133, 32,148, 60,246,209,227,203,166,181,226, 37, 70,114, 53,
- 81, 15,145,166,161,232,139, 25,134, 75,198,148, 87, 40, 18, 74, 4, 66, 97,164, 64, 44, 42, 21, 90, 4, 65,188, 7, 0,154,205,
- 14, 58,188, 98, 90, 19, 81, 70,156, 72,253, 52, 4, 82, 53,165,171,128,102,197,149, 43, 87,236, 88, 44,150,131,193, 96, 64,114,
-114, 50, 94,189,122,133,173, 91,183,102, 20, 22, 22,182,127,241,226, 69,108, 89,237,104, 16,112, 79, 6,173,156, 89,143,245,242,
- 14, 95,243, 62,170,218, 87,143,141,207,119, 1,125,218, 55,189, 52,113,196, 98,124,215,163, 43, 70,182,111, 72, 39,164,229,170,
- 1,220, 40, 54,189, 86, 5,201,139, 23, 47,186,124,251,237,183, 71,154, 53,107,230, 77,211, 52, 26, 55,110,140,161, 67,135, 34,
- 40, 40, 8, 17, 17, 17, 40, 40, 40,208, 93,191,254,127,236,125,119, 88, 20, 87,227,245,153,217,190, 44,189,131, 5, 21, 69, 41,
- 10,138,162,216, 16, 75,212,136,137,221,216, 19, 19,125,237, 53, 17, 53,198,146, 40, 36,198, 94,162, 38, 49,150, 55, 22, 98,139,
-216, 91,192,136, 29,165, 8,130, 5,105, 46,189, 45,176,125,230,126,127,176,172,136,148, 5,205,247,203,155,236,121,158,125,102,
-103,103,230,236,157,123,103,238, 61,247,220,118,113, 51,128,189, 6, 6,203,196,202,202,234,252,213,171, 87,237, 76, 76, 76,112,
-241,226, 69,200,229,114, 56, 57, 57, 97,214,172, 89,130,208,208,208,253, 37, 37, 37,163, 67, 66, 66, 68, 41, 41, 41,219, 47, 92,
-184,208, 2, 21,235,206,189,241, 16,168, 84,170, 61,191, 30,216,183,117,214,236, 57, 77,174,222,122,116, 69, 89, 42,179,112,113,
- 73, 47,177,179, 50, 53,219,252,237,234,230, 42,149,106,122,205,241,249, 71,163,226,211, 8, 35,140, 48,194,136, 55, 80,167, 22,
-169, 42,158,170,139,173,134,136, 52, 0,242,224,224,224,101, 20, 69,133, 7, 7, 7, 47, 11, 9, 9,145, 3,120,249, 87,136, 44,
-189,208, 10, 10, 10,138, 8, 15, 15, 71, 80, 80, 80, 68,173, 20, 44, 3,117, 74, 36,212, 41,145, 16,251,207,197,239, 33,227,170,
-221, 60,219,232,208, 13, 93,115,233,170, 82,169,228,238,219,183, 79,223,111, 11, 0, 24,134,121,231,169,216, 16,161,165, 19,122,
-111, 4,162,165,208, 52, 98,207,130,209,221,108,152,114,158,234,207,211,200, 84,178,218,239,159,168,203,239, 22,145,239,106,227,
- 60, 57,127, 58,210,175, 95,134,137,169,105,250,167,145,177,122, 23, 75, 39,178,158, 3, 64, 11,161,217,149, 93,243,134,245,116,
-228,131,175, 58, 19,134,151, 74, 86,185,235,133,102,111, 45, 15, 27, 8, 33,120,254,252, 57,202,203,203, 17, 21, 21,133, 99,199,
-142,229,214, 32,178,208, 82,104,250,199,207, 95, 76,232,106, 46,203,226,171,238, 94,198, 75, 37,107, 80, 83,151,109,135, 97, 61,
-248, 52,117,145,162, 57,226,126,221,218, 98,254,103,195,177,233,231,223,181, 42,251, 94, 65, 91, 79,157, 29, 83,170, 84, 47, 51,
- 80,100,233,205,198,232,232,104,207,232,232,104, 33,128,192,143, 62,250,232,236,200,145, 35, 17, 17, 17,129,211,167, 79,187, 1,
-144,234,206, 91,131,138,133,178,191, 3,240,172, 54,227,145,207,231, 31,190,124,249,178,151,179,179, 51, 46, 95,190, 12,185, 92,
-142, 25, 51,102,168,102,207,158,205,159, 50,101, 10, 85, 92, 92,172,119,178,162,162,162,242,107, 19, 89, 0,144,153,153,121,238,
-216,209,131,221,123,247,238, 61,188,149, 91, 59,243,103,178,146, 28, 19, 19,145,248,122,196, 53,254,221,219, 55,182,103,102,102,
-222,169, 57, 62,175, 24, 28,159, 70, 24, 97,132, 17, 70,212, 14,131,180, 72, 53,103,170, 33,168,114, 29, 47, 36, 36, 36, 62, 36,
- 36,228, 53,199,235, 45, 81,125,212,225,153,202, 50,173, 81,243,104, 49,197,105,111,222, 0,203, 54,228,102,223,248,205,202,202,
- 74, 43, 22,139, 95, 19, 90,172,129,156, 5, 39, 14,225,217,204,241,122, 39,171,210,217,194,160, 41,111, 37,180, 88,150,141, 2,
-240, 90, 32, 76,236,219,142,219, 60,212,163,135,103,171, 38,180,230,232, 22,100,148,107, 21, 43, 31,171, 21,137, 50,242, 65, 66,
- 13,157,172,245,156, 90, 13, 68, 18,113,170,216, 84, 82, 93,100,189, 0, 0,137,131,219,200,239, 7,183,235,227,211,174, 53,173,
- 61,178, 17,153,229,154,210,224, 4,181,250, 89, 25, 57, 94, 75, 28,174,124,239,189,247, 86,218,216,216,136,182,110,221,106,225,
-226,226, 2,173, 86,171,170, 46,178, 76,236,219,142,219, 50,172,125,143,182,142, 86,180,230,183,109, 72,151, 51,229, 91,158,105,
-246, 27, 34,178,108, 45, 76, 47,236, 90, 55, 83,108, 34,228, 65,161, 80, 32,116,231,111,184,120, 35, 46, 40, 47,238,228, 5, 0,
- 23,222,226,129,252, 52, 40, 40,104,211,154, 53,107,160,209,104, 48,117,234, 84, 60,125,250,244,226,227,199,143,183, 52,111,222,
-124,241, 23, 95,124,225,236,232,232,136, 49, 99,198,240, 53, 26,205,148, 90, 56,190,253,245,215, 95,131,124,124,124, 16, 17, 17,
-129,162,162, 34, 56, 57, 57, 97,246,236,217,130,144,144,144,253, 37, 37, 37,163,215,173, 91, 39,122,254,252,121,157, 78,214,107,
-207, 53,195,124,179,123,211,204,197, 93,186,245,164,159, 60, 73,210,166,249, 5,208,215, 46,159,142,180,177,177,217,159,150,150,
-246, 42, 62,135,119,104,112,124, 26, 97,132, 17, 70, 24,241,110, 64, 81,212, 25, 93,191,171,215, 92,174,234, 34,172,210,177,170,
-186, 95,253,124,221,241,119, 81, 89,222, 83,131,240,122,125,122,135,160,160, 32,131,135,213,179,101,185, 6,137,167,234,120,191,
- 29, 52, 77, 76,193, 93, 22, 64,131, 47,177, 82, 12, 93,115,233,106,109,231, 74, 36, 18,131, 29, 45, 86,169,168, 47, 81, 26, 36,
-180,116,125,180,206, 19, 66, 94, 19, 90, 22, 14,109, 3,150,124, 49,111,115,207,145,131,232,236,207,252, 81, 84,170, 84,126,241,
- 72,203,102,148,215, 45,178, 42, 74,113, 77,138,137,196, 52, 86, 36, 49,169, 42,178,210, 0, 64,100,223,218,239,243,249,179,118,
-246, 29, 55,148,202,157,209, 19,133, 69,114,229,226,120, 45,149, 41, 39,163, 19,128,107, 53,209, 93,189,122,117, 55,128,221, 1,
- 1, 1,217, 18,137, 4,165,165,165,111,164, 65,101,120,123,140, 28, 68,103,127,218, 21, 5,101,106,229, 23,241, 90,188,148,179,
-135,235, 19, 89,118,150,102, 23,118,173,157,105,242, 50,227, 5,248,124, 62, 76, 77, 77,113,233,207, 88,228,197,159,122, 27,129,
- 5,154,166, 87, 5, 7, 7,175,156, 53,107, 22,242,243,243,113,250,244,105,188,255,254,251, 56,116,232,144,203,217,179,103, 55,
- 5, 6, 6,130,195,225, 32, 60, 60, 28, 26,141, 38,185, 22,154,225,211,166, 77, 91, 60,114,228, 72,220,185,115, 7, 82,169,244,
- 53, 39,171,168,168,232,163,157, 59,119,142, 76, 73, 73,169,215,201,170, 6,191,150,173, 59,241,151,174,216, 0,101,121, 14, 55,
- 55,243, 86,196,149, 75,244,205,130,130, 2, 19, 0,197,141,141, 79, 35,140, 48,194, 8, 35, 12,118,181,106,211, 34,185, 58, 17,
-149, 91,211,126, 21,129, 85,211, 62, 85,205, 5, 83, 85, 59,254,240,175,188, 39,131, 28, 45,174, 67,123,104,179,227,170, 8,173,
-156,215,142,139,204,172, 13,106, 58,212,104,193,221,181, 87, 63,143,150, 40, 63, 63, 95,100,107,107,171,168, 42, 16, 76, 76, 76,
-224,236,236,140,194,194, 66,236,217,179, 7,168,191, 83,180,214,124,228, 68,248,141,155,138,187, 77, 5, 32, 26,181,222,217,218,
-245,241,199,175,137, 45, 62,159, 95,217, 55,172,190, 66,247,182,206,105,186, 9,128,116,114,107,245,181, 72, 34,249, 88,100,219,
-204,118,254,204, 79,121, 41, 57, 74, 92,237,185,180,232,183,111,151,152,166, 19,211, 89,105, 40,190, 81, 15,223,179, 15,127, 56,
- 88,221,201,202,232,232,214,106,185,200, 68,244,153,192,186,133, 99,240,194,153,188,148,108, 37,117,213,239,139,146, 99,223,125,
- 97,242, 28,102,139, 51, 80,116,205,128,228, 89,249,254,251,239,175, 36,132, 16,150,101, 87, 0, 64,213,240, 46,156,253, 25,239,
- 89,150, 2, 87,122, 46, 47, 60,246,237, 18,179,116,212, 29, 94,219, 14,195,122, 56, 88,153, 95,216,181,110,150,137, 52, 51, 21,
- 66,161, 16,102,102,102, 72,207, 46, 6,143,203,145,191,229,243, 38,236,213,171,215,146,153, 51,103, 34, 54, 54, 22, 51,102,204,
-144,166,165,165, 29, 63,114,228,200,140,175,190,250,138, 59,112,224, 64, 72,165, 82,172, 95,191, 94,243,231,159,127,174, 3,176,
-190,198,231,145,203,253,244,235,175,191, 38, 47, 95,190,164,158, 63,127, 14, 39, 39, 39,204,153, 51, 71,176,110,221, 58,125,159,
-172,134, 56, 89,149,200,204,204,140,184,120,249, 38, 62, 56,183, 25, 90,141, 50,162, 40, 63, 45, 50,241, 89, 97,132,181, 64,176,
-168, 73,167, 14,141,138, 79, 35,140, 48,194, 8, 35,222,137,139,117,183,174,253,191, 1,106,106, 58, 52, 72,104, 37,111, 91,254,
-137,219, 39,179, 62,135,216,165, 7,148, 9, 39,192,150,102,235, 29, 45,145,169, 21,172,155,123,160,168, 76,137,176, 43,247, 1,
- 32,185, 33,161,146,201,100,240,245,245,197,142, 41,109,251, 42,100,249, 34, 49, 0,165,208, 92,113, 82,208,235,234,217,179,103,
-203, 89,150, 61, 12,224,108, 61, 52,171,188,188,188,182,111,216,176, 65,224, 49,238, 19,148,222,186, 94,221, 65,129, 88, 44,134,
- 80, 40, 68, 76, 76, 12,174, 94,189,170, 2,176,170,158, 4,189,173,213,106, 31, 30, 57,114, 36,163, 77,171, 38,131,124, 59,122,
-207, 93,182, 52,216,236,209,245,139, 88,177,110, 59,219,166,243,192,226,208, 67, 39,101,197,166,205,251,201,165,143, 31, 24,112,
-171, 15,171,137,172,151,238, 45,155,245,237,216,222,235,243, 21, 43,150,155,199, 95,191,132,175,190,219, 69,220,124,250, 23,127,
-119,236, 84, 73,158, 73,139,247, 20, 57,137,119, 12,137,195,136,136,136,221, 0,118, 87,238, 87, 15,111,240,154, 45,108,219, 46,
-131, 10, 67, 15, 29, 43, 43, 49,107,222,191,174,240,218,121, 12,239,222,212,206,234,194,182,111,254, 99,146,149,153, 6,161, 80,
- 8, 83, 83, 83,164, 73,139,176,114,243,209, 50, 53,203, 14,122, 91,161,101,102,102, 38, 84,171,213,216,177, 99, 7,210,210,210,
-252, 1,164,221,187,119,111,215,216,177, 99,183,118,232,208,193, 61, 62, 62, 62,185,180,180,116, 22,128,196,218, 72, 44, 45, 45,
-253,237,236,236,168,155, 55,111,226, 63,255,249,143,106,206,156, 57,252,201,147, 39, 83,133,133,133,141,117,178, 0, 0, 77,154,
- 52, 9, 24,208,175, 27,122, 12,152, 17,161, 82, 20, 69,166, 36,238,143,160,201, 13, 81, 99,227,211, 8, 35,140, 48,194,136,127,
- 13, 26, 55, 49,120, 0,192,109,107,131,233, 94, 77,248, 89, 7,190,157, 67,100,207,162,136,252,206,110, 82,114,226, 51,114,102,
-253,100,114,118,219,124, 50, 99,136, 23,113,183,167,178,218,218, 96,122,192,155,194,237,181,213,189,223,111, 7,205,128,214, 32,
- 3, 90,131, 12,105, 11, 13,128,101,157, 58,117, 58, 57,219,239,213, 60, 90,179,253, 64, 0,252, 7,128,105, 45,193,170,105,197,
-112, 39, 0,123,124,125,125,181,215,174, 93, 35,143, 71,247, 39,209,238,182,100,214,172, 89,228,171,175,190, 34,227,199,143, 39,
-118,118,118, 90, 93, 68, 56,213,199,249,193, 7, 31, 52, 5,128,102,205,154, 89,118,246,104,147, 21,115,229, 52,137, 60,176,149,
-252, 60,123, 4,233,218,193, 35,207,209,189,247, 67,177, 83,187,142,245, 68,159,158,211,209,209,113, 41, 33,100, 16, 33,196, 9,
- 0,220,220,108, 76, 59,185,183,121,249,240,242,105,114,253,224,118,242,243,236, 17,164,155,183,103,126, 83,143,192, 68,145,189,
-187,159, 33,156, 53,161,198,240,182,119,207,115,104,211,253, 65, 29,225,213,115,182,242, 27,115, 42,227,101, 54,185,125,251, 54,
- 57,123,246, 44,185,126,253, 58, 57,112,228, 20,105,222,101,116,169,109,135, 97, 61, 26,240,232,212, 22, 78,139, 33, 67,134,144,
-228,228,100, 50,120,240, 96, 2,192,162,145,156, 39, 83, 82, 82, 72, 92, 92, 28, 89,182,108, 25, 1,176,111,230,204,153,242,226,
-226, 98,210,191,127,255, 52,157,192,226, 54, 38,156,174, 45,155,132, 14, 31,218,107,213,236,255,140, 12,120,219,248,124,135, 48,
-114, 26, 57,141,156, 70,206,127, 3,231,255, 50,156,116,174, 86,229,182,147, 65,243,104, 69, 0, 90,228, 99,119,123,123,245,127,
-215,173,223,182,104,199,238,125,159, 47,153,251,169,164, 87,207, 1,136,189,252, 11,142,133, 31, 41, 83, 40, 85,235,249, 28,108,
-136,203, 71,121, 82, 61,161,208,205,163,245, 26,162,163,163, 77,172, 91,191,154,131,233, 73,197,220,172,187, 26,120,131, 82, 0,
-211,238,223,191,191, 33, 48, 48,112,237,103, 61,252, 70,204,238,222, 23, 26,141, 6, 7, 14, 28, 64,106,106,234,113, 0,203, 13,
-117,220, 98, 99, 99,243, 60, 91,187,204,227,113,184,159,207, 26, 63,220, 46,247,233, 35,100, 36, 68, 3, 0,148, 74,185, 38, 43,
- 57,210,167, 33,129, 19,139,197,183,237,236,236, 30,219,217,217, 21,182,109,213,108,154, 16,188, 21, 51, 62,250,208, 62, 63, 37,
- 17,233,241, 21, 45,163, 74, 69,185, 58, 35,249,154,123, 99, 82,215,197,197, 69, 40,225, 97,122,141,225, 85, 41, 52,217, 79, 18,
- 59, 26,194, 83,174, 84,173, 91,189,233,192,123,223,124,254,177,208,220,220, 28,247,227,158, 96,197,198, 67,101,114,149,102, 80,
- 94,236,201,119,210, 60, 70, 8,129, 70,163, 49,120,160, 67, 45, 88,226,227,227,211,110,237,218,181,110, 83,166, 76,193,219, 58,
- 89, 85,241, 44, 37, 51,184, 73, 51, 87,207, 39,143,239, 7, 90,139,249,255,125,155,248, 52,194, 8, 35,140, 48,226, 95,131, 33,
- 58, 51,103, 90,149,109, 52, 12,172,245, 35, 46, 7,229, 0,214,180,226,148,238, 90,186,118,211, 74,154,218,252, 49, 75,200, 47,
- 90, 26,171,159,231, 35,247, 45, 3, 87,206,227, 66,251,222,176,241, 92, 0,224,113, 27, 87, 64,234,144, 12, 96,228,143, 55,238,
-116,249,241,198,157, 47,117,191,125, 3,160, 65,109,185,102, 92,196,245,244,116,109,210,171,147,151,136,195,200,145,145,240, 20,
- 5,101, 10, 92,138, 79, 45,162, 9,253, 75, 67, 3,245,252,249,243, 63, 0,192,193,194, 36,161,151,103,235,230,189,125,189, 76,
-120,148, 10, 25,143,238,163, 88,174,194,197,248,212, 98, 80, 84,163, 59, 84,191,171,240,102,199,158,186,251, 59,168,254, 20, 69,
- 93, 94, 54,123,156,112,229,198,195,239, 84,100, 1, 40,207,204,204,204, 47, 47, 47,183,121,249,242,165, 10,141,159, 36,238, 73,
- 73, 73, 73,135,249,243,231,175, 89,188,120,241,231,223,126,251, 45,191, 49,125,178,106, 67, 97,102,234,137,222, 94,239, 46,253,
-141, 48,194, 8, 35,140,248, 87, 96, 90,181, 45, 12, 22, 90,122,193,144,131, 92, 0,179, 92, 93,201,194,103,207,160,122, 87, 33,
-171,201,233,122, 75,220, 5, 48,180,209, 87,211,148,236, 86,114,106,233,237,228,212, 82,176,132,176,132, 40,105, 26,233,101,106,
-245,186,228,231,153,141, 31,117, 71, 81,204,221, 39,105,242,123, 79,211, 21,132,101, 9, 75,136,138,162,144,165,209,176,235,226,
-159,167,158,250, 59,132, 55, 47,246,228,141,112, 45,213,235,198,237,184,133,101,101,234,237,121, 9, 39,163,222, 97,186,104, 98,
- 99, 99, 39,248,251,251,127,194, 48,204, 46, 0,154,183,224, 82,105,181,218, 37,161,161,161,199, 99, 99, 99,143, 70, 69, 69, 73,
-223,133,200,250, 75,211,223, 8, 35,140, 48,194,136,127, 42, 26,183,168,116,109,120,151, 34,235,239,136,184, 39, 47,124,255, 10,
-222,248, 39, 47,218,255, 47,132, 55, 59,225,196,189,108,224,163,191, 40,122, 47, 50, 12,115,241, 93,138,234,243,231,207,183, 68,
- 13,203,234,252,221,210,223, 8, 35,140, 48,194,136,127, 44,166,213, 38,190,184,198,184, 49,226, 31, 0,242,174, 68,150, 17, 70,
- 24, 97,132, 17, 70, 52, 2,181, 58, 90, 20,106, 31, 57,112,185, 1,127,208,152,209, 7,151,141,156, 70, 78, 35,167,145,211,200,
-105,228, 52,114,254,235, 56,255,137,112, 66, 69,135,248, 51,186, 45, 8, 33,123,254,127,252,177,113,232,171,145,211,200,105,228,
- 52,114, 26, 57,141,156, 70,206,127, 58,222,232, 8, 95, 57,189, 3,109,140, 27, 35,140, 48,194, 8, 35,254, 66, 8,117,159,198,
- 30, 55,194,136,255, 69,177,165, 23, 92,141,233,163,213, 70,183,125,242, 23, 6,118,182,147,147,211, 52,111,111,111, 15, 62,159,
- 79,203,100,178,213,215,174, 93, 91, 85,253,164, 94,158,220,123, 28, 26, 77, 95,253, 66, 1, 20, 7,160,105, 48, 4, 25,215, 99,
-228,157,141,233,254,183,134,139,216,220,238,119,138,230, 8, 24,173, 26,140, 70,141,138,238, 86, 21, 96, 89,109, 42,163, 86, 14,
-172,237, 98, 71,159,225,205,181, 12,251, 45, 64,118, 0,244, 76,128,221, 73,129, 59,131, 64,251, 3, 5,206,127,192, 33,223,129,
-161,190,224,242, 56, 75,165,209,191,165,255, 19, 34, 44, 44, 44,140,243, 54,215,143, 30, 61,186,198, 5, 68,157,157,157,195, 77,
- 76, 76, 90,215,118, 93, 89, 89,153, 84, 42,149, 6,254,195,159,199,222, 0,182, 1,240,170,246,123, 34,128,121, 0,174,188,237,
- 31, 4, 0, 92, 7, 96, 58, 31,248, 2, 0,212,192,119,217,192,238,136,191, 81, 31, 67, 59, 59,187, 72, 46,151,235, 86, 86, 86,
- 86, 38,147,201, 92,205,204,204,158, 73, 36, 18,137, 86,171, 77,206,205,205,237,221, 64,186,153,120,181,148,214,231, 0,118, 54,
-240,184, 17, 70,252,175,224,173, 70, 29,182,173,200, 31, 16, 0,160,119,151, 46, 93, 28,202,202,202,144,152,152,152, 13, 32, 18,
- 64,132,238,147,244, 46, 66, 74,211,244,247,155, 54,109, 90, 52,103,206, 28,253, 98,208, 49, 49, 49,240,241,121,115,142, 80, 14,
-141,166,215, 78, 95,182,191, 27,155,132, 46,253, 71,233,132, 22, 13,148, 73, 17, 56,192,175,177, 65, 48,179,178,178, 90, 77, 81,
-212,104,154,166,235, 45,212, 88,150,101, 8, 33, 97,133,133,133, 43, 1,200, 26,242, 71, 18, 19,161, 70,203, 48, 53,254, 7,151,
-195, 97,202,202,149,181, 78,123, 97,109,109, 29, 69,211,116,171,170, 11,102, 3,175, 47,160, 93,219, 49,173, 86,155,145,151,151,
-103,136, 8, 21,209, 92,254, 60,138,226, 15, 0,205,182, 5, 40, 80,160,147, 88, 70,117,137,213,170,183, 0, 80,188,141,200,114,
-106,230,122,125,193,242,208,166,113, 9,137, 88, 54,123, 60,190,221,182, 15, 75,231,125,130, 45,123, 14, 97,222,180,113,240,244,
-244, 66, 93,203,138,179,224,175, 91, 62,119,116,255,144, 29, 71,123, 46,157, 53, 90, 24,178, 35,172,215,178,217, 99, 5,235,182,
- 31,237,181,108,246, 24, 97,200,246,163, 61,151,206, 29, 45, 94,183,243, 55, 22,192,196,198, 4,114,156,155,115, 25,165,213,214,
- 88,219, 38, 92,174,242, 80,242, 75,201,255,197, 27, 61,101,202, 20,111,185, 92,126,127,252,128, 78,161, 29,219, 54,201,172,233,
-156,252,172,204, 38,207, 30, 71, 7,243,248, 98,223, 15,131,247,197,212,105, 57, 8,133,173, 18, 19, 19,221, 88,150, 5,195, 48,
-208,106,181,250,173, 74,165, 66,239,222,189,223,213,192,153,161, 0, 86, 87,188,172, 8, 1,112,244, 45,184, 76,185, 92,238, 2,
-129, 64, 16,160,213,106, 61, 0,128,199,227, 37, 40,149,202, 8,173, 86,187, 9, 64,105, 3,249, 54,103,102,102,122,154,154,154,
- 66,173, 86,235, 23,160,231,112, 56,238,205,155, 55,223,161, 80, 40,220,222,246,230, 29,128,233,221,123,246,220, 50,121,209, 34,
-142, 60, 50, 18, 91,246,238,221,140,146, 18, 0,216, 81,223,181, 2,129,224, 2, 77,211, 46, 13,249, 63,150,101, 83, 85, 42,213,
-192,134, 92,195,229,114,221, 94,190,124,105,239,236,236, 12,153, 76, 6,137, 68, 34,169,220,111,132,147,181,158, 16, 34,214,229,
-237, 91,186,117,235,230, 79, 81,148, 22, 0, 97, 89,150,190,125,251,246, 56,150,101,185,186,252,105, 61,128,189, 0,148,198, 50,
-219,136,255, 81, 55,107, 79, 67,133,214, 89, 0, 1, 93,186,116, 17,127,244,209, 71, 8, 8, 8,128,155,155, 27, 68, 34, 81, 69,
- 38,158,159,239,240,224,193,131, 49,145,145,145, 99, 78,159, 62,141, 71,143, 30,201, 1,252, 9,160,198,151,186, 95, 80,207, 57,
- 34, 83,225, 86, 0,200,205,200,151,102, 60,207,217, 42,149, 74,215, 3,168, 58, 69,184,235,196,137, 19, 23,206,157, 59, 23,225,
-225,225, 56,116,232, 16,148, 74, 37,100,178, 58,244, 75,121, 14, 10,175,134, 2,146, 20, 32, 45, 2, 48,177, 7, 36, 14,141,142,
- 41, 43, 43,171,213,243,230,205,155,239,233,233,169,159,197, 92,163,209, 64,171,213, 66,163,209,160,176,176, 16, 11, 23, 46,172,
- 40,104, 9, 1,203,178, 56,119,238,220,156,105,211,166,161,176,176,112, 65, 77,156,221,124,155,221,163, 41,186,105,165, 87, 67,
- 24, 38,227,214,131,140,206, 90,134,225, 40, 20,234, 26, 87, 42, 23,137,248,117,138, 60, 30,143,215,244,209,239,191,219,211, 2,
- 1, 8,195, 0, 44, 11,194,178,186,232,212,125, 72,197,111,132, 97, 65, 52, 12, 88, 45, 11,173, 92, 9,191,153, 51, 13,137,138,
-238, 60,129,248,208,132,207, 22, 57,118,237,214,141,215,162,153, 51,180, 12,139,167, 41, 25,142,247,239,221,234, 17,182,127,199,
- 12,149, 92, 54, 14, 64,163,230,217, 18,152,152, 95,220,254,195,143, 77,239, 62,136,195,149,107,145,184,124, 53, 2, 0,112,225,
- 90, 84,165,224,174, 55,169,160, 45,237, 48,111,234, 48, 97,232,246,195,188,121, 83,135,115,190,221,126,132, 55,247,147, 15, 57,
-161, 91, 15,241,231,126,242, 33, 39,116,219, 33,254,220,169,195, 56, 33, 91,126,246, 6, 96, 5,160,176, 54,178,218,210,136,210,
-106,133,255,125,150,205, 1,128,220, 93,187,160,201,201,129,243,202,149, 0,128, 9,174, 14, 6, 55,119,216,218,218,222,227,241,
-120, 77,235, 59, 79,163,209,212, 43,130,167, 76,153,226, 35,151,203,239,105,181, 90,194,229,114,131,199, 15,127,239,228,160, 94,
- 62,249, 85,207,137,137,121,104,179,110,221,239,195,142,222,151,145, 49,190,102,247,195,191,159,210, 57,104,241,190,135,117, 20,
-200,180, 82,169, 68,114,114, 50,170, 46,242, 94, 5, 76, 99,235, 78, 0,182,216,216,216,116,205,207,207,159, 0, 96, 89, 73, 73,
-137, 55,135,195,129,181,181,245, 50,149, 74,245,212,194,194,226,167,226,226,226, 40,157,107,100,232,146, 1,189,205,205,205, 15,
-156, 56,113,194,170, 83,167, 78,116, 94, 94, 30, 90,182,108,137,130,130, 2,191,200,200, 72,223,169, 83,167, 78,149,201,100,147,
-116,149, 65, 67,209,206,196,196,132, 76,158, 60,153, 98,152, 87,183,251,243,207, 63, 99, 96,123,109,107, 59, 75,147,114,133,138,
- 20, 95, 73,182,248, 15,159,207,255, 51, 53, 53,181,184,161,145,193, 7,190,152,188,104, 17,199,244,197, 11,152, 62,124,136, 9,
- 37, 37,220,111, 43,220,173,122,133, 22, 77,211, 46, 7, 14,253,226, 38, 16, 8,160,213,106,245, 98,176, 50,143,210,104, 52, 80,
-171,213,208,104, 52, 96, 24, 6, 26,181, 6, 33,223,124,215,232,188,208,196,196,196,196,201,201, 41,219,196,196,196,228, 93,148,
- 66, 66,161,144,187,127,255,254,113, 2,129, 0, 0,160, 82,169,208,190,125,123,202, 88, 62, 27,241, 15, 19, 91,111,184, 92,117,
- 9,173,193, 37, 37, 37, 96, 24, 6,102,102,102,224,112, 94, 47,247,109,108,108, 48, 96,192, 0,244,238,221, 27, 31,125,244, 17,
- 30, 61,122, 36,254,232,163,143, 6,212, 70, 54,126, 81, 16,154,185, 57,232, 10, 19,214,233,198,153, 7,161, 63,127,253,155, 93,
- 86, 86,214,162, 42,167, 77,157, 62,125, 58,149,159,159,143,209,163, 71, 71, 42,149,202, 15, 0,148,212,198,201,176,200, 8,252,
-104, 2, 88, 66,137, 55,221,254,145, 82, 41,228,132,166,105,121,101,211, 97, 99, 98,137,162,168,209,206,206,206, 56,124,248, 48,
- 84,170, 55,167, 11, 51, 55, 55, 71,124,124,252, 43, 87,141,195, 65,183,110,221, 56, 20, 69,141, 6,176,160,102, 78,186,233,141,
-187, 47,236, 43,247,131, 6,120,241,187,249,210,217, 47,179,203, 8, 0,106,249,242,229,122,225, 6, 0,171, 87,175, 54, 36,156,
-160,121, 60,228, 70, 68,188,202,136,185, 52,104, 62, 5,138, 7,208,220,138, 86, 84, 16,128, 48, 0,171, 5, 88, 13, 32,114,106,
-102, 72, 52,248, 53,105,238, 22,190,110,227, 78, 75,165,134,224,240,169, 43, 72, 73,121, 14, 14, 77,195,181,181, 27,222,235,211,
-139,231,219,197,191,217,119,171, 22,157,126,153,246,100, 48,128, 59, 13,142,104,150,136, 90, 55,183,197, 79, 63,223,135,157,149,
- 41, 70, 15,123, 31, 98,145, 16,223,110,251, 5,223, 44,157, 13, 55, 87, 23,236,222,188,182,214,203, 45, 44, 44,214,120,184,181,
-118,217,185,255, 12, 60,220,221, 57, 59, 15,156,129,135,167,110,235,229,193,217,121,224, 12, 60,189, 60, 57, 59, 15,156,129,183,
- 87,187, 22,247,164,183,215, 20, 20, 20,204,174, 61, 62,171,165,209,123, 21,105,196, 43,101,245, 5,193,139, 25, 51, 0, 64, 47,
-180, 26, 2, 30,143,215,244,229,203,151,246,245,157, 87,159,107,160,115,178,238,105,181, 90,228,228,228, 80, 69, 69, 69,196,210,
-210,114,216,249,221,203, 78, 12,236,233, 83, 0, 0, 15, 31, 62,180, 14, 9, 89, 55,236,200,189, 18,200,111,109,167,254,251,123,
- 4, 59,225,131,128,123,167, 66,167,248, 66,183, 36, 68,117, 40,149,202,148,142, 29, 59, 18,221,247, 38, 66,161,144, 95,237,121,
-115,110,211,166,205, 27,174,181, 1, 77,138, 91,110,222,188, 57,219,211,211, 19,238,238,238, 81, 93,187,118, 53,151, 72, 36, 56,
-127,254, 60, 60, 60, 60,188,204,205,205,111,135,133,133,241,150, 44, 89,226,179,119,239, 94, 0,152, 99, 64,116,246, 15, 12, 12,
- 60, 28, 30, 30, 46,226,243,249,144,203,229,136,143,143,135,133,133, 5, 4, 2, 1, 62,252,240, 67, 78,143, 30, 61,108,250,244,
-233,115, 44, 41, 41,105, 28, 26, 48, 2, 74,161, 80,144,101,203,150,193,196,196, 4, 38, 38, 38,144, 72, 36,144, 72, 36, 48, 21,
-129,218, 53,175,185,120,238,158, 34,241,130,149,187, 66, 15,236, 92,117,173, 89, 51,246,171,244,244,244,162,134, 50, 47,200,121,
- 0, 0, 32, 0, 73, 68, 65, 84, 62, 11,242,200, 72,152, 62,124, 8, 84,121,119, 13,133,133,196, 26,193,193,193,245, 57, 82,224,
-243,249,232,222,189,123,189,124,214,214,214,199,185, 92,238,107, 53, 83,173, 86, 43, 10, 14, 14,102,146,146,146, 36, 52, 77, 75,
- 88,150, 69,112,112, 48,163,213,106, 69,246,246,246, 81, 44,203,102,231,229,229,141, 48, 32,184, 74, 0,159,211, 52,189, 69, 40,
- 20,114, 91,180,104,145,186, 98,197,138,155, 58, 55, 19,132, 16,186, 69,139, 22,126, 98,177,216, 69,169, 84,106, 81,209,116,104,
-116,179,140,168, 17,132, 16,223, 10, 83, 88, 15, 21, 0,129,238,123,126, 69,105, 7,219,106,191, 3, 64,158,174,162,232, 80,203,
-126, 62,128, 71, 0,218, 1,176,215, 29,187, 75, 81, 84, 65, 35,130, 89,187,163, 21, 30, 30,174,175,194, 6, 5, 5,233, 11, 22,
- 51, 51, 51,220,189,123, 23, 20, 69,193,204,204, 12,230,230,230,176,176,176, 64, 73, 73, 9, 30, 61,122,132,196,196, 68,188,120,
-241, 2, 20, 69,193,213,213, 21,149, 47, 80, 21,232, 51,184, 95, 55,132, 67,100, 42, 4, 69, 1,157,250,122,195,187,119,123,116,
-185,243,108,222,189,203,212, 30,169, 84,154, 12,128,219,190,125,251,169,221,186,117,195,198,141, 27,161, 84, 42, 55,214, 34,178,
-244,156,215, 31,105, 59, 3,128,147,147,211,226,131,231,159,154, 76, 28,212,186, 92, 42,149,126,223,136,200,121, 45, 35,206,203,
-203, 51,120, 45, 62,150,101, 81, 88, 88, 88, 39,103,117,135, 96,211,150,237,150,178,226,108,124,253,237, 65,104, 52, 26, 44, 90,
-180, 8, 44,203,234, 63, 69, 69, 69, 6,133,147, 48,204,155,222, 1, 93,209,122, 74,113,129,230, 99, 43,116, 69,218,225,237,160,
- 8, 64, 49, 0,222,188,175,234,133,144,136,195, 23, 31, 89,245,237, 86,203,232,196, 12,156,186, 18, 13,117, 73, 38,164, 15, 79,
- 84, 88,142,221,199,225,168,146,131,174,222,173, 49,127,249,119, 86, 95,206,159,116, 68, 37,151,185,227,245,102,196,203,245,191,
- 52, 12,190, 94,179, 6,123,182,110,196,119, 27,183,162,164,184, 8, 60,158,173, 46,163,103,192, 48, 76,221,247, 78,200,160,224,
-121, 31, 83,223,254,112, 28,126,158, 78, 56,118,254, 14,122,118,116,193,137,139,247,208,219,183, 37, 78, 93,142, 70,223,174,173,
-113, 54, 34, 14,243,167,143,163,198, 93,216, 59,168, 33,105,180,121,243,118, 75, 89, 73, 54,194,215,238, 71,206,142, 29, 72,157,
- 61, 27,126,186,115,238, 80, 20,248, 77,155, 2,252,250,211,168, 58, 18, 18, 18,160, 84, 42,107,170,237,195,195,195,163,222,116,
-151,203,229,247,181, 90, 45,201,206,206,166,178,179,179, 33,145, 72,168,248,248, 56,198,203,171,253,112,146,248,219,143, 0, 16,
- 18,178,110,248,209,251, 37, 40,143,218, 10,249,205,109,224,183,140,161,247,172,158,174,158,182,114,247,253, 42,239,232,107,225,
-204,202,202, 26,156,149,149, 5, 0,104,213,170, 85, 98, 82, 82, 82,187,202,166,102, 93, 19, 34, 95,171,213,186, 85, 54, 39,106,
-181, 90, 40,149, 74,244,239,223,159, 83,215,189, 91, 89, 89,117,243,240,240, 64,116,116, 52,182,110,221,106, 29, 24, 24,136, 39,
- 79,158,128,162, 40,172, 91,183,142,242,244,244,228,229,229,229, 97,224,192,129, 56,126,252,120,247,146,146,146,250,226,211, 76,
- 34,145,236, 61,125,250,180,136,166,105,200,100, 50,176, 44,139, 30, 61,122,128,166,105,196,197,197, 97,249,242,229, 56,126,252,
- 56, 78,158, 60, 41,246,245,245,221, 91, 94, 94,238,129,215,155,245,107, 75, 35,162, 80, 40,136, 80, 40,132, 80, 40,132, 72, 36,
-130, 72, 36,130, 64, 32, 64,169, 2,152,182, 41, 85,201, 17,217,178, 94, 29,123,182,254,120,238, 58,250,251, 21,159, 92, 5,112,
-202,208,103, 30,168,232,147,181,229,151, 95,182, 78, 40, 46,166, 1,224, 39,138, 98,213,132,124,103,200,251, 14, 0,165,138, 98,
-184,184, 54,197,177, 35, 39, 49,114,236,176, 26, 69, 22,143,199, 7,159,199,131,185,181,164, 94, 78, 62,159,239,144,152,152,104,
-195,227,241, 64, 8, 1,195, 48, 80,171,213,217, 95,126,249,165,221,144, 33, 67,204,206,157, 59, 71, 15, 25, 50,132,181,178,178,
- 42,187,115,231, 78,142, 86,171,181,233,213,171, 87, 67,158,249,157,222,222,222,157, 78,156, 56,241, 73,112,112,240,189,197,139,
- 23,127, 93,245,224,250,245,235,215,156, 61,123,214,101,248,240,225, 7, 30, 62,124,184,179, 33,121,200,219,230,243, 70,206,191,
- 31,103,109, 90, 68, 7, 7,138,162,194,171,228,217, 65,149,251,193,193,193,203, 66, 66, 66,226, 41,138, 10,175,250,123,229,121,
-186,202, 98,120, 77,251,186,107,173,151, 46, 93,218, 62, 52, 52,116,157,191,191,255,225,168,168,168,231, 0, 26, 42,180,234,238,
-163, 85,121, 67, 85,111,178, 90,161,134,146,146, 18,148,148,148, 32, 61, 61, 29,187,118,237,210,189,208, 60,112,185, 92,112,185,
- 92,125,127,134,218,112, 37,252,207,109, 0,182,117,234,212,137, 23,123, 51,236,220, 23,123,230,246,235,220,191, 19,231,254,149,
-216, 81,168, 88,143,112,240,228,201,147,109, 1, 96,255,254,253,121, 0,206,253, 31,169,230,176,228,228,228,249, 78, 78, 78,250,
- 62, 42, 85,155, 15,181, 90, 45, 68, 34, 17, 42,251,178, 40, 20, 10,236,218,181, 75, 75, 8, 9,171,131, 19, 73,241, 87,145, 28,
-127,173,226, 58,150, 5,203,188,186,126,213,170, 85,250, 97,160, 0, 48, 67,231,156,212, 43,242,106,138,115, 82,109, 91,237,119,
-194, 48,245, 52, 79,240,231,142,154, 52,219,137,165,184,248,253,234, 3,240,120, 60,176, 85,220, 76, 30,167,162,182, 28,255,228,
- 37,156, 29,188,240,193,184,233,142, 39, 14,108,159,171, 85, 43,190,109,104, 92,187,123,251, 99,222,252,249,248,113,207, 30, 44,
- 95,185, 70,175, 0,180, 12, 3,109,189,225,164,233,254, 61,218, 67, 91,250, 18, 28, 14, 7,125,253, 90,131,195,225, 96,128,127,
- 91,112, 56, 28, 12,236,225, 14, 46,151,139, 65, 61, 61,209,166, 77, 27,112,185, 92,186,158,116, 71, 82,252, 21, 36,199,255, 81,
- 69,244, 18, 16, 0,106,169,244,141,243, 53, 82, 41, 72,115,155,134, 62, 91,152, 58,117,106, 81,122,122,186,186,250,177,102,205,
-154,241, 35, 35, 35, 45,107,105,182,211, 67, 44, 22,251,114,185,220,251, 5, 5, 5,172,137,137, 9,205,178, 12,235,229,213,158,
-115,126,247,178, 19,149,231, 44, 93,186,236,196, 24, 95,243,225, 7,195,194, 9,191, 69, 79,138,226, 9,181,159,173,220,205,231,
-241,197,190,128,220,144,202, 3,173, 84, 42,241,248,241, 99,212, 23, 30, 66, 72,157, 77, 63,133,133,133,147, 61, 60, 60, 34,183,
-109,219,102, 77, 81, 20,174, 95,191, 14, 14,135,163,255, 60,123,246, 12, 52, 77,227,139, 47,190, 80,151,148,148,124, 90, 95,216,
-184, 92,238,252, 99,199,142, 89, 8, 4, 2,200,100, 50,253,123,195,225,112,144,152,152,136,239,191,255, 30,147, 39, 79, 70, 90,
- 90, 26,156,157,157,177,104,209, 34,211,208,208,208,249,106,181,122,141, 1, 73, 20,163, 82,169, 58,155,152,152, 64, 36, 18,161,
- 82,112, 1,192,197,120, 94,156, 92, 46,239, 96, 99, 83,238,104, 23, 17,254,123,247,192, 15,124,108,236,156,252,165, 82,105,131,
-150,206,122, 10,236, 73, 97,152, 47, 7,159, 56, 97,127,227,196, 9,246,214,233,211, 25, 66,153,108,183,193,207,144,134, 70,234,
-179, 12,248,250,250,226,254,253,251,240,245,245,173, 42,154, 32, 16, 8,192,231,243,193,231,243, 97,107,101, 80, 23, 10, 66,211,
- 52,110,220,184, 1,134, 97,160, 82,169,160, 82,169,224,233,233, 89,112,237,218, 53, 83, 0,120,246,236, 25,153, 56,113, 98,209,
-237,219,183,209,177, 99,221,235,169, 59, 56, 56, 68,114, 56,156, 22, 85,127,203,207,207,183, 26, 49, 98, 4, 10, 11, 11,223, 31,
- 49, 98, 68, 79,221,251,155,249,219,111,191, 77, 4, 0,129, 64, 0,154,166, 25, 24,241,175, 71,125, 90,164,170, 80,170, 46,184,
- 66, 66, 66,130,170,255, 86, 85, 84,213,244,189,234,181,161,161,161,235,170,112,203, 27, 17,252,250,251,104,133,135,135,147, 26,
- 20,164,193,168, 79,104, 85, 34, 58, 58, 90,227,236,236,252, 99,242,131, 23,253, 90,123,187, 66, 44, 17,190, 7, 96,155, 80, 40,
- 92, 56,105,210, 36,220,186,117, 11,113,113,113, 63,227, 45, 71,225,180,111,223,254,130, 80, 40,116,169,165,153, 36, 53, 46, 46,
-110, 96, 45, 5,195,202,211,167, 79,163,174,206,240, 87,175, 94,173, 90, 40, 85,237, 12, 95,243,131,193, 18,104,212, 26,148,149,
-203, 95, 21,226, 58,161, 85, 86, 86,134,177, 99,199,190,230,104,229,228,228,212,123,127, 20, 69,225,251, 83,167,112, 41, 44, 12,
-239,251,248,224,248,157, 59, 8,157, 52, 30,238, 46, 77, 64, 24, 10,132, 2,210, 14,109, 71,126, 73, 41,126,189,114, 3, 5,178,
-114, 76,232,213, 11,110,230,182,117,243,242,248, 3,252,186,249,243, 47, 71, 61, 2,143,199, 5, 13, 22, 68, 83, 14,103,143, 62,
-224,208, 52, 44, 28, 90,130,207,227,129,199,227,226, 89,122, 30, 60,218,119, 17,132, 11, 68, 3, 26, 35,180,154,185,180, 4,195,
- 48,152, 60,121, 50, 14, 31, 62, 12, 27, 71, 23, 88, 52,107,143,111, 54,238,193,251,253,123,213,123,255,149, 53,120, 46,151, 11,
- 14,135,243,198,182,242,187, 33,238, 36, 97, 9,212,213,211,136, 37, 0, 33,104,186,118, 45,154,174, 93,139, 59,186,255,244, 44,
- 43,131, 92, 46, 7,186,122, 53, 72,100,169, 84, 42,164,167,167,171,179,178,178, 28,106, 56,158,173, 82,169,234, 21, 54,251,246,
-237,139,153, 50,101, 74,103,107,107,235,123, 49, 15, 31,106,188,125,124,120,231,118, 45, 59, 89,217,108, 8, 0, 62, 62, 62, 5,
-203,150, 45, 59, 57,113,116,208,176,157,193, 31, 49, 51,215, 28,224, 10,197,226,206, 65,139,247,197, 28, 26, 61,186,254,246, 30,
-165, 50,197,219,219,155, 24,114, 95,229,229,229, 89,117, 28, 30, 10, 96,117,167, 78,157,204, 3, 3, 3, 17, 25, 25,137,145, 35,
- 71, 42,213,106,117, 50, 0, 12, 25, 50,164,237,175,191,254, 42,120,244,232, 17,236,236,236,120,169,169,169,123, 81, 79, 7,121,
-129, 64,208,167, 75,151, 46,180, 82,169,124, 67,100,133,134,134, 98,220,184,113,104,219,182, 45, 88,150, 69,105,105, 41, 2, 3,
- 3,121, 91,183,110,237, 99,160,208,154,231,238,238,254, 61, 42, 70, 29, 86,205, 11, 19, 80,209,172,133,252,252,252,172, 7,183,
-175,196,247,234, 63,162,115,139, 54,237,157,226, 98,238,215, 73,104,111,111,191,148,166,233, 49, 44,203,114, 74, 74, 74,210, 31,
-168, 84,109, 60, 93, 92, 28,122, 12, 27,134, 98, 30,143,179,229,202, 21, 58, 91, 38, 51, 5, 96, 80, 19,164, 66, 83, 6, 23,215,
-138,174,126, 35,199, 14,195,253,251,247, 49,234,163,225,224,243,249,224,114,121, 21,239, 38,191,194,209,178,180, 53, 55,232,217,
-212,104, 52,250, 60,188,178,159,151, 90,173, 70,101,215, 44, 19, 19, 19,253, 49,165, 82, 9,138,162,234,122, 54,220,142,174, 89,
- 97, 47, 54,183, 0,163,209,192,107,216, 40,253, 51,125,251,167,157, 98,176,172,184, 40, 53, 5,115,194, 78,243, 96,132, 17,181,
-184, 90,117,105,145,170, 66,233,109, 65, 81, 84,120,112,112,240, 50, 0, 36, 56, 56,120, 89,229,126, 72, 72,136, 28, 64,102, 35,
-197,214, 27, 46, 23,247, 93,136,172,202,230,133,186, 16, 24, 24, 56,199,204,204,108,107,229,126,250,173, 76,164,223,202,132, 71,
- 59,175, 30,157,124, 58, 23,143, 27, 55, 14, 54, 54, 54, 88,188,120, 49, 1,240,115, 67,255,255, 89, 82,188, 41, 0,226,228,228,
-180, 88,151, 33,251,220,185,115,199,238,238,221,187,232,210,165,203, 43,235, 94,173, 70,207,158, 61,235,162,146,233, 58,181, 47,
-120,119, 46, 25, 11,181, 90,141,242,114, 57, 84, 42, 53,180, 26, 22, 90,173, 22,190, 94,102, 56,176, 39,184,226, 55,109,165,123,
- 86,225,154, 53,117, 52,131,153, 41, 79, 67,211,148,252, 94, 76, 86,141, 57,166, 74,165, 66, 76,106, 42, 30,190,120, 1, 0,248,
- 32,164,238,142,175, 7,174, 68,194,211,211,179,190,208,182,110,234,236,136,151,151, 98, 42, 50,111,121, 58,238,254,121, 20,102,
-102,166, 0, 0,175,128, 9,224,243, 43,132, 86,153, 92, 13,219,118,205, 64, 17, 82,235,180, 0, 38, 86,142, 23,184,124,145, 11,
- 97, 88, 16,194,130,176, 12, 8, 97,193,225,241, 77,230,204,248, 4, 44,203,192,207,207, 15, 20,135, 3, 70,163,196,232,161, 3,
- 80, 88, 44,131,141,165, 97,133, 4,159,207, 71, 64, 64,128,184,182,227, 79,158, 60,145, 87, 21,102,117,167,145, 6,101,101,114,
- 40,149, 74,168, 85, 90,168, 53, 90, 48,173,248,248,250,203,241,208,170,181, 40,255,200, 31,106,141, 22,236,252,225, 80,171, 52,
- 72, 51,161,105,111, 15, 91, 13, 13, 74,254, 32, 33,215,188, 62,161, 85, 41, 14,106, 67, 77,125, 2,107, 17, 91, 15,167, 76,153,
-226,235,237,227,115,127, 76,127,159, 13,177,113,241, 47, 99,227,226,223, 56,207,165,173, 79,202,204,208,195,139,120,124,177,111,
-208,226,186, 71, 29, 86, 69,213,102,196,183,196, 50,153, 76,230,109,106,106,138,164,164, 36,112, 56, 28, 80, 20,245, 4,128, 55,
- 0, 56, 57, 57, 61,229,114,185,174, 28, 14, 7, 59,118,236,160,184, 92,110, 7,127,127,255,101, 10,133,226,104, 29, 21, 58, 15,
- 51, 51,179,215,220, 44, 62,159,143,224,224, 96, 76,156, 56, 81, 47,178,248,124, 62,246,237,219,135,206,157, 59, 67,165, 82,121,
- 24, 24,222,187, 0,122, 25,224,248, 81, 58,113, 94,175, 24,213,106,181, 83,242,199,140,105,131,136, 8,244,112,117,245,244,245,
-245,133, 90,253,202,208,116,117,117,109, 38,147,201,178,228,114,249,127, 81, 49,181,193,131, 58, 69,145,130, 69,234,179,138,238,
-167,247,239,223,135,159,159,159,222,193,170,234,102,241,249,124,136, 5,166, 13, 18, 90, 44, 91,145, 47,201,100, 50, 58, 34, 34,
-194,214,221,221,157, 2, 0,119,119,119,234,193,131, 7,214, 38, 38, 38,121,173, 91,183,174,183, 2, 44, 54,183,192,190, 41, 99,
- 1, 0, 95,245, 31,164,175, 24,157, 95,189, 12, 60, 30, 15,253, 22, 47,123,227,185,103, 89,150, 3, 35,140, 34,203, 0, 45,242,
-174, 68, 86,117, 71, 43, 36, 36, 36, 62, 36, 36,228, 13,119,172,129,168,223,209,170,106,221, 53, 20,149, 47,107,109,216,184,113,
- 35, 58,116,232, 80,103, 65,180,117,235, 86, 28, 60,120,112, 35,128,103, 13,182, 28,251,117,242,194,166, 19,241,174,109,189, 40,
- 0, 88, 51,127, 40, 93, 86, 86,134, 27, 55,110,192,194,194, 2, 79,158, 24, 60,237,151,153,133,133,197,106,154,166, 71,115,170,
-143, 0,168, 89, 96, 50, 44,203,134, 21, 23, 23,215, 58,189, 3, 33,128, 90,163, 69, 89,185, 2, 42,149, 10,243,191,216, 94,111,
- 32, 66, 0, 74,173,146,113, 3,122,251,139,107,115,116,252, 58,244,193,172, 73,166,111, 20,222, 28, 26,160,105,160,163, 95,133,
-227,242,224, 78, 60, 88, 22, 96, 88,192,214,222, 10, 63, 31,218, 80,167,200,215, 50,172,174,118,204,160, 84,201,192,163, 91, 16,
- 50, 18, 34,244, 14,146,128, 95,209,100,204,231,241,192, 18,170, 98,214,135,218,132,144, 64,236, 82, 40,125,230,182, 39, 60, 22,
-211,130, 58,224,183,203, 49, 24,213,223, 27,215,110, 63, 66, 96, 87, 79,196, 39,191,128,151, 91, 11,236,216, 27, 6, 66, 32,251,
- 97,211, 55, 89,175, 10, 52,109,170, 33,142,214,173, 91,183,228,213, 93,172,170, 91, 82,127,121, 8, 66, 94, 57, 90,114,133, 18,
-139,151, 26, 52,157, 79, 69, 26,245,234, 38, 54,228,228,186, 28, 43, 67,132, 88,117,103, 11,245, 76,207,210, 10, 64,103, 96,201,
-255,101,198,201, 48, 12,206,156, 57,163, 79,143,154,210,177,106,218, 25, 32,114,144,154,154,138,248,248,120,116,235,214, 13,197,
-197,197,224,209, 52, 22,197,198,194,115,210, 36,168,248,124,176, 44, 11,129, 64,128,233,211,167, 27, 28,159, 13,204,157,117,157,
-185,153,250,200, 55,248,251,251,183, 73, 42, 43, 67,124, 98, 34,250,175, 90, 5, 0, 56,123,246,236,107,207,196,194,133, 11, 5,
-143, 30, 61,154,122,239,222,189,169, 47, 95,190,220, 8, 96, 81,173,249, 44, 81,234,251,104,141, 25, 63, 18,109,220, 91,225,224,
- 47,135,244,199, 23,126, 62, 15, 60, 30, 31, 60, 62, 15,150, 22,150, 6,221,141, 70,163,209,139,214,242,242,114,250,236,217,179,
- 77, 7, 12, 24,192,159, 55,111, 30, 5, 0, 7, 15, 30,164,183,109,219, 38,185,116,233, 18,191, 73,147, 38,210,122,197,165, 90,
-253, 70, 26, 83, 20, 5, 30,143, 7,190,128, 15,176, 44, 40,138,146,172, 95,191,126, 77,124,124,124, 23,119,119,119, 40,149,202,
- 73,168, 24,168, 97,156, 71,203, 40,182,234,212, 34, 53,245,181,210,185, 82,181, 33,183,106,191,173,218,132, 90,213, 62, 91,104,
-220,160, 12,195,250,104,213, 4, 14,135, 83,175, 91, 69,211,116,189, 77,135, 11, 23, 46,132,153,153, 89,109, 5, 16,137,141,141,
-125, 36,149, 74,247, 0,216,222,168,196,185, 18, 29,191,122,193,112, 25,116,109,171,150,150,150,121,125,251,246, 45, 5,160, 62,
-122,244,245, 10,178, 82,169,172,181, 0,183,176,176, 88,253,211, 79, 63,205, 29, 54,108, 24, 93,125,138,129,170,205,123,149, 31,
-141, 70,131,163, 71,143,206, 93,178,100, 9,138,139,139, 23,212, 85,136,151,151,201, 33,215,117,132,126, 26,247,155,161,153,122,
-173,135, 76, 45,157,208,180,149,119,173,133, 9,205,175,232, 67,228,208,252, 85, 1,102,102, 38, 2, 83, 7, 39, 69,209,207, 94,
-164,189,108,210,204,209, 26, 79,211,115,225,208,162, 3, 10, 51, 95,197, 3,151,203, 1, 79,215,116,104,105, 46, 65,110, 78, 14,
-104,154, 83,167, 48,254,230,215,104,220,142,123,129, 99,151, 31, 64,173, 40,195,166,253,231,161, 86,150, 66,173, 40,131, 90, 81,
-177, 93,183,228, 51, 80, 20,178, 52,202,178,182, 13, 73,119, 46,151,139,174, 93,187,214, 42,116, 50, 51, 51, 13,116,180,136,222,
-209,146, 43, 26,152, 70,134,213,156,234,116,172, 42,143, 55, 86, 24, 84, 78,249, 32, 22,139, 59,239,219, 87,251, 52, 14, 53,193,
-209,209,241,156,169,169,105, 75, 67,207,111,192,228,165,235, 44, 45, 45, 87,187,187,187,123,108,218,180,137,199,225,112,208,175,
- 95,191,182,142,142,142,169, 0,224,229,229,229, 92,153,199,204,156, 57,147,220,186,117, 43,174,162,142, 81, 59, 4, 2, 65,162,
-133,133, 69,231,192,192, 64, 20, 23, 23, 35, 61, 61, 29, 18,137, 4,158, 27, 54, 32,118,230, 76,248,236,218, 5,186,111, 95, 80,
- 20, 5,129, 64,128,216,216, 88,136,197,226, 68,133,162,214, 41,223,186, 2,248, 14, 64, 15,188,106, 46, 36, 0,110,160, 98,218,
-133,219, 53,228,119, 52, 0, 48, 44, 91, 95, 98,141, 95,188,120, 49,138,120, 60, 96,200, 16,240,159, 61,131, 90,173, 70,183,110,
-221,244, 46,123,183,110,221,192,229,114,225,237,237, 13,103,103,103,236,216,177, 99,124, 93, 66, 75, 81,170, 70,234,179, 12,248,
-251,251,235,157,171, 33, 67,134,232, 29, 45, 30,143,167,119,182, 40,166,126,225, 74, 81, 20,169, 90, 73,102, 24,134,226,114,185,
-220, 5, 11, 22, 80, 35, 71,142, 36, 42,149,138, 21, 8, 4,244,177, 99,199,168,107,215,174,113,203,202,202,234,173,136,183, 31,
- 62, 26, 95, 13, 24, 92,241,238,183,180, 3,143,207,131,128,207,199,226,196, 12,125,186,152,239, 59, 44, 8, 13, 13, 29,229,238,
-238, 94,209, 12, 15,112,141,243,104, 25, 81,143,209,147, 91, 77, 36,169,170,236,231, 2,160,116,251,185, 85, 4, 85, 46, 69, 81,
-119, 9, 33, 93,170,157, 91,121, 92, 85,109, 91,121,252, 97, 35,130, 95,185,214,225, 27,226,171,174, 26,113,242,205,155, 55,221,
-124,125,125,145,150,150,246,198, 72,184,202,130, 75, 34,145, 64, 44, 22, 35, 42, 42, 10, 0,146,107, 35,187,118,237,218, 54, 84,
-204,186, 92, 17, 34, 39, 39,255,192, 49,125,162,252, 6,117,193,175, 33,135,138,165, 82,169, 55, 94,205,161, 67, 57, 59, 59, 79,
-228, 9,184, 99, 93,219, 55, 15, 0,203,126,119,229,244,141, 85,117,221,161,107, 91,175, 82, 0,242,202, 81,135,141, 28,125, 8,
-154,166, 71, 15, 27, 54,140,126,244,232, 17,198,142, 29,139,131, 7, 15,214,122,238,196,137, 19,113,248,240, 97, 12, 27, 54,140,
- 94,186,116,105,173,211, 59,188,238,150,168,222,217, 67,153,244,228, 33, 14, 28,254,169,214, 62, 72,246,246, 21,253,177,114,114,
-242,244,191,117,241,173,187,101,132,213,170, 46, 69,223,187,227,223,189,119, 63,126,122,118, 17, 88,173, 18, 10,217,171,235,203,
-139,178, 65,180, 10,240, 77,172,225,104,107,129,251, 55, 47,170,212, 42,197,165,186, 56,231, 14,243,194,204,161, 30, 0, 97, 49,
-124,209,207, 8,223, 62, 71, 95,131,238, 57,114, 30,174, 28,221, 98,112, 31,191,234,224,241,120,136,141,141,149,215,230,102,113,
- 56, 28, 67,230,228,210,185,142, 26,148,151,203, 81, 46, 87,188,203,188,195,206,193,193,225, 7, 43, 43, 43, 81, 45, 66,202,206,
-206,206,238, 7, 27, 27, 27,145,161, 77,135,181,137, 44,221,188, 90,247,166, 76,153,210, 32,177, 37, 20, 10, 91, 38, 39, 39,235,
- 39, 43,173,107,171, 82,169, 16, 24, 24,104,232,228,165,167, 1, 60,119,114,114,186,225,233,233,105,241,244,233, 83, 28, 58,116,
-136,207,227,241,154, 87,230, 31, 50,153, 12, 28, 14, 7, 57, 57, 57, 26, 0,159,160,158,166, 51,165, 82, 25, 17, 17, 17,209,113,
-232,208,161,156,196,196, 68,112, 56,156,138,112,249,251,195,103,215, 46,196, 45, 88,128,128, 23, 47,160, 80,171, 33, 18,137,112,
-225,194, 5,117,121,121,121, 68,109,124, 98,177,120, 79, 74, 74,138,151, 72, 36,130, 90,173, 6,203,178,160,105,154,226,114,185,
- 61, 45, 45, 45,183, 2,232, 82, 45,177,236,125,186, 4,182, 99,180, 90, 70,154,246, 52,183,190, 8,200,207,207,199,233,211,167,
-209,173, 91, 55, 4, 4, 4, 32, 51, 51, 19,207,158, 61,195,251,239,191,175, 63,231,225,195,135,136,142,142, 70,235,214,173,235,
-119,244,104, 13, 90,183,107, 9, 62,159, 95,225, 16,241,248,186,138, 15, 79,239,100,241,121,124,240,184, 60,136,196, 34,131, 29,
- 45,138,162, 64,211, 52, 40,138,130, 88, 44,174,172,100,179, 77,155, 54,149, 22, 20, 20, 56, 1,224,136,197, 98, 48, 12, 99, 80,
-165,165,178,140,168, 20, 89,124, 1, 95,239,108, 1, 64, 81, 81,145, 98,216,176, 97,255, 85, 42,149, 31,163,113, 43,148, 24,241,
- 47, 3, 69, 81,119,255, 47,174,109, 0,134,232,132,213, 27,157,226,235,122,192,223,239,222,189,251,174,113,227,198,245,219,188,
-121, 51, 76, 77, 77, 33,149, 74,245, 5,162, 64, 32, 64,179,102,205, 80, 80, 80,128,221,187,119, 35, 35, 35,227, 42,128,233,134,
-134, 72, 42,149,222,122,242, 32, 57, 63,112, 84,119, 27,175,238,237, 44,211,147, 51,186, 73,165,210, 40,157,200,250,121,220,194,
-247, 63, 14, 28,225, 7,190,128,135,244, 39, 89,184,114,250,198,255,151,196,228,112, 56, 28,138,162, 48,118,236, 88,131,206,255,
-232,163,143, 16, 17, 17,129,186,154, 25,217, 74, 71,171, 92,129, 50,249,187,171,172,205,154, 51, 17,179,230, 76,212,139, 9, 67,
-154, 94, 0,192,217,249, 72, 29, 66, 75,189, 57,252,200,238,105,157,252,252, 93, 58,123,181,196,237,123, 15,240,235,174, 87, 38,
-195,222,109,107,240,237,222,171,104,230, 96, 5,181,178, 12,231,126,251, 49, 75,173, 44,223,220, 72, 83,174, 66,220, 82, 20, 8,
- 97, 27,116,239,149,226,137,199,227,161,125,251,246,181, 58, 90, 5, 5, 5,242,250, 10, 6,125, 26,169, 52, 40, 45,147, 67, 94,
-254,206,132,150, 79,207,158, 61, 47,133,133,133,217,216,219,219,227,229,203,151,213,133,150, 79,143, 30, 61, 46,133,133,133,217,
- 56, 56, 56, 32, 61, 61,221,224,105, 69,106, 16, 89,200,205,205,165, 10, 11, 11, 89, 43, 43,171, 6,137, 45,154,166,161, 84, 42,
-145,144,144, 96,232,223, 26, 60, 66,204,194,194, 98,223,225,195,135, 45,242,242,242,192,225,112,144,144,144,240,218,168,195,202,
-207,207, 63,255,204, 31, 62,124,248, 79, 69, 69, 69,117, 14,107,211,106,181, 27, 39, 78,156, 56, 53, 51, 51,211,202,222,222, 30,
- 82,169, 20, 2,129, 0,132, 16, 80,129,129,232,245,252, 57,212, 12, 3,177, 88,140,164,164, 36,236,217,179,167, 76, 55, 85, 76,
-141, 6, 25, 69, 81,110,124, 62, 31, 19, 38, 76,120,237,192,254,253,251,241, 65,103, 78,103, 59, 11,110,169, 22, 34,101,182,120,
-240, 57, 14,135, 67,249,116,237,219,182,107,239, 33,237, 31,199,221,126,154,155,157, 81, 95,166,164, 81,169, 84,112,119,119,199,
-221,187,119,113,249,242,101,244,237,219, 23, 1, 1, 1,136,137,137,193,197,139, 23, 17, 29, 29, 13,138,162, 96, 99, 99, 83,217,
-253,162,206, 62, 24,170,114, 45,114, 94,230,191,225, 94, 85,223,231,243,249, 80,202,213, 6,165, 81, 98, 98, 34,238,222,189,171,
-159, 90,134,195,225,104, 39, 77,154, 4, 66, 8, 73, 73, 73,129,153,153, 25,153, 50,101, 10,195,229,114,181,153,153,134,245, 15,
-174, 20, 85,149, 34,139,203,231,189, 38,208, 88,150,149,197,196,196, 76, 3, 16,163,115,178, 0,227, 60, 90, 70,252,111,227, 12,
-222, 92, 88,186, 94, 71,235, 57,128,254,135, 14, 29, 26,127,242,228,201,141, 91,183,110,181, 11, 10, 10, 66, 97, 97, 33, 92, 92,
- 92,224,228,228,132,240,240,112,156, 61,123, 54,143, 97,152, 69, 0,106,178,126,250,163,142, 57,107, 50,159, 74,195,148,165,165,
- 51,125, 3, 60,112,245,232,245, 16, 71, 71,199,233, 28, 14,103,254,148,101, 31,126,220,103, 88, 23, 36, 69,167,224,214,197, 88,
-100,167,229,213,203, 89,189, 51,188,165,165,229, 84, 19, 19, 19, 1, 0,117, 13,181,226,234,163, 14,245,156, 12,195, 48, 42,149,
- 10, 71,142, 28, 49, 72,108, 29, 58,116, 8, 10,133, 2,204,155,237,171,122, 78,194, 18,138,203, 19,194,185,153, 59,212,234, 50,
-176,108,163, 7, 84,234, 57, 43,107,160, 79, 5, 2,216,231,229,225,246,237,219,134, 73,238, 33, 67,234, 75, 35,133, 74, 33,155,
-176,101,237,226,240,217,193,223, 89,246,237,222, 17, 95,109,216, 15,181,122, 47,104, 14, 13,177,144, 15, 95,191, 30,224, 64,137,
- 31, 66, 63, 47, 42, 47, 41,156,128, 55,151,226,121,141,147,212,213,194, 66, 0,134,101,113, 57,242,142,193,247,174, 47,237, 25,
- 6, 92, 46, 23, 79,158, 60,145,215, 52,218,144,195,169,104,230,172,172,169,215,197, 73, 88,150,226,241, 69,104,230,226, 9,149,
-178,244,157,164,145,189,189,253,231, 39, 78,156,176,169,156, 42, 33, 38, 38, 6, 20, 69, 37,188,114, 28, 43,142,203,229,114,196,
-197,197, 33, 38, 38, 6,168, 24,225,102,240,123, 84,233,100,229,230,230, 82, 82,169, 20, 38, 38, 38,116, 76, 76,140,210,219,219,
-251, 94, 61,239,183,158, 83,161, 80,188,168,173,255,164, 66,161,104, 34, 18,137,120,213, 10, 81,231, 54,109,218, 36,213,208,132,
-248, 70, 56,139,139,139,111, 47, 89,178,196,119,208,160, 65,248,252,243,207, 11,172,172,172,204,126,248,225, 7, 46,135,195,161,
-102,207,158,205,228,228,228,148,254,248,227,143, 22, 39, 79,158, 68, 81, 81, 81,148, 1,247, 46, 83, 40, 20,211,186,119,239,190,
-255,252,249,243, 38,110,110,110, 40, 41, 41, 1, 33, 4,251,246,237,195,236,217,179, 33, 18,137,144,148,148,132, 15, 62,248,160,
-188,188,188,124, 26,222,236, 59, 89,201, 73, 81, 20, 69, 88,150,197,138, 21, 43,244,147,147, 86, 78, 86,106, 38,166,176,103, 97,
- 43,201,188, 31,139, 37,227,191,250,113, 18, 0, 48, 90, 45,243, 56,238,246,211,125,219,191,186,198,231,243, 35,235, 73,163,229,
-243,230,205,251, 97,200,144, 33, 98, 83, 83, 83, 20, 20, 20,224,198,141, 27,184,121,243, 38,110,221,186, 5,149, 74, 5, 27, 27,
- 27, 88, 89, 89, 65, 42,149, 34, 49, 49, 81, 14, 96,121, 93,156, 2, 19, 30, 92,219, 86,142,252,173,112,176,120, 85, 70, 27, 86,
-117,183,248, 60,158, 65,239, 81,239,222,189,209,181,107,215, 74, 1,196,164,166,166, 74,149, 74, 37, 85, 69,244,103, 86, 10,242,
-230,205,155,107, 15, 30, 60, 72,234,226,188,181,103, 7,206,127,189, 28, 2, 62, 31,139, 18,210,245,162,107,127,223, 78,224, 9,
-248,240, 24, 58,178,234,181, 59, 81,209, 92,136,106, 34,171,174,178,227,173,223, 77, 35,231,223,150,243,127, 25, 82, 52, 98, 9,
-158, 74,252,170, 80, 40,206,125,246,217,103,161, 62, 62, 62,159,109,218,180,137,226,243,249, 88,181,106, 21,121,249,242,229, 47,
-186, 90, 72, 97, 99, 66, 69, 8,249,229,143,227, 81, 51, 38, 7, 15,163, 22,110,158,210,243,222,149,184,196, 14,221,221,208,161,
-187, 27,238, 93,125,132,237,203, 14, 29,100, 52,204,138,172,172,172,180,122,168,148,253,123,180,171,222, 25,222, 38,226,218, 21,
-155,134,142, 58,100, 89, 54,236,208,161, 67,115, 71,140, 24, 65,223,185,115,231,141, 62, 89,149,203,238,176, 44,139, 75,151, 46,
- 65,173, 86,227,151, 95,126, 97, 89,150,173,125, 30, 45,144, 83, 91, 54,135, 78,254,229,192, 41,129,128, 79,225,102,228, 49, 20,
- 23,214, 61,170,139,207,231,225,231,125,199,213,124, 62,239,113, 77,199,213,106,117,250,149, 43, 87, 28, 6, 50, 12,143,166,233,
-154, 4, 84,141, 8, 11, 11,211,176, 44,155, 90,207,105, 81,217, 25,105, 67,191,249,252,147, 67, 67,198,124,230,208,189,123, 79,
-158,173,189, 3, 40,138, 66, 78,118, 14,146,226,238,104,206, 29,251, 41,187,172,220,176, 37,120, 62,249,254, 15,125,159, 44, 0,
- 8,154,189, 85,223, 63, 11, 0,134, 78, 89,130,192,110, 94,160, 12,177,158, 94,137, 44, 86,171,213, 66, 34,145, 64,171,213,214,
- 56,197,131,133,133,133, 88,161, 80,200,117, 19, 49,214,105, 21, 17,224,157,167, 17,195, 48, 30,133,133,133, 40, 43, 43,195,205,
-155, 55,201,218,181,107,115,115,115,115,245,157, 54, 53, 26,141, 71, 65, 65, 1, 74, 75, 75, 17, 21, 21, 69, 66, 67, 67,115,243,
-243,243,151, 53,228, 29, 18,139,197,157,185, 92,238,189,194,194, 66,214,196,196,132,214,104, 52, 26,111,111,111,161, 88, 44, 54,
-120, 65,117,169, 84, 58,168,182, 99,174,174,174,201,201,201,201,109, 24,134,169,186, 6, 34, 95,161, 80,184,117,239,222,221,144,
-252, 99,222,222,189,123,113,252,248,113,191,146,146,146,137,169,169,169,251, 1,248,113,185, 92, 60,120,240, 32, 65,161, 80,140,
- 27, 49, 98,196,190,194,194,194,219,168, 88,130,199, 16,156, 79, 74, 74,154,224,225,225,177,119,245,234,213,166, 1, 1, 1, 92,
-103,103,103,116,233,210, 5, 73, 73, 73, 56,115,230,140,102,231,206,157,101,229,229,229,159, 0,184, 84,119,178,131,210,106,181,
- 16, 8, 4,250,143, 80, 40, 4,159,207,135, 76, 78,240,233,134,103,114, 45,196,242,141,171,166,157, 33, 0,149,149,254, 44, 47,
- 39, 43,253, 54, 69, 81,145, 82,169,180,184,150, 56, 19, 40, 20,138,142,132, 16, 14, 69, 81,155,213,106,245,148, 57,115,230, 56,
-173, 91,183, 14,237,218,181, 67, 94, 94, 30, 36, 18, 9,220,220,220,144,155,155,139, 59,119,238, 48,229,229,229,187, 0,172,129,
-174,255, 72,109, 40,202, 43, 65, 83,199,230,175, 57,159,132, 16, 16, 6,208, 40, 25, 48,106, 2, 21,165, 1,143,167, 1,159,207,
- 55,196,121, 34, 44,203,162,208,201, 9,108, 92, 28,110,221,186, 5, 66, 72,173,174,154,187,187,187, 1, 25, 59, 11,129, 80,240,
- 90,115, 33, 69, 81,224, 11, 4,224, 9,248, 53,141,156, 49,186, 88, 70,252,163, 97,104,219,120, 17,128,233, 15, 31, 62,220,223,
-167, 79,159,112, 66, 8, 15, 21,237,145,215,223,230,207,179,178,178,238, 71,157,185,191,212,161,169, 85,232,224,137, 61,209,174,
-163, 11, 24, 45,131, 27,103, 31,224,151,117, 39, 15,103,166,103, 78,129, 1,107,159,177, 44,123,173, 71,231,118, 52,170,204,213,
-237,236,236,204, 54,102,212, 97,113,113,241,202, 69,139, 22,225,243,207, 63,111,204,168,195, 26, 17,155,152, 59,157, 2,105, 58,
-116,112,175,129,160,104,162, 82, 41,235,200,248,160,159,185,148,207,231, 61,190, 27, 35,245,174,233,188,220,220,220,129, 31,127,
-252,241, 37, 46,151,219,178, 33,113,206,178,108,106,118,118,118,191,250,207,212,222, 80,202, 75,220, 78, 31,222,189,224,252,241,
-189, 3, 89,150,105, 77, 1,224,112,249, 79, 53,106,245, 5,165,188,100, 19, 12, 92, 84,122,253,116,127,204,219,114, 17, 59, 62,
- 31,138, 57,161, 71,241,211,138, 79,177,116,195, 33,124,247,249, 60,172,221,250, 95,124, 53,111, 2, 70,141,255,152, 37, 20,253,
-167,161,247,193,225,112,206,239,222,189,123,242,167,159,126,170, 31,180, 64, 8,121, 45, 99,215,104, 52,114,150,101,177,107,215,
- 46, 22,192,249,186,248, 94, 79, 35,138,212,213, 95,202,208, 52, 42, 41, 41,249,196,223,223,127, 31, 0, 33, 33,228, 73, 97, 97,
-225,127,128, 87, 75, 67,149,150,150,126,210,189,123,247,125,132, 16, 33, 69, 81,111, 28, 55, 4,186,169, 30, 58, 91, 89, 89,221,
-211, 57, 89,194,198,116,136,175, 43,170,235,104, 86, 52,164, 9,145, 5, 48,167,202,140,239,235,252,252,252,170, 46, 42,157, 80,
- 88, 88,216,185, 17,225,186, 36,151,203,189, 86,172, 88,177, 64, 36, 18, 5,150,151,151,183, 5, 0,137, 68,146,164, 84, 42,175,
-201,229,242, 77,168,127,110, 42, 21,203,178, 73, 90,173,182,189,157,157, 93,197,136, 90,157,216, 2,128,223,239, 49,247, 0,166,
- 75,133, 41,254,171,193, 1, 59,123,246,108, 11, 43, 43,171,247, 40,138, 26, 69, 8,113,151,201,100,202, 21, 43, 86, 68,133,133,
-133, 21,183,108,217,114,240,144, 33, 67, 40,107,107,107,220,189,123,151,228,231,231, 31, 3,176, 12, 6,140,180,102, 89, 54,117,
-253,250,245,104,232,251, 94,215,113,181, 90,157,117,246,236, 89,219, 65, 57, 57, 92,150,101, 49,116,232,208,215, 4, 92,117, 60,
-126,252, 24, 74,165,178,206,201, 28,149,197,133,232,187, 96, 9,160, 27,253, 89,137, 10, 39,139,128,168,140,186,202,136,127, 23,
-254,234, 5, 61, 13,178, 22,157,156,156,198,138, 36,194, 89, 46,109,157,188, 95, 62,203,121, 36, 43, 46, 63, 40,149, 74,119,215,
-146,145, 27,196,217,192, 9, 75,141,246,239, 95,196,249,106, 30, 45, 6,132, 48, 32, 44, 1, 33, 44, 88,150,169, 88,240,154,176,
- 32, 12, 67, 81, 20,254, 84,201,235,156, 25,188,122, 56,173,108,109,109,215, 16, 66, 6,113, 56, 28,186,170, 25, 86,245,187,206,
-201, 58,159,155,155,251, 85, 13,206,235,255, 92,124,134,133,133,213, 40,254, 13, 29,117, 56,122,244,104,166,129,239,230, 53,137,
- 68,226, 84,211,177,178,178,178, 52,169, 84,250,222,223, 36, 62,171,142, 24,108, 8,103,131, 71, 29,214,199,233,226,226, 34, 84,
-171,213,157, 0,184, 81, 20,101, 9,160, 64,173, 86, 95,200,203,203,203, 6,208, 25,192, 10,221, 53, 95, 3,184,247,127,252,190,
-139,109,109,109,247,210, 52,221,212,144,139,181, 90,173,170,160,160, 96,114,181, 10,129,158,211,198,198,230, 30,151,203,109,106,
- 0, 79, 70,126,126,126,103, 99,254,105,228,252, 7,161,122, 39,248,105,132,144, 61,255, 63,254,184,191,145,211,200,105,228, 52,
-114, 26, 57,141,156, 70, 78, 35,231,191, 64,104,161,154,208, 2, 33,196, 56,172,214, 8, 35,140, 48,194, 8, 35,140, 48,226, 45,
-113,166,154,216, 58, 83,249,133,170, 67,149, 54,196, 18,108,140,178,189,108,228, 52,114, 26, 57,141,156, 70, 78, 35,167,145,243,
- 95,199,249,175,192, 95,178, 50,197, 59, 74, 32, 35,167,145,211,200,105,228, 52,114, 26, 57,141,156,255, 62,206,255,101,212,218,
-116, 72, 27,227,198, 8, 35,140, 48,194, 8, 35,140, 48,226,175,129,193, 66, 75,226,224,238, 97,235,226,189,207,170,105,135, 24,
-171,166, 29, 98,108, 93,188,247, 73, 28,220, 61,254,165,241, 38, 6, 48,158,203,229, 94,114,116,116, 44, 65, 45, 75,239,252, 3,
- 96, 14, 96, 20, 42,230,247, 25, 14,192,228, 93,146, 7, 0,220,177,192,172, 73, 64,218, 36, 32,109, 44, 48, 43,224, 31,184, 28,
-199,170,185, 78,254,145,231,198,159, 91, 53,215,201,191,198,227,139,156,108,110, 93, 28,189,101,221, 44,103,235,119,244,151,102,
-246,246,246,123, 28, 28, 28, 94,216,219,219,167,218,219,219,239, 5, 96, 97,204,238,140, 48,194, 8, 35,254, 50, 84,246,209,170,
-252,232,251,104,113, 1, 32, 60, 60, 60, 0,192, 31, 0,250, 4, 5, 5, 69, 84,191,218,170,121,251, 79, 91,183,106,253,249, 55,
-171,150, 81,142,246,182, 38, 90,134, 85,167,188, 72,247, 92,249, 77,232,111, 47, 5,220,141,133,105,113, 63, 53, 34, 80, 20,135,
-195, 25, 43, 20, 10,131, 0, 84, 10,182, 4,165, 82, 25,206, 48,204, 17, 24, 54, 76, 27, 14, 14, 14,145, 28, 14,167, 69, 67,254,
-152, 97,152,180,236,236,236,158,141,140,204,209,205,155, 55,223, 27, 16, 16, 96,226,231,231, 7,129, 64,128, 21, 43, 86, 44,146,
- 74,165,155, 12, 37,176,178,114, 53, 83, 11, 69,243,185, 2,193, 0,162, 81,181, 39, 32, 0, 45,140, 99,181,202, 43,124,165,114,
- 99, 97,225, 51,153,129, 84,203, 55,111,183,181, 0, 0, 32, 0, 73, 68, 65, 84, 0, 76,209,197,213, 79, 0,214,191,205, 83, 50,
-185, 35, 52, 26,166,226,153,224,115,193,156,122,110,241,199,242,229,203,185, 65, 65, 65,248,233,167,159,122,238,217,179,103,154,
- 76, 38,187, 2,224,119, 0, 79,223,246,169,116, 0,166,119,239,217,115,203,228, 69,139, 56,242,200, 72,108,217,187,119, 51, 42,
-230, 91,218,209,208,103,137,207,199, 40, 91, 91, 94, 16, 33,232, 68, 1, 20, 5, 60,200,205,103,207,170,213,204, 17, 24, 48, 23,
- 91, 29, 24,143,215,135,227,255,218, 80,130,226,167,228, 75,225, 80,143, 94,197, 79,175,125, 9, 96,112,245,227, 90,133,104, 50,
-225, 52, 11,146,147,232,116, 0, 27,222, 50, 90, 77,236,236,236, 98, 78,157, 58,213,212,207,207,143, 11, 0,247,238,221,155, 20,
- 20, 20,212, 55, 55, 55,183, 61,128,146,255,163, 76, 72,196,165,233, 89, 2, 30,111, 0,195, 48, 29, 0,128,195,225,196,170, 52,
-154, 75, 90,150,221, 1, 3,231,100, 51,194, 8, 35,254,185,168, 79,139,252,205, 81,235,204,240,149, 55, 71,170,110,171, 66, 98,
-223,206,179, 91,191,145,143,139,101,229,138, 23, 47, 50, 11, 23,206, 90,123,105,218,188,239, 79,110,248, 49,252,108,196,237,132,
- 91, 30,126,239, 61,146,216,183,243,172,133,186,182, 54,220,230, 98,177,248,254,206,157, 59,213, 73, 73, 73,164,168,168,136, 60,
-126,252,152, 28, 59,118,140,204,152, 49, 67, 33, 22,139,239, 3,104,110, 8,167,131,131, 67,246,227,171, 23, 73, 70, 76, 52, 73,
-189,119,155,104, 52, 26,162, 86,171,137, 90,173, 38,143,206,135,147,152,223,143,147, 7,199,142, 16,149, 74, 69, 84, 42, 21, 81,
- 42,149,164, 85,171, 86, 47, 13, 12,103,117, 56,123,121,121,169,194,195,195,201,111,191,253, 70, 22, 45, 90, 68,124,124,124, 24,
- 0,179, 13,189,119,137,189, 91,160, 89, 19,239,220, 79,131,119,168,207, 68, 93, 32,241,207, 31,144,248,231,201, 36,236,114, 2,
-153,178,120,171,218,172,137, 79,174,196,222, 45,176,190,123,183,178,178,234, 70, 81, 20,169, 4, 0,210,162, 69,139,210,170,159,
-230,205,155,191,246,105,214,172, 89,105,203,150, 45,159,218,216,216,116,170,137,115, 92, 7, 16,242,232, 87, 66, 30,253, 74,150,
-247, 6,137,143,143,191, 69, 8,249,163,242, 35,151,203,255, 56,113,226,196, 31, 31,126,248,225, 31, 0, 62,168, 35,158, 12,138,
-207, 73, 64,154,236,212, 41, 66, 54,109, 34, 36, 32,128, 36, 0,100, 18,144,214, 64,206, 86,142,142,188, 7,223,175,159,166, 58,
-117,234, 23,114,238,220, 25,114,246,108, 56, 57,121, 98, 47,217,188,105,150,218,193,129, 23, 7,160, 77, 3, 56,185, 0,214, 2,
-216,136, 10,231, 50, 41, 55, 55,151,100,101,101, 17, 0, 73,186,223, 54,218,217,217,109, 64,205,238, 91,255,170, 78,214,130, 65,
-142,231,198, 12,238, 73,100,197, 47,201,152,193, 61,201,130, 65,142,175, 57, 91,131, 92, 93,205,230, 12,237,144, 27,127,239, 32,
- 51,103,104,135,220, 65,174,174,102,141,140, 79, 10, 21,235,132,238,188,122,245,170,150, 84,129, 70,163, 33,251,247,239,103,172,
-172,172,126,105, 0,103, 91, 59, 59,187, 84,107,107,235,164,170, 63,218,121, 15,239,238,222,107,210, 74, 27,207, 15, 3, 26, 16,
- 78, 63, 17,159,159,113,233,232, 15, 76,126, 90, 44, 81,201,179, 73,241,147,104,146,145,112,139,236,223,189, 81, 35,224,114, 51,
- 0,248,189,205,179,212, 64, 24, 57,141,156, 70,206,191, 33,103, 93, 90,228,127, 17,111, 76,239, 80,219,141, 9,133,130,224,149,
-203,151, 80, 69,249, 69,114, 69,137, 76,165, 81, 40, 20, 52,159, 40, 98, 31, 61,207,161,185,156,162, 5,243,230,154, 5, 47, 93,
- 30, 92, 6, 76, 48,240,191,155,251,248,248,220, 57,126,252,184,189,181,181, 53,138,139,139,145,159,159,143, 59,119,238,128, 16,
-130, 17, 35, 70, 8,187,118,233,210,233,203, 21, 43,110,102,100,102,250,163,246,130,247,149,120,177,182,197,250,158, 21,107,209,
-126,245, 34,191,162,212,161, 40,236, 25, 29,164, 63,103, 77, 70,197,106, 25, 34,145, 72,191, 32,113, 35,224,223,175, 95, 63, 62,
- 0, 76,157, 58,181, 68, 38,147,133,232, 28, 14,131, 86, 90,149,216,187, 5,218, 58, 57,135,255,176,107,189,184, 67,107, 55,168,
- 53, 90,164,102,189, 4,151,103,137,166, 77,249,248,120,194, 0, 94,239,238,214,182,107,191,222,115, 38,139,197,240,242,188,228,
- 11,181,113, 89, 90, 90,238, 63,114,228, 8,142, 30, 61, 10, 0, 72, 74, 74,130,155,155,155,164,190, 48,196,197,197,185,126,240,
-193, 7,135,243,243,243,219,212,119,110,245,137,241,133, 66, 33,122,246,236, 9, 79, 79, 79,156, 58,117,170,143,206,217,122, 43,
-200, 35, 35, 97,250,240, 33, 16,209,168,202, 75, 43, 95, 95,151, 91,103,207, 28,180, 61,115, 54, 1, 27, 54,236,197,211,167, 21,
- 70,155,171,171, 43,198,143, 27,205,139,141,141,242, 26, 53,106,124,212,245,235, 79,123,234,132, 82,125, 88,253,227,143, 63, 46,
-107,217,178, 37, 70,141, 26, 53,218,203,203,203,209,220,220, 28,187,119,239,134,147,147,147,171, 74,165,122,114,234,212, 41,231,
-172,172, 44,204,157, 59, 23,217,217,217,139,106, 35,234, 51,176,207,151,194,161, 30,189,218,249, 78,134,169,185, 19,126, 60,116,
- 4,143,239,239,239,165, 84, 39,124,201,103, 34, 38,202,137,112, 74,110,154,105,112,139,206, 1, 54,109,188, 62,128,139,111,180,
-173,130,185,254,252,203, 1,173, 66,185, 34,197,254, 85, 27,164,249,111,144,142, 10,227,180, 47, 73,180,142,187,132,124, 96, 21,
- 91, 41,176,244,110, 45,193, 7,189,123,247,214, 39,220,139, 23, 47,160, 84, 42,225,225,225, 65,171, 84,170, 64, 3,227,181,237,
-123,239,189,247,231,217,179,103,109,218,182,109,155, 91, 80, 80,160, 63,224,104, 99, 57, 48,226,248,230,185,107,183,252,215,253,
- 0,161,138,114, 19, 78,198,214,195,229,215,163,155,239,229,115,199, 15,154, 82,165,233, 16, 88,230, 1,108, 62,158, 29,254, 25,
-148,137, 53,198,206, 88,200, 13,236,215,183,201,128,193, 35, 47, 63, 78,126,218, 15,192, 93, 99,189,222, 8, 35,254,213,174, 22,
-249,167,221,147, 94,104, 5, 5, 5, 81, 53,221, 32, 75, 88,111, 7,123, 27,241,230,239,247,221,229,168, 85, 42,137,165,133,138,
-103, 97,206, 82,102, 22, 28,181, 74, 83,234,226,234, 34, 96, 9,235, 93, 11,127,245, 33,158,148, 88, 44, 62,254,251,239,191,219,
-243,120, 60,176, 44, 11, 59, 59, 59,164,164,164,160,168,168, 8, 50,153, 12, 79, 19, 18,208,178,121, 51,172, 10, 94,226, 52,119,
- 73,240,241,242,242,242,206,120,189, 25,241,141, 97,163,140,230,245,117,163, 43,151, 96,121,163,202,175,251,173,134, 99,134, 14,
- 69, 77, 73, 75, 75,131,169,169, 41,218,183,111,111,122,227,198,141,235,117,136,172,215, 56,173,172, 92,205, 88,161,224,232,206,
- 31, 86,136,213,154, 56, 60,122, 86,128,118, 45,123,193,193,166, 57, 94, 22,168,112,235,206,239,136,139,249, 21,173,155, 52,199,
-236, 25,125, 69,161,235,127, 59,194,215,182,108, 94, 84,148, 82, 82, 19,103, 73, 73,137,105,171, 86,173,208,188,121,197,186,103,
- 12,195,224,209,163, 71, 96, 24, 70,191, 95,117,187,239,216, 85,104, 75, 82, 49,121,210, 36,228,231,231,155,214,196,201,227, 64,
-187,112,218,120,174,152, 7, 8, 36,214,170,210,210, 82,253,240, 84,181, 90,141, 7, 15, 30,192,223,223, 63, 32, 44, 44,172, 62,
- 85,100, 80,124,170,129,239,182,252,242,203,214, 9,197,197, 52, 0,252, 68, 81,172,154,144,239, 12,125,150,236,237,121,199,206,
-159, 59, 96,203,161, 19, 97,109,241, 45,238,220, 73,133, 90, 93, 17,222,252,252, 28,204,153, 85, 2, 62,207, 12,167, 78,253,215,
-198,195,163,231,177,172, 44,117,123,188,222,140, 88, 83, 56, 69,231,206,157,195,156, 57,115,240,232,209, 35,103, 14,135,131,219,
-183,111, 67, 44, 22,227,251,239,191,231,120,120,120, 56, 75, 36, 18,156, 63,127, 30,217,217,217, 84, 93,225,252,227,194, 31,223,
- 20, 63,189,246,101, 22,117,126,208,143,135,142,224,179,113, 99,225, 72,158, 93,183,104, 77,125,243,222,208, 30, 95, 17, 78,179,
- 32,137,153,183,149, 91,251,161,224, 11, 76, 49,251,139, 53, 72,138, 59,109, 85, 46,139,153, 69, 49,233,205, 86,109, 8,155,247,
- 70, 56,127, 27,205, 76,253,245,134,239,165,230,119, 93, 30, 62,152,118, 91, 26,189, 39,230,149,208,114,229, 82, 52, 99, 81, 89,
-147,122,242,228, 9,158, 62,125, 10, 46,151, 11,185, 92, 14,173, 86, 91, 99, 56,157,157,157,167,107,181,218,175,116,233,188, 79,
- 36, 18,125,114,240,224, 65,155,170, 66,219,206,123,120,119, 27, 51, 73,191,236,156,252,194,168,187,241,143, 23, 78, 31,213, 39,
-242, 86, 92,186,154,247, 97, 90,113,204,169,226, 90,226, 83, 36, 22, 8,142,157, 63,241, 95, 83,205,243,171,144,120,244, 1,207,
-212, 13,140, 38, 19,229,133,101,144, 61,149, 66,249,195,118,116,156,181, 0,167, 79,254,102,234,213,161,115,152, 82,163,113, 3,
-160,106,196,187,217, 16, 24, 57,141,156, 70,206,191, 39,103,173, 90,132, 16,226, 11,192, 65,183,155,175,211, 5,182, 0,242, 80,
-177,138,140,131, 46,239, 16, 84,185,172,250,126,213,115,171,239, 87,253,158,175,251,110,175,219,222,165, 40,170,160,158,160, 59,
-161, 98,105,194, 51,186, 45,160,107, 74,172,183,227, 49, 69,209, 37, 12,195, 10,249,118,246,138,169, 99,250,117,184,120,249,222,
- 3, 19, 91,115,238,192, 62,157, 2,238,196, 62,191, 73,209,148,134,162,104,131,250,125,112, 56,156,177,155, 55,111,238, 96,110,
-110, 14,150,101, 97, 97, 97,129,220,220, 92,168, 84, 42, 20, 23, 23, 67, 41, 43,129, 90, 86,130,135,233, 47,208, 35,160, 15, 70,
- 14,122,207,227,191, 39,127, 31,203, 48,204,225,186,120,157,189, 59,233,157,172, 53, 45,108, 94, 89, 19,233, 69,122,209,245,109,
- 39, 55,240, 77, 77, 49, 96, 97,240,219, 60, 3,209,103,206,156, 57, 55, 98,196,136,193,139, 23, 47,166,165, 82,233,249,148,148,
-148, 30, 0, 30,213, 43, 42,132,162,249, 51,231, 7, 89, 89,153, 18,132, 93,250, 29,189, 59,141,131,137,128,131,252, 18, 53, 40,
- 10, 72,136, 63, 14,138,178, 70, 76,146, 20,189, 58,154,227,189,129, 30,166, 39,127, 75, 88,140, 87,253,131,222, 72,154,194,194,
- 66,228,228,228, 64,163,209, 64,163,209, 96,212,232,209, 56,176,127, 63,202,202,202, 32,151,203,161, 82,169,192, 48, 12,104,154,
-198,165,240, 48,164, 63, 79, 64,119,127,127,160,150,165,151,246, 63, 0, 15,192,173,199,143, 31, 35, 33, 33, 1, 25, 25, 25, 16,
-137, 68,112,116,116,196,154, 53,107,160, 84, 86,172, 81, 54,122,244,232, 0, 0,177,111,251, 66, 61, 5,246,164, 48,204,151,131,
- 79,156,176,191,113,226, 4,123,235,244,233, 12,161, 76,182,219,144,107,249,124,140, 90,255,221,140,118, 18,137, 4, 25,105,155,
-225,238,206,199,162, 5, 54, 8,249, 54, 15, 0, 48,119, 78, 83,116,233,108,139,146,162,223, 96,107,191, 12, 91,183,206,107, 61,
-101,202,198, 73,229,229,204,190,122,168,191,252,253,247,223, 71,186,185,185, 53,137,142,142,166, 4, 2, 1,196, 98, 49,196, 98,
- 49, 68, 34, 17,114,114,114,144,146,146, 66,214,175, 95,159, 9,224,203,186,136, 86,109,149,222, 4, 48,120,193, 32,156,123,124,
-127,127,175, 38,156,231, 15, 71,206,238,249, 34,230, 86,180,236,226,165, 27, 95,107, 21,162,244,162,140,203, 75, 90,117,137,182,
-157,245,249,106,108, 95,191, 18,143,111, 71, 22, 56, 52, 47,217, 33,166,148, 53,134, 51, 32, 96, 21,215,201,193, 90, 59,125,202,
- 72,203,211, 14, 81,211,207,114,169,220,172,188,251,223, 35, 37, 90, 46,108,211,105, 98, 91, 87, 90,117,245,234, 85,113,239,222,
-189,161, 80, 40,244,206,228,193,131, 7, 89,173, 86,123,173,198,103, 83,173,254, 42, 51, 51,211, 73, 46,151, 99,208,160, 65,115,
-191,255,254,123, 73,229, 26,117, 12,195,188,230,100,125,179,233,192,133,249, 95,237,184,118,225,240,183,206,223, 4,127,210,103,
-194,236,181,215, 80,203, 58,146, 92,154,158,117,250,196, 94, 71,145,149, 6, 98,235,247,160,200,150,227,241,158,207, 80, 94,162,
- 64,151,111, 86, 3, 16, 64,165,161,177,123,232, 40,240,108,156,177,242,211, 79,156,151,239,254,113, 6,203,178,155,141,245,122,
- 35,140, 48,162, 26, 28, 40,138, 10, 7,128,224,224,224,101, 33, 33, 33,241, 20, 69,133, 19, 66,130,116, 6, 74, 56, 33, 36,168,
-242, 28,157, 56,123, 99,191,242,220,234,251,213,191, 47, 93,186,212, 43, 52, 52,116,157,191,191,255,225,168,168,168,231, 0,234,
- 19, 90, 67,116,194,170,250, 82, 60, 21,163, 14,131,130,130,168,170,219,215, 28, 45,150,141,124,242,252, 69,249,123,253,187, 54,
- 13,143,136,189,251,241,199, 67,250,141, 29,218,123, 96, 74, 90,126, 66,107, 23, 71,219,248,248, 88,115,150,101, 35, 13,137, 37,
-161, 80, 24,212,183,111, 95,110, 97, 97, 33, 76, 76, 76,144,155,155,139,204,204, 76,168,213,106, 40,138,139,160, 44, 46,130,162,
-168, 16,234,226, 66, 60,189,119, 7,222,173, 93,133,186,206,242,117,162,210,117,169,238, 84, 85,117,182, 4,102,102, 16,154,153,
-129,106,120,179,225,135,150,150,150,183, 42, 11, 85,181, 90, 61,107,201,146, 37,121, 44,203, 98,237,218,181,230,166,166,166, 97,
- 0,132,245,145,152,217,113,130,252, 59,182,167, 19, 83, 98,208,211,103, 50,218,182,122, 31, 41,217,114,228,201,212,200, 41, 82,
-163, 75,239,109,104,225,179, 26,205, 58,134, 32, 33,181, 0,206, 77,220,104,112,133,117, 46,254,156,158,158,254,218,254,225, 67,
-135, 80, 94, 94,142,214,173, 91, 99,220,184,113, 88,178,100, 9,198,141, 27, 7,103,103,103, 76, 24,243, 1, 86,174, 92,137,172,
-172,172,250,130,170,108,219,182,173,210,197,197, 69,233,226,226,162, 84,171,213, 40, 45, 45, 69, 81, 81, 81,245,248,158,215,208,
-136,180,183,183, 95,234,232,232, 24, 99,111,111, 31, 47, 20, 10,207, 62,160,168, 68,133,139,139, 67,143, 97,195, 40,207, 49, 99,
- 56,169, 98, 49, 21, 1,152, 26,194,101,107,205, 27, 18,216,119,176,160,168,112,175,222,164,250,228, 99, 59,252, 25,225,133, 27,
-215, 59, 99,206,172,214,160,104, 17, 40, 90,128,242,178,171,232,234,231,207,183,180,164,234,123,150,198, 3,120,208,163, 71, 15,
-231,217,179,103, 83, 66,161, 16,115,231,206, 85,127,250,233,167,201,227,198,141, 75,190,114,229, 10,227,226,226,130,102,205,154,
- 81,205,154, 53,115, 2,240, 64,119, 77,157, 48,111, 77,125,163, 84, 39, 92,183,116,147, 60,103, 96,219,189, 84, 35, 28,181,106,
-131, 52,255,155,157,207, 55,164, 60, 46,119,125,124, 59, 50, 63, 57,238, 52,155,114,247,143,188,151,201, 50,215,111,118, 62,223,
-176,108,199,203, 26, 95,234,136, 8,176,199,195, 35,212,229,101,229,220, 97, 67, 3,203,167, 79, 29,219,214,218,212,235, 32,154,
-188,231,211,162,121,211, 9, 43,215,109, 85,127, 58, 99,190,250,167,159,247, 18,153, 76,134,146,146, 18,108,221,186, 85,123,250,
-244,233, 76,134, 97,230,215, 86, 7, 2, 0,141, 70,131,233,211,167, 75,204,205,205,145,158,158,174,119, 68, 1, 64,154,155, 31,
-123,227,110, 92,226,194,255,140, 14, 40, 83, 42,149, 23,254,184,151,224,233,230,210,148,162, 72,173, 3, 81, 4, 60,222,128,206,
- 93,187,114, 8, 41, 2,197,109,142,167,251,215,163, 36,171, 0, 37, 57, 5,224,240, 36,208, 66, 8, 13, 43,128,165,183, 31,146,
-238, 70,163,137,157, 3, 87,200,227, 13, 52,150, 39, 70, 24,241,239, 68, 93, 90,164,170, 88, 10, 13, 13, 93, 87,215,241, 42, 91,
- 85,181,125,189,144,170, 46,194,170,126, 7,128,208,208,208,117,132,144,160,168,168,168, 67, 0,228, 6,222,194,180, 42,219,105,
-175, 9,173, 58, 93, 40,133, 42,100,241,146, 47, 97,101, 33,182,240,235,228,230,120,234,124,196,189,200,168,123, 9, 45,154,217,
-218, 17,141,202,234,187,141,219,155, 82,229,242, 80, 3, 3,225, 97,107,107, 11,181, 90,141, 39, 79,158, 32, 35, 35, 3,106,181,
- 26,218,178, 50, 40,139,138,160, 40, 44, 4, 83, 38, 3,159, 97, 32,207,205,129,141,137, 8,120, 53, 34,177, 30,231,141,170, 81,
-104, 85,110, 69,230,230, 16,154,153,131,230,241,106,108, 86,172, 5,190,126,126,126, 71,227,226,226,186,246,239,223,255,107, 84,
- 12,145, 79,205,204,204,236,183, 98,197, 10,165,131,131, 3,166, 79,159,222, 14,192,228,122, 69,166, 64,229,225,226,216, 14,109,
- 93, 39,163, 69,179,190, 40, 42,211, 32,183, 68,131,156, 34, 53,118,111,243,199,177,159,252,240,231,177, 94,136,187, 48, 0, 69,
- 26, 71,152, 58,127, 8,194,168,188,234,226,188,116,233, 18,214,172, 89,131,175,191,254, 26,107,215,174,197,215, 95,127,141,204,
-204, 76,180,111,223, 30,105,105,105, 56,119,238, 28,164, 82, 41,108,109,109,113,231,206, 29,108,218,180, 9,127,254,249,103,189,
- 55,109,200,108,182,186,115, 26,212,150,174,213,106,167, 72,135, 13,235,144,109,109,237,217,169, 83,167,193,115,231,254, 63,246,
-174, 59, 46,138,107,109, 63, 51,219, 27,101,233, 44,160, 2,138,162,130, 64, 68,196,142, 26, 73,236, 13, 75, 20, 75, 52,154,196,
- 18, 77, 98,176,197, 94,226,181,197,146,168,137, 61,118, 49, 42,118,197,222, 5, 11, 2, 10,210,123,135,101,123,153,153,239, 15,
-129,139,134,178,104,114,111,242, 93,158,223,111, 88,118,119,230,217,115,166,156,243,156,247,125,207,123,102,184,119,238,220,185,
-234,123,119,119,247, 38, 66,161, 48, 23,175,103, 80,250,214,197, 69, 3,126,182,182, 94,208,105,227, 43,174, 49, 7, 4, 33, 64,
-207, 15,227,208,185,235, 35,232, 13, 92,144, 4, 31, 36, 41,128,209, 88, 4,169, 84, 6,134, 33,188,234, 41,226,194,130,130, 2,
-143,203,151, 47,147, 41, 41, 41, 16, 8, 4, 0,144,186,120,241,226, 45,235,214,173,139,181,182,182,166, 34, 34, 34,240,251,239,
-191,163,127,255,254,172, 73,147, 38,121,184,184,184,108,171,175,222,139, 55,229,220, 61,176,254,220, 40,142, 65,234, 43, 16, 54,
-115,133, 82, 50,232,139,238, 54, 98, 0, 56,159,148, 84,110,215, 68,190, 90, 89,254, 52,221,210, 89,241,195,249,164,250,102,156,
- 46,166,163, 18,226,239, 29, 56,113,190, 44, 63,175,132,227,231,221, 86,189,106,233,183,220,102,174, 45,214, 44,250,110,170, 67,
-150, 92, 80,250,225,140,115,241,225,231, 31, 40,198, 78,152,108,252,244,179,105,154,115,231, 47,157,160,105,218, 27,181,204, 56,
-164,105, 26, 57, 57, 57,120,254,252, 57,146,146,146, 80, 80, 80,128,194,194, 66,148,151,151, 87,185, 27, 69,229,242, 51, 91,118,
-159,126, 34, 22, 10, 69, 1,222, 30, 77,238, 71,199,230,139,133, 66,145,135,107,147,150,192,226, 26,219, 17,138,162,188, 5, 34,
- 33, 0, 2,165, 49, 55,160, 40, 81, 64, 81,170, 64,121,177, 2, 90, 61, 11, 26, 45, 9,181,142, 68,211,238,125,160, 80,106,160,
- 40, 42, 3, 77, 81, 62,141,221, 77, 35, 26,209,136, 58,250,250,136,176,176,176,121, 38,238,107,178,123,243,109,225, 21, 22, 22,
- 54,143, 32,136,136,185,115,231,182, 69,237, 19,170,170, 99, 71, 13, 27, 0, 19,210, 59, 20, 21, 37, 40,204,136,214, 67,103,205,
-249,254,220,193,157,155,237,180, 90, 85,186,181, 84, 66, 73, 68, 60,155, 79,167,172, 64,185,162,100,136,210,244,116, 4, 40, 41,
- 41, 65,114,114, 50,132, 66, 33,184, 28, 14, 40,181, 26,148, 90, 9,117, 73, 17, 72,189, 22, 92,138,130,149, 72,136,166, 50, 7,
- 52,179,119, 48,137, 51, 49,242, 98, 85,224,123,117,119,225,191, 58,180, 6, 79, 44, 1,207, 76,130, 47, 34,174, 1, 0,184, 92,
- 46,176,112,153, 73, 70, 19, 39, 39,167, 83, 7, 14, 28,224, 22, 20, 20,224,241,227,199, 79, 0,148, 1, 48, 3, 64,199,197,197,
- 93,142,137,137,233,239,225,225, 1, 0,205,235, 35,147, 23,146,148,193,200, 32, 35, 55, 21, 41,153,209,176,178,112, 3, 71,212,
- 18,249,165,122,240,133,110, 48,104,255,237,125,212,200,211,160,214,179, 76,170,187, 78,167,131,209,104,132,209,104,132, 78,167,
-195,103,159,125,134,219,119,238,224,208,239, 87,144,252,234, 37, 90,185, 58, 32, 52,116, 44, 58,116,232,128, 59,119,238,212,201,
- 53,206, 23, 6, 39, 9,216,235, 63, 38,193,147, 88,107, 59,126,119,225,126,125, 98,139, 32, 8, 6,181,184, 34,223,194,186,192,
-192,192, 22, 47,149, 74, 60,143,143, 71,239,197,139, 1, 0,103,207,158,125,163, 46,179,103,207,230,197,198,198,126,250,232,209,
-163, 79,179,179,179,215, 3,168, 57,216,156, 1,206,156,185,139,169, 83, 99, 81, 80, 80, 0, 0, 56,124,240,223,186, 52, 37, 89,
-143,143,250,189,246,104, 89, 90, 90, 98,253,122, 47,147,206, 39, 69, 81,216,177, 99, 71,149,187, 16, 0,216,108,118,231,217,179,
-103, 15,173,105,255, 22, 45, 90,112,235,227,156, 53,220, 73,112,235, 9,243,165, 69,139,102,109,205,109,218,161,200, 16,237, 21,
-157,149, 51,125,214,112,167,141, 27,142,101,105,132,132,118, 15, 65,101,184,176, 5,154,189,166,148, 49,233,252,102, 93, 81,211,
-241,123,115, 11,228,243,167, 77,254,196,218,220,210, 78,249,235,150, 85, 82,146, 69, 50,167, 30,233, 75,219,186, 91, 91, 14,234,
-248,163, 98,234,172,133,209, 58, 99,198, 52,100,156,122,137, 58, 82, 92, 80, 20,133,236,236,108, 20, 20, 20, 32, 61, 61, 29,133,
-133,175,221,175,133,133,133,160,105,250,125, 26, 68,168,211,211,145,118,226, 87, 52, 27, 59, 22,254,203,150,130,162,217, 80,171,
- 40,172,239,212, 11, 37,101,106,104,105, 2,178, 15, 58, 97,242,217,155, 32, 25, 10,216,190,181,177, 39,105, 68, 35,254, 71, 97,
- 74,122,135, 74, 65,180,106,213,170,254,127,246,239, 87, 23, 91,171, 86,173,122,190,106,213,170,134,252,214,219, 46,195,170,247,
-149, 49, 90,215,170, 5,160,253,161,211, 44, 47,140, 75,138,141,101,103, 43,213, 74,145,189,157,173, 86, 36,224,211,101,242,114,
- 86,244,179, 39,122,101,238,171, 23, 13,168, 71, 92, 76, 76,140, 87,118,118, 54,210,211,210, 96, 84, 43, 65,106,117, 96, 52, 42,
-244,238,210, 9, 2, 0, 2,146, 0,151,214,131,205,226,161, 92, 33, 7,128,184,122, 59, 71,131,225, 15,150, 45,130, 32,192, 51,
- 51, 3, 79, 44, 6, 79, 98,246,134,133,203, 20,139, 13,159,207, 63,112,244,232, 81, 71, 39, 39, 39, 44, 93,186, 20,206,206,206,
-158, 50,153, 76,101, 97, 97, 33,180,183,183, 71,155, 54,109,208,169, 83, 39,156, 59,119, 14, 48, 33,167,148,193, 40,120,250, 34,
- 21,157, 11,139,239,224,230,181,159,161, 83,107,225,215,253,103,232,217,205, 96,219,118, 9,232,196,253, 80,229,158,124,109, 61,
-112, 24,128,204,244, 84, 16, 44,222,115, 83, 45, 79,149,255, 63,121,242, 4, 7, 79, 94,135, 99,211,214, 72, 79,136, 71,252,213,
-203,184,109,107,141,166,173,219, 84,185,129,106, 45, 35, 5,246,242,173,175,211, 68, 45,248,242, 19,126,113,113, 49,223,202,202,
- 74, 91,121,238, 28, 29, 29,223, 71,108,125,242,205, 55,223,160,148,195, 1,250,245, 3, 55, 41, 9,122,189, 30, 29, 59,118,132,
-191,191, 63, 0,160, 99,199,142, 96,179,217,104,215,174, 29,100, 50, 25,182,110,221,250, 73,109, 66,139, 36,240,216,104, 44,242,
-116,119,119,175, 18, 90,123,247, 21, 32,250,209,135, 32,192,195,166, 45,137, 85,251, 54,105,210, 4,185, 57, 73, 32, 8, 38,166,
-158, 50, 46,115,112,112, 88,232,232,232,232,190,110,221, 58,150, 64, 32,192,231,159,127,238,166, 80, 40,154, 85,152,146, 49,119,
-238, 92, 0,192,162, 69,139,176,120,241, 98,104,181, 90, 85,109,100,123,215,123,203,242,139,233, 79, 25,133,104, 72,144, 77, 51,
-239,158,193,189,225,230,209, 19, 61,131,211, 1, 96,165, 21, 59,117,196,154,249,150, 39, 44,205,136, 93, 23,207, 95, 90,212,165,
-123,207,249,223, 41,174, 46,255, 97, 71,105,189, 49,143,101,105,123,202, 95,240, 70,110,216,188,109,223,134,239,231,206, 20,164,
- 23,232, 74,178, 74, 24,133,132,207,150, 52,183, 39, 36,211,231, 44, 75,206,206, 78,250, 26, 25,231,235,157,105, 73,211, 52,146,
-146,146,170, 98,250, 52, 26, 13,148, 74, 37, 50, 50, 50,170,238, 25,181,216,252,163,105, 19, 6,248, 40,213,106,213,253,103, 9,
-233, 11,102,140, 9, 84,170,213,170,132,148,244,151,192,166, 26,213, 24, 73,146,207, 84,229,170,222,170, 82, 13, 10, 30,191,128,
-115,175,166, 48, 24, 9,232,140, 20, 10,138,202,161, 53, 2, 20,201, 65,219, 17,161,160, 8, 54, 10,179,179, 64,178, 88, 79,240,
-102,208,126, 35, 26,209,136,255, 29,212,169, 69, 42, 45, 90,129,129,129,135,170, 91,157, 42,255, 7,160, 69,221,161, 60, 5,213,
-197, 84,165, 59,177,182,223,121,139,215, 84,252, 33, 70,171,222,244, 14,149,191,233, 98, 33,151,253,107,209, 24,103,218,104,108,
-149, 95,152,103,100,179,249, 28, 23, 11,117, 78,113,186,233,191,174,213,106, 35, 46, 95,190, 60,248,195, 15, 63,228, 39, 60,123,
- 2, 93, 89, 25,116,101,165,224,208, 70, 88, 9,219,131,212,107, 65,232,116,112,242,164,161, 41, 23,226,250,237, 24,131, 86,171,
-141, 48, 85,104,145, 44,214,155,113, 89, 18, 9,248,102,230,224, 75, 36,111,187, 22,235, 19, 5,162, 62,125,250,244,234,216,177,
- 35, 24,134,193,142, 29, 59,160,215,235,121,122,189, 30, 58,157, 14,122,189, 30,114,185, 28,251,246,237,195, 79, 63,253,116, 27,
-192,238,122, 59, 51,163,238,242,133, 75,145, 29, 38,142,233,207, 57, 27,177, 30, 70, 29, 5, 53,225, 12,165,210, 0,133, 78, 4,
-202,122, 44,144,119, 6, 44,182, 0,129,237,220,112,242, 88,184, 30, 70,237, 21, 19, 85,248, 27, 86,161,140,244, 84,100,190,122,
- 9,137, 60, 23,182,230, 34,168,146, 94,194, 47,116,220, 59, 89, 39, 92, 92, 92, 64,211, 52,130,130,130,170,130,171,223, 85,108,
- 21, 21, 21,225,244,233,211,232,216,177, 35,186,119,239,142,172,172, 44, 36, 37, 37,161,111,223,190, 85,251, 60,121,242, 4,209,
-209,209,104,222,188,110, 35, 97, 97,177,225,108,102,198,227,144, 65,131, 6,113,239,221,187, 7,134, 97,224,225, 97, 14,115, 51,
- 49, 8,146,143,214,173,237, 0,188, 30, 3,244,232,209, 3,114,121,146,177,164,132, 57, 91, 79,117, 15, 0,248, 93,167,211, 37,
-118,235,214, 77,246,234,213, 43,204,154, 53,139,125,248,240,225, 74, 83, 50,194,194,222,156, 76,161, 86,215,238,186,111,229,237,
-249,173,155, 81,218, 93, 32,108,230,106,110,211, 14,110, 30, 61, 1, 0, 31,246,159, 8,183, 22, 77, 32, 47,124,234,170, 81,167,
- 14,225,178, 75,164, 79, 55,101,197, 10,251,121, 77,208,228, 95, 75,192,107,215,105,189,151, 93,157,112, 56, 47,157, 51,246,200,
-239,167,206, 77,233,219,127, 32,199, 64, 25,141, 94, 77, 57,150, 71, 79,156,201,207, 74, 75,255, 17,233,231, 99,254,109,255,171,
-211,138, 71,201,229,114,136,197, 98,196,196,196,104,251,245,235,199, 39, 73, 18,137,137,137, 85, 66,203,206,198,170, 77,103,127,
- 47,207,229, 27,246, 93, 16,243,249,252,224, 30,237, 91,199, 38,164,101, 50, 12,145, 90,171,181,213, 96,184,244,236,241,147, 32,
- 91, 89, 11, 86,210,181,123,176,238,218, 23, 90, 45, 9,181,142,134,214, 8, 24, 89, 92, 56,250, 6,192,178,121,107, 48, 0, 30,
-222,187,109,208, 26, 12, 23, 26,251,154, 70, 52,226,127,218,170,197,212, 37,146, 42,254, 47, 6,144,186,106,213,170,194,106,214,
-166, 2, 0, 79, 0,248, 84,236, 87,240,214,113, 5, 4, 65, 60,100, 24,198,191, 26, 79, 65, 53,193, 85,253,127,221, 91,251, 60,
-105,128,200,170,254,250,166,208,170,109, 74, 37, 0,216,216,216,216,249,249,181,111,254,203,206, 35, 96, 24, 6, 47,162,215,162,
- 36, 63, 30, 11, 87,222,109,238,228,228,212, 61, 43, 43,235,186, 41, 37,160, 40,234,240,174, 93,187,190, 14,248,192,207,207,213,
-217, 25, 79, 82, 83,192,101, 40,112, 41, 10,164, 94, 11, 54,165,131,179, 23, 5,146,144, 32, 59,187, 12,171, 15, 28,137,169,200,
- 18, 95, 39, 60,251, 14,196,210,204, 50, 16, 4,129,117,129, 94,224,153, 73,192, 21, 75,240,197,169,200, 42,113, 21,177,116, 46,
-120, 18, 9,154, 7,152,148, 16, 94,117,245,234,213, 71,207,158, 61,243,247,242,242,194,215, 95,127,141,212,212, 84,208, 52,141,
-188,188, 60, 77, 78, 78, 78, 86, 65, 65, 65, 42,128, 19, 0,126,129, 9,153,199,185, 90,205,198,136,227,123,167, 5,118,233,110,
- 51,104,200, 79,248,253,216,108,148,150,201,161, 50, 10,161,212, 24,161,212,178, 96,101,237,141,128,118,237,144,157,149,143,231,
-247, 46, 40,216, 90,213,218,134,220,160, 4, 65, 32, 58, 58, 26,238, 50, 51,188,188,121, 29, 54, 34, 14,124,100, 14,144,117,238,
- 82,149, 95,170, 46,112, 88, 48,126,242,201, 39, 85,153,225,251,244,233,147, 50,118,236, 88,199,217,179,103, 99,231,206,157,184,
-125,251,246, 31, 2,180,187,119,239,142, 27, 55,110, 44, 1,176,168, 62,163,158, 78,167,131,167,167, 39, 30, 62,124,136,203,151,
- 47,163,103,207,158,232,222,189, 59,158, 62,125,138,139, 23, 47, 34, 58, 58, 26, 4, 65,192,218,218, 26,134,215,226,217, 80, 27,
-153, 94,143,163, 63,172,217, 53,111,195,134,159,218,142, 25, 51, 6,199,143, 31,194,196, 9,173, 64,144,124, 16, 4, 31, 3, 7,
-180,194,210,101, 15, 17, 16,208, 3, 54, 54, 28,108, 88,127, 50, 89,173,166,246,153,112, 26,151, 95,188,120, 81,166,209,104, 80,
- 90, 90,202, 72, 36, 18,162,168,232,245,140,214,154, 44, 90, 42,149, 74, 80, 27,209,179,168,184,181,165,229, 76, 9,163,136, 30,
- 82,108,140,246,238, 25,156,129, 15,251, 79,192,165,136,221,136,188,112, 25, 86,236,212, 20,136,203,207, 21,166, 20,202,115,148,
- 30,219, 90,127, 48,137,149,169,188,176,109,250,192,151, 44, 71, 71,250,232,220,159,229,165,117, 9, 45, 0, 68,113,236,254, 83,
- 39, 24, 12,236, 20, 24,208,194,171,137, 35,175,164, 48,159, 57,118,242, 92,140, 62,229,248,233,106, 2,139,169, 71,168, 47, 13,
- 11, 11,251,190,226,255, 61, 11, 22, 44,152,180,122,245,106,219,220,220,220,170, 24,173,252,194,226,200, 78,253,166, 83, 69,165,
-101,186, 93, 27,230, 12, 23, 10,248,188, 5,171,119, 93, 51,176,112,175, 54, 94, 35, 77,111, 29, 49,107,225,204,132, 23,209, 78,
-205,132, 60,156,156,179, 8, 79, 46, 94,133,129,228, 98,234,229,251,208,234, 41,148, 22, 22,225,202,167, 95, 66, 98, 47,197, 79,
-215,142,231,209, 52,253,115, 99, 87,211,136, 70,252,239,162, 54, 45, 66, 16, 68, 77, 57,246,242,106,248,236, 97, 93,199,213,194,
-243,103,160,214,172,240, 38, 77,193, 43, 44, 44,204,191,113,227, 62,174, 69, 44,199,245,136,229,120, 30,253, 4,217, 89, 58,100,
-229,105, 96,110,110,126,183,142, 67,223,206, 28,203,168, 84,170,161, 11, 22,126,159, 43, 16,138,208,173, 87, 47, 56,216,218, 65,
-196,229,128,101,164,193, 34, 56, 80, 20, 88,226,229, 83, 21,190,219,181, 63, 95,161, 82, 13,173,161,147,232, 93,155,200, 32, 8,
- 2,124,115, 51,240, 36,102,224,155,153,191,225, 70, 20,152,155, 67, 96,102, 14, 54,143, 87, 83, 48,252, 31, 56, 21, 10,197,176,
-225,195,135,151,148,149,149, 97,210,164, 73,184,126,253,122,244,133, 11, 23,204,159, 62,125, 42, 44, 40, 40,104, 1,160, 15,128,
-237,117,136,172, 55, 56, 75, 74,146,202, 25,163,118,228,170,239,191, 82,107,140,214, 8, 25,119, 24, 98, 50, 3, 70,138, 6, 3,
- 64,102,197, 67,231,222,203,144,175,235,132,195,219, 86,168,104,189,102,204, 91, 57,180,222,224,100, 24,134,177,183,183,255,195,
- 57,184,124,249, 50, 66,134, 15, 67,240,144,193,176,117,117,135, 93,239,190, 8,158, 52, 21,219,182,109, 3, 73,146,176,177,177,
-121,187,227,173,226,220,251, 24,156,131,207, 64, 28,124, 6, 98, 79, 52,216, 0, 66,247,239,223,255,131,143,143,207,213,219,183,
-111,175, 5, 48,178,250,111, 85,195,226,183,172, 89, 53, 93,163,249, 51,103,206, 84, 39, 36, 36, 64, 44, 22,195,104, 52,226,246,
-237,219,248,233,167,159,176,110,221, 58, 68, 71, 71,195,218,218, 26,205,155, 55,135, 86,171,197,195,135, 15,213, 0,230,215,193,
- 73, 23, 20, 24,135,109,218,180,186,168,127,255,174,216,181,107, 11, 28, 28, 58,129,195,118, 0,155, 99, 11,177,196, 19,191,254,
-242, 3, 62,254,216, 15,167, 78, 30, 41, 46, 44, 50, 14, 3, 96, 52,225, 94,210,220,191,127, 31,219,182,109,195,240,225,195,179,
- 66, 66, 66,168,178,178,178, 42,139, 86,101,166,223,197, 21, 49,102, 90,173,150, 95, 27,231,228,239, 98,178,230,172,120,190, 52,
- 47, 55,171,227,245,171,119, 63,137,188,112, 25,201, 9,145,136,188,112, 25, 55, 35,239,132,229,229,102,117,244,235,208,146, 59,
-116,210,180,111,247,134, 31,103, 73,204, 29,177, 55,252, 56,107,244,244,175, 86,180, 15,238, 57,191,190,123,190,226, 58, 50,138,
-252,188,185, 43,215,110, 86, 24,245, 26,242, 95, 63,110,205, 86, 23,228,204,175,118, 95, 50,245,221,159,106,181,122,187, 70,163,
-145,105, 52, 26,153, 86,171,157,159,154,154,218,237,235,175,191, 46,160, 40,170,202, 90, 90, 16,123,234,110,252,173, 61, 43,237,
-108,164,194, 78,254,109, 91,173,223,126,236, 90,122, 70,222,111,213,114,104,213, 84, 78,141, 66,173, 25, 54,120,232, 88,101,105,
-137, 22,129, 95,133,129, 22, 72,160,165, 0, 3,195,130,145, 96,227,217,242,245, 16, 90,153,225, 64, 74,148,170,204,160, 31,134,
- 55,115,104,213, 85,247,247, 65, 35,103, 35,103, 35,231,223,147,243,159, 12, 71,188,185,214,161,227, 27, 22,173,250,166, 84, 58,
- 57, 57,117, 27, 52,176, 55,122,244, 95, 0,134, 97, 16, 31,181, 6, 37, 5, 47,224,228,192, 71, 82,186, 60, 16,192,245, 6, 20,
- 38, 61, 53, 35,163,227,204,249, 11,194, 67,250,244,106,237,229,234,202,111,214,172, 41,196,118,118, 40, 44, 44,192,173,123,177,
-134, 21, 7,143,198, 84,136, 44,147, 28,147, 52, 77,191, 14,114, 7,208,107,230,119, 32, 88, 44,160, 34,141, 67,101,199,232,234,
-223, 9, 4,155, 13,138,161,161,213,106, 77,153, 45,151,249,234,213,171, 97, 99,198,140,185, 18, 17, 17, 65, 6, 7, 7,251,158,
- 56,113,226,125,214,204,131, 50, 63,225, 42,128,254, 43,230, 78, 57,220,177,231, 96,115,143,182,237,185,237,155,177,160, 55, 16,
-200,206, 74, 67, 68,248, 3,125,236,253, 11,114,198,168, 25,169, 42, 76,184, 90, 23,151, 94,175, 79,111,209,162,133,253,182,109,
-219,170,130,225, 41,138, 66, 97, 97, 33,238,222,189, 11,111,255, 0,180,158,240, 41, 10, 10, 10,176,105,211, 38, 52,105,210, 4,
- 3, 6, 12, 64,113,113, 49,140, 70,163,169, 14, 95, 10,192,133,138, 13,111,137, 44,162, 98, 9,160, 58,221,134,238,238,238, 60,
-141, 70,227,203, 48, 12,139, 32,136,141, 58,157,110,252,220,185,115, 29, 87,174, 92,137, 86,173, 90,161,176,176, 16, 98,177, 24,
- 30, 30, 30, 40, 40, 40,192,131, 7, 15, 40,149, 74,181, 13,175, 23,178, 46,168,167,124,137, 15, 30,164,116,156, 49,227,139,240,
- 31, 86, 79,241,208,104,123,240,172,172,186,128, 97,140, 40, 40, 72, 69,185,252,182,126,217,210,221,175,242,242, 13, 67, 1, 36,
-152, 88,231, 69,211,166, 77, 3, 0, 1,128, 5, 73, 73, 73,143, 91,183,110,237, 81,155, 69,203, 20,108, 56,150,165, 1,112,112,
- 88,176,108,150,188,240,169,135, 21, 59, 53,165,163, 23,189,105,195,177, 44,141,185, 76,185,188, 48,245,250,203, 28,229,133,109,
-123,195,143,179,198, 13, 25, 70, 57, 75, 18,194, 4,118,204, 49, 19,168, 25, 31, 31, 31, 23,130, 40,118,203, 47,122,241,104,226,
-164, 41, 35, 44,184,234,179, 62,206, 69,205,201, 38,126,130,232,232,232, 20, 52,112,102,104, 5, 94,102,101,101,117,155, 59,119,
-238, 5,134, 97,222,136, 77,200, 47, 44,142, 12,236, 63,141, 41, 45, 45,123, 92, 16,119,202,148, 92,106, 15, 30, 68, 69,247,242,
-242,246, 59,254,195,202,213,246, 61,102,126,205,126,121,245, 26, 64, 25,144,118,253, 26, 40,190,142, 94,127,231, 82, 94,153, 94,
- 63, 4,141, 89,225, 27,209,136,255,121,107, 86, 93, 90,228,111,142,126,168, 37, 24,222,228,202,184,187, 57, 93,104,229,209,172,
- 79, 19,103, 91, 0, 64, 82, 74, 54,146, 82,178, 46, 38, 37,103, 5,215,163,120,107,155, 94, 89,181,168, 52, 81,145,194,129, 49,
-109, 81,233, 55, 56,173,173,173, 31,177,217,108,231,134,156, 13,138,162,178, 11, 11, 11,253, 76, 44,231,104, 87, 87,215,213,105,
-105,105,225, 52, 77,207,106,160,218,175,145,179,114, 81,105,146,205,235,205, 24,117,222, 0, 64,176,121,166, 44, 42, 93,157,211,
- 91, 34,145,108,231,112, 56, 77, 42,175, 99,101, 12, 22, 69, 81, 44,189, 94, 47,160, 40,138, 5,128, 32, 73,210,200,225,112, 52,
- 4, 65, 24,141, 70, 99,186, 86,171,157,130,127, 39, 28,173,171,238,245,118,244,175,178,100, 50, 0, 0, 32, 0, 73, 68, 65, 84,
- 21, 66, 11, 53, 88,180, 46, 3, 64, 66, 66, 66, 75,169, 84, 58,146, 32,136,225, 12,195,120,150,151,151,107, 23, 46, 92, 24,125,
-244,232, 81,185,171,171,235, 71,253,250,245, 35,158, 62,125,138,152,152, 24,166,168,168,232, 88,133, 21, 43,169,129,247, 18,201,
-231,179, 70, 89, 89,145,253, 24, 6, 62, 96, 64, 16, 36,158,149,149,209,103, 85, 42,234,183, 10,193,216,208,251,179, 18,159, 52,
-107,214,108,119, 74, 74, 10,167, 54, 75,106,109,117,127, 27,107,230,183, 93, 16,216,181,235,176,187, 55,111,158,152,179,226,249,
-210,234,223, 77, 31, 44,157, 56,250,203,153,107, 14,110,253,113,206,230,223, 75,118,153, 82, 78, 95, 95, 95,119,130, 32, 70, 2,
-240, 98, 24,166, 5,195, 16, 2,130, 96, 74, 8,130,120, 14,224,169, 78,167,139,136,141,141,205,124,143,186,191,203, 8,183, 54,
-206,170, 69,165, 65, 81,237, 40,128, 49,113, 81,233,255,116, 57, 27, 57, 27, 57, 27, 57,255,123,156,255,100,124, 86, 67, 7,105,
- 90,102,248, 74, 36, 37,103, 5, 39, 37,103,161, 69,139, 22, 76, 98, 98, 98,131, 68, 90,109,157, 52, 69, 81,135, 84, 42,213,161,
-247, 33, 41, 42, 42,106,255, 23,159,188,131, 41, 41, 41, 7,255, 76,194, 10, 33,181,180, 98,123, 87, 60, 83, 40, 20, 1,166,238,
-172,215,235,255,138,115, 67, 84, 88,179,150,212,182, 67,159, 62,125,210,244,122,253,101, 0, 25, 4, 65, 88, 2, 40,214,235,245,
- 23,140, 70, 99, 94, 98, 98, 98,251,245,235,215, 87,102,190, 95, 6,224,209, 59,150,131,214,106,169, 3,217,217,212,129,191,160,
-142, 7,116, 58,221,108,107,107,235,230, 26,141,134,167,209,104,184,213, 39, 31, 8,133,194,130,186, 2,226,171,195,210,140,216,
-195,101,151, 88, 91,154, 17,111, 11, 41, 88, 57,225,184, 90, 25,211,202,202, 9,199, 77, 45,216,227,199,143,147,124,124,124,246,
-147, 36,233,202, 48,140, 61,192, 88, 48, 12, 10, 24,134, 41,100,179,217, 89,177,177,177, 89,127,163, 70, 72, 99,164,233,181, 70,
-157,238,223,113,135,141,179, 11, 27,209,136, 70,252,255, 65,173, 49, 90,236,134, 50, 37, 38, 38, 18,141,231,179, 17,213,197, 86,
- 93, 95,166,165,165,105, 1,220,169,216,222,198, 35, 0, 3,254,238, 21,204,201,201,241,171,237, 59, 83, 69, 22,240, 58,102, 11,
-136,169, 49, 59,251,226,205, 37,229,216, 28,254,109, 67,203,246,228,201,147,116,152,232, 98,111, 68, 35, 26,209,136, 70,252,101,
-248,172, 54,241,197,110, 60, 55,141,104, 68, 35, 26,209,136, 70, 52,162, 17,239,133, 29,213, 4,215, 27,214, 45, 2,181,207, 28,
-104,136,239,245, 93,102, 31, 92,110,228,108,228,108,228,108,228,108,228,108,228,108,228,252,159,227,252,255,138, 55, 68,150, 41,
-201,209,255, 12, 52, 78,125,109,228,108,228,108,228,108,228,108,228,108,228,108,228,252, 95, 16, 89,111,108,149, 89, 15, 26, 93,
-135,141,104, 68, 35,254,103,113,244,232, 81,147, 22, 21, 29, 53,231,215,254, 18,137,116,161, 66, 94,182,250,208,218,137, 39, 42,
- 63, 15, 9, 9,161, 26,207, 98, 35, 26,209, 8,188, 75, 48,188,155,155,115, 27,146,162, 59, 51, 12,201, 98, 72,198, 64,200,213,
-135,147, 74, 74,222, 72, 59,224,226,226, 98,201, 33, 49,128, 96, 24, 49, 65,208, 20,205, 34,111, 39, 39,103,198, 54,160, 96, 60,
-169, 84, 58,141,203,229,246,214,233,116,206, 36, 73,102,106,181,218,203, 42,149,106, 11,254,152,184,240,191,134,150, 45, 91,142,
-190,118,237,154,101,151, 46, 93,180, 66,161,208,168, 86,171,217,231,207,159,231,127,252,241,199,165,175, 94,189,122,167, 25,137,
- 50,153,172,231,175,191,254,234, 22, 28, 28,140, 22, 45, 90, 40, 71,142, 28,201, 13, 12, 12,228, 78,154, 52, 41, 57, 59, 59, 59,
-178,129,116,109, 8,130,216, 71, 16, 4,139,166,233, 80,252, 59,117,195,159, 13,146, 36,201, 41, 4, 65, 12, 97, 24,198,157, 32,
-136, 36,134, 97, 78,208, 52, 93, 87,226,214,186, 48, 12, 64, 95,146, 36,253, 0,128,166,233,104, 0,103, 1,211,103,222,253, 39,
- 57, 69, 34,145, 47, 0,168, 84,170,199,127, 22, 39, 65, 16,190, 0,192, 48,204,187,114, 78, 16, 10,133,147, 1, 64,173, 86,255,
- 2, 19,150,131,122, 27,204, 54, 79,198,111, 73, 60, 0, 32,122,145, 39, 0,160, 33,239,137,169,241, 68, 67,126,171, 38,190,134,
-112,212,128,190, 99,198,140, 89,249,219,111,191, 45, 2,112,242,175,184,241, 29, 28, 92,182,172,251,113,135,236,171,105,159,174,
-198,235, 21, 33,234,126, 32,129, 15,121, 44,214, 64, 29, 69,221,140, 5,142, 2, 96, 91, 89, 89,141,230,241,120,221,116, 58,157,
- 35,155,205,206,209,233,116, 55,202,202,202, 14,162,142, 21, 16, 76, 62,175,113,144,234, 85,112, 32,232,127,175,243,198,144,208,
-114, 69,200, 37, 90,163,228,111,208,140,146, 0,102, 86,212,117, 39,106, 79,231, 81, 87,227,243,149, 76, 38, 27, 34,151,203, 85,
- 44, 22,139,193,235, 89,207,175,255,188,254,158,160,105, 58,191,184,184, 56,180, 62, 46,113, 19,180,226,137,137,125,148, 1,106,
-163,150,249, 92,153,129,120,137, 11, 58, 49, 64, 40, 3,184,146, 44,210,150,166,233, 28, 0,145,164, 17,167, 21,217, 72,252,155,
-118,238, 77, 43,206,107,179,138,247, 28, 0,246, 0,158, 2,248, 10,128,162, 81,255,252,199,240,118, 48,252, 25, 0, 57, 85, 66,
-171, 90,186,251, 30,253,251,247,191,238,230,230,220,102,248,224,161, 43,167, 78,249,156, 96,177, 72,196, 60,127,206,254, 36,116,
- 66, 31,169, 84,234, 36,209,106, 91,131, 32,104,149, 64, 16, 35,151,151,101, 29, 61,248,155,153,103,171, 86, 20, 69,209,216,182,
-253,231,143,143,253, 30, 62,207, 68,177,213,210,193,193, 97, 95, 88, 88,152,195,192,129, 3, 89, 14, 14, 14, 72, 77, 77,181, 60,
-116,232, 80,171,205,155, 55,143, 40, 41, 41, 9, 5,240,242, 29, 42,219,213,193,138,236, 99, 38, 36,122,161,156, 66,185, 1, 87,
-114,213,184, 8,224,230,187,158, 61,149, 74, 53, 93,165, 82, 5,248,251,251, 51, 59,119,238, 36,198,143, 31,207, 16, 4, 65,168,
-213,234, 61, 0,222, 73,104,137,197,226,173,193,193,193, 30, 30, 30, 30, 73,175, 94,189,234,123,228,200,145,179,227,198,141,115,
- 23,139,197, 9, 0, 90, 54,144,110,119, 81, 81,145,143, 90,173,134,179,179,243, 78, 0, 31,252, 5, 55, 17,193, 98,177, 78, 56,
- 57, 57, 49,107,214,172, 57,233,227,227, 99, 95, 92, 92,108,252,246,219,111,123,223,187,119,239, 99,138,162, 6, 54, 64,108, 73,
- 9,130,216,110,111,111,111,179,122,245,234,196,246,237,219, 63,229,243,249,188,132,132, 4,209,236,217,179,103,189,124,249,114,
- 4,195, 48, 83,128, 6,117, 16, 82,130, 32,182,203,100, 50,155,149, 43, 87,166,250,249,249,197,112,185, 92,110, 66, 66,130,248,
-187,239,190,251, 42, 62, 62,254,157, 56, 73,146,220, 22, 16, 16, 32, 93,180,104, 81, 92,171, 86,173,238,176, 88, 44, 94,102,102,
- 38,185,120,241,226,105,151, 46, 93, 10,161,105,122,234,187,148,211,206,206, 78,186,120,241,226,184,192,192,192,123, 92, 46,151,
-251,226,197, 11, 50, 44, 44,108, 90, 98, 98,162,201,229,180,178,178, 10, 34, 8, 98, 71,110,110, 46, 27, 0, 28, 29, 29, 59,152,
-155,155,111,174,190,166,101,101,140,128,193, 96, 40,215,104, 52, 99,138,139,139,107, 76,132, 59,126,238,166, 1, 0,176, 89, 95,
-249,254,245,107,125,239,129,109,167, 77,169,180,175,195,235,188,120,235,148, 19, 7, 3,192,232,138,165,194,215, 41, 1, 54,155,
- 77,251, 58,124,197, 60,206,109, 80,202,152, 65, 61,123,246, 92, 28, 25, 25,249,115,143, 30, 61,190,219,191,127,191, 93, 70, 70,
-198, 15, 55,111,222,116, 25, 53,106,212,248, 43, 87,174,172, 42, 44, 44, 60,246,103,221,252, 60, 46,159, 79,144, 4,132, 2,145,
-185, 41,251,115, 72,178,255,157, 65,131, 38,255,242,226,133,223,230,248,120, 55,165,163, 99,192,140, 25, 51,236,135, 14, 29, 74,
-186,184,184, 32, 49, 49,209,122,255,254,253,173,127,249,229,151, 33,165,165,165, 51, 1,164,189,143,200, 82,150,194, 91,171,131,
- 31,195,192,178,234,129, 37, 80,202,215, 35,154,137,195,179,191,129,216,250,126,247,238,221,139, 18, 19, 19,177,106,213, 42, 0,
-216,210,192,227,103, 15, 26, 52,168, 95,120,120,184,240,232,209,163, 66,127,127,127, 56, 56, 56,160, 98, 48, 85,149,152,218,205,
-205,205,180,115, 70, 99,221,198,179, 19, 63,136, 41, 62,135,173, 67,115, 87, 9,157, 97,236, 52,200, 99, 72,255,241,126,176,176,
- 21, 65, 32, 97,163,180, 72,238,245, 34, 58, 35,248,234,145,196, 31, 18,163, 10, 86, 43,211,241, 61,106,207,201,247, 95,129,181,
-181,245,206,228,228,228, 32,177, 88,252,198,231, 73, 73, 73,190, 30, 30, 30,101, 0,190,110,168,112,179,181,181, 61, 64,211,180,
-182,168,168,232, 83, 0, 48, 51, 51,251, 77, 44, 22, 75,115,114,114,230,253, 85, 3,153, 74,188,173, 69,254,225, 22,173,170,120,
-173,154,214, 58, 36, 72,138,238, 60,117,202,231,196,200,209,163,114, 19,147,146,105, 54,135, 55,250,252,133, 11,162, 54,109,218,
-144,218, 45, 91, 96, 44, 40,128, 97,214,172, 78,151, 47, 95, 54,132,140, 30,171,230,176,136,221,238,110,174,162,195, 7, 15, 57,
-132, 31, 63,214, 25, 64,125, 66,139,231,224,224,176,239,218,181,107, 78,110,110,110, 40, 45, 45, 69,106,106, 42,148, 74, 37, 70,
-140, 24,193,233,220,185,179,211,240,225,195,247,149,149,149,117,105,128,101,203,190,133, 51, 59, 98,202,132,161, 45, 63,238,211,
- 89,236,228,210, 28, 76,174, 6, 25,175,226,253, 35,174,221,155,177,251,248,217,151,137,101, 76,127,212,188, 54, 82,157, 40, 44,
- 44,156, 51,100,200,144,227, 65, 65, 65,182,124, 62, 31, 50,153,140, 24, 56,112, 96,126,118,118,246,146,119, 86, 45, 21, 75,216,
-144, 36, 73, 85,127,173, 97,121, 32, 83,224, 44,149, 74, 33,149, 74, 1,192,233,125, 71,158,150,150,150, 91,204,204,204,134,203,
-229,114, 53, 73,146, 12, 65, 16,140, 78,167, 19, 74,165,210, 39,113,241, 47,101, 90,173,182,197,218,141,191,252,216,179,171,143,
-249,165, 75,151, 48,116,232, 80,230,226,197,139, 83, 76, 93,167,142, 32,136,237, 67,134, 12, 81, 45, 92,184, 80,147,152,148,234,
- 20,247, 50,137, 16, 11,120,180,141,141, 13,231,193,131, 7,236, 13, 27, 54, 8, 22, 47, 94,188,157, 97,152,225, 13, 56,159,219,
- 71,141, 26,165,255,230,155,111,114, 94, 36, 38,219, 61,139, 75,100, 36, 2,142,209,198,198,154,117,239,222, 61,250, 93, 56, 73,
-146,220, 54,103,206, 28,249,148, 41, 83, 74,138,138,203, 28, 74,228, 10,134,207, 97, 25, 28, 28, 28,216, 39, 79,158,212, 30, 56,
-112,128,156, 60,121,242, 54,154,166, 67, 26,112,126,183, 13, 28, 56,176, 60, 44, 44,172, 52, 33, 41,197,225, 89,236, 75,136,248,
- 28,131,189,189, 29,235,225,195,135,250,181,107,215,146,203,151, 47, 55,169,156, 98,177,120,239,145, 35, 71,216, 39, 79,190,110,
-251,238,222,189, 75,186,187,187,139,170,239,163,214,104, 65, 18, 64, 97, 97,161, 40, 48, 48,112, 47,128, 63, 36,247,245, 91, 18,
-143,241,115,129,233,211,167,231, 52,244,102,241,115,156, 81,239, 62,212,207,158,204, 6,213,196,193,108, 54,155,158, 60,121,114,
-238,219,223,107, 52, 26, 2,192, 64,252, 96,186,216,234,219,183,239,252, 51,103,206, 52,223,191,127,255,250, 3, 7, 14,232, 0,
- 64, 32, 16,216, 28, 58,116,104,213,136, 17, 35, 48, 98,196,136,133,199,142, 29,251,211,132, 22,197, 80,122, 0,224, 11,248,252,
-248,248,120,194,211,211,179,206, 40, 87, 61, 77, 63,250,229,197,139,246, 95,120,122,250, 23,211,116, 11,238,199, 31, 43,102,207,
-158, 93, 40,151,203,145,154,154, 10,189, 94,143,241,227,199,179,122,244,232, 33, 27, 49, 98,196,166,242,242,242, 97, 0,244, 38,
-220,147,107,157,156,156, 62, 43, 43, 43, 83, 84, 90,117,186,132, 82,236,110,190, 70,126,187, 22, 6, 30,151,101,228, 14,152, 69,
- 19, 23,183, 16, 74, 79, 55,220, 2, 0,174, 10, 5, 13, 28, 12,212, 8,115,103,184, 81, 28, 44,183,117, 22,246, 44, 72, 83, 47,
- 85,166,215, 41,150,134,137,197,226,193, 74,165,242, 88, 69,231,220,178,127,255,254,184,119,239, 30, 0,116,174, 16, 90, 61, 73,
-146,252,132,166,233, 95, 1,212,181,148,219,140, 65,131, 6,125, 24, 30, 30,110, 6, 0,199,142, 29,131,193, 96,128,187,187, 59,
-184, 92, 46,120, 60, 30, 56, 28, 78,213,234, 32, 38,194,209,214,214, 6, 54, 22, 28, 72,173,196, 31,127,247,211, 32,118,147, 54,
-230,200,167,158,163,152, 41,133,145,209,130,107, 45, 70,171, 96, 75,248,245,233, 73,158,222, 22, 51,239,244,214,184,246, 42, 18,
- 3,144, 6,237,223,165,103, 39, 73,146,255,244,233, 83,200,100,178, 55, 62,103,177, 88, 0,208,237, 29, 40, 23, 38, 37, 37, 5,
- 70, 69, 69, 33, 40, 40,104,161,183,183,247, 71,215,175, 95,119, 40, 42, 42, 66, 80, 80,208,166,204,204,204,147,127,117,157,170,
-107,145,255, 47,166, 46,242, 45, 37,217,227,245, 40,152,100,177, 88, 36,146,147, 82, 13, 65, 65,189,198,165,167,167, 75, 2, 2,
- 2, 72, 14,135, 3,101,100, 36, 52, 15, 31, 66, 34,145, 96,200,144, 33,156, 27, 55,110,152,155, 75,204, 39,165, 36,167,148,179,
- 88, 36, 24,134,172, 55,230, 65, 42,149, 78,155, 55,111,158,131,135,135, 7,140, 70, 99, 85, 70,115,163,209,136,140,140, 12, 72,
- 36, 18,132,134,134,218,137, 68,162,105, 38,214,163, 89, 75,119,187,232,107,103,183,127, 48,123,106, 95,113, 75,209, 37,136, 51,
-102, 66,114,236, 11,180,206, 62,143,176,193, 1,226,139, 91, 23,250, 53,151, 89, 69, 87, 51,177,154, 12,173, 86,123, 43, 38, 38,
-102,210,245,235,215,105, 0,184,122,245, 42, 19, 23, 23, 55,229,125, 70,161, 52, 77,163,180,180, 20, 52, 77,179, 42,222, 87,190,
-254, 87,239, 7,115,115,243,109, 31,125,244,209,168,180,180, 52,225,185,115,231,172,211,211,211,109, 82, 82, 82,108, 91,182,108,
-201, 94,181,106,213, 25,141, 86,207, 50, 80,140,206, 72, 25,202,115,158, 63, 79, 42,201,203,139,222,181,107,151,154, 32,136, 33,
- 38,254,198, 48, 71, 71, 71,235,185,115,231,130,224,136, 58,180,106,237,237,193,226, 8, 45, 72, 14,207, 66,173,214, 80,201,201,
-201, 25,115,231,206,117,245,241,241,145,225,181,123,205, 36, 78,153, 76,102,243,205, 55,223,128,205, 55,243,109,231,227,215,156,
-199, 23,155,177, 56, 66,179,128,128,128, 30, 73, 73, 73,217, 97, 97, 97,142,254,254,254, 13,226,244,247,247,151, 78,158, 60,217,
- 40, 16,154, 5,186,185,185,183,110,215,182,117,191,150, 45, 91, 14,102,179,217,198,130,130,130,180,208,208, 80,199, 1, 3, 6,
-216, 55,132,211,206,206, 78, 26, 22, 22,102,116,105,234, 30, 28,252, 97,159,142, 92,161,153, 5,155, 39,182, 84,169, 52,212,139,
- 23, 47,210, 22, 44, 88,224,232,235,235,107,103, 10,167, 74,165,226,216,216,216,192,203,203, 11,109,220,221, 81, 86, 86,134,240,
-240,112,236,222,189, 27,191,254,250, 43, 14, 30, 60,136,246, 93,250,192,204,204, 12,217,217,217,144,203,229,156,255,244, 13, 69,
-253,236,201,108,214,125, 54,240,243,207, 63,207,158, 60,121,114,174, 80, 40,164,223,222,172,172,172,168, 49, 99,198,228,133,126,
-183,113, 96,165,107,177, 30, 75,214,211,179,103,207,190,218,191,127, 63,218,180,105,131,224,224, 96, 30, 0, 76,155, 54,141, 55,
- 98,196, 8, 28, 57,114, 4,199,142, 29,139,245,240,240,184, 13, 96,144, 41,229, 12, 13, 13,237, 18, 18, 18,114, 51, 36, 36,228,
-241,200,145, 35,119, 76,153, 50,229,141,158, 43, 39, 59,243,145, 78,167,131,143,159,191,104,217,206,251, 99,234,227,139, 3,246,
-239,136,143,223,189,250,249,243,180,133,109,218, 88, 54, 77, 73,177,218,179,118,173, 77,229, 34,221, 6,131, 1, 25, 25, 25,144,
- 74,165, 24, 51,102,140, 13,159,207, 15, 53,161,152, 27, 6, 13, 26, 52, 33, 61, 61, 93,242,203, 47,191, 56, 62,126,252, 88,150,
-147,147,227,120,229,242, 5,219,111,191,158,102,102, 33,225,241,178, 11, 24, 2, 0, 82,178, 33,142, 79, 70, 23,134,129,101,117,
-119,226, 59,193, 17, 66,161, 51, 54, 55,239, 98,249,242,155, 35,190, 35,195, 34,252,108,164,142,252,185,117, 28,209,110,205,154,
- 53, 71, 79,159, 62, 61,186, 75,151, 46,199, 1, 8,107,216, 71,208,190,125,251,240, 35, 71,142, 76,232,218,181,235, 45, 0, 94,
-181,142, 34,157,157,135,252,254,251,239,214,149,239,109,108,108, 32, 16, 8,254, 32,178,184, 92, 46, 72,146,108,112,245, 86, 28,
- 26,205,182,106,173, 69, 76,201, 89, 28, 89,243, 20,107, 62,126, 65,175,236,148,162,221, 18, 26,143,139, 71,158, 34, 31, 79,209,
-247,139,230, 24,189,192,167,183,136,194,242,191, 83, 7, 94, 80, 80,240, 73,183,110,221,142,246,237,219, 87, 27, 21, 21,133,130,
-130, 2, 56, 57, 85,141,181,115,223,129,210, 74, 36, 18,193,197,197, 5, 30, 30, 30,163,111,220,184,225, 96, 48, 24,144,146,146,
-130,252,252,252,232,255, 68,157,170,107,145,127, 24,222, 14,134, 63,243, 7,161, 85,177,182,208, 53, 0, 96, 8, 66,249, 52, 38,
-134,195,226,241,198,254,118,224, 0,159,203,229, 34, 45, 45, 13,177,177,177, 80, 93,185, 2,245,157, 59,200,203,203,131, 66,161,
-128,189,189, 61,182,239,220, 41,214, 81,204,196, 23, 47, 95,178, 24,146,169, 30,111, 80,227, 20, 79, 62,159,223,123,232,208,161,
-181, 10,178,236,236,108,244,237,219,151,195, 98,177,106,154,213,240, 54, 39, 33,179, 37, 78, 95, 57,190,204,209,145, 23, 11, 36,
-206, 6,202,163, 1, 70, 11, 24,117, 64,214, 51,224,204, 18, 52, 85,196, 19, 23,150,141,115,112, 18,177, 79,215,160,148,235,155,
-138,234,238,233,233,249,235,216,177, 99, 73, 0,232,217,179, 39,225,233,233,185, 3,128,123, 29,199, 92,174,167,147,188, 87, 82,
- 82,130, 17, 35, 70, 88, 55,111,222,252,242,136, 17, 35,172, 43, 63,127, 87,206, 74,107,114,155, 54,109,138, 4, 2,193, 65,192,
-164, 6,182,138,211,210,210,114, 75,223,190,125,135, 31, 56,112,128, 11, 0,215,174, 93,195,233,211,167,241,252,249,115, 36, 36,
- 36,208,126,126,126,182, 27,127, 61,186,109,203,207,123, 55, 12,238,236, 35,235,209,193,175,181, 68, 81,162,176,183,183,239,204,
- 48,140,187,137,229,236,187,100,201,146,216,184, 87,105, 22, 36,155,195,230,114,216,124,115,115,177,189,212, 76,236,108, 37, 18,
- 56,241, 73, 66,162, 82,169,114, 15, 30, 60, 72, 3,232,107, 42,231,178,101,203,146,227, 18,211, 44, 9,146,205,230,176, 57, 92,
-137, 68,100,249,113,112,144, 63, 0,112,193,112,229,114,121,222,238,221,187,245, 13,225, 92,180,104, 81, 76,113,169, 66,202,230,
-112, 56,108, 54,171,234, 92,138,133, 66, 91, 17,159,207,211,106,181, 89, 63,254,248,163,186, 33,156, 75,150, 44,137,125,241, 42,
-221,138, 36, 8, 22, 65,144,108,115, 51,177,181,181,133,200,214, 86, 34,180, 17,177, 89, 60,185, 92,158,181,111,223, 62,147, 56,
-245,122, 61, 55, 47, 47, 15,113,113,113,112,241,247,199,165, 75,151,208,164, 73, 19,140, 24, 49, 2,163, 70,141,130, 80, 40, 68,
-207, 64,111,204,157, 59, 23,175, 94,189,130, 94,175,231,215,196, 89, 25, 39,245, 54,100, 50, 89, 84,125, 55,207, 91,199,190, 81,
- 78, 95, 7, 48,155,117,159, 13,172, 46,176,106,227,183,178,178,162,106,178,118,189,205,217,183,111,223,249, 87,174, 92,105,190,
-111,223,190,129,161,161,161,183,246,237,219,135,142, 29, 59, 34, 46, 46, 14,174,174,174,216,179,103, 15, 70,141, 26,117,107,211,
-166, 77, 3,163,162,162,124,220,220,220,230,213,199, 57,114,228,200, 47,125,125,125, 35,115,115,115, 3,139,139,139,189,194,195,
-195, 39, 14, 25, 50, 36,121,244,232,209,189,170, 4,163,193,112,224,204,169,227,232, 55,112, 40, 90,181,245,218, 54,126,222,126,
-239,122,158, 77,230, 57,176, 99,119, 78, 78,193, 1,141, 70, 53,130,195, 17,137,238,223,183, 58,246,243,207, 54,213,167,124,103,
-101,101, 97,192,128, 1, 28, 46,151,219,181,158,114,174, 25, 60,120,240,136,240,240,112,105,165, 85,231,206,157, 59,120,246,236,
- 25, 82, 83, 83, 81, 90, 90,138, 94, 83, 20,248,124,213,107,238,207, 87, 49,232, 51,141, 17,191, 99, 27, 82, 5, 97, 19, 56, 88,
-155,179,111, 79,252,177,213,180,207,182,181, 97, 75,172, 56,248,237,187, 4, 20,166,104,143,213,194, 73, 4, 6, 6,238, 15, 9,
- 9, 33,116, 58, 29,116, 58,157, 14, 64,141, 89,125,157,156,156, 4,237,218,181,195,148, 41, 83, 72,115,115,243, 77,181,149, 83,
-169, 84,106,207,158, 61,139,208,208, 80,204,156, 57, 19, 45, 90,180,128, 84, 42, 5,135,195,193,222,253,135,109, 70, 77,156,218,
-242,131, 46,221,124,218,124,208,177, 93,185,150,229,207, 17, 74, 39,215, 98, 13,169,177,238, 10,187, 40,196,164,220,197,230,129,
-153,244,131, 61, 42,197,183,159,252, 43,254,197,245,188,231,243, 66,118,196, 48,119, 59, 21,238,255, 42, 29,121,134, 56,116, 29,
-209, 20,110,190,210, 89, 98, 23,120,190,235,249, 52, 17, 13,226,244,246,246,238,242,224,193, 3,126,183,110,221,144,150,150, 6,
- 14,167,106, 60, 69,189, 79, 57,151, 44, 89,194,215,104, 52,120,242,228, 9,198,141, 27,151,165,215,235,103,189, 79, 57, 27, 98,
-209,170,212, 34,255, 48,236,120,107,203,169,205,162,181, 4, 0, 12, 52, 78,143, 29, 55, 81, 21, 17, 17, 33,226,241,120, 72, 75,
- 75, 67, 78, 78, 14,246,238,222, 77,245,180,179, 43, 15,118,114,146,239,221,189,155,209,233,116, 96, 24, 6,158,158,158, 24, 62,
-124,184,112,216,136,209,249,132, 92,125,216, 4, 55,143, 99,165,127,125,226,196,137,127,248,254,219,111,191,133,185,185, 57, 8,
-130,112, 48,161,114, 33, 51,150, 12,118,150,186, 89,230, 49,185,123,139,193, 18, 0,108, 51,128,109, 14, 8, 44, 0,190, 25,192,
- 19, 65, 27, 21, 89, 76, 50,193,169, 67,187,126,234, 4,160, 33,174, 30,200,100,178,133,145,145,145,182, 81, 81, 81,140, 92, 46,
- 71, 78, 78, 14,179,114,229, 74, 91,153, 76,182,240, 93,175, 72,118,118,246,178,126,253,250,229,141, 27, 55,206,226,252,249,243,
- 46,227,198,141,179,232,215,175, 95, 94,118,118,246,178,247,185,210, 92, 46,151,245,252,249,115,171,229,203,151,143, 2,240,168,
-109,219,182, 69, 78, 78, 78,143,240, 58,104,178, 78,152,153,153, 85,137,172, 74,235, 26,155,205, 6,135,195,129, 76, 38,211, 21,
- 23, 23, 83, 93, 63,112, 23,122, 90,144, 6, 25,159, 43,180, 18, 10,156,205,204, 45, 2,138,138,138,158, 18, 4,145,100,162,139,
-207,183, 67,135, 14, 28,138,225,208,159,143,237, 41,155, 54, 33,200,238,167,229,147,155,252,184,236, 51,167, 53,139, 39,121, 46,
-155, 51, 38,136,164,105,141,171,171,171, 67,101, 64,187, 9,230,115,191,246,237,219,179,105,112, 16,247, 50, 53, 47, 45, 51,171,
-252,195, 30,129, 85,150,203, 54,190,126,193,182,182,182,221, 60, 61, 61,219, 19, 4, 97,210,148,100,161, 80,232,219,170, 85, 43,
- 54,201,226, 16,214, 82, 51, 23, 51,137,208,190,202,133, 98,105,217,201,202,214, 54,132,100,152, 50, 71, 71, 71, 59,161, 80,232,
-219,128,186,179,105,112, 97,111,103,101, 97,107, 99, 41, 9, 14,234,220, 34,176, 83, 96, 75,239,128,142,129,109, 63,104, 63,140,
- 48, 26,229,238,238,238,118,149, 65,242,245, 88, 90, 5, 7, 14, 28,192,242,229,203,209,174,105, 83, 56, 57, 57,193,206,206, 14,
-119,238,220,193,131, 7, 15, 32,149, 74,145,159,159,143,181,107,215,226,196,137, 19,208,235,245,102, 13,189,159, 76, 17, 91,117,
-193,104, 52,146,111, 11,172,218,248,133, 66, 33, 93, 25, 36, 95, 27,206,158, 61,187,191,210,146,245,213, 87, 95,117,217,184,113,
-227,173,248,248,120, 72, 36, 18, 60,120,240, 0, 19, 39, 78,188,181,105,211,166, 46, 83,167, 78,197,238,221,187,145,156,156,188,
-179, 46,190,145, 35, 71, 46,158, 52,105,210,143,215,175, 95, 39,237,237,237, 33,149, 74, 49,120,240, 96,236,220,185,147,109, 52,
- 26,119,133,132,132, 60, 14, 9, 9,121, 76,101, 92,156,127,244,215,149,119, 98,158, 62,198,151, 51,190,225,233,140,134, 48, 19,
-170,207,168, 37,146,114, 99,183,110,197, 71, 12, 6,213, 72, 46, 87,100,241,248,177,213,233, 93,187,170,196,214,220,185,115, 97,
- 97, 97, 1,188, 14, 96, 70, 29, 86,157,207, 78,156, 56, 81,213, 30, 90, 91, 91,131,199,227,129,203,229,130,195,225,128,197, 98,
-225,242, 54, 49,126,158,251, 90, 95,252, 60,151,192,197, 45,132,242,125,174,157,200, 9, 94, 82,123,222,227, 47,246,180,245,241,
-234,101,141, 59,135,114,177,178, 95, 84,230,131, 35, 5,179, 53,249, 88, 87,203, 97, 31,124,251,237,183,109,242,243,243,241,240,
-225, 67, 60,124,248,176, 54, 11,144,230,212,169, 83, 63, 40, 20, 10,184,185,185, 97,208,160, 65,221, 0,248,215,242,220,160,125,
-251,246, 24, 48, 96, 0,130,130,130,208,174, 93, 59,232,244, 70, 78,200,216,207, 90, 61, 79, 46,112, 90,185,118,165, 40,242,106,
- 56,121,235,214,117,214,254,227, 23, 45, 2,131,250,252,200, 53,115,188, 7,161,181,163, 41,245, 84, 81, 69,240,117,252, 24, 59,
-174,204, 32, 55, 95, 27, 39,217,123,122,179,187,153,153, 25, 17,253,240,177, 97,239,214, 35,233, 94,226, 65,249,247, 14, 21, 65,
- 69,228,162,215, 4, 55,146, 6,134,255, 93,122,118,129, 64,176,241,250,245,235, 14,122,189, 30, 49, 49, 49,152, 57,115,166,230,
- 61, 41,171, 12, 32, 46, 46, 46,184,118,237, 26,198,140, 25,163,201,203,203,187,251,159,170, 83,117, 45,242,255, 5,236,106, 10,
-178, 10, 25, 25, 25,165, 82,169,212,169, 85,171, 86,164, 78,167,123,237,146, 56,118,140,250,117,215,174, 51, 26,141,102, 6, 0,
-238,150,159,126,218,230,228,236, 28, 52, 54, 52,148, 48, 24, 12,232,215,175, 31, 47, 34, 34,194, 58, 41, 63,191,220,132, 14,231,
-141,223, 27, 63,126, 60, 54,110,220, 8, 0,152, 62,125,122,149,105,157, 48, 33, 96, 73, 98,129,190,193,253,219,155,103,136, 55,
-155,235, 59, 25, 20,205, 94,153,221, 19, 43,132,237, 65,242,216, 16,176, 64,235, 13,198,132,252, 33,143, 94, 37,180,110, 35, 44,
- 46,114,237,221,182, 59,126,189,180,175,175,138,210, 28, 49,185,193, 17,137, 58, 72, 36, 18, 60,122,244,168,184,125,251,246,165,
- 12,195, 88, 44, 91,182,204, 70, 36, 18,117,120,143,115,159,242,242,229,203,110,157, 59,119,158, 70,146,100,111,154,166, 47,231,
-229,229,109, 1,144, 98,226,241,159, 3, 88, 4,160,106,100,169,211,233, 64,146, 36, 24,134,193,200,145, 35, 49,119,238,220, 54,
-207,158, 61, 67,100,100,164, 85,239,222,189,239, 1, 40, 5,240, 41,128, 26,173,102,114,185, 92,253,224,193, 3, 97,100,100, 36,
-104,154,134,149,149, 21,204,205,205,193,231,243, 49,120,240, 96, 73, 88, 88, 88,175, 11, 23, 46,228,203,155, 53, 97, 9,114,178,
-148,124,137,196, 12, 14, 78, 93,167,142,254, 36,158, 97,152, 19, 13,104, 28,120, 66,182, 81, 67, 80, 90,114,205,247,155, 72, 17,
-151, 75, 8,184,108,240,105, 21,230,255,176,130,224, 50, 20, 27, 13,244,207,115,185, 92,174, 25, 31, 58, 22,143,101, 16, 17,248,
- 83,178,196,177, 88, 44,158,128, 91,123, 60, 6,135, 36, 73,146, 36,185, 0, 76, 94,180,143,207,231,115,205,248, 76,173,156, 66,
- 22,193, 34, 8,130,135, 90,102,162,249, 58,128,169,180, 34,241,102, 36,105,171,139,226,174, 93,187,226, 76,228, 35, 28, 59,125,
- 25,133,105, 79,177,224,187,175,224,239,239,143,136,136,136, 58,203, 84, 25,163, 85,155,117, 89, 38,147, 69,101,103,103,127, 80,
-219,177,117,185, 12,107,177, 82,253,145,255,123, 11,248, 45,137, 71, 61, 49, 90,131,186,118,237,250,229,129, 3, 7,116, 31,125,
-244, 17,111,228,200,145,240,242,242,234, 50, 97,194, 4, 0, 64,239,222,189,177,113,227,198, 46, 19, 38, 76,192,225,195,135, 17,
- 30, 30,174,237,209,163,199,119,215,174, 93,203,194,235, 25,157,127, 0, 77,211, 3,182,111,223,254,182,165, 16, 70,163, 17, 6,
-131,193,209,104, 52, 58, 86,180, 69,248,241,199, 77,133, 23, 47, 68,224,187,121, 75, 96,103,235,224,107,226, 61, 68,140,255,230,
-155,194, 61,107,215, 98,237,225,195,248,198,213, 85,180, 47, 54, 22, 23, 53, 26, 28,137,140, 44,172,248,157,122, 99, 51,149, 74,
-165,250,236,217,179,230, 71,142, 28,129,165,165, 37, 90,180,104, 1, 43, 43, 43,112, 56, 28,144, 44, 33, 88, 92, 41, 90,181,237,
- 0,224, 1, 0,192, 85, 6,165,167, 27,110, 17, 4, 74, 25,178,225, 49, 69,252, 38,104,102,227, 44,184,254,229,110, 47, 75,115,
- 59, 46,206,111, 73,199,133,205, 25, 39, 52,133, 88, 15, 35, 94,160,246,152,175,246,110,110,110,200,207,207,199,217,179,103,149,
- 64,173,130, 12, 52, 77,255,240,211, 79, 63,125, 59,111,222, 60,190,167,167, 39, 0,248, 2,120, 88,211,190, 98,177, 24, 78, 78,
- 78, 85,194,114,228,184,169,238, 83,102, 79, 21, 14,233, 19, 4, 54,219, 6,165, 74, 3,138,202, 13,144,218, 72,240,221,236, 16,
-193,229,246, 78,254,219, 55,253,118, 74,173,134, 63,240,199,246,128, 32,240,240,254,211, 91,222, 2, 79,128, 32,129, 12,242, 42,
- 8, 16, 80, 16, 6, 16, 44, 22, 67, 81, 20,210,211,211,193, 48, 12,198, 12,153,152,241,217,202,112,187, 46, 99,228,112,105, 37,
- 3,193,160,251,223, 69, 8, 88, 91, 91,251, 22, 21, 21, 33, 37, 37, 5,227,198,141,203, 42, 44, 44,188,164, 84, 42, 39,102,103,
-103, 3, 64,241, 59, 80, 86,137,121, 95, 95, 95,116,232,208, 1, 35, 70,140, 16,168, 84,170, 16,119,119,119,167,130,130,130, 78,
-127,101,125,222,214, 34,255,175,132, 86,141, 15,154,193,208, 74,187,109, 27,148,151, 47,131,119,241, 34,142,200,100, 10,141, 70,
-243, 53,128,140,138, 7,255,171,221,123,246,220, 30,120,247,174,185, 46, 62, 30,238,207,158,129, 99,105,233,219,208, 2,236,218,
-181, 11,114,185, 28,101,101,101, 0,128,205,155, 55, 67, 46,151,195,104,226,130,179,108, 46,186, 56,216,185, 34, 23, 9,160,217,
-164, 36,181,149,170,163, 68, 99,150,237,148,110,175, 44, 35,157, 16,159, 22, 32, 86, 23,233, 58, 18, 44, 29, 52,133, 42, 56,117,
-110, 1, 54,216, 93, 26, 82,198, 74,191, 63,155,205, 46,126,249,242,229,128,150, 45, 91,158, 6, 96,243, 46,241, 0,111, 33, 49,
- 47, 47,111,198,187, 28,200, 98,177, 22, 37, 39, 39,219,237,220,185,115,218,178,101,203,152,234, 66,171,242,127, 54,155, 13,134,
- 97, 96, 97, 97, 1, 14,135, 99,127,231,206, 29,251,128,128,128,173, 52, 77,251,214, 82, 79,198,203,203, 11,201,201,201, 96,179,
-217,176,176,176, 0,109,212, 99,201,236,169,160, 88,124,246,156, 57,115,124,135, 14, 29, 26,179,115,231, 78,131,121, 96,231, 78,
- 69, 69, 69,207,191, 28, 51, 54,230,228,201,147,186,138, 20, 15,245, 15,241, 25,230,113, 66, 66, 2,203, 89,102,207, 98,140, 42,
- 90,204, 5, 4, 79,127,100,120, 18, 7, 8,216, 44,134, 75,144,224, 11,132, 22, 41,153,153, 69, 52, 77,199,153,194, 73,211,116,
-116,114,114,178,208,222,206,154,173, 82,235, 20, 66, 14,195, 75,141,126,148,212,204,175,189, 59, 0,104,162, 31, 92,227,183,106,
- 45, 76,205, 43, 16,187,186,186,154,196,169, 86,171, 31,103,101,101,177,236,237,237,217,105, 25,153,167, 44, 37, 98, 91,115, 75,
-203,142, 0,160, 47, 47,123, 64,106,181, 5, 44, 14,219,190,160,168,168, 88,173, 86, 39,155, 90,247, 87,175, 94,177, 29, 29,237,
- 88,231, 47, 94, 57,109, 47,226,219,153,241,216,230,124,130, 32, 68, 44, 66,206, 53,210,133, 2,145,200, 46, 37, 51,179,152, 97,
-152, 90, 45,132,171, 75,199, 14,121,125,189,150, 28,174,198,141,167, 79,159,226,220,173, 56,136, 25, 29, 8, 77, 25, 46,238,254,
- 5, 99,230,204,123,239,184,191,250,196,214, 59, 89,179,182,183,142,122,139, 31, 57,245, 4,194,143, 25, 51,102,201,254,253,251,
-171, 2, 80,226,226,226,208,179,103,207, 74, 55, 7,130,131,131, 17, 16, 16,128,184,184, 56,120,120,120, 32, 50, 50,146,207, 98,
-177,248, 99,199,142, 93,249,219,111,191,157,173,215,238,191, 99, 7, 38, 78,156, 88, 83, 96,245, 43, 0, 26, 66,234,169,152,187,
-122,175, 77,113, 81, 33,242, 11,114, 31,155,122, 30, 8,130,192,248,111,190, 41,220,174,211,225,192,253,251, 8, 21,139, 69,123,
- 18, 19,209, 47, 32, 0,222, 61,123, 22,154,210,214, 85, 90,117, 52, 26, 13, 56, 28, 14,204,205,205, 97,109,109, 13, 46,151, 11,
- 22, 71, 6, 54,207, 7, 36,151, 11,191,174, 62, 88,251,181, 88, 53,238, 99,108, 34, 8,148,242,121,136,230,138,106,141,213, 33,
-196, 77, 48,152, 97, 32, 87,101,224,106,165, 32,177,104, 10, 11,142, 25,231,226,164,173,158,150,230,118, 92,156,219,148,134,139,
- 91, 51,143,107,114,177,160,226, 92,208,117, 12, 36,188, 45, 45, 45,145,145,145,129,244,244,244, 88,212, 29,224,175,138,139,139,
- 75,226,243,249,109,108,109,109, 1,192,173,182,129, 57, 77,211, 85,113, 88,251, 14, 28,181,241,237,230, 46,248,176, 75, 27,236,
- 61,189, 2, 95,132,108, 2,135, 69,128,162,244, 88,191,177, 63, 40,173, 2, 33, 3, 63, 35,186,247,246,240,185,124, 90, 55,201,
-160, 46,249,229, 15, 3, 1, 54,150,255,107,212, 29, 75,190,132,244, 6, 77, 88,218,216,216,137,185, 92, 46,172,205, 29,117,243,
-166,204,202, 97, 24,166,234,185,225,176,184, 6,178,220, 74, 93,148,171, 16, 90,114,212, 0, 67, 54,123,183,108, 54,127, 62, 50,
- 51, 51,103,116,235,214,109,101,121,121,121,137, 82,169, 28, 3, 0,110,110,110, 77, 73,146,228, 3,168,203, 59,210, 20, 53,167,
-133,224, 62,123,246, 12,102,102,102,200,202,202,170,110,124, 1, 77,211,127,155, 73, 0,127, 83,248, 1,136, 6,224, 8,160, 31,
-170,165,119, 32, 43, 76,117,221, 35, 34, 34,152,136,136,136,238, 85,157, 23,195,208,198,226, 98, 48,218,215,231,150,195,225, 48,
- 0,170,207,104, 18, 89, 90, 90, 18, 28,103,103, 16,252,215,161, 31,204,159, 56,245,213, 96, 48, 45,181, 12, 77,129, 5, 66, 15,
-166,218,160, 69, 41, 32,176,194,166, 23,102,240, 22, 34,151,103, 89,189,167, 3,140, 12, 40,208,172, 6, 22,135, 81, 42,149, 48,
- 26,141,210,230,205,155,159, 49, 26,141,210,138,206,141,249,111, 93, 81,138,162,146, 88, 44, 22,166, 77,155,134, 74,235,143, 78,
-167, 67,110,110, 46,180, 90, 45,116, 58, 29,146,147,147, 81, 86, 86, 6,157, 78,135,231,207,159,195,205,205, 13, 44, 22,203,177,
-142,198,156, 97, 24, 6, 46, 46, 46,104,214,172, 25, 88, 4,131, 95,215, 44,198,252,153, 83, 49,202,141,198,174, 45,235,209,163,
- 71,143,214,174,174,174,129,108, 54,155,114,112,112,224,134,135,135,159,162, 40,106, 48, 76,111,121,206,206,157, 59,183, 89,219,
-182,109,237, 44,205,205, 12,124, 30, 11, 60,131,146,225,107,139, 24,182,170, 16, 46, 46, 77,141, 16,138, 60, 66, 67, 67,169,218,
-172, 16, 53,113,126,253,245,215,142,158,158,158, 22, 82, 75, 51, 37,143,195,202,231,130, 41, 44,123,250,240, 30, 0,240,108,237,
- 52, 16,136,218,140, 27, 55,206,216, 16,206,133, 11, 23,186,217,218,218, 90,146, 96,202, 41,189,254,223,254,118,173,174,136,224,
-112,212,224,242,218, 79,159, 62,157,104, 8,231,183,223,126,235,218,166, 77, 27, 75, 75,115,177,130,205, 97,229,112,105, 58, 71,
- 0, 58,151,163,211,151, 8,108,109, 84, 16, 73,252, 66, 67, 67,107,229,172,180,102,133,133,133,101,188, 37,188, 81, 92, 92, 12,
- 77,110, 12,184, 89,241,240,145,112,224,111, 43, 5,159,207,175,154,250, 94,219,237, 90, 91,140, 86, 77, 98,203,212, 99,219, 47,
-173,195, 5,184,189,117,212,219,121,179,178,179,179,225,232,232, 88,231,243,244,219,111,191,205, 11, 10, 10,202, 15, 14, 14,214,
-157, 57,115, 6, 4, 65, 32, 50, 50, 18, 89, 89, 89, 8, 14, 14, 6,195, 48,149,179,218,240,248,241, 99,244,238,221, 91,215,173,
- 91,183,172,138,252, 90,245, 98,226,196,137, 48, 24, 12, 80, 40, 20, 40, 46, 46, 70, 68, 68, 4,124,124,124, 24,145, 72, 52,148,
-229,210,103, 69,200,164,121,157,188,218,249, 98,235,166,181, 58, 30,155,179,186, 33,207, 43, 65, 16, 24,247,245,215,133,101,126,
-126,197,251,148, 74,213,120,115,115, 81,243,140, 12,171, 71, 23, 46,216,232,245,122,147, 56, 42,173, 58,206,206,206, 85, 34,139,
-203,229,130,205,179, 5, 75,236, 13,158,117, 48, 68, 14, 67,113, 53,154,175,181, 16,227,132,153, 4,231,197,150,181,167,118, 16,
-185, 96, 69,167,145,142,225,157, 71, 57, 94, 17, 53,193,206,138,254,128,100,216, 68,248,132,245, 45,155,219, 54, 19,226,238,209,
- 92, 92,220,154,249,187, 38, 23,139, 1, 36,214,247,156,235,245,122, 13, 69, 81, 32, 73, 18,108, 54,187,122, 76,224,237,223,127,
- 96,217, 72, 25, 0, 0, 32, 0, 73, 68, 65, 84,255, 29,143, 30, 61, 2,170,165,237, 41, 47, 47,167, 88, 44, 22, 4, 2, 1, 0,
- 72,234,104,239,192,225,112,192,225,112,112,237,222, 13,235, 81,195,250, 19,119,158, 92, 66,103,159,209, 40, 82,232,145, 87,166,
- 71,169, 10,104,235,191, 0, 94,189, 79,224,105,114, 57,124,219,121,177, 88, 60,241,184,154,248, 52, 41,200, 80,166, 99,120, 81,
- 44,221, 66,151, 41, 60,119,247,100, 92,236,141, 99, 79,159, 31,250,233,116, 98, 39,255,110,202, 10, 99, 2, 20, 10, 5, 67, 16,
- 4, 51,107,242,188,164,125, 19, 75,168, 77, 99,158,210,108,173,224,213,127,176,169,111,106,107,107,123,199,218,218, 58,178, 66,
- 28, 53, 53, 51, 51,187,237,232,232, 24,143,215, 19, 61, 78,230,228,228,120, 42,149,202,206,120, 61, 57, 43,173,168,168,168,103,
-133,229, 41,173, 14, 75,216, 78,185, 92,254, 21, 69, 81, 3, 43,182,143, 41,138,242, 77, 72, 72,104,227,235,235, 27,235,238,238,
-254,216,221,221,253,156,187,187,251, 41,119,119,247, 83, 65, 65, 65, 27, 43,211, 61,252,197,110,195, 63,104,145,127,152,208, 66,
-133,200,218, 81,241,138, 42,161, 5,224,218,219, 1,104, 70, 62,255,185,241,203, 47, 97,121,234, 20, 56, 9, 9,152, 48,110,156,
-185, 72, 36,218,132,215, 57,154, 58, 75, 36,146,173,139, 23, 47, 54,179, 89,181, 10,178, 27, 55,144, 26, 17, 1, 3,135,243,240,
- 93, 74,167, 86,171,193,102,179,171, 44, 49, 98,177, 24, 20, 69,161, 38,147,239, 31, 30, 64, 35,238,102,229,197,131,135,102,160,
-193, 40,206,203,187,221, 31,157,180,192, 46, 66,238,230,145,168,228,122, 44,181,237,104,183,169,105,151,251, 74,130,173,224, 89,
- 10,144,158,158, 1, 10,116,131,252,205, 26,141,166, 76,169, 84,194,215,215,215,250,209,163, 71,205,125,124,124,172, 42, 62,127,
-240,158, 23, 38, 80, 38,147, 29,117,114,114, 74,145,201,100, 71, 1, 4, 54,224,216,157, 55,111,222, 4,139,197,194,226,197,139,
- 81, 94, 94, 14,189, 94,143,162,162, 34,164,167,167, 67,167,211, 33, 51, 51, 19, 47, 94,188,128, 78,167, 67,106,106, 42,180,218,
-250, 7, 36, 52, 77,195,220,220, 28, 26,181, 2, 63,175,152,143,133, 97,179, 81,246, 42, 10,153,217,121,176,180, 16, 99,198,140,
- 25, 44,169, 84, 74,211, 52,221,140,162,168,222, 52, 77,111, 51,229, 58, 85,187,223,110,185,184,184,120,173, 89,179,166,205,252,
- 21,219,184,230,108, 5,195, 55, 19,208, 60, 51, 62,195,107,221, 17, 19, 23,108,226,254,184, 97,221,203,187,119,239,102,193,180,
-228,157, 36,128, 91,126,126,126, 45,179,178,178,124, 60, 61, 61, 91,217, 52,117,229,243, 29,157, 74,185,142, 77,228,140, 86,115,
-159,112,106,210,117,219,182,109, 49,183,111,223,206,110, 8,167, 88, 44,110,189,119,239, 94, 47,123,123,123, 47,142, 80, 40, 80,
-149,149, 29, 49,170,148, 71, 89,150, 82, 1,105,110,249,241,137, 19, 39,162,142, 31, 63,158,219, 16, 78, 15, 15, 15,207, 21, 43,
- 86,180,245,246,246,110,235,224,214,156, 47,116,114, 41, 18, 56, 55, 45, 18,122,251,240,225,220,236,163,173, 91,183, 62,190,123,
-247,174, 73,156, 44, 22,203, 72,146, 36, 56, 28, 14, 68, 34, 17,206,159, 63,143, 47, 39,141,134,139,147, 53, 90,121,122,162,215,
- 23, 95,225,248,241,227, 85, 49, 60, 44, 22,171,214, 30,125,207,170, 25,167,253, 28,137, 40,108,111, 29,133,237,173,163,252, 28,
-137,168, 90,197, 86,197,247, 53,237, 99, 82,107, 84,139,187,209, 4,177,117,246,218,181,107, 63,140, 31, 63,158,215,183,111, 95,
-220,191,127, 31, 19, 39, 78,188, 21, 30, 30, 14, 0,184,127,255, 62,102,205,154,117,235,202,149, 43,152, 58,117, 42,122,246,236,
-201,187,121,243,230, 86,152,144,251,199,104, 52, 98,215,174, 93, 48, 26,141,144, 72, 36,176,178,178, 66,255,254,253, 17, 19, 19,
- 51,117,247,238,221,241, 44, 14,231,147,126, 3,135,225,204,169,112,188,120, 30, 51,117,207,202,177, 13, 78, 10, 76,146, 36,250,
-142, 27, 87, 88,216,182,109,241, 30,185, 92,245,169, 84, 42,242,204,205,181,186,122,244,168,141, 9, 66,141,160, 40,170, 74, 92,
- 85,138,142,202,141,205,179, 5, 91,236, 5,182,153, 63,158, 38,114, 13,220, 0, 68,243,252, 17, 87, 87,254, 44, 14,143,156, 56,
-116,190, 27,134,206,119,195,160, 57,174, 19, 68, 77,240,171,184, 9, 62,239, 59,179, 89,144,187,191, 5,228,249,122, 68,172, 79,
- 77,211, 20, 97, 21,128, 23,166, 60,231, 52, 77,199,102,101,101,129,199,227,161, 73,147, 38, 45, 1, 84,198, 5,238,156, 60,121,
-242,244,165, 75,151,206, 6,176,180,226, 51, 73, 80, 80, 80, 91,133, 66,129,132,132, 4, 0,120, 84,135, 53,184,106,150, 97,177,
- 60,149,239, 42,243,134, 79,235, 41,144, 74,219, 33,171, 88,135,236, 98, 29,126,253,121, 48,162,110, 46,199,163,139,161, 72,203,
-205,133,208, 97, 8, 40,163,214,203,132, 65,189,236,201,147, 39,196,205,155, 55, 9,154,166, 97, 48, 24,152,114,185,156,137,190,
-117, 11,234,235,215, 9,115,115,115,162, 75,135,110,138, 61,203,207, 60, 56,177,229,214, 35,189,170,193, 3,245,247,193,194,164,
-164,164,192,163, 71,143, 6, 1, 88,232,237,237,125, 55, 61, 61,189,211,141, 27, 55, 90, 57, 59, 59,111,122, 87,210,202,180, 16,
-169,169,169,111,108, 21,105, 33,116, 21,162,161,111,133,152, 27, 4, 96, 22,222, 99,150,125, 3,112,237, 31, 28, 12,127, 6,111,
-205, 54,124, 91,104, 85, 79, 20, 6,119,169,212,204, 96,208,103, 94,186,116, 73, 79,146, 36, 68, 34, 17,198, 79,156, 72,254,252,
-211, 79, 93, 71, 7, 6, 70,126,246,225,135,231, 34,175, 92,241, 11, 8, 8, 0,195, 48, 32, 73, 18,135, 15, 31, 86,107, 52,234,
- 34, 23, 23, 23, 75, 83, 26,141,234, 15,144, 92, 46,175, 18, 90,101,101,101,176,183,183, 55,217,117,168,148,227,242,149,243, 81,
- 37, 12,245, 69,122,223,196, 13,250,213,185,131, 3, 74,105,138, 93, 70, 25, 80,166,102, 80,174, 1,251, 62,105, 21, 48,222, 99,
-136, 62,185,119,192,139,235,241,119,138, 52,148,166, 65,179, 37,242,243,243,231,135,132,132, 20, 57, 58, 58, 18,230,230,230,112,
-114,114, 34, 7, 13, 26, 84,152,145,145,177,244, 93,175,136,181,181,245,168,160,160,160,211, 89, 89, 89,195,175, 95,191,222,236,
-198,141, 27,195,131,130,130, 78, 91, 91, 91,143, 50,145,226,200,188,121,243,148, 60, 30, 15, 29, 59,118, 68,121,121, 57, 42,102,
-249,212,185,153,226, 34,229,114,185,216,190,102, 17, 22,134,205, 70,113,252,125, 60,189,117, 9,215,114, 9, 44, 88,177, 14, 92,
- 46,247,157,114,125,181,176, 21,121,123,203,204,226,102, 77, 28,153, 61, 55, 44,204,236,241,227,199,156,233, 51,103, 49,169, 57,
-197,224,245, 93,203, 66,247,249,228, 19,165, 45,250,125,220, 11,139, 23,126,227, 93,145,180,179, 78,180,182, 21,121,123,201,204,
- 98,191,249,108,116,210,204,153, 51,133,171, 87,175,214, 4, 6, 6,170,243,242,242,132, 98,169,149, 39,219,194,210, 43, 53, 39,
- 87, 18, 24, 24,152,252,197, 23, 95,148, 54,148,115,193,130, 5,162, 11, 23, 46,176, 67, 66, 66,140, 37, 37, 37, 18,142, 80,232,
- 75,240, 5, 29, 10, 74, 74, 44,134,135,132, 36, 14, 31, 62, 92, 85,145,176,212,100,206,239,191,255, 94,244,226,197, 11,118, 96,
- 96,160, 33, 55, 55,215, 76,108,109,227,195,178,180,242, 79,201,201, 51,239, 16, 16,240,106,250,244,233,202,186,202, 89, 93,164,
-152,153,153,101,117,238,220, 25,235,215,175,199,143, 63,254,136,143, 62,250, 8, 49,207, 99,208,111,250,108,180,249,124, 22, 78,
-221,185,135,172,172, 44, 44, 91,182, 12, 62, 62, 62,224,114,185, 47,106,124, 30,167,198, 19,143,115, 65, 60,206, 5, 65, 76,141,
- 39, 42,223,215,106,217, 90, 90,134,234,251,215,180,223,163,239,107,182,116,249, 57, 18, 81,117,197, 97,213, 39,182,134, 15, 31,
-254,101,101, 10,135, 79, 63,253,244,214,166, 77,155,186,124,250,233,235,129,118,199,142, 29,177,124,249,242, 46, 11, 22, 44,184,
-181, 98,197, 10,244,234,213, 11,238,238,238,245, 78,124,161, 40, 10, 70,163, 17,163, 71,143,134,209,104, 68, 65, 65, 1, 94,190,
-124,137, 29, 59,118,128, 97, 24, 1, 0, 56,202,156,219,243,120, 60, 60,137,126,168, 90,248,105,192,111, 13,176,100, 17,213, 7,
- 49, 10,133, 2,195, 63,255,188, 48,179, 69,139,226,109,133,133,170, 73, 82,169,200, 53, 45,205,202, 76,167,115, 66, 29,113,137,
- 4, 65,128,166,233, 42, 97, 85, 41,184,222,222, 42, 58, 74,147,160, 87,209,103,111,236,207, 6, 0,116, 27, 43,195,160, 57,174,
- 19, 28, 61, 68,155,187,142,121,109,244, 62,190, 60,137, 41,207,166, 86,195,128,216, 6, 88,172,239,223,191,127, 31,150,150,150,
- 8, 9, 9,225,147, 36,185,170,114,188,138,215,185,179, 54, 84,114,241,249,252,181,161,161,161,100,105,105, 41,158, 62,125, 10,
- 0, 87,106,107,151, 24,134,169,170,187,162,152, 0, 69,243,112, 59,250, 60, 46,222, 56,134,148,172, 2,164,229,107, 0,182, 5,
- 52,202, 76,232,213, 89,208,149, 70, 67,174, 21,153, 84, 96, 46,151, 91,224,237,237,205,248,251,251, 51, 12,195,224,213,171, 87,
-198,212,180, 52,227,195,141, 27,153,103, 83,166, 16,102, 47, 95,114,133, 66, 33,225,230,230, 6,129, 64, 64, 11, 4,130,162,255,
- 96,231,253,151,164, 91,248, 11,210, 66,252,153, 86, 45, 6,255, 76,228,224,205,217,134, 85, 9, 76,107, 74, 88, 10,198, 92, 56,
-242,216,214,159, 45, 66, 70,143, 85,250,248,248, 72,157,156,156, 64, 16, 4, 6, 15, 25, 66, 4, 93,191,110,198,145,201, 96,253,
-193, 7, 85,238,136,203,151, 46,225,252,249,243,202, 51,191,159,112,154, 56,105,210, 0, 0,123,235, 40, 12,155,207,231, 87,253,
-110, 78, 78, 14,248,124,126, 85, 76,132, 92, 46,135,173,173, 45,114,114,114, 76, 93,249,122,223,220,176,123, 97,249, 1,243,221,
- 2,204, 56,196, 57,101, 46, 40,134, 1,135,160, 0, 53, 3, 3, 5,104, 13, 12,218,187,178,172, 46,170,141,210,136,251,225,201,
- 0,246, 53,228,236,105,181,218,171,143, 31, 63,158, 66,211,244, 49, 0,228,245,235,215,233,216,216,216, 47, 97,122,224,250, 31,
-205,246, 34,209,156,200,200, 72,171, 57,115,230,148, 68, 68, 68,148,245,239,223,223, 98,199,142, 29, 86, 61,123,246,156, 83, 84,
- 84,116,200, 20, 67, 96,122,122,250,222,140,140,140, 47,253,253,253, 81, 92, 92, 12,189, 94,143,168,168, 40,120,120,120,224,209,
-163, 71,104,217,178, 37, 30, 62,124,136, 86,173, 90,129,162, 40,104, 52, 26,208, 52, 77,213,215,152, 23, 23, 22, 0, 69,233,200,
-190,127, 14, 47,159, 69, 33, 50,155,192,150, 67,167,209,164,153,219, 59,229,169,105,105, 39,106,235,104,107,125,113,245,146,239,
-237, 82,175, 30, 70,248,174, 45,244,181,115,231,218,240,204, 48,165,251,232,175,134,233, 12,104, 10,128,215, 41,192, 31,125,165,
- 47, 40, 81, 51,228, 70,198,214,157, 96,177,165,157,168,173,189,141,245,133,127,173, 90,106,246,234,252, 30, 28,217,190,158, 57,
-190,255,160,143, 6, 8,104,219,182,109, 95,146, 36, 45, 1,104, 42,226,188, 76, 90,218,166, 38,206,203,167, 79,251,105,128,128,
-147, 39, 79,246, 21,137, 68, 14, 0, 12, 42,149, 42,233,125, 56,175, 68, 68,248, 85,150,147, 32, 8, 59, 0,122,134, 97, 94,161,
-129, 75,240,140, 24, 49, 98,249,172, 89,179,194, 40,138,178,173, 54, 58,103,173, 93,187,150, 77,211, 52,139, 97, 24, 61, 73,146,
-250, 11, 23, 46, 80, 70,163, 49, 91,163,209,124,254, 62,173,200,176, 97,195,112,239,222,189, 37,120, 61, 9,195, 84,107,245, 27,
-113, 90, 21, 75,246,188, 51,255,245,235,215,151,125,242,201, 39,115, 15, 29, 58,244,114,211,166, 77, 3,167, 78,157,138,195,135,
- 15,163, 69,139, 22,120,242,228, 9,230,207,159, 15, 0, 93, 22, 44, 88,112,106,231,206,157,238,169,169,169,107, 77,176,104,192,
-104, 52,226,224,193,131, 24, 60,120, 48,108,109,109, 33,147,201, 64, 16,196,213, 73,147, 38,253, 4, 0, 44,130,197, 5, 0,173,
- 70,171,245,244,244, 55,217,130,203,229,114,171,218,186,220,220,220,170,153,130,125, 62,249,164,240,215,213,171,241,155, 90,141,
- 73, 82,169, 40,211,217,217,241,212,171, 87,159, 61,127,221, 56, 51,117, 89,117,234, 19, 89,166,134, 52,168,115, 48,239,247,149,
- 41, 14, 0, 62,234, 54, 86,134,110, 99,101,240, 31,100, 71,144, 44, 2,207, 46, 22, 33,230,114,241,113,131, 28, 87,209,176,229,
-114, 98, 87,173, 90,117,170,123,247,238, 3, 91,183,110,141,201,147, 39,127,177,107,215, 46,174,193, 96,152,137,127,167,121,176,
- 32, 73,114,233,246,237,219, 63,179,178,178,194,205,155, 55,113,227,198,141,171, 0,210,107,107,151, 0, 84,229,204,106,226,210,
- 82,243, 34, 85, 33,202,207,186,141, 91, 55,127, 71, 11,159,175, 32,116, 24, 0, 43,207, 21,208,199,255, 8, 93,209, 69, 88,185,
-244, 71,102,234, 43,176,216,252,152,250,130, 80, 24,134,121,158,153,153,233,238,238,238, 78,164,164,164, 24, 1, 48, 20, 69, 49,
-250,174, 93, 13,109, 86,175,230,196,124,241, 5,209,233,197, 11, 22, 67, 16,116, 84, 84, 20, 0,196,253, 55,122,241,202,116, 11,
- 49, 49, 49,181,165, 91,104, 16,188,189,189,187,220,184,113,131,175,209,104,112,237,218, 53,116,232, 80, 53,183,235,191,154,253,
-190,186, 22,249,135,225,179, 26, 62,219,241,134, 69,235,141, 27,155, 38, 56,173, 90,182,164,184, 36,118, 15, 30, 48, 64,245,248,
-241,227,170, 81,159,230,193, 3, 40,207,159, 7, 69, 81, 96, 24, 6, 55,174, 95, 71,232,216,177, 10, 14,139,248,213,213,181, 25,
- 67, 48,111,228,110,233, 93,195,232, 33, 36, 36, 36,164,170,241,201,200,200,128, 88, 44, 6,143,199, 3, 77,211, 48, 26,141, 96,
-177, 88,176,176,176,128,209,104,172,201, 4,243, 54,167,129, 42, 86, 14,223,217,111, 76,142, 76,161,103,166, 88,186,162, 41, 87,
- 88,245,112, 58,152, 19, 24,232,195,129, 13, 59,159,185,178,246,195,108, 90, 91, 52, 28,127,156,209, 85,223,148,255,150,237,218,
-181,251, 41, 52, 52,148, 4,128,222,189,123,147,237,218,181,219,140,186,151,202,169,147, 83, 32, 16,240, 1,224,244,233,211,197,
- 47, 95,190,252,232,244,233,211,197,213, 63, 55,145,115,199,154, 53,107, 32, 18,137, 96, 52, 26,161,211,233,170,226,179,170,191,
-234,245,122,216,216,216,224,204,153, 51,160, 40,234, 76,125,229,116,105,218, 12,132,109,115,236, 61, 29,137, 27,133,220,119, 17,
- 89, 85,156,205, 29,196,173, 28,108,172, 47,253,107,229, 50,219,146,196, 40,100,102,102, 50, 23,206,159,185,171, 1,178,202,202,
-177,176, 84,137, 86,106, 29, 4, 29,220,145,126,105,251,119,204,130,110, 48,160,230, 89,131, 85,156,109, 28,196,173,156,108,173,
- 47,172,251,215, 74,179,210,196, 40,228,228,230,226,236,153,211,143, 53, 64,165,187,113, 2, 77,211, 94, 52, 77,123, 1,152, 80,
-135,120,105, 16,167, 74,165,242, 86,169, 84,222,127, 38, 39,195, 48,222, 12,195,152,204, 89, 61, 38,106,195,134, 13,241, 57, 57,
- 57,161,249,249,249,193,149, 91, 73, 73, 73,111,133, 66,209, 67,165, 82,117, 85,111,104,102,161, 82,169,236, 20, 10,133,163, 70,
-163,105, 15, 32,170, 1,247,124, 21,170,103,157,206,201,201, 89,156,147,147, 67,212, 87, 78,214,231,241,196,129,117,223,252,190,
-125,251,118,199,247,228,127,163,156,133,133,133,199, 14, 29, 58,228,235,230,230,230, 62, 97,194, 4,108,219,182, 13,155, 54,109,
-210, 2,192,206,157, 59,181,213, 44, 89, 46,169,169,169,254,181,184, 13,123, 87,179,150,236,235,211,167, 15,115,227,198, 13, 12,
- 30, 60,184, 42,145,232, 47,191,252, 2,163,209, 40,239,213,171, 23, 13, 0,106,141, 74,206,208, 12,116,250, 90,253,239,127, 56,
-159, 60, 30,239,227,234,249, 2, 43,147, 49,243,120, 60, 48, 12,131, 86, 93,186, 20,150,250,248, 20,239, 42, 43, 83, 45,246,246,
- 54,255,204,211,115, 66,107, 96,108, 77,156, 4, 65,188, 97,213,121,123,107,128, 37,171,122, 57,243,213,217,152,252,251,202,148,
-243,149,150, 45,129,132, 13, 77,185, 17, 39, 86,167, 20,104, 10,240, 75,109,226,167,174,186, 23, 23, 23, 79, 95,189,122,181, 86,
- 42,149, 98,216,176, 97, 88,177, 98,197,164, 46, 93,186,148,217,217,217,221,107,209,162,197,179,145, 35, 71,230, 68, 69, 69, 77,
- 15, 10, 10, 66, 66, 66, 2,214,173, 91, 87, 90, 82, 82, 50,166, 46, 78,130, 32,170, 44,121,131,250,245, 46,254,121,243,122,186,
- 87,247, 47, 33, 18,154,195,192,113, 65,177,194,128, 18, 37, 3, 29, 63, 0, 60, 46, 31,193,129,109,113,239,194, 30, 21,165, 83,
-238,173,239,158, 87, 40, 20,199,199,143, 31, 47,231,114,185,208,233,116, 12,135,195, 1,255,117,220, 49,205,249,232, 35,125,167,
-216, 88, 35,197, 48, 52, 65, 16,248,250,235,175,149, 37, 37, 37,135,222,229, 57,106, 0,170,115,254, 89,233, 22,122,191,213,255,
-252, 25,105, 33,254,138,186,255,147,177,163,134,237,223, 22,173,202, 41,149,149,175, 4, 65, 83, 20, 69,195,213,205,213, 44, 53,
- 37,125,203,136, 17, 33,159,246,237,219, 79,212,175, 95, 63, 65,219,248,215,163,209,211,167, 79, 35, 60, 60, 92,117,241,226, 69,
- 57,159,195,218,233,210,196,197,158,162,104, 16, 4, 93,167, 26, 54, 51, 51,155, 57,111,222, 60, 97, 89, 89, 25, 54,109,218, 68,
-251,250,250,146, 98,177, 24,122,189, 30, 59,119,238, 52,180,109,219,150, 67,146, 36,202,202,202, 64,146,228, 11, 19, 43,248,180,
- 44, 61, 43,248,167,160,161,225,254,211, 38, 90,183, 9,234, 36,237,225,226, 4,195, 7, 12,178, 51, 82,240,242,202,197,146,231,
- 23, 54, 22, 65,147, 55, 20,245, 47, 15, 84, 83, 71,176,232,226,197,139,118,211,167, 79,103, 52, 26, 13,145,158,158,206,172, 92,
-185,210,110,242,228,201,139,178,179,179, 71,189,227, 69, 33, 74, 75, 75, 65, 16, 4, 93,209,144, 84,142,250, 27,226,151,139,217,
-187,119,239,201, 33, 67,134, 12,234,213,171, 23,226,227,227,171, 92,132,213,133, 86,229,236,195, 85,171, 86,149, 2,152, 91, 31,
- 41,135,195,193,166,189,199, 80, 90, 82, 8,123,123, 25, 4, 66, 33,222,117,134, 37,143, 36, 23,255,176,236,123,187,194,184,123,
- 68,204,221, 72,250,232,211,188,124, 35,197,212,156,241,191, 60,155,169, 80,255,117,143,102, 72,214,226, 31, 86, 46,181,168,116,
-107, 30,138,206,145, 19, 20, 51,253,189, 30,145,127, 10,231,127, 24, 50,153, 12, 57, 57, 57,132, 76, 38, 99, 42, 98,180,152, 58,
-132,214,155, 55,248,107,119, 25, 81,151,219,240, 93,249,147,147,147, 87,126,240,193, 7,223, 36, 36, 36, 28,109,211,166,205, 84,
- 0, 77,180, 90,109,233,130, 5, 11,254,181,115,231,206, 79, 77,177,100, 1,192,225,195,135, 55, 78,156, 56,241,252,128, 1, 3,
-190,163,105,186, 93,181,142, 61,217,206,206,174,202,133, 91,144,151, 27, 54,229,211,209, 97, 10, 69,137,201,121,238, 36, 18,201,
-103, 11, 22, 44, 16, 40,149, 74,108,221,186,149,110,219,182, 45, 89, 57, 40,218,191,127,191,177,101,203,150,236,144, 47,191, 44,
-220,144,155,139,229, 55,111, 42,195,188,188,124,119,189,124,217, 30, 52,189,175, 54,171, 78, 77,150,172,202,176,139,119, 68,118,
-133,216,250, 5,192, 71,157, 70, 56,224,228,154, 20,148,164,234,254, 5, 35, 94,193,132,101,129,106, 64,230,241,227,199,131,243,
-242,242, 78,126,255,253,247, 22,237,219,183,135,151,151, 23, 71, 34,145, 4, 84,166,139, 41, 43, 43,195,229,203,151,177,109,219,
- 54,221,243,231,207,135,212,229,174,162, 40, 42,191,101,203,150,149,231,129, 33, 8,162, 72,174, 37, 44,142,180, 14,144, 76,152,
-114,148,184,245,240, 14,178,245, 52,180, 6, 26,174,110,126,232,241,209, 6,156, 58,247,140,202, 78,141,141, 53,168, 75,126, 53,
-161,188,175, 18, 19, 19, 79, 44, 91,182,108,196,119,223,125, 39, 44, 44, 44,164,180, 90, 45,125,236,216, 49,214,132, 9, 19, 40,
-134,205,166,185,108, 54,102,206,156,169, 46, 45, 45,253, 29,248,143, 46, 48,253,151,164, 91,248, 11,210, 66,252,105,214,172,234,
-175,255, 95, 80,227, 19, 74,179,200,219,219,182,255,252,241,225,131,135, 28, 88, 44,242,255,216,187,238,248,166,170,247,253,220,
-123,179, 71,211, 52, 29,105, 58,104, 89,101,149, 85,246, 6, 65, 65, 64, 81,100,124, 17, 4,190, 96, 1, 81, 4, 20, 28, 56,160,
- 44, 65,252,130,130,140, 10,202, 16,148, 41, 27,101, 72,109,217,180,128, 80,202, 30,221, 35, 77,147, 54,105,246,205,253,253,209,
- 36,166,165, 35, 41, 69,193, 95,158,207,231,126,146,155,123,243,228,220,147,123,207,121,206,123,222,243,190,193,119,238,222,189,
-240,242,208, 97, 89, 71,143, 30,149,113,124,125, 59, 2,176,153, 38, 79, 62, 99, 54,234, 85, 7,246,238,141,168, 95, 63,178,141,
- 61,169, 52, 99,163,200, 83,213,253,160, 86,171,213, 37, 38, 38,150,126,244,209, 71, 68, 70, 70,198, 86,185, 92, 62,242,240,225,
-195,226,161, 67,135,234,211,210,210,118, 5, 7, 7, 15,233,211,167,143,207,251,239,191,111,212,106,181,158, 36, 30, 77,101, 10,
-138,154,159,255,108,217,235,231,151,174,121, 30, 44,170, 27,140,108,192,102, 57, 5,115,201, 81, 0, 91,225, 65,188, 35, 87,136,
- 68,162, 54, 66,161, 16,151, 46, 93, 42,234,212,169,147,201, 96, 48,112, 22, 46, 92,232, 47, 18,137,218,212,182,226, 25,134, 97,
-138,138,138, 96,179,217, 88, 0, 8,251, 43,108,158,175,197,255,207,203, 47,191,188,119,251,246,237, 47, 12, 26, 52, 8, 13, 27,
- 54,132,197, 98, 65,147, 38, 77, 96, 50,153, 16, 21, 21, 5,163,209,136,121,243,230, 65,163,209,204, 68, 53, 57,207, 8,130,128,
-213,106,117, 58,219,134,134, 69,148,197,233,121,140, 48, 22, 34, 54,217,240,198,129,239,145, 95,168,180,109,191,156,151, 87,106,
-166,251,223, 46, 40,189, 86,241,188, 82, 26,186, 62,227,167,101, 1,128,209, 86,125,198,121, 17, 23, 13,111, 30,252, 14,121,249,
- 74,252,156,146,163,214,153,109, 3,110, 86,194,233, 81, 57,159, 17,206,152,121,105, 24, 54,205,253,115, 31, 7,238, 10,170,170,
-112, 41, 23,196, 69,225,247, 12,214,125, 95,105,140,172,199,228,223,123,235,214,173,189, 0,144,154,154,154, 49,106,212,168, 15,
-239,223,191, 63, 31,192,161, 7, 15, 30,172,243,132,232,251,239,191,191, 5,224,191,213,157,243,211,178,255,238, 1,176,199, 19,
-222,146,146, 18, 67,114,114,178,225,253,247,223, 39, 50, 50, 50, 14, 7, 7, 7,191,112,228,200, 17,225,208,161, 67,141, 87,175,
- 94, 61, 30, 18, 18,210,179, 95,191,126,226, 67,231,206,101,149,222,185,115,224,192,253,251, 97, 22,155,237, 64,117,207,103, 29,
-139,172,114, 98,107,207,130,251, 75,246, 46,185,223,207,102,196, 46, 83, 17,206, 0,200,124, 12,206, 63, 78,157, 58,213, 98,204,
-152, 49,219, 7, 15, 30,220,181, 69,139, 22,168, 87,175, 30,110,222,188,137,130,130, 2, 92,185,114, 5,251,247,239,223,111, 48,
- 24,106, 76,168,173, 82,169, 30, 77, 79,196,151,133,108,252,118,238,254, 11, 73, 29,155,244, 24, 52, 78,208, 50,196, 6,147,153,
- 65,198,195, 59,152,247,233,250,210,156,135,183, 82,205, 86,243,171,112,115,161,142, 94,175,143,255,250,235,175,217, 7, 14, 28,
- 24,180,106,213, 42,159,136,136, 8,138,195,225,144, 0,152,139, 23, 47, 50,211,166, 77,211, 41,149,202,131,197,197,197,241,127,
-115, 31,253,199,221,187,119, 99, 40,138,170,211,112, 11,143, 17, 22,194,139,186, 68,131, 6, 97, 45, 26, 69,132, 76,110, 88, 47,
-108,106,131,136,240,177,149, 57,185, 55,244,243,243,105, 16, 25, 26,219,176, 94,216,212, 70, 17, 33,147, 27, 52, 8,107,225,134,
-105,177,161, 68, 34, 57,172, 80, 40,218, 2,128,175,175,239, 16,169, 84,122,205,215,215,119,136,125, 20, 56, 68, 44, 22, 95,143,
-142,142,126,243,111, 52, 87, 86,203,217,164, 73,147, 81, 90,173,246,173, 38, 77,154,140,114,236,223,185,115,199,185, 95, 27,206,
-240,240,240,190, 23, 47, 94,252,207,178,101,203, 94,107,220,184,241,144, 69,139, 22,189,246,203, 47,191,252, 39, 44, 44,172,125,
- 45, 56,121, 0,126,100,179,217,121, 92, 46, 55,159,205,102,231, 57, 54, 22,139,149, 71, 81, 84, 30,128,117, 85, 88,203,250,185,
-140,114,146,228,114,249, 3,185, 92,254, 32, 56, 56,248, 65,112,112,240, 3,133, 66,241,200, 22, 16, 16,144,228,110,125, 54, 11,
- 22,119,239, 84,207,231, 84, 43,133, 56,169,185, 92,212,172, 46,254,163,102,193,226,238, 29,235,249,158,106,165,240, 73,252,255,
-198,217, 54, 24, 12,179,182, 25,195,172,109,198,180, 13, 6, 83,211,126, 93,154,253, 21, 10, 5,163, 80, 40,230, 62,169,169,132,
- 42,248,255,246,231,189, 14, 57, 27,250,248,248,252, 84,175, 94, 61, 71, 91,247,146, 68, 34,249, 93, 44, 22,191,100,111,235, 94,
- 18,137, 68, 9,209,209,209,227,106,226,148,201,100, 23,131,130,130,114,237, 91,142, 92, 46,207,145,203,229, 57, 65, 65, 65,217,
- 65, 65, 65,217,129,129,129, 89,142, 77, 42,149,158,173,229,181, 7, 1,232, 12,160, 61, 0, 73, 29,214,103, 3, 0,147,236,109,
-208, 23, 0,222, 4,208,186, 14,254, 35,130, 45,144, 77,225, 73,195, 79,177,197,129, 37,108,113, 96, 9,207, 55,236, 84, 53, 41,
-120,220,225,108, 42,147,201, 22, 74, 36,146, 95,124,124,124, 18,125,124,124,246, 6, 4, 4, 44, 2,208,244, 31,186,151,196, 0,
- 54,160, 44, 62,211, 33,148, 77,133,239, 69,217,162,130,136,167,240,158,255,255,140,216, 74, 12, 42,248, 59,162, 64,245,243,114,
-122, 57,189,156, 94, 78, 47,167,151,243, 25,228, 36,189,245,233, 21, 90, 30, 10,173,114,155, 67,104,177,188,117,227,133, 23, 94,
-120,225,133, 23,143,192,230,173, 2, 47, 60, 68,165, 83,203, 68, 53,170,212,147, 88, 83,181, 81,182,199,188,156, 94, 78, 47,167,
-151,211,203,233,229,244,114,254,191,227,252,127,129,191, 43,121,140,215,172,234,229,244,114,122, 57,189,156, 94, 78, 47,167,151,
-243,223, 14,239,212,161, 23, 94,120,225,133, 23, 94,120,225,197, 19, 66,188,139,224, 42, 55,133,232, 21, 90,158,131, 4,240, 22,
-128, 97, 0, 26,161, 44,155,253, 78, 0,171, 81,187, 57,125, 9,128, 15, 1,116, 67,217,234,156,123, 0, 18, 81,182, 58, 71,235,
-173,238,202, 17, 16, 16,240, 49,155,205,150, 2,101,169, 77, 28,175,174,239,105,154, 86, 23, 23, 23, 47,122, 66, 69,160,224,102,
- 4,101, 71, 89, 93,203,230,250,106,177, 88,158,100, 57,189,120, 58,209, 68, 38,147,253,168, 82,169, 70,195, 37,201,178, 23, 94,
-252, 27, 16, 24, 24, 56,217,108, 54,127,194,225,112, 22, 22, 20, 20,172,249,127,116,233,143,136,172,114, 66,235,192,129, 3, 9,
- 0, 48,120,240,224, 94, 0, 32,149, 74, 79,147, 36,217,192,147, 95,176,217,108,247,212,106,117,149, 1,212,164, 82,233,105,138,
-162, 30,225,180, 88, 44, 62, 44, 22,171,164,178,239, 88,173,214,204,226,226,226,246, 79, 73, 37, 18, 0, 14,248,249,249, 25,230,
-207,159,191,186,119,239,222,225,217,217,217,214,217,179,103,247,188,124,249,242, 32, 0, 47,122, 40,182,186, 16, 4,177,177,109,
-219,182,123,198,142, 29,187,189, 83,167, 78,220,194,194, 66,159,157, 59,119,134,110,218,180, 41,217,102,179,141, 70, 53,137, 86,
-255, 63,131,205,102, 75, 51, 51, 51,125,128,178,121,112,187,176,130,197, 98,129,197, 98,129, 78,167, 67,155, 54,109,234,252,119,
-131,131,131, 99, 8,130, 88, 37, 22,139,219,107,181,218, 11, 0,166,230,228,228, 92,246,164,172, 86,171, 21, 12,195, 56,203,217,
-162, 69, 11,239, 31,234, 25, 38,114,185,220, 1, 81, 81, 81, 29,141, 70, 99,209,189,123,247,206,211, 52,253, 25,234, 46, 71,155,
- 47,128,207,120, 60, 94,167, 70,141, 26,133,223,186,117, 43,195,108, 54,159, 67, 89, 50,100, 77, 93,136,172, 94,189,122, 37,125,
-251,237,183,254, 83,166, 76, 73, 74, 76, 76,236,238, 21, 91, 94,252, 83, 8, 15, 15,151,234,116,186,245, 0, 98,216,108,118, 48,
-159,207,135, 64, 32,200,229,241,120,151, 4, 2,193,132, 83,167, 78,169, 61,229,164,105,250,179, 7, 15, 30, 4,119,238,220,121,
-105, 80, 80,208, 60,165, 82,105, 48,155,205,199,139,138,138,102, 2, 40,174,238,187, 21,181,200, 51, 38,178, 92, 95,225, 16, 93,
- 44,251,133, 49, 0,122,151, 83, 96, 44, 86,216,195,135, 15,131,248,124, 62,108, 54,155,179, 51,171,184, 57, 62, 55,153, 76,104,
-217,178,165,185,134, 14, 39, 60, 35, 35, 35,136,203,229, 58, 63, 51,153, 76, 8, 13, 13,181,101,102,102, 6,217,211, 30, 56, 97,
- 52, 26, 17, 22, 22,246, 52,229, 60,122, 75, 38,147,105,210,211, 51,218, 24,140,230,184, 55,223,249,232,227,209,195,158,247, 59,
-125,250,180,237,197, 23, 95, 52, 38, 36, 36,188,133,178,196,169,110, 53,230, 4, 65,108,154, 61,123,246, 60,190, 80,226,127,226,
-116,170,113,211,206,131, 89,109,155,212, 39,102,206,156, 73, 77,155, 54,237,143,152,152,152, 31,109, 54, 91, 59,120, 96,217,242,
-243,243, 59,194,227,241, 34,237,245,151, 94, 84, 84,244,194, 83,120, 67,178,240,104,240,216,202, 62,171, 17,133,133,133,208,235,
-245,143,108, 45, 90,180,120, 18,142,136, 44, 54,155,189,119,241,226,197,161,185, 57, 57,248,223,242,229,157, 81,102,201,236,236,
-206,151,243,243,243, 31, 41,103,179,102,205,224,133, 71,248,112,222,188,121,139, 95,127,253,117,208, 52, 13,189, 94, 31,114,251,
-246,237,232, 79, 62,249,228,213, 59,119,238,116, 4,112,247,113, 7,227, 81, 81, 81,105,211,167, 79,151,117,236,216, 17,246, 44,
- 21, 33,137,137,137,157, 55,108,216,240, 70,122,122,122, 51, 0, 5,143,243, 3, 50,153,236,199,239,190,251,206, 95, 40, 20, 98,
-223,190,125,254,125,251,246, 77, 76, 73, 73,233,241, 24, 98,139,244,247,247,159, 6,224, 57,155,205,198, 5,112,174,168,168,104,
- 1, 60,143,234,174, 16,139,197,187, 72,146,172, 15,252, 21,141,158, 36,201, 0,130, 32,148,142,207, 8,130, 8,178,217,108,103,
- 84, 42, 85, 87,239,237,248,108,195,223,223,127, 98, 94, 94,222,183, 60, 30,143,227,231,231, 7,161, 80, 8, 22,139, 5, 22,139,
- 85,143,199,227,213,227,241,120, 3,251,244,233, 51,245,247,223,127,175, 54,194,126,151,182,242,241, 32,137, 56,138, 32, 41, 0,
- 32,217, 34,137,175,175, 47,226,226,226, 68, 67,134, 12, 17, 1, 64, 82, 82,210,216,113,227,198,245,205,204,204,108, 89,149,216,
-170, 76,139, 60, 67,136,175,174,195,131, 93, 61, 38,148,123,114, 73, 18, 92, 46, 23,103,207,158,133, 59,193,202, 29, 41, 18,170,
-109, 13,236, 17,198, 47, 95,254,203, 0,224,232,104,184, 92, 46, 78,157, 42, 31, 84,190, 75,151, 46,206,135,253,239,194,176, 22,
-101, 65, 30,119,188, 93, 86,174,225,171,202,162,107,239,120,187, 25,122,126,245, 16,195,166,205, 29, 89,106, 48,119, 0,160, 83,
- 23, 21, 21, 93,216,189, 59,187,109,147, 38,156, 31,127,252,177, 99,104,104,232, 48, 15,132,214,135,237,218,181,219, 69, 9,124,
- 3,198,142, 27, 63,118, 2,139, 52,191, 49,233,253,133, 25, 57, 74, 93,108,108,236,238,125,251,246,141, 93,178,100,201,245, 89,
-179,102,125, 8, 96,142,187,229,231,243,249,145, 55,110,220,136,162,105, 26, 45, 90,180,120, 26,211, 24,180, 69, 89,240,189,215,
- 1,108,179,127, 54, 10,101,145,251, 99, 0, 92,242,132,204, 97,193,170,108,171,107,132,134,134, 54, 27, 51,102, 76,128, 74,169,
-196,255,150, 47,119,124,220, 30, 53, 76, 35, 58,158, 31,147,201,132,215, 94,123,109, 12, 77,211, 44,135, 8, 52, 26,141, 38,141,
- 70, 99,192, 95,142,165, 5, 0,158,119,163, 56, 13, 68, 34,209,151, 0, 98,244,122,125, 40, 0,136, 68,162, 44,155,205,182, 71,
-167,211,205,193, 95, 9,124, 61, 30,224, 2,136, 70,213,169,160,152,197,139, 23,223,250,232,163,143,238,254, 3,156,145,114,185,
-124,209,240,225,195,113,240,224, 65, 28, 58,116,200, 34, 16, 8, 88,227,198,141, 35,166, 78,157,234, 55,125,250,244,129, 0,190,
-126,204,191,121,224,188,121,243,100,205,155, 55,199,206,157, 59,113,229,202, 21,125, 84, 84,148,160,119,239,222, 96,177, 88,178,
-143, 63,254,248, 69, 0, 27, 31,231, 7, 84, 42,213,130,247,223,127,127,211,182,109,219,124,238,221,187,135, 85,171, 86, 5,140,
- 28, 57, 50, 33, 61, 61,189,151, 7, 98,139, 7, 96, 26,128, 62, 20, 69,245, 24, 55,110,156,245,157,119,222, 97,147, 36,105, 89,
-190,124,121,224,134, 13, 27, 70,178,217,236,152,194,194, 66,119, 6,105, 36,128,184, 9, 19, 38,252,247,247,223,127,247, 59,127,
-254, 60,215,223,223, 31, 52, 77, 59, 45,197, 54,155, 45,200,113,207, 90,173, 86, 52,107,214, 44,204,229,251,130,103, 85,104,144,
- 36,105,182,217,108,108, 0,124, 0,198,154,246,255, 77, 34, 75, 38,147, 77, 81,169, 84,171,131,131,131, 33,151,203, 31,233,107,
-141, 70, 35,248,124, 62, 39, 56, 56,248,187, 33, 67,134,176,247,238,221, 91,229, 20, 32, 65, 17,159,237,251,105,126,168,204,207,
- 7, 0,176, 98,237,175,165, 0,240,203, 47,191, 32, 59, 59, 27,126,126,126,104,217,178, 37, 53,127,254,124,197,204,153, 51,255,
- 87, 84, 84, 52,161, 42,174,138, 90,228, 25,179,104,197, 87,182, 95,173,143, 22,195, 48,206, 60,121,110,222,180, 21, 63, 58, 86,
-129,143, 48,153, 76,168,104,209,114, 60,188,108, 54,187,162,249, 17, 4, 65, 48,213,113, 86,130,113, 34,145,168,141, 78,167, 91,
-233,193,232,214,201,185,227,237,102,216,196,155, 61,202,145,137,116,224,251,101,175,155, 0,156,190, 63, 97,213,183,189,122,133,
- 78,251,244,155,185,250,194,108,229,199, 99, 94,138,140, 10,246, 23,136,212,249, 26, 89,211,166,253, 43, 88,100,106, 42,103,207,
-177, 99,199,110,254,237,236, 3,130,207,231,112, 88, 20,197,238,222,170,137,127,184, 47,229,235, 3,248,102,220,189,117,122,252,
-248,241,173,102,205,154,213,195, 3, 78,216, 59, 92,108,217,178, 5, 4, 65,144,158, 92,123, 29,226, 88,117, 34,139, 97, 24, 16,
- 4,177,213,165, 83,217,106,255, 44,197, 69,108,177,170,171, 79,135, 53,213, 33,170,198,141, 27, 55,198,106,181,178, 92, 26,137,
-138, 2,166, 50, 17,227,214,181, 43, 20,138,223, 0, 60, 79, 16, 4, 76, 6,131,233,203,175,190,114, 61,124,177,130,200, 58, 86,
-213,179,100,177, 88, 64,211, 52, 43, 37, 37,133,237,114,175,179, 1,136, 0, 4, 48, 12, 3,146, 36,255,116,163, 62,155, 9,133,
-194,211,251,247,239,151,180,111,223,158,224,114,185,176, 90,173,184,122,245,106,248,146, 37, 75, 38, 29, 59,118,236, 69,157, 78,
-215, 2,143, 38, 79,119,231, 63,138, 78, 76, 76,212, 53,108,216,176, 82,225, 88, 92, 92,204,106,210,164, 73,175, 42, 68,209,147,
-230,204,204,203,203,123,229,249,231,159,159,156,155,155,155,102,181, 90, 63, 0,208, 50, 32, 32, 32,101,232,208,161, 16, 8, 4,
-125,244,122,253,215,143,115,207, 7, 5, 5, 13,233,218,181, 43, 86,173, 90,133, 37, 75,150,244, 3,112, 28, 64,223,226,226,226,
- 99, 47,191,252, 50,164, 82,233, 43,106,181,122,227, 99, 60, 71, 77,122,246,236,249, 93, 92, 92,156,207,193,131, 7, 17, 21, 21,
-133,146,146, 18,188,247,222,123, 65,159,127,254,249, 73,181, 90,221,219,229,185,168,138,179, 5,143,199,219,184,109,219, 54,113,
-195,134, 13, 27,114, 56, 28,178, 97,195,134, 80,169, 84, 48, 24, 12,188,133, 11, 23,182, 18, 8, 4,151,191,254,250,235,141, 0,
-134,214, 80, 78, 18,192,130,117,235,214, 77,142,141,141,149,142, 25, 51,134, 54,153, 76,216,190,125, 59, 40,138, 2,155,205,134,
- 80, 40,116, 38,175,230,112, 56,104,218,244,145, 32,233,251,170,185, 94, 13,202,252, 80,165,240,108,218,245, 88, 53,124,206,169,
- 15, 54,155, 13, 62,159, 15, 62,159, 15, 30,143,135, 27, 55,110,124,202,231,243,151, 19, 4, 97,117,135,147,248, 75, 93,180, 1,
-112,190,166,125, 60,234, 26,242,119,182,159, 14,132, 17, 4,177, 2, 64,159,178,110,151, 76, 8, 8, 8,120, 55, 47, 47,239,161,
-187,156, 10,133,194,191,176,176,240,107,133, 66, 1,185, 92,238,236,191, 67, 67, 67, 97,177, 88,144,151,151, 7,134, 97,160, 86,
-171, 33, 20, 10, 17, 18, 18,242,117,108,108,236,206,248,248,248,194, 74, 57,109, 88,242,242,200, 79, 62,163, 40,138, 4, 0,138,
- 37, 22, 79,255, 8,136,140,140, 68,247,238,221, 97, 48, 24,160,209,104, 16, 29, 29,205, 34, 8, 98, 44, 65, 16, 18,134, 97,214,
- 0, 56,241, 47, 52, 20, 86,233, 12, 63,175,226,188,168, 35, 91, 60,135,195,113, 75,104,217,207,175,201,130, 66, 90, 44, 22,112,
- 56,156,114, 22, 9,130, 32, 64,211,116,185,207, 29, 66,171, 54, 66,125,234,212,169,182,239,190,251,110,114, 81, 81,209, 90,212,
-114, 42, 97,236,216,177,143,248,123,204,156, 57,201, 18, 85,156, 0, 0, 32, 0, 73, 68, 65, 84, 51, 51, 63, 63,159,121,173,127,
- 27, 81,218,225,236,156, 70,126, 98, 65,160,143, 79,125,190,159, 76, 90, 88, 88,120,198,222,152,184,139,198,237,218,181, 19,108,
-218,157,152,249,230,140,197,243,219, 55,244,151,180, 14, 11,240, 11,246, 21,112,197, 36,161,227, 91, 45,153, 50,153, 44,202,211,
-114, 59,218, 5,161, 80, 8,146, 36,159, 38,139, 22,203, 33,178, 84, 42, 21, 14, 30, 60,136, 65,131, 6,165, 56, 68, 72,113,113,
- 49,114,114,114,160, 80, 40, 82,236,150,143, 26,167, 17,109, 54, 27,204,102, 51,204,102,179, 83,192,184,220, 67, 78, 1,227, 56,
-151,162,168, 63,107, 89,246,249,126,126,126, 61,251,244,233,195,253,105,251,118, 46,195, 48, 58,148,229, 80,211, 50, 76, 21, 9,
-178, 43,192,106,181, 58,173,108,108, 54, 27,233,233,233,206,142,203,145, 91,146,207,231,187,103,202,224,241,222,255,249,231,159,
- 37, 29, 59,118, 36, 10, 11, 11, 97,179,217,156,141,228,234,213,171,249,195,134, 13, 11, 77, 78, 78,254,216,104, 52,206,171,197,
-181, 18, 85, 9, 34, 0,144, 72, 36, 86,184, 23, 49,187, 70, 78,171,213, 74,116,235,214,109,150, 82,169,108,165,215,235, 23,186,
- 83,141, 0,246,101,102,102,186,118,236,151,211,210,210,244, 35, 70,140, 16,212,175, 95,191, 83,106,106,234, 99,221,164, 77,154,
- 52,233,194,102,179,113,238,220, 57, 35, 0,199,200, 58,225,202,149, 43,198,161, 67,135,242,194,195,195,187,168,213,110,187,172,
- 52,105,214,172,217,209,160,160, 32,129,163, 13, 13, 12, 12,100,199,199,199,251,100,101,101,193,108, 54,227,195, 15, 63,196,224,
-193,131, 17, 16, 16,128,153, 51,103,202,151, 46, 93,250,163, 86,171,109, 87,157,209,154,203,229,110,190,125,251,118,148, 66,161,
- 16,156, 61,123, 22,173, 91,183,134, 82,169, 68,110,110, 46,180, 90, 45,114,115,115, 49, 97,194,132,160,255,253,239,127, 33,110,
- 88,178,156, 34, 43, 62, 62, 94,189,107,215, 46,106,253,250,245, 62,108, 54,219, 41,180, 88, 44,150, 83,104, 57,114, 43,214, 98,
-166, 65,109, 23,109, 82,141, 70,243, 56,126,110, 60, 0, 92, 87,145,197,227,241,192,227,241,192,231,243, 31, 43, 47,235, 51,130,
- 80,130, 32, 82, 57, 28, 14, 79, 40, 20,114, 72,146, 4,143,199,235, 47,147,201,174,181,108,217,178,229,209,163, 71, 31,184, 67,
- 98, 48, 24, 54,243,120, 60,118, 80, 80, 16, 0, 32, 42, 42, 10,173, 91,183,134, 78,167,179,105, 52, 26, 72,165, 82,242,225,195,
-135,208,235,245,200,201,201, 65, 68, 68, 4,155, 36,201,205, 40,243, 67,126, 4,167, 83,114,215, 2, 88,235,216, 15, 8, 8,200,
-115,181,116,242,249,124,132,134,134, 34, 43, 43, 11, 62, 62, 62,212,231,159,127, 62,116,251,246,237,175,158, 62,125,122, 44,128,
- 45, 46, 84,243,158, 97, 31, 45,135,200,114,125,253, 75,104, 13, 30, 60,120,238,129, 3, 7,122, 85, 54, 10,103,179,217,117,230,
-235,226, 16, 84, 18,137,164,162,213, 10, 54,155,173, 42,139,150,199,191,195,231,243, 5, 83,166, 76, 41, 89,179,102,141,199, 98,
-107,248,170, 52,167, 21,235,145, 97,100,139, 22,167, 63,254,248,227, 33,191,255,254,123, 86,251,134,245, 89,162,236,135, 90,190,
- 68, 42, 69, 88,189, 65,227, 94, 25,122, 5,101,171, 15,221,197,237,146,146, 18, 65,163, 48,161,137, 36, 13, 68, 61, 30,203, 71,
- 33,226,240,130,253,252, 66, 57, 38, 99,190,196,207,143,107, 52, 26,213,168, 38, 9, 52, 0,200,229,242, 95, 5, 2, 65,132, 99,
-223,207,207,207,151, 97, 24, 8,133, 66, 40, 20, 10, 49, 69, 81, 55, 93, 30,174,135,121,121,121,253,107, 42,152, 84, 42,253,149,
-199,227, 69,144, 36, 9,130, 32, 64, 81, 20, 72,146, 4, 73,146,206,247, 20, 69,129, 32, 8,148,150,150, 62,124,240,224, 65,127,
- 55,174,215, 10, 32,134, 32,136,148,131, 7, 15,162, 83,167, 78, 56,124,248, 48, 6, 12, 24, 0,141, 70,131,171, 87,175,162,103,
-207,158, 64,217,148,162, 91,112,117,126,119, 12, 10,110,220,184,225, 20, 46,174,155,143,143,207,227,152,216,147,134, 15, 31,142,
-239,190,251,142,177, 15, 38, 68, 4, 65,180,246,245,245,189,113,253,250,117,183,252, 96, 24,134,129,217,252,215,169,142,206,203,
-238, 15,225, 81,114, 96,138,162,250,183,107,215,142,208,104, 52, 14, 1, 9, 22,139, 5,138,162, 64, 81, 20,190,253,246, 91, 65,
-199,142, 29, 63,225,241,120,179, 56, 28, 78,177,197, 98,249,201, 96, 48, 44, 4,160,126,154, 90,164, 30, 61,122,204,200,200,200,
- 24, 28, 17, 17,177,255, 49,104, 24,139,197, 98, 2, 32,160, 40,138, 93, 7,109, 20,101,191,183, 12, 46, 98,223,106,223,231,161,
-108,154,216, 45, 4, 4, 4,252,120,232,208,161,176,136,136, 8, 88, 44, 22, 88,173, 86,104,181, 90, 36, 36, 36,192,104, 52,194,
-106,181, 34, 42, 42, 10,159,125,246,153,225,221,119,223,229,175, 91,183, 46, 95,171,213,142,174,129,246,221,157, 59,119,138, 20,
- 10,133, 64,175,215,227,238,221,187,104,215,174, 29, 74, 74, 74,160,211,233, 80, 90, 90, 10,179,217,140,226,226, 98, 41, 77,211,
-166, 26,184, 62,117, 21, 89,147, 38, 77,250,147,203,229,182,123,231,157,119,144,153,153,233,124,230,223,124,243, 77,200,229,114,
-231,179,100,111,147, 61,106,152, 89, 44, 22,120, 60, 30, 56, 28,142,186, 94,189,122, 32, 8,130,255,240,225,195,218, 76,197, 73,
- 0, 20,179,217,108,174,171,192,226,241,120, 56,119,238,220,199, 92, 46,183, 42,107, 86, 85,207, 37,227,201,254, 63, 13,130, 32,
- 86,112, 56, 28,158, 76, 38,227,184, 12, 56, 57, 98,177, 24, 65, 65, 65,171, 0, 12,116,243,186,219,202,100, 50,103,251,222,166,
- 77, 27,100,100,100,236,209,104, 52,111,228,231,231,131, 36,201,205, 36, 73,190,234, 24,164, 22, 21, 21, 33, 60, 60,188,109, 85,
-124, 93, 99,130, 39,131, 96,202, 89,180, 42, 12,208, 32,145, 72,112,255,254,125,232,116, 58,230,214,173, 91,196,148, 41, 83, 8,
-147,201,244, 67,114,114,242, 25,148,173,182,175, 82,139, 60, 35,240,220, 71,203, 97,209,114,183, 3, 32, 8,162,198,209,132,197,
- 98, 17, 71, 71, 71, 87,230,240, 69, 84, 38,180,236,211, 73,181,186,209,217,108,182, 79,109,197, 86, 69,236,223,181, 77,190,228,
-179, 15, 63,147,133,212,111, 52,107,214,167,172,151, 94,122,233,236,166, 77,155,104, 89,243,129,125, 79,252,186, 69,254,245,123,
-179, 15, 31, 58,116, 8, 40,115,140,118, 23, 73, 7, 14, 28, 8,158, 57,109, 42, 62,123,255,221, 35,146,168, 0,174,152,144,137,
-248, 70, 93,129, 24,140,158,215,184,217,224,221,251,247,231, 0, 72,174,142, 68, 40, 20, 70,164,166,166, 70,185, 46, 36, 48,153,
- 76, 16, 10,133, 56,113,226, 68,160, 64, 32, 8, 4, 0,189, 94,143,150, 45, 91,186,107, 49,137,184,121,243,102,148,143,143, 15,
- 74, 75, 75, 97, 52, 26, 97,177, 88, 96,179,217, 64, 16, 4,216,108, 54,184, 92, 46, 68, 34,145,167, 43,251, 46, 1,120,125,208,
-160, 65, 91, 15, 31, 62,140,232,232,104, 20, 21, 21, 33, 45, 45,205, 33,178, 60,242,209,114, 88,137, 92,253,177, 88, 44, 22,126,
-108,216, 16,111,102,103, 59, 5,204, 10, 95, 95,124,102,171, 93, 54,141,150, 45, 91, 50, 73, 73, 73, 56,114,228, 8, 94,126,249,
-101, 98,239,222,189,102,154,166, 57,217,217,217,127,102,103,103,187,197, 97,179,217,156,101,117,180,219,174, 2,203, 83,161,101,
-181, 90,125,184, 92, 46, 12, 6, 3, 28,150, 7,215,173, 65,131, 6, 80,169, 84,172,226,226, 98, 86,118,118,182,112,193,130, 5,
-239,156, 60,121, 82, 81, 82, 82, 50,234,159,108,133,214,172, 89, 19,241,230,155,111,166,179, 88, 44,102,192,128, 1, 99, 30, 62,
-124,248,138, 66,161, 56,254,251,239,191,127, 5,160,137,167,124, 1, 1, 1, 23, 89, 44, 86, 88,113,113, 49,103,199,142, 29,150,
-146,146, 18, 78, 96, 96, 96,158,163,237,112,212,181,197, 98,113,107,229,114, 64, 64,192, 69,165, 82,201, 89,185,114,165,165,176,
-176,144, 35,151,203,243, 28, 60,106,181,154,179, 99,199, 14, 75,113,113, 49,199,215,215,247,162, 70,163,169,145, 79,169, 84,142,
- 30, 59,118,108,226,241,227,199, 3, 40,138,194,195,135, 15, 81, 88, 88, 8,169, 84,138,205,155, 55, 35, 34, 34, 2, 59,119,238,
- 84,169, 84,170,137, 95,126,249,229, 39,118,145, 85,147,143, 86,207, 78,157, 58, 69,168,213,106, 72,165, 82,232,116, 58, 92,188,
-120, 17, 45, 90,180, 64,118,118, 54, 72,146,132, 84, 42,197,234,213,171, 75, 9,130, 80, 85, 71, 36, 16, 8, 94,137,141,141,149,
- 2, 64,108,108,172, 52, 54, 54,182,210, 14,174, 75,151, 46, 88,181,106, 85, 69,161,229,201,192,192,105,117,114, 17, 71,134,206,
-157, 59,227,228,201,147,179, 61, 20, 71, 38,135,104,171,104,205,226,241,120, 30, 47,166,177,217,108, 28,148,185, 52, 16,238,236,
- 63, 5,232, 37, 16, 8, 56, 21, 63, 44, 45, 45,229, 40, 20,138, 30, 30, 8, 95,127,129,160,204,224, 20, 17, 17, 1,141, 70, 67,
-155, 76,166,145, 91,182,108,177, 0, 64, 76, 76,204, 72,154,166, 13, 86,171,149,226,114,185,208,233,116, 8, 10, 10,242,175,198,
- 54,250,193,190,159, 22, 4, 87,244,209, 82, 40, 20,136,137,137,129,209,104, 68, 78, 78, 14, 18, 18, 18, 44, 52, 77,111, 93,179,
-102,141, 45, 48, 48,240,191,175,189,246, 26,149,156,156,252, 54,128, 25, 85,105,145,103,204,154, 21, 95,165,208,178, 43,200,147,
- 0,122, 87,188,200,138,226,167, 58,161, 85,211,212, 33,151,203, 85,167,167,167,139, 92, 59, 21,171,213,138,144,144, 16, 27,195,
- 48, 68,101, 66,235,113, 76,193,108, 54,219,231,163,143, 62, 82,175, 89,179,102,244,253,251,247,231,186,243,157, 29,111, 55,195,
-166, 10, 34,107,237,146,184, 85, 43,151, 44,144,221, 57,242, 3,214,127,179,140,166,105, 36,183,106,213,170,135, 86,171,101,249,
-138, 44, 80,170,113,216, 46,178,220, 21,133, 36,128,239,207,159, 63,159, 60,112,224,192, 83,223,255,188, 91,150,125,247,238, 25,
- 94,177, 50, 71,210, 56,138,197, 9,141,120,181,196, 96,224,140, 28, 57, 50, 16,192,107, 53, 53, 98,106,181, 26,185,185,185, 21,
- 5, 24,110,220,184,241,200,185,110, 21,142, 36, 65,211, 52,118,237,218, 5,161, 80, 8,145, 72, 84,110,115,136,172, 90, 46, 84,
-184, 9, 0, 3, 6, 12,128, 74,165,130, 88, 44,118,187, 92, 21,197, 11,195, 48, 48,153, 76, 48,153, 76, 48,155,205, 52, 0, 54,
-139,197,194,132,204, 76,167,149,199, 19, 1, 83, 17,173, 90,181, 98, 78,159, 62,141, 83,167, 78, 65,167,211, 97,229,202,149, 80,
- 40, 20,207, 1,248,212, 83, 46, 23, 39,125,186,184,184,152, 93, 92, 92,236,180, 14,178,217,108,167,245,192, 77, 75, 30,135,197,
- 98, 57, 71,163,142,205,213,170, 69, 81, 20,228,114, 57,130,131,131,177,118,237, 90, 78,253,250,245, 7,255,147, 45,208,210,165,
- 75, 27,175, 88,177, 98,195,166, 77,155, 14,143, 30, 61,122,251,213,171, 87,199,251,250,250,254,121,226,196,137, 5, 60, 30,207,
- 86,203,231, 59, 44, 59, 59, 59,200,245, 35,155,205, 38,180, 90,173, 78, 97, 91, 90, 90,234,246, 0,131,205,102,135,165,166,166,
- 10, 1, 96,193,130, 5,108, 0, 66,135, 51,184,131,179,180,180,148,221,162, 69,139, 48,119,239,245,196,196,196, 30,253,250,245,
- 59,125,244,232, 81,191,136,136, 8,100,101,101, 33, 43, 43, 11,141, 27, 55,198,162, 69,139,116,197,197,197,221, 0,220,212,106,
-181,123,221,228, 12,241,243,243, 99,167,167,167,195,106,181,162,109,219,182, 88,189,122, 53, 70,142, 28,137,150, 45, 91,162,184,
-184, 24,169,169,169,216,184,113,163, 31,135,195,169,182,237,208,235,245,123,227,227,227,195, 43, 90,180,198,140, 25, 35,202,203,
-203,115,222,147,113,113,113,229,166, 16, 61,105,147,237, 83, 91, 85,110,181,129,213,106,149,240,249,252, 98, 30,143,199,117,248,
-103, 37, 36, 36,120,108,205,170, 48, 0,244,100,255, 31,131, 67,180, 86,210,183, 34, 56, 56,216,109, 30, 30,143, 71, 56,218, 70,
-171,213, 10,141, 70, 67, 43, 20, 10,231,244,126, 74, 74, 10, 29, 25, 25, 73, 83, 20, 69,113,185, 92, 16, 4, 1,161, 80, 88,101,
-131,207,208, 76,220, 75, 35, 63, 45,183,234,112,250, 71,128,217,108, 70, 74, 74, 10,204,102, 51, 18, 18, 18, 44, 95,126,249,101,
-182, 90,173,158, 14,128,245,235,175,191,142,157, 61,123, 54, 21, 20, 20,212, 47, 63, 63, 31, 53,105,145,103, 72,108, 61, 98,229,
-114,244, 66, 39, 7, 15, 30, 76,216,151, 86, 18, 14,225,228,137,208,178, 63,124, 53,246,188, 4, 65, 32, 39, 39,199,185, 31, 20,
- 20,228,241,111,185, 11,127,127,127, 93,151, 46, 93,124,148, 74,229,222,165, 75,151,214,202,146,181,118, 73,220,170,197,243, 63,
-151,169,174,159, 69,102,118, 14, 84,249,150,228,164, 63,239,239, 1,176, 7, 0,176,174,249, 73, 98,114,218,183,238,114, 54, 11,
- 16,180, 97,115, 88,123,158, 31, 56, 56,124, 68,236, 12,242,173,183,222,234, 62,118,236, 88,205,232,209,163,167,137,197,226, 38,
-102,179,185,104,247,193,131, 15, 70,140, 24, 81,159,166,233,177,168, 33,230,136, 94,175,127,216,187,119,111,215,250,148, 28, 59,
-118, 76,254,224,193, 3, 76,157, 58,181, 32, 43, 43, 75,237,122,174, 59,101, 52,155,205, 15,219,180,105, 83,229,116,161, 99, 74,
- 17, 0, 74, 74, 74, 30,122, 80,165,163, 96,119,124, 47, 44, 44,196,141, 27, 55,192, 98,177,208,185,115,103, 36, 37, 37,161,123,
-247,238, 41,158, 88,181, 12, 6, 3, 34, 34, 34, 96, 48, 24,160,211,233, 74, 1,240, 54,215,175, 15, 0,120,187,176, 16, 23,191,
-252, 18,103, 23, 47,134,235,253,236, 46, 90,183,110,205,156, 61,123, 22,127,254,249, 39,140, 70, 35, 38, 78,156, 8, 0,132,253,
-222,245, 36,100, 70, 67,138,162, 6, 12, 28, 56, 48, 4, 0,116, 58, 29,113,254,252,121,240,249,124,231,179,176,127,255,126,100,
-101,101,129, 32, 8,248,249,249,133, 21, 21, 21,213, 7,112,191, 26,179, 63,113,255,254,125,124,241,197, 23,176,217,108,152, 61,
-123, 54,162,162,162,156, 2,235,225,195,135, 88,176, 96, 1,104,154,198,231,159,127,142,198,141, 27,195, 98,177,240, 81,203, 16,
- 26,117,129,153, 51,103,222,217,179,103,207,225,140,140,140, 23,151, 44, 89,210,139, 32, 8,219,172, 89,179,190,144, 72, 36,244,
-227,240, 22,105, 74,112,227,246, 67,167, 16,170,184, 5, 6,200, 60,230,187,117, 55,195,249,125,154,118,229,163,225, 47,243,243,
-180,136,165, 22,139, 69,247,234,171,175, 74,119,237,218, 69, 52,110,220, 24,247,238,221,115, 88,134, 74,225,121, 72,135, 44,149,
- 74, 21, 69, 81, 20,231,246,237,219,136,140,140, 68,167, 78,157,176,112,225, 66, 40,149, 74, 88,173, 86, 4, 5, 5,217, 44, 22,
- 75,138,217,108,254,163, 6,174,184, 73,147, 38,113, 0, 76,182, 91,182, 90, 77,159, 62,221,182,108,217, 50,164,164,164, 56, 45,
- 88,174,206,240,158, 78, 29,186, 90,157, 92,183,132,132,132,217, 92, 46,151, 1,112, 14,158, 7,122, 54, 85,180,104,213,198,154,
-245,164,240, 36, 87, 50, 42, 20,138, 4, 31, 31,159,193, 69, 69, 69,229,172, 90,221,186,117, 51,203,229,242, 68,119,121,196, 98,
-113, 17, 69, 81,254, 0,144,149,149, 5,145, 72,196,185,123,247,238, 98,148, 5,207, 70,253,250,245, 23,171, 84, 42, 78,125,123,
-123, 26, 28, 28, 12,147,201, 84,165, 27,203,153, 75,121, 63, 0,248,193,177, 47,147,201,114, 52, 26,141, 96,217,178,101,218,197,
-139, 23,235,105,154, 54, 2, 56,161, 86,171,157,113,180,114,115,115, 53,108, 54, 91, 38,149, 74, 67, 29, 66,171, 50, 45,242,140,
-161,106,139,150, 93, 73, 50, 21, 5, 17, 65, 16,143, 56,168,215, 32,180,106, 20, 89, 52, 77,151,179, 50, 56, 28,222, 43,251, 45,
-123,167, 94,171,169, 67,187,200,226,239,222,189,123,243,210,165, 75,207,185,251, 61, 87, 31,173,117, 95,205, 95,226, 16, 89, 87,
- 78, 29,197,222, 52,141,114,246,226,229, 43,106,251, 15, 52, 15, 16,182,150,203,253, 79,126,185, 40, 78,114,231,200, 70,108, 95,
-247, 63,230,202,133, 11, 29, 47, 92,184,240,198,212,169, 83,235,217,111, 44, 21,128,203, 0, 70,192,141, 85, 58, 89, 89, 89,253,
- 43,116,194, 55, 57, 28,142, 92, 40, 20, 34, 43, 43, 75,123,235,214, 45,143,167,100,148, 74,101,255, 39,112, 3,178, 28, 34, 75,
-169, 84, 34, 53, 53, 21,125,250,244, 1, 0, 36, 37, 37,161, 91,183,110, 72, 78, 78, 70,187,118,237, 82, 0,116, 64, 13,129, 90,
- 45, 22,139,186,121,243,230, 78,235,150, 70,163,177, 1, 64,108, 78, 14,226, 21, 10,176, 88, 44,156, 93,188, 24,115, 44, 22, 44,
-244, 80,192,183,105,211,134, 57,127,254, 60, 30, 60,120, 0,171,213,138, 33, 67,134,160,150, 15,125,203,102,205,154, 29, 59,113,
-226, 68,160, 88, 44,134, 78,167,131, 86,171,197,184,113,227, 48,114,228, 72, 24,141, 70,236,216,177, 3,251,246,237,131,143,143,
- 15,116, 58, 29,116, 58,157,223,160, 65,131, 78,223,188,121,179, 39,128,219, 85, 8, 45,166,127,255,254, 72, 76, 76, 4, 69, 81,
-232,216,177, 35, 10, 11,255, 90, 12, 36,151,203, 43, 59, 70,253,147, 66,139,197, 98, 49, 9, 9, 9, 75,122,245,234,133,140,140,
-140, 23,219,181,107,183,114,252,248,241, 89,143,203,235,231,235,131, 54, 45, 26,194,104, 52,194,104, 52, 34, 36, 36, 4, 37, 37,
- 37,184,115,231, 14,140, 70, 35,228, 65, 82,143,249, 98, 90, 54,118,242, 5, 5, 5, 65,167,211,225,254,253,251, 48,153, 76, 8,
- 8,240, 72,104,133,247,239,223,255,247,173, 91,183,250,111,220,184,209,212,187,119,111,238,202,149, 43, 9,137, 68, 2,151,142,
-197, 83, 36, 36, 37, 37, 69,244,235,215,175,233,245,235,215,145,144,144, 0,147,201,132,152,152, 24,220,186,117, 11, 93,186,116,
-129, 86,171, 61,119,225,194,133,125,238, 24,134, 1,124, 50,105,210, 36, 56,196, 86, 98, 98, 34,114,114,114,224,227,227,243,136,
-208,114,248, 62,218, 87,141,135,184, 83, 88,135, 32,114,177, 60,205,145, 74,165,102, 0, 43,106,105,125, 2, 0,100,100,100,240,
- 90,181,106,101,228,243,249, 92,187,104, 91,254, 56,124,117,137, 58, 88,201, 88, 37,130,131,131,167, 7, 4, 4,244,107,208,160,
- 1,242,242,242, 56, 92, 46, 23,221,186,117, 51,119,232,208,193, 28, 28, 28,252,182,187, 60, 60, 30,239, 58,135,195,233, 89, 54,
-152,160,145,158,158, 14,134, 97,102,183,108,217,242,221,146,146, 18, 20, 22, 22,114, 37, 18,137,115, 80,221,180,105, 83, 24,141,
-198,235, 30, 88,222,226, 34, 35, 35, 63,225,112, 56, 11,149, 74,101,101, 97, 33,184, 82,169, 84,194,225,112, 96, 54,155,203,137,
-205,138, 90,228, 89, 23, 89,229,132,150,139,138, 44, 39,116, 60,177,104,185, 99, 53,112, 56,216,187,238, 59, 68, 93,197,223,170,
-109, 12, 45, 95, 95, 95,163, 67,100, 45, 92,184,240, 92,109, 56,118,110,221,162,240,181,149,134,103,159, 59,132,155,127, 38, 99,
- 79,170, 90, 57,123,241,242,105, 47,189, 54, 42,175,162, 48,115, 7, 81,129,194,150,242, 32,255,147, 95, 45, 93, 44, 81, 93, 63,
-139,156,220, 92, 28, 58,119, 33,217, 12,164, 2,152, 93,151,166,101,160,108,234,144,162,168,167,233,134,117, 58,195,231,228,228,
- 56, 68, 86, 12, 0,116,239,222, 61,197, 46,178,224,174, 69, 75,173, 86, 87, 76, 89,211, 15, 64,128,227,250, 89, 44, 22,186,125,
-242,137,199, 34, 11, 0,147,156,156, 12,149, 74,229, 24, 41,214, 86,100, 33, 56, 56,248,253, 19, 39, 78, 4,126,255,253,247,197,
-155, 54,109, 42,180,217,108,236, 54,109,218,132,181,111,223,158,216,188,121, 51, 0, 96,196,136, 17,152, 61,123, 54,174, 93,187,
- 6,145, 72,132,238,221,187,211,115,231,206, 13,154, 62,125,250,219,121,121,121,211, 42,237, 29,109, 54, 14,159,207, 63, 14,224,
-185,235,215,175, 3,192,105,148,165,112,114, 88, 17,170, 60,230, 78,231, 91, 82, 82,194,246,241,241,169, 52, 52, 4,167,108, 52,
-228,169, 5,194,201,121,234,212,169, 47,190,250,234,171, 61,239,189,247,222,237,199,228,172,212,162, 53,120,240, 96,232,141,102,
-100,230,105, 64,211, 86,232,205,249, 30,243,185, 90,180, 6, 15, 30,140, 82,131, 9,233, 57, 42, 88,173, 52, 74,244,110,247,229,
-194,231,159,127,254,215,159,126,250, 41,248,204,153, 51,160,105,218,118,235,214,173,251,175,190,250,170,100,214,172, 89,254,143,
-177,200,232,155, 81,163, 70, 13, 59,117,234,148,170,105,211,166,178,115,231,206, 33, 63, 63, 31, 86,171, 21,207, 61,247, 28,184,
- 92,110,250,226,197,139, 57, 0,190,113,247,191,177,139, 45,243,133, 11, 23,222, 60,123,246,172, 76, 38,147,113,109,205,154, 33,
-231,232, 81,236,218,181,235,145, 47,172, 91,183, 14,112, 51, 10,191,195,226,116,254,252,249, 58, 17, 88,229,122,106, 46,183,214,
-211,143,207, 42,206,159, 63,159,245,214, 91,111,181,144, 72, 36, 43,122,244,232,209,199,223,223,159,244,243,243, 75, 8, 13, 13,
-125,183, 77,155, 54,110,207, 46,176,217,236,241, 34,145,232,142,213,106,165,180, 90, 45,116, 58, 93, 89, 35,109,181,114, 73,146,
- 68,253,250,245,157,125, 73,199,142, 29, 17, 28, 28, 76,167,165,165,141,119,151,191,160,160,160,220, 42,196, 74, 48,169, 91,183,
-110, 44,163,209,136, 7, 15, 30, 36,185, 30,168, 76,139, 60, 35,136,173, 86,124, 57, 46,202,245,226, 66, 67, 67, 51, 44, 22, 11,
-147, 10, 48,151, 47, 95,102, 98, 99, 99,171,221, 12, 6, 3, 19, 20, 20,148, 83, 73,231, 7, 87, 78,163,209, 88,238,123, 70,163,
-145,145,203,229,180, 94,175,127,132, 83,175,215, 51, 97, 97, 97, 89,213,113, 86,130,113,151, 46, 93, 90, 51,103,206,156, 78, 30,
- 84,144,147,147, 89,219,140,217,184,113,227,127, 24,134,233,213,163, 69,196,159,195,219,200,153,110, 81, 65,217,251,118,110, 29,
-201, 48, 76,175,138,155, 35,192,105,117,156,205,228,162,230,125,163,235, 21, 93, 57,178,141, 57,177,236, 29,230,171, 33, 81, 76,
-187, 48, 31,117,179, 0,129,167, 57, 98,106,204,150, 30, 29, 29,125,211,102,179, 49, 38,147,137,137,142,142,190, 85, 23,156,181,
- 64,117,156,109, 81,230,203, 54,170,146,207,218, 62, 70, 57,175, 48, 12,195,168, 84, 42, 70,171,213, 50, 70,163,145,161,105,154,
-113, 5,128, 43,110,112, 50,102,179,153, 41, 42, 42, 98,224,190,207, 93,165,156, 10,133,226,254,221,187,119,153, 70,141, 26,101,
-216,205,241,211,117, 58, 29, 83, 17, 58,157,142,233,211,167, 15,115,235,214, 45, 38, 50, 50,210,112,235,214, 45, 70,161, 80,220,
-168,161,156, 13,194,195,195,143, 7, 4, 4, 36, 0,136,242,224, 88,181,245,185, 99,199,142,134, 12,195, 76,100, 24, 38,182,138,
-109, 34,195, 48,205,254,105, 78,123,253,230, 49, 12,195,148,150,150, 50, 42,149,138,201,206,206,102, 74, 75, 75, 25,173, 86,203,
- 92,186,116,137, 57,115,230, 12,243,231,159,127, 50, 50,153, 44,207, 29, 78, 7,159,201,100, 98,138,139,139,153,252,252,124, 70,
-175,215, 51, 58,157,142,185,122,245, 42,115,241,226, 69,230,250,245,235,149,241, 61,194,233,239,239,191, 46, 55, 55, 87,123,250,
-244,233,210,181,107,215,150, 6, 7, 7, 95, 7, 16, 1,160,137,159,159, 95,238, 59,239,188,195,136,197,226,135,181,124,142, 90,
-176,217,236, 75, 75,150, 44, 57,127,224,192,129,188,125,251,246,153, 54,108,216,144, 57,117,234,212, 63, 88, 44,214, 37, 0, 45,
-106,249, 28, 5, 73,165,210,211,231,206,157,179, 22, 21, 21, 49,106,181,154, 41, 46, 46,102,116, 58, 29,163,215,235, 25,147,201,
-196, 88, 44, 22,230,143, 63,254, 96,228,114,185,235,180,228, 7,213, 12,172,103, 48, 12,243, 62,195, 48,172,186,110,235, 92,184,
-123,212, 21,103, 93,180,117, 36, 73,154,237,109, 71,231,178,221,234,247,255,169,114,246,237,219,247,243,145, 35, 71, 50, 3, 6,
- 12, 96, 98, 98, 98, 30,217,218,181,107,199, 76,153, 50,133, 57,112,224, 0,243,229,151, 95,126, 94, 7,229,100,161,108,209,203,
-162,190,125,251, 90, 18, 19, 19,153, 17, 35, 70, 48, 0,250, 87,167, 69,158,101,193,229, 88, 76,227, 8,239, 64,184,190, 2,128,
-217,108,206,184,121,243,166,162,169,213, 74, 1,192,183,223,126,251,136,101,202, 21,137,137,137, 86,130, 32,238, 84,247,235,102,
-179, 57,227,196,137, 19,242, 85,171, 86,177, 93, 76,192,176, 90,173,182,236,236,108,114,229,202,149,229,206, 63,121,242,164,213,
-106,181,166,123,120,145, 27,219,182,109,187,177, 46,106,235,143,107, 15,222,253,245,208, 47, 1,157, 59,245, 80, 75,100,178, 74,
- 71, 97, 59,222,110, 6, 98,114,245, 86, 45,130, 69, 46, 92,178, 40, 78,234,152,130,252, 57, 37, 87,109, 48,210,125,210,148,250,
- 43,117,253, 15,107,181,218, 7,142,149,128, 58,157, 46,253, 41,188, 9, 47,161, 44,198,149,181,194,103, 29,240,152, 78,167, 54,
-155, 13,190,190,190, 78,107,104, 45, 44,162,140,195,194,234,248,235, 30,167, 60, 12,195,156,186,122,245,106,228,184,113,227,124,
- 54,109,218,116,151,166,105,246,132, 9, 19,204,193,193,193,156,164,164, 36, 11, 0,162, 87,175, 94,172,220,220, 92, 38, 43, 43,
- 75,245,242,203, 47,151,188,249,230,155,254,151, 47, 95,230,218,108,182,154,130, 22,222,203,200,200,232, 91,139, 99,213, 98,248,
-240,225,119,241,248,105,108,158, 56,167, 3, 42,117, 49,238, 62,200,178, 71, 48,183,129,126,152,231,244,171,178, 88,172, 80, 21,
- 23,122,108,209,186,115, 63,203,158, 98,140, 6, 77,103,219,249,202, 28,226,153,162,210,154,123, 19, 22,171,251,220,185,115, 7,
-146, 36, 73,158, 61,123,214,184,116,233,210,140,130,130,130, 33, 0,210, 1,160,168,168,168,247,198,141, 27,127,116, 35,148, 67,
- 85, 72,181, 88, 44, 93, 62,248,224,131,105, 0,186, 3,168,103,231, 78,178, 91,178,106, 27,193, 60, 95,173, 86,191, 48,112,224,
-192,163, 20, 69,213,119,121,142, 2, 0, 40, 29,207, 5,195, 48, 65,121,121,121, 47,186, 67, 72, 16,196,242, 39,213,144, 60, 73,
-238,199,108,135,158,137,149,140,199,143, 31,159, 55,100,200, 16, 86, 68, 68,196,199, 17, 17, 17,100, 81, 81, 17,180, 90, 45, 72,
-146, 68,112,112, 48,162,163,163, 17, 28, 28,108,187,126,253,250,162, 15, 63,252,176,198,152,124,205,155, 55,111,104,177, 88, 26,
-145, 36,217, 16, 64, 67,134, 97, 26, 18, 4,209, 16,128, 12, 0, 36, 18,137, 36, 50, 50,146,213,185,115,103,116,234,212, 9, 39,
- 79,158,196,206,157, 59,127, 0,240,171,171, 53,171,162, 22,121, 26,144,218, 22, 76,139, 75, 32,174,181, 67, 47,194,134,147, 12,
-137,222,209,201,206, 56,123, 21, 69, 86,213, 73,165, 43, 49,253,245,127,238,185,231,156, 15,156, 27,157,202,131,154, 30,190,130,
-130,130,254,227,199,143, 47,199, 73,211,180,177,176,176,240,173,174, 93,187,174,166, 40,138, 87,225,134,125,152,159,159,255,183,
-230,234,171, 24, 71,171,255,192, 87,148,143,203, 41,230,144,141,110, 30,252, 14,121,249, 74,252,156,146, 91, 84, 98,162,123,223,
- 82,150, 94,125, 18,229,127,248,240,225,128,103, 64,241, 87, 38, 90, 31, 55,121,118,129, 27, 1, 73,107,202, 81, 71,216,195,137,
-212,201, 67,158,155,155,187,236,147, 79, 62,121, 97,209,162, 69,129,135, 15, 31,150, 56, 6, 40, 67,135, 14,205,191,122,245,106,
- 15, 0, 60,131,193,112,108,209,162, 69,129,113,113,113,254, 0,252, 1, 96,208,160, 65,121,121,121,121,171,224, 69,181,176, 88,
- 44,153,209,205,155,150, 27, 57, 58, 6,128,174,239,173, 86,107,166, 39,124,149,241,184,238,211, 52, 93, 45, 31, 69, 81,239,117,
-234,212,137,122,239,189,247,242, 14, 31, 62,236, 72,164,235,170,208,110,214, 16,148,212, 29, 24, 1, 44,181,111,117, 9,157, 74,
-165,234,226,225,119,104,239,221, 88,233,128,210,147,253,127, 4,123,247,238,253,116,196,136, 17, 27,101, 50,217,150,134, 13, 27,
- 54,149,203,229, 18,129, 64, 0,163,209, 88, 98, 50,153,110,220,188,121,115,244,167,159,126,122,207, 45, 11,199,198,141, 20, 0,
-142,205,102,227,147, 36, 41, 2, 32, 33, 8,194,207, 33,180, 8,130,128,217,108,198,131, 7, 15, 48,103,206, 28,250,248,241,227,
- 95, 2,248,220,131,129,107, 7, 0,129, 46,237,120, 32, 0, 19,202, 2,216, 22, 16, 4,113,225, 73,215, 23, 97,195,201, 22,151,
- 64,164,182, 69,101,253, 68,245, 73,165,171,122,224, 10, 10, 10,186,212,245, 67, 92, 21,103, 65, 65, 65,196,211,242,132,140, 53,
- 46,221,134,117, 75,203,229, 57,116,136,176,202,246,107,130, 70,111,157,250,205,175,215,150, 25,173,140,205,108,181,253,247, 86,
- 65,105,170,183, 29,170,115, 60, 95, 87,207, 82, 29,150,233,106, 90, 90, 90,215,169, 83,167,126, 42, 20, 10, 59, 2, 64,105,105,
-233,217,236,236,236,249,176,175, 42,172,233,184, 23, 85, 67,169, 84,182,127, 26,249, 76, 38,211,187, 93,187,118,253,154,166,233,
-175,172, 86,107,210,255,131,191,194,224,189, 27,159, 93,108,223,190,253, 30,128, 46, 0, 48,108,216, 48, 10, 0,118,238,220,233,
-177,120, 30, 55,110, 28,205, 48,140,217,126, 63,232, 80,182,186,176,200,209,166,234,116,186,162,236,236,236,235, 52, 77, 95, 7,
-240, 35, 60, 95,113, 27, 72, 16,196, 1,134, 97, 6,219,133,219, 1,134, 97, 6,187,126,246,164,173, 90, 53,156, 82,179, 51,188,
- 23,101,216,153, 10,162,226, 84, 96, 77,251, 53,225,102,158, 46, 1, 64, 59,111,237,254,191,196,221,236,236,236,177,143,113,220,
-139,103, 15,233, 38,147,105,200,255,163,235,213,120,255,242,127, 73,255, 87, 11,129,229,192,245,235,215,159,152,139,192, 63,141,
- 22,151,202, 15,192, 43,238,187, 32,182, 50,225,229, 21, 90, 94,120,225,133, 23, 94, 60, 14,212,222, 42,240,226,223, 12,135,111,
-150, 99,191, 10, 31,173,138,254, 89,206,125, 2, 85,175, 28,240, 36, 43,121,109, 86, 73, 28,243,114,122, 57,189,156, 94, 78, 47,
-231, 63,206, 41, 5, 16, 9, 96, 73, 13,231, 85, 92, 93,152, 7, 64, 9,192,226,173, 79, 47,231, 99,232, 7,183,192, 48,204,160,
-234,166, 14, 9,130, 56,248,164,132,150,211, 25,190, 45,230, 70, 95,194, 92,199,126, 77, 66,139, 97,152,248,191, 67, 8,246,243,
-114,122, 57,189,156, 94, 78, 47,167,151,211,203,233,229,124, 76,161,213,231,195, 15, 63,252, 8,101,161, 49,152, 15, 63,252,240,
- 35,134, 97, 6,149, 29, 98, 6, 61,201,223,190,214, 14,189, 82,219,130,113,108,215,218,161, 87, 21,167,198,186,108,229,195, 59,
-120,225,133, 23, 94,120,225,133, 23, 94, 60,197, 56,189,120,241,226,210,197,139, 23, 59, 28,223, 11, 0, 16,118, 11, 87,193,147,
-252, 97,251, 52,161, 59, 11,165,170, 79,193,243, 15, 32,132,100,113,198,176, 57,188, 62, 96,108,209, 0, 0,146,186, 70,155, 12,
-191, 91,173,230, 45, 0,178,107, 75,220, 12,104,222, 88, 42,216,103,164,105, 78, 70,137,105, 88, 90, 89,154, 3,143, 49, 12,232,
-198,227,114,127,227, 73,165,130,202,142, 27,213,106,189,209,100,122, 97, 39,112,202,251, 12,120,225,133, 23, 94,120,241,140, 64,
-228,231,231,119,156, 36,201, 8,199, 7,174,113, 7, 43,198, 32,164,105, 58, 71,165, 82,189,128,178,169,226,191,147,211,245,251,
- 38,212,178, 47,175,107,184, 59,117, 8,215,240, 14, 46, 81, 88,255,150,140,217, 20,155,247,166,143,175,116,225,127,198,191,235,
- 31,213,164, 41, 17, 30, 30, 10, 48, 64,122, 70,166,252,206,237, 91,125,183,111,250,102,102,177, 70, 53,199, 98, 52,126,231, 41,
-119,115, 64, 84, 79,204, 75,250,238,195,215,165, 44, 88, 49,106,193,214, 35,132,214, 28,126,189,108,185,169, 71, 34, 75,234,239,
-255,235,226, 99,199, 4,126,173, 91,151, 59,198, 48, 76, 89,126,189, 43, 87, 4, 31,191,240,194,175,195, 84,170,254, 94,177,245,
-175, 68,176, 68, 34,153,206,102,179,123,155,205,230, 8, 46,151,155, 65,211,116, 66, 81, 81,209, 10, 0, 89,222,234,249,119,163,
-105,176,168, 71,211,134, 17, 91,179,115,243, 82,138, 13,166, 9, 55,179,181, 42,111,173,120,140,234,242,107,254, 99,185, 55, 1,
- 64, 44, 22, 95, 36, 73, 50,204, 85, 4, 56,114,246, 58,246, 43,190,218,108,182,123, 42,149,170,107, 53,180, 13,101, 50,217,106,
- 0, 29,106, 10,152,108,143,205,118, 65,165, 82,189,133,170, 87,235,249,248,249,249,205, 35, 8, 98, 56, 73,146, 84, 77,215,100,
-179,217,104,134, 97,118, 20, 21, 21,125, 14,160,164,170,243,252,252,252,142,165,165,165,117, 8, 10, 10,170,209, 74, 99,181, 90,
-145,158,158, 30,216,177, 99,199, 63, 84, 42, 85,179, 39,201,249,119,107,145,218,162,154, 85,135, 85,222,232, 0,202,229, 23,122,
-162, 17, 89, 57,124,241,190, 46, 61,251,247,153, 50,237, 61,209,165,171, 55,240,219,201, 51, 40,214, 25, 65,145, 36,164, 62, 66,
- 52,105,210,136, 88, 30,191, 43,224,135,181,203,191, 58,155,120,116,144, 65,167,121,217, 35,153, 46,100,205,153,253,106, 71,145,
-191,140, 6,108, 52,222, 31,216, 70,244,241,129,148, 57, 40,181,126,228,177,200, 58,126, 92,152,159,151,135,184,144, 16,176,172,
- 86,240, 73, 18,124,130, 0,159, 36, 33,226,243, 49, 96,195, 6,204, 63,124, 88,248,233,139, 47,122,197,214,191, 12, 98,177,120,
-124, 72, 72,200,210,245,235,215,251, 55,104,208, 0, 34,145, 8, 42,149, 42,224,230,205,155,109,103,204,152, 49, 54, 39, 39,231,
-147,226,226,226,117,222,154,250,247,194,102,195,152,239, 23,190, 21,154,243,240,118,232,164, 69,219,154, 16,254,116,239, 27,133,
-250, 92,111,205,184,141,182, 0, 82, 80,121,254,210,234,142, 85, 9, 62,159,159,103, 48, 24,130,170, 59,135,203,229,230,155, 76,
- 38,121, 77, 92, 36, 73,134,101,101,101, 5, 9,133, 66,208, 52,109,207, 6, 96,115, 14,164, 93,179,159,216, 3,213,162, 89,179,
-102,230,234, 56,125,124,124,190,205,207,207,239,231,200, 19,232, 34,168, 42, 69, 86, 86, 86,191, 22, 45, 90,124, 91, 82, 82,242,
- 66, 21,226,101,222,180,105,211,166,183,108,217,210, 97, 5,178,103, 65, 40,123, 85, 42,149,152, 58,117,170,243, 55,108, 54, 27,
-142, 30, 61, 58,109,252,248,241, 40, 42, 42,154, 81,205,181, 71, 4, 5, 5, 17,246,132,226, 85, 98,238,220,185,152, 59,119, 46,
-190,249,230, 27,130,205,102, 75,107,168,207, 58,225,252,187,180, 72,109, 44, 88, 53, 68,134, 63,136,242,225, 29, 14, 62, 34,180,
-254, 14, 80,108,222,127, 59,116,237,215,123,234,244,217,162,109,191,156,192,205,235, 87,144,150,244, 83,185,115,218,191, 48, 30,
-185,202, 18,140,159,242,190,152,160, 88,189, 19,143,237,253,175,197,168,255,222, 77,107,150, 60,130,199,125,167,115,199,104,118,
-150,224, 38,130,253, 4,232,222,174, 49, 59,252,215, 63,223,209,193,250,245,245,178, 85, 50, 30,137,172,245,175,191,142, 30, 22,
- 11,130, 40, 10, 20, 65,128, 2, 64, 18, 4, 12, 70, 35, 46,140, 25,131,142,155, 55,227,243,253,251,133,243, 94,122,201, 35,177,
- 37, 18,137, 46, 17, 4,225,167,213,106, 7,161, 44,177,244,179,128, 22, 98,177,248, 32,195, 48, 69, 58,157,174,237, 83, 84, 46,
- 5,202,230,232, 43,142,142, 57, 40, 91, 81,229, 81,102, 97, 30,143,247,230,176, 97,195,150,175, 90,181, 74,152,151,151,135,236,
-236,108,208, 52, 13, 62,159,143,168,168, 40,226,216,177, 99,254,179,103,207, 94,118,240,224, 65, 94, 73, 73,201,215,158, 12,108,
-216,108,118,188, 76, 38,123, 81, 46,151,139,242,243,243, 75,213,106,245, 81,163,209,248, 38,106,159, 54,133,100,179,217,163, 35,
- 35, 35, 95, 9, 9, 9,145,103,101,101, 41, 51, 51, 51,247, 25,141,198, 31, 80,203, 68,205, 46,117,218, 26,246,104,245, 0,114,
- 34, 35, 35,175, 61,120,240, 32,191, 14, 57,179, 35, 35, 35, 83,107,193, 41, 2,176, 29, 64, 72, 13,231,101, 3, 24, 1, 15,173,
-217,206,138,101,108,135, 22,172, 88, 63, 33,110, 92,119,226,251, 25,253,162, 38,127,115,236, 12,201, 97,122, 94,207, 49,100,120,
- 53,148,123, 34,203,158,210,170,162,160,170,238, 88,181, 48, 26,141,129,102,179, 25,236, 42,146,197,235,116, 58,248,248,248, 4,
-186, 91, 72,129, 64,128,159,126,250, 9,108, 54, 27,108, 54, 27, 69, 69, 69, 8, 11, 11,115,238,115, 56, 28,231,251,122,245,234,
-213,200, 71,211,116, 71,138,162,160,213,106, 65,211,180,115, 83,171,213, 96, 24, 6, 60, 30, 15, 52, 93,150,206,201,229,120,199,
-170,248, 8,130, 24, 30, 18, 18,130,109,219,182,193,100, 50, 61,114, 92, 34,145,224,234,213,191,146,140, 80, 20,133, 78,157, 58,
-145, 4, 65, 12, 7, 48,163, 26, 94, 6, 0, 98, 99, 99, 65, 81, 20, 40,138, 2, 73,146,206,247,142,141,166,105,204,157, 59, 23,
- 21, 82,147,253,109,156, 79, 27,106,136, 12,159,131, 42,124,180,200, 39, 92, 46,215, 37,158, 33, 66,145,228,139,183,222,125, 95,
-124,240,143, 63,145,158,145,254,136,200, 2,128,139,191,253,128,156,236, 44,164,164,101, 98,244,150, 61, 49, 16, 0, 0, 29, 44,
- 73, 68, 65, 84,127,223, 22, 75, 36,210, 47, 42, 52,168, 85, 46, 27,245,245,225,124,249,225,136,238,124,173, 37, 27, 37,126, 0,
-213,144, 11,182, 80,135,217,131, 91,243, 36, 62,156,165,238,148,147,199,229,254,182,248,216, 49,167,200,234,102, 52,130, 71,211,
-176,210,180, 83,100,153,172, 86,232, 77, 38, 40,180, 90,220, 25, 63, 30,140,197,130, 79,246,236, 17,242,184,220,223,220, 41, 39,
- 0,112, 56, 28,197,190,125,251,234,181,106,213,234, 36,220, 15,102,122,236, 9,255, 71,213,161, 93,155, 54,109, 18, 54,111,222,
- 92,143,195,225, 40,234,130,147,207,231,191, 38, 18,137, 10,248,124,254,107,181, 44, 39, 9, 96,193,132, 9, 19,146, 27, 53,106,
-116,194, 46,172,156,162,166, 81,163, 70,199, 38, 76,152,112, 9,192,220, 42,238,245,202, 56, 67, 67, 66, 66, 22,174, 90,181, 74,
-120,235,214, 45,100,101,101,193, 98,177, 96,212,168, 81,160,105, 26,122,189, 30, 38,147, 9, 75,150, 44, 17,249,251,251,207, 65,
- 89,162, 96,119,174,157,227,235,235,123,107,211,166, 77,195,238,223,191, 47, 62,113,226, 4,113,245,234, 85,209,178,101,203,134,
-248,251,251,223, 4,192,171, 69,125,146, 10,133,226,251,189,123,247,190,117,245,234,213,176,221,187,119,179,207,158, 61,171, 88,
-187,118,237, 68,133, 66,177, 25, 0, 85,203,255,168,173, 80, 40,236, 59,107,214, 44,219,233,211,167,179, 78,159, 62,157,181,124,
-249,114,244,232,209,163, 91, 92, 92, 92, 76, 45, 57,219,249,248,248, 60, 55,107,214, 44, 91, 98, 98, 98,246,185,115,231, 50,151,
- 45, 91, 70, 62,247,220,115,221, 23, 46, 92,216,218, 67,206,237,167, 79,159,238,149,145,145,209, 32, 51, 51,179,126,102,102,102,
-100,102,102,102,100, 86, 86, 86, 68, 78, 78, 78,189,220,220,220,240,252,252,252,240,132,132,132,238, 0,182,186,195,217, 84, 46,
-122,107,198,168,126,165,115,254, 59,144,249,232,141,231,153,217,163,122, 49, 47,246,108,245, 11,197, 98, 17,231, 82,211, 17,230,
- 11,252, 48,181, 67, 68,120,128,232,106,180, 76,220,228, 41,123, 54,159, 54, 78,150, 67, 72,169, 84, 42, 28, 60,120, 16,118,235,
- 85, 91, 87,145, 85, 92, 92,140,156,156, 28,199, 49,150, 59,229,148, 72, 36,199,215,175, 95,207, 24, 12, 6,104, 52, 26,228,231,
-231, 35, 35, 35, 3,119,238,220, 65, 97, 97, 33,110,220,184, 1,161, 80,120,220,157,114, 18, 4, 1,154,166,157, 66,234,232,209,
-163,152, 48, 97, 2, 84, 42,149,243, 51, 22,139,229,124,239,248, 78, 77,156, 14,203, 19, 77,211, 56,119,238, 28, 38, 77,154,132,
-229,203,151, 99,235,214,173, 56,112,224, 0, 84, 42,149, 83,108, 89,173,214, 26, 57,149, 74, 37,108, 54,247,198, 76, 12,195, 64,
-163,209,184,253,191,187, 10, 32, 22,139,245,136, 40,114,108,158,220, 75,143,201,249,212,194,141,200,240, 85,143,176, 29,111,236,
-166,186,222, 79,170,144, 36,139, 51,122,248,184,105,254,153,249,197,200,202,211,128, 34,255,234,247, 98,250,141, 3,139, 34,113,
-254,215, 50,195, 21, 73, 81,208,232,140, 80,107,205, 24, 54,110,186,236,187,229,159,141,182,154, 13,213,198,120,105, 9, 68, 69,
-139,197,175,182,104, 81,143,188,206, 75, 67,204,139, 73,160,109, 0,147,248, 18,218, 22, 5, 81,205,126,227,190,170, 43, 49, 47,
-188, 10,220,170,214,154, 33,149, 10,252, 90,183, 70, 92, 72, 8,122, 90, 44,224, 48, 12,158,207,203,195,149,233,211, 97,220,181,
- 11, 36, 0,206,107,175,161,207,138, 21,248, 35, 36, 4,193,122, 61,212, 51,103, 34,240,200, 17,112, 36, 18, 1, 10,220, 91,252,
- 64, 16, 4,122,247,238,141, 99,199,142,249, 15, 24, 48,224,215, 63,255,252,115,168,213,106,253,163, 54,117,235,235,235,123,145,
-197, 98,133,213,116,158,213,106,205,212,104, 52, 30,167, 25, 97,177, 88, 61, 59,117,234,180,103,247,238,221,126,102,179,185, 78,
- 70, 33, 92, 46,119,192,144, 33, 67,214,175, 89,179, 70, 50,113,226,196,245, 7, 14, 28, 40, 53,153, 76, 71, 60,185,165, 0, 44,
- 88,183,110,221,228,216,216, 88,233,196,137, 19,153, 59,119,238,184, 90,175, 2,123,244,232,209,104,253,250,245,193, 29, 58,116,
-152, 54,105,210, 36, 14,128, 79,106,178,242,136,197,226, 41,235,215,175, 15, 80, 42,149,208,106,181,206, 70, 54, 51, 51, 19, 2,
-129, 0, 36, 73,130, 36, 73,176,217,108,124,241,197, 23,254, 83,166, 76,153,174, 82,169,166,187, 97, 37,139, 95,189,122,117,224,
- 11, 47,188, 64,222,191,127, 31, 36, 73,130,207,231,227,245,215, 95, 39,245,122,189, 95, 92, 92,220, 70,157, 78, 55,210,147, 58,
-100,179,217,163,227,227,227,155,116,235,214,141,149,150,150,134, 46, 93,186,224,252,249,243,120,237,181,215,216, 37, 37, 37,245,
-103,207,158, 61,193,104, 52,122, 26,199, 69, 33, 20, 10, 91,254,254,251,239, 25,225,225,225,206,134,165,126,253,250,244,160, 65,
-131, 84,105,105,105, 77, 79,159, 62, 93,216,181,107, 87, 79, 18,150,135, 10,133,194,102,135, 14, 29,202,137,139,139,235,187,110,
-221,186, 33, 0,208,177, 99,199,125,243,231,207, 63,161, 82,169,162,255,248,227, 15, 85,207,158, 61, 51,221,228, 11, 81, 40, 20,
-244,212,169, 83,197,213,157,180, 97,195, 6, 53,202, 18, 46, 55, 0, 80,109,190,182,166,145,193,115,150, 78, 31, 46, 0,109, 6,
- 99,209, 3,230, 82,192,172,133,205, 84, 10,130, 35, 0, 44,122, 4,242, 84,216, 62,165,169,228,131,109,119,175,211, 55,136, 65,
-105,202,146, 35,240,162,210,166, 6, 64, 12, 65, 16, 41, 7, 15, 30, 68,167, 78,157,112,240,224, 65, 12, 26, 52, 40,197, 85, 12,
- 92,189,122, 21, 61,123,246,132,221,162,229,150,175,150, 70,163,249,112,238,220,185,137,163, 71,143, 22,150,107, 12, 72, 18, 82,
-169, 20, 3, 7, 14, 52,232,116,186, 15,221, 45, 40, 77,211, 96,177, 88,200,204,204,196,134, 13, 27,176,104,209, 34, 68, 69, 69,
-193, 98,177, 60, 34,182,236,237,158, 91,141,159,213,106,197,133, 11, 23,176,101,243,102,124, 50,103, 14,124,124,124, 0, 0,102,
-179, 25,170,162, 34,240,249,124,167, 24,171, 65, 56,237,184,125,251,246,244,176,176,176,114, 83,134,142, 87,123,155, 5,155,205,
- 6,171,213, 10,131,193,128,229,203,151, 91, 25,134,217, 81, 83,255,227, 16, 69,211,167, 79,135,209,248,151, 65,189,181,221, 39,
- 57, 50, 50, 18,109,218,180,113,238,147, 36,201,184,203,249, 93,215,150,208,187,156,221,116,238, 50, 0, 64, 88, 88, 24,154, 54,
-109, 10,133, 66, 81, 37,231,147,214, 34,181,129, 7,145,225,171, 22, 90,127, 71,166,108, 54,135,223,167, 97,227, 38, 68,122,142,
- 10, 44, 22, 11, 34,223, 0,116,125,101, 6, 40,138,132, 88, 26, 0,130,214,255,165,136, 73, 10, 44,138, 5, 85,137, 30,145, 13,
- 26,147, 60,190,160,143,174, 6,161, 37,241,101,175,158, 53,178, 43,191,208,154, 9, 65, 61, 62,104, 71,119, 26,194, 5,233, 95,
-130,247, 6, 68, 9, 98,247,253,185, 26, 26,203,115,238,148,151,178, 90, 17, 68, 81, 48, 51, 12,174, 76,159,142,152,248,120,164,
- 56,132, 97,124, 60, 82, 98, 99, 33, 99,179,193, 35, 73, 48, 22,203, 35,115,250,238, 8, 45, 0,200,200,200,192,174, 93,187,100,
-195,135, 15,223,115,245,234,213,209, 30,138, 13, 7, 87,192,185,115,231,130, 26, 52,104, 80,229, 57,247,238,221, 67,251,246,237,
- 61,158,158,226,114,185, 3,158,123,238,185,109,187,118,237,242, 77, 77, 77, 69, 80, 80,208, 99, 11, 45, 30,143,215,179, 95,191,
-126,219, 54,109,218, 36, 41, 40, 40, 64,124,124,188,228,165,151, 94,218,154,156,156,252,138,209,104,116, 71,108,150, 19, 89,241,
-241,241,234, 13, 27, 54,124,135,242, 83,132, 57, 27, 54,108,248,190, 67,135, 14,111,197,198,198, 74, 1, 76,182,251, 14, 84, 43,
-182,120, 60, 94,239,134, 13, 27,150, 27,213,242,120,101,198, 38,145, 72, 4, 95, 95, 95,112, 56, 28, 24,141, 70,196,196,196, 16,
- 92, 46,183,187, 59,215,236,227,227,211,239,213, 87, 95, 37,147,146,146,144,155,155, 11,169, 84, 10,177, 88, 12,154,166, 49,113,
-226, 68,106,249,242,229,189,117, 58,207,102,184,194,195,195,135,244,237,219,151,117,237,218, 53,220,191,127, 31, 70,163, 17, 55,
-111,222,132, 68, 34,193, 27,111,188,193, 89,186,116,233, 75, 89, 89, 89,158, 10,173,150,177,177,177,121,174, 34,203, 1,145, 72,
- 68, 52,105,210, 68,229,239,239,223, 14,128, 39, 66,171,229,219,111,191,157,191,120,241,226,158,199,142, 29,115, 6,189, 60,118,
-236,216,108, 0,248,250,235,175, 19, 3, 3, 3,219, 1,112, 87,104,129, 97, 24,219,127,254,243,159,135, 92, 46, 23,108, 54, 27,
- 92, 46,183,220,198,225,112, 64,146,164,143,227,113,174,137,239,250,253,220, 37, 19,103, 47, 91, 38,226, 83,236,119, 95,105,133,
-122, 82, 14, 32,144,129,211,243, 3, 16,210, 50,163, 37,163,186, 7,252,246, 1,190,122, 85, 69,198,254,104,248,197, 76,251, 5,
-222, 45, 42, 42,249,135,251,128, 14, 0,254,135,178,228,186,115, 0,156,123, 74,250,166, 75, 0, 98, 6, 13, 26,228, 20, 91,135,
- 15, 31,198,128, 1, 3,160, 86,171,113,237,218, 53, 87,145,229, 73,130,229, 75, 22,139,229,242, 79, 63,253,212,117,248,240,225,
-132,203,243,133,212,212, 84,220,184,113, 35,197, 93, 62,146, 36, 97,179,217,192,102,179,177,108,217, 50,152,205,102,252,248,227,
-143,216,185,115, 39, 72,146, 4, 65, 16, 32, 8, 2, 18,137, 4,223,124,243,141, 71,237, 30, 77,211,216,184,113, 35, 62,152, 61,
-219, 41,178,236, 51, 25, 8,150,203,225, 31, 16,128,187,119,239,214, 40,180,138,138,138, 62,223,191,127, 63,170,115,134,223,191,
-127,191,243,125, 5,103,248,154,251, 57,138,130,209,104,196,243,207,255,149, 42,246,237,183,223,118,190, 87,169, 84,160, 40,202,
- 81, 23,132,187,156,122, 6,120,133,255,215,103, 3,223,123,175,156,133,174, 42,206,191, 67,139,212,149,117,171, 18,177, 21, 99,
-183,206, 42, 0, 12, 66,153,143, 86, 14,240, 55,250,104, 49,140,173, 89, 88,104, 8, 46,223,185, 10, 22, 69,129,235, 27, 0, 95,
-153, 28, 54,171, 9,154,252,251, 56,185,251, 91, 0,192,186,141, 59, 64,146, 36, 88, 44, 10, 70, 19,141,168,122, 33,176,217,108,
-205,170,227,110, 14,116,237, 45, 15,232, 20, 30, 33, 37,174,249,221, 71,147, 32,255, 10, 19, 33, 60, 68,101,139,137, 46, 98, 65,
-199, 34, 77,113,215,235,192,233, 26,197, 0, 73,130, 36, 8, 8, 57, 28, 24,119,237, 42,243,218,140, 47,235,179, 82, 98, 99, 65,
-254,242, 11,124,120, 60, 80, 4, 1,150,221, 4, 93, 27, 20, 23, 23,131, 32, 8,108,217,178,197,239,141, 55,222,216,122,237,218,
-181, 88,131,193,176,203, 19, 14,181, 90, 61,168, 91,183,110, 39, 54,110,220, 24, 24, 28, 28,252,200,241,220,220, 92,140, 27, 55,
-174, 64,173, 86,123, 20,212,141,207,231,191, 54,100,200,144,245, 63,252,240,131,228,246,237,219,208,106,181, 8, 12, 12,124,220,
- 91,161, 93,231,206,157,247,236,218,181,203, 55, 55, 55, 23, 26,141, 6, 70,163, 17, 91,182,108,145, 14, 28, 56,112, 87, 90, 90,
-218, 0, 0,201, 53,112,124,234, 42,178, 38, 77,154,244, 39,128, 32, 0,171, 43,106, 80,251,177, 86, 46, 98, 75, 3, 96,105, 53,
- 35,209, 8,145, 72,132,252,252,124,140, 27, 55, 14,183,110,253,101, 0, 13, 9, 9,113,142,244,238,222,189,139,192,192, 64, 16,
- 4, 17,228,206, 69, 7, 6, 6,138, 77, 38, 19, 38, 76,152,128,140,140,140,114,156,153,153,153, 32, 8, 66,232,105, 69,202,229,
-114,185, 94,175, 71,143, 30, 61, 96, 48,148,229,245, 29, 49, 98, 4,216,108, 54,242,243,243,193,102,179, 3,106,241,255, 4, 12,
- 26, 52,168,202,208, 42, 18,137,196,236,231,231,215,220, 67, 78,255,151, 94,122, 41, 43, 62, 62,254,145,133, 45,231,207,159,127,
- 89, 38,147, 29,147,201,100, 77, 60,228,180,185,138, 42, 14,135, 83, 78,104,177,217,108,144, 36,233,182,143,218,173,124,221, 42,
- 22,145,211,102,241,212, 23,198,213, 11,242, 5,163,205, 3,231,185,207,113,185, 64,128,101,203, 15, 1, 0,222,127,189, 61, 90,
-247, 91, 0,211, 15, 47, 96,122, 23,138, 59, 38,211, 56, 11,192,167,255,112,155,255, 37, 0,199, 42,184, 53, 0,218, 60, 69,253,
-145, 83,108, 29, 62,124, 24,209,209,209, 40, 42, 42, 66, 90, 90, 90,109, 69,150,163,189,251, 96,222,188,121,191, 13, 29, 58, 84,
-228, 24,180, 10, 4, 2,204,156, 57, 83,175,213,106, 63,240,232, 38,178,217,192, 98,177,156,131,100, 62,159,143,152,152, 24,167,
-200, 34, 8, 2,165,165,165, 96,177, 88,142, 21,137,132,155,101,132, 34, 56, 24, 62, 62, 62,104, 28, 21,133,219,246,118,196,241,
-158,199,227,129, 32, 8, 88,173, 53, 26,242, 74,236, 78,237, 51,234,186, 75,118,136,162,106, 77,199, 33, 33,176,217,108, 14,145,
-201,212, 5,103, 64, 64, 0,180, 90,173,187,156, 79, 37,170,176,104, 57,132,214, 32,148,249,106, 61, 18,222,161, 23,128,147,120,
-130, 75, 42, 9, 48,132,141, 97,192,162, 72,251,220, 45, 5,138, 34,161, 42,200,193,138,207, 39,219, 69,214, 78, 28, 76, 76, 67,
- 88,195,232,191,230,113, 9, 2, 96,170,191,185, 3,125, 57,241, 83,134,118, 22,228, 17, 57,144,134, 8,193,231, 87,208,143,126,
- 28, 16,145, 36,166,246, 14, 19, 94,216,111,136,191,174, 49,215,216, 81,240, 73,178,204,249,157, 32, 42,117,238, 33,237,199, 40,
-130, 40,139,254,106,243,204,239,216, 33,228, 5, 2, 1,204,102, 51, 40,138,194,202,149, 43,165,253,250,245, 91,237,169,208, 2,
-144,154,151,151, 55,112,226,196,137,135,119,236,216, 17, 16, 16, 16, 80,110,244, 48,113,226, 68,101, 94, 94,222, 64,120,232,116,
-207,102,179, 87,175, 89,179, 70,242,224,193, 3,148,150,150, 66, 32, 16, 56, 27,159,218,222,159, 29, 59,118,252,245,200,145, 35,
-126, 26,141, 6,102,179, 25, 2,129, 0, 12,195,128,162, 40,252,252,243,207,254,131, 7, 15, 62,148,158,158,254, 92,117,101, 21,
- 8, 4,175,216,133, 19, 98, 99, 99,165,177,177,177,189,128, 42, 35,245, 58, 17, 27, 27, 43,157, 49, 99,198, 75,122,189,126,105,
- 53,215,156,161, 82,169,130, 5, 2, 1,118,239,222, 13,177, 88, 12,161, 80,136,144,144, 16,168, 84, 42, 8,133, 66, 48, 12, 3,
-139,197,226,104, 44, 10,221,185,240,130,130, 2,173,213,106,245, 61,124,248, 48, 10, 11,255,250, 74,189,122,245,160, 86,171, 97,
-179,217, 74, 61,173,204,236,236,236, 60,130, 32,194, 47, 95,190,140, 7, 15, 30, 96,192,128, 1,248,229,151, 95,208,190,125,217,
-236,176,201,100,170, 77, 16, 63,154,162, 40,166,154,251,150, 0,224, 87,151,156,246,206,203, 35, 78,155,205,102,115,136, 44,215,
- 87, 87,241, 85,195,111,150,123,156,155,203,197, 27, 22, 79,233, 59,238,133,232, 0,232, 11,238,131,239, 19, 0, 66, 26,137,101,
-203, 15,225,218,189,178,255,107,217,214,139,216, 22, 55, 16, 16,200,208,212, 87,137, 96, 31,214,171, 55,242,255,113,161,229,235,
- 58, 78,120, 90, 59,166, 1, 3, 6, 64,165, 82, 65, 44, 22,215,133,127,206, 25,189, 94,127,115,239,222,189,237, 6, 13, 26, 4,
- 46,151,139,155, 55,111, 34, 57, 57, 57, 13,192, 25, 79,133, 22,155,205,198,188,121,243, 48,121,242,100,200,229,114,124,240,193,
- 7, 96,177, 88,206,141, 32, 8,167,133,203, 19, 4,201,171, 95,248,232,112,136,175,201, 24,238,235,235, 59,143, 36,201,225,148,
- 27, 21, 71,211, 52,109,179,217,118,104, 52,154,106,195, 59, 56, 28,215,221,249, 47, 92,235,160,134, 62,237,177, 57,255, 14, 45,
- 82, 27, 84, 92,109, 88,133, 69,203,177,234,240,145, 84, 64,142,171, 60,105, 55,217,157,124, 82, 5, 37, 72,234, 70,102, 86, 54,
-252,253,196,118,145,101,223, 72, 18,173,163,203, 6,179, 7, 19,211, 16,214, 32, 26, 44,138, 2,139,162, 32, 22,240,144,151,155,
- 3, 22,139,188, 81, 21,111, 75, 10, 67,135, 54, 9,143,244,243,103, 67, 25,104,130, 66, 94,133, 97,160,157, 15,194, 20, 92,244,
-247,231, 71,180,164, 48,180,122,235, 27,227, 20, 90,102,171, 21,156,215, 94,115, 78, 23,166,196,198, 34, 38, 62, 30,244,144, 33,
-208,153,205,229, 76,197,181, 21, 90, 2,129, 0, 37, 37, 37, 24, 61,122,180,202, 98,177,188, 85,203, 42, 78, 46, 44, 44, 28, 54,
-102,204,152, 66,135,128, 49,155,205, 24, 51,102, 76, 97, 97, 97,225, 48, 55,172, 68,143,192, 98,177,188,213,190,125,123,149, 82,
-169,116,150,179, 54, 13,142, 3, 50,153,236,224,134, 13, 27,100, 70,163, 17, 86,171,213,201, 41, 16, 8, 64, 81, 20, 2, 3, 3,
-177,109,219,182, 64,153, 76, 86,109,206, 42,189, 94,191, 55, 62, 62, 94, 13, 0,241,241,241,106,130, 32, 18, 8,130, 88, 75, 16,
-196,154, 10,219, 90,130, 32, 18, 92,207,213,235,245,123,170,227, 54,153, 76, 9,105,105,105,140, 80, 40, 4, 69, 81, 48,155,205,
-224,243,249, 78,147,120,113,113, 49,244,250,178,105,238,228,228,100, 88, 44,150, 36,119,174,189,164,164,228,248,198,141, 27,109,
-245,234,213, 67,116,116, 52, 98, 98, 98,208,185,115,103, 68, 68, 68, 96,254,252,249,180, 78,167,243,248,217,203,206,206, 62,184,
-125,251,118, 75,120,120, 56,218,181,107, 7, 30,143,135,214,173, 91, 35, 36, 36, 4,139, 22, 45, 50,105, 52,154,195,181,248,155,
-210,175, 94,189, 74, 85, 35,114, 37,112, 99,245,110, 5,100, 92,184,112,129,234,220,185,243,190,138, 7, 58,118,236,184, 79, 44,
- 22,251, 58, 76,236,158,140,200, 93,197, 21,143,199,115,110,142,207, 89, 44,150, 59,163, 31,178,185, 92,188,225,139,201,125,198,
-189, 16,237,135,125,199,207,129, 99, 86, 3,166,106,102, 4,105, 11, 8,142, 8,114, 95,118,216, 83,208, 7, 76, 7,240, 39,202,
-226, 48,125,128,167, 11, 78,199,247,194,194, 66,164,165,165, 33, 57, 57, 25,157, 59,119, 70, 82, 82, 18,240,151,131,188,199,208,
-104, 52, 31,196,197,197,233, 28, 43,249,230,204,153,163, 47, 41, 41,249,192,211, 54,152, 97, 24,176,217,108, 52,109,218, 20, 51,
-102,204,192,161, 67,135,112,243,230, 77, 88, 44, 22,167, 16,114,248,100,122, 98,209,226,112, 56,144,203,229,176, 88, 44, 78,107,
- 22, 0,220,190,117, 11, 44, 22, 11, 54,155, 13, 38,147,169, 70,139,150,175,175,239,188,245,235,215, 79, 83, 42,149,138,130,130,
-130, 32,215, 45, 47, 47, 47, 40, 39, 39, 39, 40, 43, 43, 43, 40, 35, 35, 35,232,225,195,135, 65,247,239,223, 87, 44, 89,178,100,
-154,175,175,239, 60,119,202, 73, 81, 20, 90,183,110,141,183,223,126,219,185,173, 90,181,202,185,157, 60,121,210, 99,231,117,138,
-162,208,116,238, 50, 12, 44, 96,156,219,161, 64,194,185, 93,123,127, 82,117,156, 79, 92,139,212, 74,191,216, 87, 27,186, 38,150,
-174, 4,142, 85,135,142,182,204,233,182, 81,209, 25,254,137,193,106, 50,156,184,119,231, 86,159,166, 45, 59,144,185, 74,109,185,
-229,159, 49,189,135,129, 32, 8,132, 54,136, 6,197, 98,129,162, 72,176, 40, 10, 82, 9, 31,105,151, 47,219,140,122,253,137,202,
- 56,123, 1, 44,174,128,187,234,245,254,173,249,217,220,124, 4, 42, 68,224,176,203,180, 35,115,111, 88,133, 30,130, 5,180,244,
-193,248, 44,127,193,137, 60,195, 42, 63,157,121, 95, 66, 21, 35, 64,155,205, 6, 49,143, 7,131,209, 8,189,213,138,222, 43, 86,
- 56,167, 11, 73,130,192, 37, 0,173, 86,172,192,233, 93,187, 32,225,114, 1, 30,207,237, 85, 33,149, 9, 45,165, 82,137,177, 99,
-199, 22,230,228,228,188, 81, 27, 31, 45, 7,140, 70,227, 31,185,185,185,111, 12, 27, 54,108,203,238,221,187,101,195,134, 13, 83,
-229,230,230,190,225,166,223,211, 35, 48, 24, 12,187, 50, 50, 50, 74,199,142, 29,187,121,235,214,173,254, 1, 1, 1,206,145, 72,
-173,110, 86,130, 80,246,237,219,151,231,206,121, 53,156, 18,103,119,110,159,108,183,108,181,154, 52,105,210,105,148,249, 95,185,
- 98,238,186,117,235, 70,184, 76, 49,174, 5,176,162, 58,226,226,226,226, 53, 51,102,204,248,239, 31,127,252, 17,192,231,243, 65,
- 16, 4, 56, 28, 14, 26, 55,110,236, 92, 69,195,102,179,193, 48, 12,222,123,239, 61,101,126,126,254,215,110,254, 55,147,226,226,
-226,122, 26, 12, 6,191,177, 99,199, 82,124, 62, 31,121,121,121, 88,190,124, 57,253,195, 15, 63,168,117, 58,221,184, 90, 8,225,
-141,159,125,246, 89,111,173, 86,219, 96,226,196,137, 28,141, 70, 3,189, 94,143, 89,179,102,153,190,255,254,251, 76,189, 94,239,
-113,192,223, 46, 93,186,220,121,248,240, 97,247,210,210,210, 34,161, 80, 88,209,218, 71,136, 68,162, 14, 0, 54,123,194, 25, 19,
- 19,115, 55, 61, 61,189,243,130, 5, 11, 18, 44, 22, 11,251,252,249,243, 78,103,248,149, 43, 87,158,228,243,249,125, 81,197,178,
-232,106,238, 17, 27,143,199, 43,103,193,170,248,158,197, 98,213,216,166, 53, 11, 22, 46,248,226,205,158,227,158,111,238,139,189,
-199, 47, 34,110,207,189, 27, 81,227, 2,155, 54,242, 43,128,173, 32, 13,239,191,222, 30,203,182, 94, 4, 80, 54,117,104,203,191,
- 6,166,232, 46, 24,159,112,220, 87, 41,179,159,130, 62,224, 36,202, 66,102, 60,109, 40, 39,178,174, 93,187,134, 62,125,250, 0,
- 0,146,146,146,208,173, 91, 55, 36, 37, 37,161,123,247,238, 30,199,210,178,227,247,226,226,226,135, 39, 79,158,108, 17, 30, 30,
-142, 51,103,206,220, 7,240,187,167,133,116, 8, 45, 22,139,133, 81,163, 70,161, 95,191,126,168, 87,175, 94,185,213,134,142,247,
-158,136, 13,171,213,138,150, 45, 91,194,104, 50,129,195,225, 56,167, 38, 89, 44, 22, 2,131,130,112,231,206, 29,183, 44, 90, 36,
- 73, 14,127,229,149, 87,200,212,212, 84,140, 28, 57, 18, 91,182,108,169,242,220, 49, 99,198,224,167,159,126,194, 43,175,188, 66,
-126,244,209, 71,213,134,119,112, 56,161,187,115, 77,142,126,186,166,118,191,174, 56,159,180, 22,121, 28,184,132,118,168,116,210,
-164,146,207,226,203, 9, 45,151, 32, 97, 79, 70,104, 89,205, 91,126,249,241,219, 25,157, 87,119, 15, 84, 4,249, 66,165,209, 59,
-197, 86,202,201,157, 0,128,161,147, 22,130, 69,149, 77, 41, 74,196,124, 8, 56, 20,118,109,250, 90,105, 54, 27, 42,189,187, 74,
-216,228,228,143,186, 54,246,229,138, 44, 40, 14,102, 16, 29,248, 87,166, 28,162,193,206, 71, 5, 87, 91, 63, 4, 92, 43,194,235,
-141,196,146,175, 83,213,147, 97,177,173,122,164, 67, 84,171,245,234,203,151, 5, 3,214,175,199,249, 55,222, 64, 40, 77, 35, 33,
- 36, 4, 50, 54, 27,190, 60, 30, 72,130,128,254,192, 1,156,222,189, 27,114, 30, 15,240,241,129,117,254,124, 24,211,210, 96, 41,
- 41,209,215, 98,100,134, 17, 35, 70, 40,149, 74,229, 48,147,201,244,199,227,214,179, 94,175, 63,146,145,145, 49,185, 75,151, 46,
-171, 45, 22,203, 91,122,189,254,177, 86, 70,153, 76,166, 35,185,185,185,175,141, 24, 49, 98,231,158, 61,123, 2,164, 82,105,173,
-185, 10, 11, 11,219,215,209,237,100, 3,240,137,221,185,125,114,108,108,172,244,194,133, 11,255,221,176, 97,195,106,151,209, 68,
-208,132, 9, 19,222,172, 32,178,106, 92,117, 8, 32, 61, 63, 63,127,254,204,153, 51, 23,126,245,213, 87, 98,135,227,251,149, 43,
- 87, 96,181, 90,193,102,179, 65,211, 52, 38, 76,152,160, 45, 44, 44, 92,134,170, 35, 58, 63,114,107, 21, 23, 23, 55, 94,176, 96,
-193,134, 21, 43, 86,244,163, 40, 74, 68,211,180,174,180,180, 52,193, 96, 48,140, 67,237,226,104,217, 10, 10, 10,198,126,250,233,
-167, 99,151, 47, 95,254, 10, 73,146, 65, 86,171, 85, 89, 82, 82,178, 95,175,215,127,143, 90, 76, 37,157, 57,115,166,224,245,215,
- 95,191, 87, 80, 80,208, 44, 44, 44, 76, 35, 22,139, 77, 38,147,137, 18, 8, 4, 18,145, 72, 20, 3,224, 12, 65, 16,215, 61,225,
- 76, 73, 73,201,157, 56,113,226, 3,163,209,216,116,237,218,181,137, 18,137,228, 56, 65, 16, 4,135,195,241, 19, 8, 4,125, 0,
- 36, 16, 4,113,219, 19, 78,146, 36,109,174,214,171,138,254, 89, 92, 46,215, 45, 31,173, 6,129,194,241,253, 26,179,176,247,196,
- 69,196,237, 77,223, 72, 51,204,238,221, 41, 69, 7, 62,232, 6,152,119,188,142,214,195, 54,151, 77, 23, 2,176,229, 95,131,121,
-199, 24, 16,194, 0, 36,102,177,161,209,155, 15,194,139,202,224, 12,239,160, 84, 42,145,154,154,234, 16, 89, 49, 0,208,189,123,
-247, 20,135,216, 74, 78, 78, 70,187,118,237, 82, 0,176, 61,189, 95,139,139,139,103,142, 30, 61,250,136,125,112, 60,179, 22, 3,
- 63,167,208,114, 8,170,122,245,234, 57,247, 93, 55, 23, 31, 45,183, 64,211, 52, 56, 28, 14, 88, 44, 22, 20, 33, 33,206,223, 98,
- 24, 6,119,238,220,129, 74,165,114, 75,104, 81, 20, 69, 17, 4,129,145, 35,221, 91,144,252,159,255,252, 7, 9, 9, 9,160,220,
- 84,133, 20, 69, 33, 50, 50,178,198,115, 28,186,212, 93,206,176,176,176, 90,115, 62,105, 45, 82, 91,129, 85,217,251,202, 68, 85,
- 85, 15,196,223,133,108,173, 86,243,201,166,245, 43,191,154, 48,229, 61,241,181,187,121,208,104,141,160, 40,210,181,241, 4,139,
- 69, 65, 34,226, 35, 60,216, 23, 91,191,251, 95, 73, 73,177,250, 83, 84,145,247,176,158, 15,103, 82,223, 14,141,120, 28,133, 14,
- 77, 91,141, 0,197,255, 75, 4, 48,185, 85,204, 14,118,251, 13, 47,166,235,248,191,164,235, 38, 93, 42, 50, 61, 42,180, 76,166,
- 23,230,244,239,255,107,220,161, 67,194,142, 27, 55,226,238,132, 9, 8,209,235,193,179, 79, 37,146, 4, 1, 49,135, 3, 49,135,
- 83, 38,178,150, 47,135,222,106,197,138, 55,222, 40, 53,154, 76,253, 61,121,200, 11, 11, 11, 49,100,200,144,130,236,236,236,129,
-168,197,212, 94, 85,208,233,116,187, 0,236,170, 43, 62,163,209,248, 71,102,102,230,139, 67,134, 12, 57,116,228,200,145,192,167,
- 36,200,156, 67,108,153, 47, 92,184,240,102, 98, 98,226, 93,148, 79, 44,170, 78, 76, 76,188, 59,113,226, 68, 98,195,134, 13,223,
- 3,248, 12,110, 6,240,212,233,116, 43,143, 30, 61,138,158, 61,123,126,182,120,241, 98,255,246,237,219, 35, 40, 40, 8, 37, 37,
- 37, 72, 78, 78,198,244,233,211, 85,197,197,197,139,213,106,245, 87, 30,150,217,108, 52, 26,199,184, 46,165,174,139,122, 48, 26,
-141, 63,228,228,228,252, 80, 87,132, 83,167, 78,189,114,231,206,157,194,192,192,192, 78, 28, 14,167, 21,202,252,128,114, 1,124,
-239,169, 32,114, 96,202,148, 41,151,239,220,185,163, 12, 13, 13,237,108,231,148,162, 44,141,209,250, 90,112,102, 95,188,120, 49,
-172, 67,135, 14, 36,155,205,102, 40,138, 2,155,205,102, 88, 44, 22, 99,247,171, 97, 0, 96,255,254,253, 60, 0,213,166,205,185,
-155,175, 95, 48,230,127,167, 62,186,158,107,216,157,150, 87, 58, 3, 0,179,227,154,240,183,214,129,212, 11, 47, 52,201,132, 49,
-190, 59, 8, 73, 89,160, 74, 70,155, 3, 66, 36, 71,166, 45, 20,115,247,221,200,181,130, 88,234,213, 84,149,143,171, 97, 15,239,
-144,147,147,227, 42,178, 28, 86,171,152,238,221,187,167,216, 69,150,227, 88,109,252,203,142,217,108,182,199,234,195, 24,134, 65,
- 92, 92, 28,214,173, 91,135,154, 34,154,219, 87,247, 17, 53,241, 57, 44, 90, 52, 77,195,108, 54,227,218,181,107,206,152, 93,142,
-233, 66, 71,104, 7,171,213, 90,237,106,117,154,166,105,147,201,132,159,127,254,217, 45,177,181,109,219, 54, 24, 12, 6,208, 53,
- 40, 56,215, 80, 12,109,218,180,129, 74,165,114, 46,246,137,137,249, 43, 84,158,217,108,246, 72,184, 58, 56,155, 54,109, 10,165,
- 82, 9,135,191,112,248, 27,127, 25,123,172, 58,221,191,245,190,175,210,162,245,183,247,152, 60,161,228, 72,251,174,253,186,189,
-241,230,116,145,214, 72,227,193,131,135, 40,200,207, 1, 73,144, 80,132,134, 33, 34, 34, 18, 2, 46,137, 45,241, 95,233, 82, 78,
- 31, 63,165, 45, 41, 26, 80, 21,215, 32,223,255,107,239,108, 98,219, 40,162, 56,254,223,117,252,145,164,117, 12,235,184,144,130,
-132,107, 75, 77,133, 64,168, 80, 33, 80, 36,108, 65, 64, 28, 16,135,208, 54, 7, 90,110,149,162, 34,144,122,171,132, 84,163,158,
- 56, 68, 37, 72,225, 16,113, 33,226,196, 33,135,170, 7,135, 15,149, 28, 40, 32, 4, 82, 32,253, 74, 85,197,170, 72,237, 56, 45,
-113,140,227, 38,246,122,135,131,189,210,118,179,235,122,227, 55,182, 55,218,191,180,202,135,162, 95,222,204,123, 35,191,153,217,
-121,227,249,249,194,123, 67,175, 68,163,126, 1,114, 25,168,148, 1,185, 12, 40,181,175,234,239,148,135, 99,110, 97, 97,141,157,
-253,243,254, 47,151,114, 37,195, 59,171,142, 2, 67,143, 73, 82, 50,113,241, 98,175, 82, 42,225,222,153, 51,232,149,101,116,215,
-102, 37,213,134,248, 32,159, 63, 95, 77,178, 78,156,216,200,173,173, 89,186,130,167,191,191,255,119, 65, 16,250,179,217,172,173,
- 42,195,135, 66,161, 75,140,177,213,213,213,213, 35, 29,100,215, 62, 0,107, 0, 74, 6, 19,137, 16,172,191,255,163, 42, 28, 10,
-133,206,138,162,248, 42, 99, 44, 40,138,226,191,138,162, 92, 89, 89, 89,249, 12,192, 45,231,243,180,109, 82, 43,195, 31,120,196,
-223,173, 0,248, 24,213,151,130,151, 26,133,191, 16, 8, 4, 54,189,229,153,119,159,243,197,143,189, 24, 64,228, 73, 63,220,158,
-110, 44,175,203,248,254,234, 58,190,186,156,190, 83, 44, 87,222,185,153,221,248,203,113, 69, 93,145, 95,193, 67, 41, 73,146,126,
- 77, 38,147, 71, 34,145,136,168,125,225, 93,173,149,167,110,111,117,117, 85,115,185,185,185, 57,121,116,116,244, 74, 38,147,121,
-205,140,233,247,251,103,231,231,231,223,204,229,114,219, 18, 42,109,165,120,245,231, 66,161,128,177,177,177,239,204,174,224, 9,
- 4, 2, 23,198,199,199, 63, 26, 25, 25, 17,213,114, 20,218, 71,189, 46, 72,125, 74,165, 18,166,167,167,149,137,137,137, 47,114,
-185,156,233,214,225,192,192,192,157,229,229,229,167,213, 82, 11,141, 20, 21, 13,135,195,119, 83,169,212,254, 86, 50,109,156,112,
- 77,105, 19,239,182, 44, 77,184,123,122, 78,251,247, 62,126,110,228,253, 15,131,225,232, 65,225,137,129,167, 32, 64, 68, 38,253,
- 15, 82,183,111,178,153,111, 38,239, 21,214,239,127, 90, 44, 22, 38,235,113,158, 5,162, 7,250, 60,223,122, 43, 24,132,154, 0,
-233,238,167,218, 54,227, 0, 80,114,139,215,151,242,229,227, 87,235,108,251,168,201,214, 39, 51, 51,189,222,193,193,109,133,226,
- 20, 69,193,230,181,107,248,252,228, 73,203, 73,150, 35, 71,142, 72, 20,193,163,107,100,149, 81,173,207,101,117,197, 68, 56,180,
-111,207,113, 6, 28, 19,161, 60, 47, 10,130, 87,102,184, 1,134,217,222,174,141, 47,255,184,139,162,211,253, 13,169, 99, 47,149,
- 6,176, 71,146,164, 31, 92, 46,215, 51,234,138,140,118,181,222,224, 66,233,165, 76, 38,243, 6,128,122, 39,132,163,126,191,127,
-178, 82,169,188,220,200,165,210, 46,151,235,183,124, 62,127, 26,117, 46,149,230,113,234, 48, 24, 12,222, 74,165, 82, 81,245, 20,
-181,246,179,210,232,100,249,226,226, 34, 98,177, 88, 42,157, 78,135, 91,201,236, 84,153,156, 58, 60,101,224,227,246,172,104,105,
-180,223,227,219,251,129,183,167,251,117,165, 44, 31,130, 0,116,185,221,215,183, 30, 20,127,220, 44,254,247, 53, 76,182, 11, 91,
-169,163,192,144,207,235,157,245,244,245,245, 24, 37,109,229,124,190,184,185,181,245,150,147,100, 57,114,228,200,145, 35, 27,105,
- 80,146,164,164,219,237,246,105,147, 73,253,247,170,100, 89,126,144,205,102,223, 6,112,163,197, 76, 91,203, 74, 17,243,135,100,
-241, 37,181,225, 70,153,181, 39,214,233, 76,142,109,103,132,204, 88,141,153,176,137,157,177, 78,101,170,237,181,192, 29,182, 18,
- 71, 84,253,169,177,147, 81,219,201,139, 73, 53,142, 12,236,100, 28,252,158,176,137,157,177, 78, 99,234,227,167, 65,174, 37,102,
-131, 49,101,213, 78, 70,109, 39, 47,102,179,227,168,142,157,172,217, 88, 50,241,125, 2, 54,212,194, 97,176,133,195, 96,127,191,
-100, 88,183,209,104, 69, 11,140, 49,107, 47,195,243, 58, 9,160,150,221,175,241,133, 78,101,106,251,129,242,170, 0, 14,215, 14,
- 92,166,102,234,250,147, 74,137,218, 9,147,159,208, 64,193, 81, 43,109,167,240,187,174,173, 36,220, 29, 36, 89,150,152, 84,113,
-207,155, 73, 53,150,244, 76,138,184, 55,242, 59, 71, 31, 81,217, 73, 50,150,120,196,188, 65,252, 52,205,213, 51, 41,198,146,158,
- 73, 17,247,173, 96, 82,140, 37, 35, 38, 69,220,155,249,222,174, 43, 84,234,118, 97,173,196,131,208, 64,178, 53, 5, 0,226, 78,
- 58,141,135,120, 92, 36, 73,157, 16,241, 74, 54, 45,172,192,180,157, 73,236,163, 68,141, 73, 57,187,137, 83,249,136, 71,188,107,
-153, 84,124, 61,135,194, 79, 70,204,102,237, 53,177,147,188,237,205,198,125,171,152,196, 62, 34, 25, 75, 58,102,156,120, 50, 16,
-215,252,156,160,100, 82,141, 37, 3, 59,155,246,147, 17,179, 89,123, 77,236, 36,111, 59,197,103, 8, 47,110, 59, 87,180,152,104,
- 26, 19, 83,186,167, 37,137, 70,219,182,228, 44,178,119, 21,211,226,246,204, 48, 7,223,183,213, 78, 74,166,222, 70,202,237, 30,
-158,118, 82, 50, 45,216,186,235,152,118,243,123, 39,246,167, 25,175,153,109, 41,179,213, 81, 30,118, 82, 50, 27,100,239, 10,102,
- 19,190,223, 53,218,209,214, 33, 79,169, 29, 79, 60, 51, 1,241, 10, 12,183,118, 19,219, 25,231,177, 66,200, 65,228,118,214,102,
-202,231, 56,180,221, 46,125,234,140, 37,103, 44,117,220, 88,210,197,100,156,112,165,136,116,229, 89,207,164,248, 31, 90, 6, 85,
-140,242,110, 59,229, 88,226,225,123,187,233,127,210, 11,149,201, 8, 25,190, 81, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+137, 80, 78, 71,
+ 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 2, 90, 0, 0, 2,128, 8, 6, 0, 0, 0, 68,254,214,163, 0, 0, 10,
+ 79,105, 67, 67, 80, 80,104,111,116,111,115,104,111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108,101, 0, 0,120,218,157, 83,
+103, 84, 83,233, 22, 61,247,222,244, 66, 75,136,128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, 20,145, 38, 42, 33, 9, 16, 74,
+136, 33,161,217, 21, 81,193, 17, 69, 69, 4, 27,200,160,136, 3,142,142,128,140, 21, 81, 44, 12,138, 10,216, 7,228, 33,162,142,
+131,163,136,138,202,251,225,123,163,107,214,188,247,230,205,254,181,215, 62,231,172,243,157,179,207, 7,192, 8, 12,150, 72, 51,
+ 81, 53,128, 12,169, 66, 30, 17,224,131,199,196,198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8,179,100, 33,115,253, 35, 1, 0,
+248,126, 60, 60, 43, 34,192, 7,190, 0, 1,120,211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, 15,234, 66,153, 92, 1,128,132,
+ 1,192,116,145, 56, 75, 8,128, 20, 0, 64,122,142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, 0,160, 4, 0, 96,203, 99, 98,
+227, 0, 80, 45, 0, 96, 39,127,230,211, 0,128,157,248,153,123, 1, 0, 91,148, 33, 21, 1,160,145, 0, 32, 19,101,136, 68, 0,
+104, 59, 0,172,207, 86,138, 69, 0, 88, 48, 0, 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87,102, 72, 0,176,183, 0,192,206,
+ 16, 11,178, 0, 8, 12, 0, 48, 81,136,133, 41, 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, 0, 20, 70,242, 87, 60,241, 43,
+174, 16,231, 42, 0, 0,120,153,178, 60,185, 36, 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, 40,206, 73, 23, 43, 20, 54, 97,
+ 2, 97,154, 64, 46,194,121,153, 25, 50,129, 52, 15,224,243,204, 0, 0,160,145, 21, 17,224,131,243,253,120,206, 14,174,206,206,
+ 54,142,182, 14, 95, 45,234,191, 6,255, 34, 98, 98,227,254,229,207,171,112, 64, 0, 0,225,116,126,209,254, 44, 47,179, 26,128,
+ 59, 6,128,109,254,162, 37,238, 4,104, 94, 11,160,117,247,139,102,178, 15, 64,181, 0,160,233,218, 87,243,112,248,126, 60, 60,
+ 69,161,144,185,217,217,229,228,228,216, 74,196, 66, 91, 97,202, 87,125,254,103,194, 95,192, 87,253,108,249,126, 60,252,247,245,
+224,190,226, 36,129, 50, 93,129, 71, 4,248,224,194,204,244, 76,165, 28,207,146, 9,132, 98,220,230,143, 71,252,183, 11,255,252,
+ 29,211, 34,196, 73, 98,185, 88, 42, 20,227, 81, 18,113,142, 68,154,140,243, 50,165, 34,137, 66,146, 41,197, 37,210,255,100,226,
+223, 44,251, 3, 62,223, 53, 0,176,106, 62, 1,123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88,116,192,226,247, 0, 0,242,187,
+111,193,212, 40, 8, 3,128,104,131,225,207,119,255,239, 63,253, 71,160, 37, 0,128,102, 73,146,113, 0, 0, 94, 68, 36, 46, 84,
+202,179, 63,199, 8, 0, 0, 68,160,129, 42,176, 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220,193, 11,252, 96, 54,132, 66, 36,
+196,194, 66, 16, 66, 10,100,128, 28,114, 96, 41,172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, 64, 29, 52,192, 81,104,134,147,
+112, 14, 46,194, 85,184, 14, 61,112, 15,250, 97, 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, 97, 33,218,136, 1, 98,138, 88,
+ 35,142, 8, 23,153,133,248, 33,193, 72, 4, 18,139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, 49, 82,138, 84, 32, 85, 72, 29,
+242, 61,114, 2, 57,135, 92, 70,186,145, 59,200, 0, 50,130,252,134,188, 71, 49,148,129,178, 81, 61,212, 12,181, 67,185,168, 55,
+ 26,132, 70,162, 11,208,100,116, 49,154,143, 22,160,155,208,114,180, 26, 61,140, 54,161,231,208,171,104, 15,218,143, 62, 67,199,
+ 48,192,232, 24, 7, 51,196,108, 48, 46,198,195, 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12,171,198, 26,176, 86,172, 3,187,
+137,245, 99,207,177,119, 4, 18,129, 69,192, 9, 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, 78,216, 72,168, 32, 28, 36, 52,
+ 17,218, 9, 55, 9, 3,132, 81,194, 39, 34,147,168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49,135, 88, 72, 44, 35,214, 18,143,
+ 19, 47, 16,123,136, 67,196, 55, 36, 18,137, 67, 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, 70,210,110, 82, 35,233, 44,169,
+155, 52, 72, 26, 35,147,201,218,100,107,178, 7, 57,148, 44, 32, 43,200,133,228,157,228,195,228, 51,228, 27,228, 33,242, 91, 10,
+157, 98, 64,113,164,248, 83,226, 40, 82,202,106, 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, 85,163,154, 82,221,168,161, 84,
+ 17, 53,143, 90, 66,173,161,182, 82,175, 81,135,168, 19, 52,117,154, 57,205,131, 22, 73, 75,165,173,162,149,211, 26,104, 23,104,
+247,105,175,232,116,186, 17,221,149, 30, 78,151,208, 87,210,203,233, 71,232,151,232, 3,244,119, 12, 13,134, 21,131,199,136,103,
+ 40, 25,155, 24, 7, 24,103, 25,119, 24,175,152, 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235,152,231,153, 15,153,111, 85, 88,
+ 42,182, 42,124, 21,145,202, 10,149, 74,149, 38,149, 27, 42, 47, 84,169,170,166,170,222,170, 11, 85,243, 85,203, 84,143,169, 94,
+ 83,125,174, 70, 85, 51, 83,227,169, 9,212,150,171, 85,170,157, 80,235, 83, 27, 83,103,169, 59,168,135,170,103,168,111, 84, 63,
+164,126, 89,253,137, 6, 89,195, 76,195, 79, 67,164, 81,160,177, 95,227,188,198, 32, 11, 99, 25,179,120, 44, 33,107, 13,171,134,
+117,129, 53,196, 38,177,205,217,124,118, 42,187,152,253, 29,187,139, 61,170,169,161, 57, 67, 51, 74, 51, 87,179, 82,243,148,102,
+ 63, 7,227,152,113,248,156,116, 78, 9,231, 40,167,151,243,126,138,222, 20,239, 41,226, 41, 27,166, 52, 76,185, 49,101, 92,107,
+170,150,151,150, 88,171, 72,171, 81,171, 71,235,189, 54,174,237,167,157,166,189, 69,187, 89,251,129, 14, 65,199, 74, 39, 92, 39,
+ 71,103,143,206, 5,157,231, 83,217, 83,221,167, 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, 27,161,187, 68,119,191,110,167,
+238,152,158,190, 94,128,158, 76,111,167,222,121,189,231,250, 28,125, 47,253, 84,253,109,250,167,245, 71, 12, 88, 6,179, 12, 36,
+ 6,219, 12,206, 24, 60,197, 53,113,111, 60, 29, 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97,149, 97,151,225,132,145,185,209,
+ 60,163,213, 70,141, 70, 15,140,105,198, 92,227, 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, 75, 77,234, 77,238,154, 82, 77,
+185,166, 41,166, 59, 76, 59, 76,199,205,204,205,162,205,214,153, 53,155, 61, 49,215, 50,231,155,231,155,215,155,223,183, 96, 90,
+120, 90, 44,182,168,182,184,101, 73,178,228, 90,166, 89,238,182,188,110,133, 90, 57, 89,165, 88, 85, 90, 93,179, 70,173,157,173,
+ 37,214,187,173,187,167, 17,167,185, 78,147, 78,171,158,214,103,195,176,241,182,201,182,169,183, 25,176,229,216, 6,219,174,182,
+109,182,125, 97,103, 98, 23,103,183,197,174,195,238,147,189,147,125,186,125,141,253, 61, 7, 13,135,217, 14,171, 29, 90, 29,126,
+115,180,114, 20, 58, 86, 58,222,154,206,156,238, 63,125,197,244,150,233, 47,103, 88,207, 16,207,216, 51,227,182, 19,203, 41,196,
+105,157, 83,155,211, 71,103, 23,103,185,115,131,243,136,139,137, 75,130,203, 46,151, 62, 46,155, 27,198,221,200,189,228, 74,116,
+245,113, 93,225,122,210,245,157,155,179,155,194,237,168,219,175,238, 54,238,105,238,135,220,159,204, 52,159, 41,158, 89, 51,115,
+208,195,200, 67,224, 81,229,209, 63, 11,159,149, 48,107,223,172,126, 79, 67, 79,129,103,181,231, 35, 47, 99, 47,145, 87,173,215,
+176,183,165,119,170,247, 97,239, 23, 62,246, 62,114,159,227, 62,227, 60, 55,222, 50,222, 89, 95,204, 55,192,183,200,183,203, 79,
+195,111,158, 95,133,223, 67,127, 35,255,100,255,122,255,209, 0,167,128, 37, 1,103, 3,137,129, 65,129, 91, 2,251,248,122,124,
+ 33,191,142, 63, 58,219,101,246,178,217,237, 65,140,160,185, 65, 21, 65,143,130,173,130,229,193,173, 33,104,200,236,144,173, 33,
+247,231,152,206,145,206,105, 14,133, 80,126,232,214,208, 7, 97,230, 97,139,195,126, 12, 39,133,135,133, 87,134, 63,142,112,136,
+ 88, 26,209, 49,151, 53,119,209,220, 67,115,223, 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, 45, 74, 53, 42, 62,170, 46,106,
+ 60,218, 55,186, 52,186, 63,198, 46,102, 89,204,213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, 54,110,108,190,223,252,237,243,
+135,226,157,226, 11,227,123, 23,152, 47,200, 93,112,121,161,206,194,244,133,167, 22,169, 46, 18, 44, 58,150, 64, 76,136, 78, 56,
+148,240, 65, 16, 42,168, 22,140, 37,242, 19,119, 37,142, 10,121,194, 29,194,103, 34, 47,209, 54,209,136,216, 67, 92, 42, 30, 78,
+242, 72, 42, 77,122,146,236,145,188, 53,121, 36,197, 51,165, 44,229,185,132, 39,169,144,188, 76, 13, 76,221,155, 58,158, 22,154,
+118, 32,109, 50, 61, 58,189, 49,131,146,145,144,113, 66,170, 33, 77,147,182,103,234,103,230,102,118,203,172,101,133,178,254,197,
+110,139,183, 47, 30,149, 7,201,107,179,144,172, 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, 42, 7,178,103,101, 87,102,191,
+205,137,202, 57,150,171,158, 43,205,237,204,179,202,219,144, 55,156,239,159,255,237, 18,194, 18,225,146,182,165,134, 75, 87, 45,
+ 29, 88,230,189,172,106, 57,178, 60,113,121,219, 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138,182, 42,109,213, 79,171,237, 87,
+151,174,126,189, 38,122, 77,107,129, 94,193,202,130,193,181, 1,107,235, 11, 85, 10,229,133,125,235,220,215,237, 93, 79, 88, 47,
+ 89,223,181, 97,250,134,157, 27, 62, 21,137,138,174, 20,219, 23,151, 21,127,216, 40,220,120,229, 27,135,111,202,191,153,220,148,
+180,169,171,196,185,100,207,102,210,102,233,230,222, 45,158, 91, 14,150,170,151,230,151, 14,110, 13,217,218,180, 13,223, 86,180,
+237,245,246, 69,219, 47,151,205, 40,219,187,131,182, 67,185,163,191, 60,184,188,101,167,201,206,205, 59, 63, 84,164, 84,244, 84,
+250, 84, 54,238,210,221,181, 97,215,248,110,209,238, 27,123,188,246, 52,236,213,219, 91,188,247,253, 62,201,190,219, 85, 1, 85,
+ 77,213,102,213,101,251, 73,251,179,247, 63,174,137,170,233,248,150,251,109, 93,173, 78,109,113,237,199, 3,210, 3,253, 7, 35,
+ 14,182,215,185,212,213, 29,210, 61, 84, 82,143,214, 43,235, 71, 14,199, 31,190,254,157,239,119, 45, 13, 54, 13, 85,141,156,198,
+226, 35,112, 68,121,228,233,247, 9,223,247, 30, 13, 58,218,118,140,123,172,225, 7,211, 31,118, 29,103, 29, 47,106, 66,154,242,
+154, 70,155, 83,154,251, 91, 98, 91,186, 79,204, 62,209,214,234,222,122,252, 71,219, 31, 15,156, 52, 60, 89,121, 74,243, 84,201,
+105,218,233,130,211,147,103,242,207,140,157,149,157,125,126, 46,249,220, 96,219,162,182,123,231, 99,206,223,106, 15,111,239,186,
+ 16,116,225,210, 69,255,139,231, 59,188, 59,206, 92,242,184,116,242,178,219,229, 19, 87,184, 87,154,175, 58, 95,109,234,116,234,
+ 60,254,147,211, 79,199,187,156,187,154,174,185, 92,107,185,238,122,189,181,123,102,247,233, 27,158, 55,206,221,244,189,121,241,
+ 22,255,214,213,158, 57, 61,221,189,243,122,111,247,197,247,245,223, 22,221,126,114, 39,253,206,203,187,217,119, 39,238,173,188,
+ 79,188, 95,244, 64,237, 65,217, 67,221,135,213, 63, 91,254,220,216,239,220,127,106,192,119,160,243,209,220, 71,247, 6,133,131,
+207,254,145,245,143, 15, 67, 5,143,153,143,203,134, 13,134,235,158, 56, 62, 57, 57,226, 63,114,253,233,252,167, 67,207,100,207,
+ 38,158, 23,254,162,254,203,174, 23, 22, 47,126,248,213,235,215,206,209,152,209,161,151,242,151,147,191,109,124,165,253,234,192,
+235, 25,175,219,198,194,198, 30,190,201,120, 51, 49, 94,244, 86,251,237,193,119,220,119, 29,239,163,223, 15, 79,228,124, 32,127,
+ 40,255,104,249,177,245, 83,208,167,251,147, 25,147,147,255, 4, 3,152,243,252, 99, 51, 45,219, 0, 0, 0, 6, 98, 75, 71, 68,
+ 0,255, 0,255, 0,255,160,189,167,147, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0,
+ 0, 0, 7,116, 73, 77, 69, 7,219, 9, 1, 15, 54, 15, 19,126,136,129, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236, 93,119,120,
+ 20,213,226, 61, 51, 59,179,187,217,146, 77, 35, 61,144, 66, 9, 96, 0, 67, 81,130, 84, 65, 80,140,138, 10, 86,132,167,207,103,
+197,134, 5, 84, 68, 68, 32, 54, 64,240, 39,242,208,167,128,160,128, 5, 4,164, 68, 74,232, 29,233, 9,144, 4, 18, 66, 58,201,
+ 38,219,203,220,223, 31,217, 89, 55,203,182, 64, 98,129,123,190,111,190,221,157,157, 57,115,239,157,123,239,156, 57,183, 1, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,215, 52, 86,175, 94, 77,154,112,248,144, 64, 57, 29,219,128,
+191, 59,103, 11,198,157, 52, 35,231, 0, 7,231,187,255,144,112, 14,248,187,114,138,241,109, 2,239,144,166,228,163,230, 74, 79,
+151,112,146,230, 14,103, 75,113, 54, 87, 57,242, 16, 78,210, 2,247,253,221,127, 72, 56, 7,252,221, 56,221,243, 79,128,188, 77,
+226, 12, 48, 79, 53, 53,156,164,185,195,217, 82,156, 87, 91,142,124,132,147, 92,109, 94,242,114,239,223,197,117, 4,174, 5, 69,
+ 86,192,200,204,204,100, 92,248,153,191, 43,167,107, 58,136,252,205, 25,214,102,196,150,230,230,116, 75,207,230,194,187,153,153,
+153,204,234,213,171,183, 2, 24,208,156,113,111,142,251,238, 22,215,102,225,189, 2,145,213, 36,206,230,202,247, 45,205,217, 92,
+101,201,157,179, 57,242,189,167,251,222,130,247,168,185,194,217, 44,101,169, 37,242,188,135,252,115,213,188,238,156,205, 81,150,
+220, 57,155, 35,223,255, 25,156,205, 81,150, 60,113, 54, 71,190,247,118,239,175, 55,131,138,253,139, 5,129,123, 1, 31,248,119,
+ 22, 68, 45, 37, 54,155,224,192,252,229,156,205,124,143,222,117,112, 54,231,219,205,192,230,186, 71, 45,145,223, 93, 57,155,139,
+223,157,167, 57,238,147, 39,206,171, 13,175,151,112, 54,123,220,175, 54,223,255, 89,156,205,124,143,154,165, 44,185,113, 14,108,
+230,151,129,129, 46,191,223,109, 78,206,230, 42, 75, 30,194,121,213,247,201, 19,231,213,134,215, 75, 56,155, 61,238,205,241, 12,
+105, 41,222,107, 26, 45,213,124,214,220,156, 77,228,190,166, 56,155,216, 60, 51,164, 5,238,253, 95, 26,206,230,228,116, 15, 99,
+115, 54,247,180,100, 56,155,147,179, 9, 97,189,230, 56,255,105,247,253,239,152,158,222,248,174,166, 89,202,155, 59,218, 18,225,
+108, 78,206, 0,185,175, 9,206,171,184,247,215, 28,184,191, 75, 64,196,132,111,230, 55, 19, 52,179, 3,211,146,194,181, 57,195,
+ 57,176, 37, 28,194, 22, 64,179,135,211,241,166, 60,185, 5,226,254, 79, 73, 83, 90,150,104, 89,250,219,149, 37,183, 60, 57,176,
+ 25,157,162,102,117,158,221, 57,155,227, 26,174, 28,205,149, 71, 91, 58,238,205, 89,150, 90,226,222, 83, 92,133, 11, 65, 57, 41,
+ 39,229,164,156,148,147,114, 82,206,235,150,243,154, 4, 75,147,128,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,
+130,226, 31, 5,175,237,187,113,113,113,171,149, 74,101, 59,111,255,235,116,186,139, 23, 47, 94, 28, 68,147,240,175, 3,189, 71,
+ 20,255, 32,176,248,195, 65, 23, 0, 16,199, 70, 65, 65, 65,113, 77,195,107,103,120,185, 92,158,114,242,228,201, 14,130, 32,192,
+110,183,195,102,179, 57, 63,205,102, 51,250,247,239,223,228,142,244,209,209,209, 57, 18,137, 36,169, 41,231,216,237,246,243,101,
+101,101,125,125, 28,178, 19, 64, 10,195,252,161, 25,197,239,222, 62, 1,148, 88,173,214,238,190, 56, 25,134, 73,113,231,243,194,
+ 37,126,247,201, 25, 18, 18,178,159,227,184, 4, 79, 92,222,190, 11,130,144, 95, 81, 81,209,231,207,188, 71,215, 51,162,163,163,
+115, 56,142,107,114,254, 44, 45, 45,245,154, 63, 99, 99, 99, 15,177, 44, 27,215, 4, 74,137, 32, 8,185, 23, 47, 94,236,235, 67,
+136,236, 4,144,226,243, 13,202, 45, 63, 49, 12, 83,108,183,219,123,250, 43, 71,190,184, 60,228, 81,127,156, 78,145,197,113, 92,
+ 86, 84, 84,212, 51,122,189,222, 8,128, 72, 36, 18,226, 18, 54, 0,128,205,102,171,168,169,169,233, 66,115, 34, 5, 5,197,117,
+ 33,180, 4, 65, 96, 77, 38, 19,242,242,242, 64,136,199,250,222,126, 5,215,235,112,224,183,141, 81,193, 81,209,176, 89, 44, 80,
+181,138,116,114,151,157, 56, 6,155,213, 2,155,217,140, 54,189,122,139, 97, 64,231,206,157, 37,126, 56, 19, 62,248,224,131,168,
+224,224, 96, 24,141, 70, 24,141, 70,152, 76, 38, 24,141, 70,152,205,102,152,205,102, 88, 44, 22, 88, 44, 22,216,108, 54,152, 76,
+ 38,100,103,103,219,173, 86,171, 79,206,105,211,166, 69,105, 52, 26, 39,159,184,137,156, 34,175,213,106,133,209,104,196,166, 77,
+155,124,114,114, 28,151, 80, 82, 82, 18, 37,149, 74, 65, 8,129, 32, 8, 32,132, 52,218,220,209,182,109, 91,139,175, 64,182,208,
+ 61,186,158,209, 97,218,210, 53, 81, 33, 10, 57,108,130,128,204,110,109,157,127,228,127,185, 28,196,102,135, 96,179,161,253,243,
+163,157,251, 59,117,234,228, 51,127, 18, 66, 18,167, 45, 93, 19, 26, 40,103, 85, 85,149,161, 99,199,142, 37,104,112,155,189, 9,
+173, 4,131,193, 16,229,224,191, 76, 16,177, 44,219,104, 91,191,126, 61, 50, 51, 51,253,197, 61,225,229,151, 95,142,178, 90,173,
+ 48,155,205, 48,153, 76,176, 90,173,176,217,108,206,205,110,183, 59, 55,179,217,140, 61,123,246, 4,234,100,125,112,219,109,183,
+ 61,190,102,205, 26,213,207, 63,255,172, 74, 74, 74,130, 84, 42,133, 68, 34,129, 68, 34, 1,203,178,224, 56, 14, 55,223,124, 51,
+ 67,179, 32, 5, 5,197,117, 35,180, 76, 38, 83, 65,122,122, 58,113,124,143,151,203,229, 82,183,183,220,184,246,237,219,231,186,
+159,231,175,185, 42, 56, 42, 26, 19, 91,135, 3, 0,222, 57, 87,229,124, 64,124,216,231, 70,231, 49,239, 93,168, 5, 0, 40, 20,
+ 10, 48,174,175,209, 94,160, 82,169,112,219,109,183, 65, 38,147,161,103,207,158,224,121,222,227, 38,149, 74,193,243,188,223, 68,
+ 97, 24, 6,106,181, 26, 83,166, 76, 17, 69, 18, 84, 65,114,140,235,211, 19, 65, 32,248,239,177,211, 48, 11, 4, 28,199, 57,183,
+ 64, 56,165, 82, 41,142, 30, 61, 10,142,227, 32,145, 72,156,159,226,247, 85,171, 86, 97,228,200,145,224, 56, 14, 10,133, 2,240,
+ 51,115,176,235, 61, 50,155,205,177, 50,153,204, 2, 64, 20,103, 82,134, 97, 98,174,228, 30, 93,207, 8, 81,200, 49,102,222, 79,
+ 0,128,162, 89,207, 59,239,221,158,103,223,113, 30,147,248,159, 7,192, 48, 12,120,158, 7,203,178,205,198, 89, 93, 93,109,120,
+232,161,135,182, 7, 7, 7,175,215,106,181,240, 35,224, 80, 84, 84, 4,142,227,188,230,119,150,101, 49,115,230, 76,156, 57,115,
+ 38,160,184, 27,141, 70, 44, 88,176, 0,118,187,189, 17,175,248,221,125, 95,128, 34,235,253,161, 67,135,142, 94,179,102, 77, 24,
+195, 48,248,236,179,207, 32,149, 74, 49,124,248,112, 68, 68, 68, 96,195,134, 13,144, 74,165,120,253,245,215,105,230,163,160,160,
+240, 85,231,241, 0,110, 4, 16,233, 48, 17,234, 0,132,186, 28, 82,225,248,140, 20,127, 51, 12,179,207, 3, 79, 47,199, 49, 21,
+ 12,195,236,115,249,109, 6, 32,243,176,191, 10,128,194,177,153,208,224,254,167,185, 92, 71, 60, 15,222,174,203, 1, 13,235, 15,
+ 1,216, 2, 96, 96,102,102,230, 86, 0, 40, 45, 45,189,163,180,180, 20, 0,144,146,146,114, 50, 55, 55,183,163,168,121, 28,205,
+ 83, 82,155,205,214, 65,108,170, 18,221,162, 33, 67,134,248,124,195,183, 89, 44,151, 9, 16, 79, 90,202, 83,115,133, 55, 1, 99,
+177, 88,240,192, 3, 15, 0,128,215,135,142,235, 22,128,118,131,217,108, 6,199,113, 72,109, 29,137, 73,195,210,113, 19,177, 66,
+ 87,207,192, 86,171,195, 61,106, 43, 78,118,238,142,249,231, 43,112, 78, 91, 15,142,227, 2,226, 20, 4,193,171,200,146, 72, 36,
+152, 55,111, 30, 30,122,232, 33, 72, 36,146,128,248, 92,239, 81,114,114,242,154,220,220,220, 8,134, 97, 76,142,123, 36,183,217,
+108, 26,155,205, 22, 97,183,219, 35,154,114,143,174,103,216, 4,193, 99, 62,244,150,103, 3,185, 79,129,112, 86, 87, 87, 27, 50,
+ 51, 51,119,203,229,242,133,209,209,209, 37,197,197,197,126,133,150,187,248,113,127,169,248,228,147, 79, 48,103,206, 28, 12, 26,
+ 52, 40,160,112,154, 76, 38, 48, 12,131,249,243,231, 95,246,223,212,169, 83, 47,187,158, 31, 78, 6, 0, 27, 23, 23,247,236,186,
+117,235, 52,226,177,173, 90,181, 2,207,243,232,210,165, 11,130,131,131,177,125,251,118,216,237,246,128,203, 37, 5, 5,197,181,
+ 11, 79, 90,196, 5,253, 39, 78,156,216, 51, 43, 43,107,122, 70, 70,198,119, 59,119,238, 92,202, 48,204,106,151, 58, 49,211, 81,
+191,174, 22,127, 19, 66,122,185,138, 30,135, 88,139,100, 24,102,181,120,188,235,111,241,147, 16, 50, 4,128, 76,252, 61,113,226,
+196,180,172,172,172,233, 19, 38, 76,120,115,198,140, 25,210,137, 19, 39,118,205,202,202,154, 46, 94,199, 83, 56, 60, 57, 90, 62,
+215,158, 18,155,168, 78,157, 58,229,173,137,202,245, 1,224,179,182, 84,181,138,116, 58, 89,239, 37, 70, 56,247, 79, 41,174,113,
+ 62,192,230,246,104, 7,149, 74,133, 97,239,125, 20,144, 83,100, 54,155, 81, 94, 94,238,116, 25,252,109,129,114, 42, 21, 65,200,
+126,185, 11,138,170,100,120,119, 87, 53,214, 28, 62, 3,158,231,113,123,231, 46,184, 67, 26,140,183, 19,101,120,249,116, 33,172,
+ 36,176, 62,189,132, 16,143, 2, 75,252, 46, 54,161, 4, 42,180,220,238, 81,145,209,104,172,202,203,203, 51, 8, 13, 15,118, 5,
+ 33, 36,140, 97,152, 58,135,203, 21, 27,232, 61,186,158,145,217,173,173,211,117,218, 19, 60,216,185,127,164,238,168,243,158,140,
+159,247, 33, 0, 96, 80,247,155,253,150,135, 64, 56,171,170,170, 12,125, 7, 15,220,106, 55,152,191, 25, 61,122,116,193,230,205,
+155, 21,129,132,213,147,208, 18, 93, 91, 81,100,113, 28, 7,179,217, 28, 80,220,205,102,179,215,242, 33,149, 74,175,196,209,130,
+ 78,167, 51,175, 92,185, 18,115,231,206, 69, 68, 68, 4,134, 14, 29,138,216,216, 88, 44, 95,190, 28,132, 16, 60,255,252,243, 80,
+ 40, 20,162,123, 77, 51, 32, 5,197,245, 13, 95, 90, 68,158,149,149, 53,221, 93,200,184,254,118, 21, 80,110, 98,202, 85,172,165,
+249,121,254,175,118, 23, 79,226,117, 25,134, 89, 61, 99,198,140, 76, 63,225,168,240, 38,180,124, 78,137,111, 50,153, 10,186,117,
+235, 22,144,154,208,235,245,165,254,196,134,167,183,122, 87,151, 64,173, 86, 67,165, 81,131, 13,176,222,181, 90,173, 78,161,178,
+113,227, 70, 40, 20, 10, 12, 31, 62,252,170, 28, 45,139,197, 2,153,148, 7,219, 42, 26, 99,102,109, 70, 85,157,193,249,128,217,
+146, 95,128,131,101,229,120, 57, 99, 48, 84,138,114,212,155,205, 1, 57,111,130, 32, 92, 38,178, 56,142,195, 3, 15, 60,224,116,
+ 19, 92,251,173,192, 71,211, 97, 68, 68,196,126,142,227, 18, 92,238, 81, 80, 74, 74, 10,240, 71,191, 30, 70, 16,132,250,208,208,
+208, 31, 1,196, 17, 66, 18, 0, 4, 7,114,143, 40, 60,231, 79,247,253,130,155, 83,117, 37,156, 85, 85, 85,134,204,204,204,221,
+118,131,249,155, 11, 23, 46,236, 6, 16,116,211, 77, 55, 53, 89,104,137, 2,139,231,121,204,156, 57, 19,115,230,204,113,254, 31,
+168,208,178,217,108,141, 4,212,233,211,167, 27, 93,203, 93,216,249,105, 54, 37,104, 24, 93, 40,164,164,164, 56,207,137,137,137,
+ 65,104,104, 40, 4, 65,128, 32, 8, 8, 10, 10,130, 66,161,128, 84, 42,165,153,142,130,130,194,151, 22, 49, 76,152, 48,225, 77,
+134, 97, 86, 59,156,165, 99, 62, 4,149, 39,237,209,203, 77,172, 85,120, 57, 46,211,147,216,114,253, 46, 98,226,196,137,105,238,
+225,240,212, 92,233,172, 85,221,166,221,111, 4,215, 38,170,230,122,136,249,122,144,169, 67, 53, 80,168, 84,144, 72, 88, 48, 12,
+ 67,252,113, 89, 44, 22,103,197,255,204, 51,207,248,236,183, 18,104,127, 42,139,197, 2,150,147,224, 98, 76, 50,236,236, 54,231,
+185,226,198,114, 60,206,197,116,132,228,212, 33,240, 1, 62,112,221, 29,173,231,159,127, 30, 11, 22, 44, 0,203,178,206, 52,225,
+ 56, 14,237,219,183, 71, 65, 65,129, 79, 46,142,227, 18,206,157, 59, 23,229,154,142,162,136, 37,132,192,110,183,163,109,219,182,
+198,188,188,188, 23,105,209,189, 58,145,229,109,191,221, 46, 4,236,194,120, 58,174,170,170,202, 48,106,212,168,173,181,181,181,
+223,220,112,195, 13,167,209,120, 10, 4,191,124, 28,199, 53, 18, 88,162,200,250,244,211, 79, 27,137, 34,171,213, 26,208,139,128,
+213,106,189, 76,240,124,252,241,199,141, 62, 1,160, 79,159, 62, 1, 57,195, 0, 8,203,178, 68, 42,149,226,182,219,110, 67,215,
+174, 93,241,243,207, 63, 67, 16, 4, 60,247,220,115, 80, 40, 20,152, 61,123, 54,108, 54, 27, 62,248,224, 3,234,104, 81, 80, 80,
+248,210, 34,166, 25, 51,102, 28,155, 49, 99,134,211, 89,114,119,180,188, 60,119,239,116,136,170, 72, 81,164, 1, 48,121, 18, 68,
+158, 92, 50,119, 1,230,186, 47, 43, 43,107,186,123, 56,220,155, 43, 27, 9,173, 63, 11,165,199,143,226,163, 91,210, 1, 52,110,
+ 46,156,119,115, 71,168,212, 42,168,130,213, 24,181,106, 27, 0, 56, 42,253, 9, 1, 57, 90,162,208,170,170,170,242, 41,178,154,
+226,104,177, 50, 14, 43, 18, 46,129,200,120,112,102,107, 35,161, 37,225,120, 20, 69, 36,131,229,165,224,236,182,128, 56, 9, 33,
+151, 53, 21,142, 29, 59, 22, 12,195, 56, 71,136,117,235,214,205,149,139,241,247,112,124, 45,188,161, 15,158,123,115,236, 7,149,
+ 70, 90, 98,175, 36,127,238,255, 18, 39,127,120, 22, 0,208, 87,167,115,222,139,105,221,254, 24, 59, 48,235,232, 86,167,251,248,
+ 30, 94,189, 34,206,170,170, 42,195, 77,157,210,118, 75,195, 67,190, 57,127,254,252,110, 0,236,131, 15, 62, 24,218,173, 91,183,
+128,202,164, 56,184,194, 93,100,185, 58, 89,226,167,159, 17,182, 46,194,209, 30,144,128, 18,155, 17, 3,200,243, 68,204,219, 26,
+141, 6,106,181,218, 57,226, 54, 40, 40, 8, 74,165,210,217,191, 51, 64,225, 70, 65, 65,113,253, 34, 76, 20, 58, 14,177,212,200,
+105,114,244,173,202,116,253,237,201,241,114, 56, 80, 57,126,234,215, 53, 14,129,230, 17,162,179,230,118,206,106,111, 34,141, 19,
+ 21,164,235,103, 76, 76,204,175,106,181, 58, 57,208,216, 55,101, 20,155,221,106,185,204,217, 98, 24, 6,234, 96, 53, 20,106, 21,
+ 20,193,106,175,174,151, 47,161, 37, 58, 69,226, 67,103,225,194,133, 80,171,213,248,215,191,254,213,228, 62, 90, 78,161, 37,101,
+177, 65,190, 9, 18, 25,215, 72,100,113, 28, 7, 9,207,163, 84, 29, 11,150,231,193,217, 2,115,201,106,107,107,193,113, 28, 38,
+ 77,154,228,124,131,119, 21, 89, 77,137,179, 47,176, 12, 35,186, 91,242,118,237,218,189,202, 48, 76, 34,128, 36,157, 78, 39,191,
+120,241,226,173,180,188,250, 80, 6,118,235,101, 46,148, 55,247,245, 74, 57, 69, 39, 75, 26, 30,242, 77,199,142, 29,157, 78,150,
+ 82,169, 20, 71,155,250,191,199, 44,235, 81,100,185,143, 16,228, 56,174, 33, 47,251, 25, 29,233,234,104,205,152, 49,195,201,235,
+234,100,137,104, 74, 57, 18,195,186,117,235, 86, 28, 60,120, 16,207, 60,243, 12, 20, 10, 5,230,204,153, 3,155,205,134,169, 83,
+167, 66,161, 80, 64, 38,147,209,204, 71, 65, 65,221,172, 70, 90,196, 13, 21,110,253,160, 24, 55, 81, 83,225, 73, 96,185, 54, 19,
+138,223, 25,134,177,122,224, 53,187, 53, 41,186,239, 23, 63,171,102,204,152,177, 89,116,178, 92,246, 55, 10,135, 95, 71, 75, 46,
+151, 39,231,229,229, 57, 39,194,244,245,105, 54,155, 49,104,208,160,128,157, 49,113,212, 33,199, 73, 26, 9, 11,101,176, 26, 74,
+ 77, 48, 20,106,181,187,224, 96,252, 85,226,226, 27,177,171,208,154, 60,121, 50, 56,142,195,130, 5, 11, 0, 0,175,190,250,106,
+192,125,180, 68, 78,216, 25, 20,147,179, 72,159, 53, 18,230,111,173, 40,219,241, 59, 56,142, 67, 84,239, 59, 32,220, 52, 18,122,
+133, 26,156,221, 22,240,168,195,234,234,106, 20, 20, 20, 64, 34,145,224,149, 87, 94,105, 52,215,145,251, 72,182,141, 27, 55,250,
+141,187, 39, 39,107,242,249,106, 39,143, 66,161, 96,127,255,253,247,100, 65, 16, 82, 12, 6, 67,187, 62,125,250, 8,180, 40,251,
+ 17, 69,130, 45, 32, 81, 21,104,254,116,231, 20,251,100,213,214,214,126,115,254,252,249, 61, 0,216,209,163, 71,135, 42,149, 74,
+124,245,213, 87,122, 0,178,229,203,151, 43,252,137, 34, 49,223,248, 19, 89, 60,207, 55,228,229, 64,226, 78, 26, 79, 89,226,175,
+ 99,124, 32,121, 94, 12, 43,195, 48,176,219,237, 80, 40, 20,141,156,172,160,160, 32,200,229,114,154,241, 40, 40, 40,252,213, 37,
+251, 2,174,199, 9,233,229, 34,170,246, 93, 9,111, 83,174,231, 15,156, 55,161, 97, 50,153,112,226,196,137, 64,121, 2,158, 24,
+179,117,207,155,241,222,133, 90, 48, 12,131,255,246,185, 1, 42,141, 26, 74,149, 10,247,255,188,213, 89,113, 31,157,254, 42,228,
+ 42, 53,226,250, 13, 13,168, 34, 23,155, 14, 93,133, 86, 77, 77, 13,120,158,199,251,239,191, 15,150,101,241,193, 7, 31, 32, 62,
+ 62, 30, 23, 47, 94,196,242,229,203, 3,114,180, 36,118, 9, 98, 31,235, 4,229,216, 16,104, 30,235,143,176,219, 38,227,130,153,
+195, 78,163, 18,253,141,199, 33,219,240, 41,204,130, 61,224, 17, 88, 54,155, 13, 91,183,110,117,239,240,238,236, 83,101,179,217,
+ 96,181, 90, 97,177, 88,240,193, 7, 31, 4, 50,194,243,178,251, 38,166,161, 99, 18, 84, 73,110,110,110, 36, 33, 36, 28, 64, 8,
+128, 74, 90, 92,125, 35,182,247,243,136,236,249, 52, 0, 96,213,140, 39,156,251, 39, 29,253, 35,127,206,252,182, 97, 1,128,142,
+ 73, 67,155,196, 89, 85, 85,101,184,125, 80,159, 28,163,192,127,221,165, 75,151, 70, 78, 86, 80, 80, 16,227,248, 29,144, 93,198,
+178, 44, 36, 18,201,101,205,133,222,196, 86, 32,125,180,108, 54,155,115, 34, 81, 95,253, 25,175,196,209,122,226,137, 39, 16, 27,
+ 27,235,116,178,222,123,239, 61, 40, 20, 10, 76,156, 56, 17, 86,171, 21,159,126,250, 41,205,124, 20, 20, 20,127,186, 40,251, 51,
+224,177, 38, 53, 26,141,133, 93,187,118,133,151,255,226,131,130,130,120,183, 72,197,181,111,223, 62,215, 67, 19,226, 16, 0,217,
+158, 42,117,134, 97, 16,172, 9, 70,144, 90, 5,165,155,139, 21, 20,172,129, 92,173, 6, 43,245, 88,153, 95,198, 41,246, 45,113,
+ 21, 90,226, 86, 91, 91, 11,158,231, 49,119,238, 92,104, 52, 26,152, 76, 38,191,156,226, 67, 71, 34,145, 64, 95, 84,135,147,211,
+179, 33, 11,218,137,118, 67, 31, 66, 44,175,128,116,251,143, 48,216,173,254, 38, 44,189,140,179, 67,135, 14,120,231,157,119, 46,
+155,214,193, 27,226,227,227,253,198,221,221,201,154,121, 67, 27, 72,101, 82,140, 63, 94, 4,147,201,196, 60,244,208, 67, 2, 0,
+ 3,128, 10,131,193,112, 62,144,244,108, 6,252,227, 57,125,141,138, 21, 33, 16,187, 39, 1,227,145, 83,116,178,140, 2,255,117,
+ 65, 65,129,232,100,133, 40,149, 74,124,241,197, 23,122, 0,236,212,169, 83,149,137,137,137,146, 64,242,146, 68, 34,193,172, 89,
+179, 60,246,201,242, 36,186,154, 82,142, 92,207, 29, 48, 96,128,199, 9, 75,189,136,183,203, 56,197,176, 70, 68, 68, 56,157, 44,
+187,221,238, 28,109, 40,206, 62,239,227,165,130,230, 79,202, 73, 57,175, 31,206,107, 18, 30,107,224,139, 23, 47,222,238,237,132,
+182,109,219,230,229,229,229,181, 23,151,226,112, 84,156, 82,163,209,216,161, 79,159, 62,126,173, 29, 65, 16, 32,151,203, 65, 8,
+193,173,239,100,129, 97, 1, 22,141, 31, 98, 81,183, 12,134, 68,194, 65,104, 88,234,195,239,168, 67,131,193,208,232,225,224,105,
+171,175,175,135,201,100, 10,120, 54,111,163,209,216,104, 10, 6,134, 8, 56,247,219,178,203, 70, 31,138, 91,160,253,118,130,130,
+130, 26, 53,253,248,113,172,152, 64, 28, 45,215,166, 71,169, 76, 10, 78,202,139,142, 86,221,233,211,167, 71,209,108, 30, 56,196,
+ 1, 11, 0,144,218,103, 56, 4,193, 14, 98,183, 55, 90, 38,169, 83,242,237, 16,136, 29, 22,171, 30, 38,147,201,223,180, 39, 76,
+101,101,165, 97,212,168, 81, 91, 1,252,239,158,123,238,201, 69,195,236,194, 68,173, 86,203,121,158, 23, 0, 84, 3, 32,151, 46,
+ 93, 10,185,112,225,130, 96, 52, 26,219,248, 11,231,154, 53,107,112,226,196, 9,244,235,215,175,209,114, 80,162, 43,234, 58,187,
+123, 32,249, 83,108, 46,247, 52, 35,188, 55, 33, 23, 40, 36, 18, 9, 66, 66, 66, 32,149, 74,241,254,251,239, 67, 42,149, 66,169,
+ 84, 2, 0, 62,253,244, 83,231,228,171, 20, 20, 20, 20,215,141,208,242, 87,111,250,104, 86,244,217,132,104,179,217,138, 19, 19,
+ 19,155,116, 49,187,221, 94,230, 71,184, 21, 47, 95,190, 92,234,234, 66,248,251, 36,132,148,249,121,216, 22,175, 90,181, 74,234,
+201,221,240,182,192,180, 63, 78,187,221, 94,156,148,148,228,213, 49,241, 4,171,213,122,193,159,104,205,170, 48, 52, 18, 9,227,
+143, 23,121, 93, 59,145,194,111, 94,243,145, 63,223,186,210,252,121, 58, 53, 53,245, 66,104,104,232,218,232,232,232,170, 29, 59,
+118, 68,244,234,213, 43,194,245,152, 94,189,122,197,186,157,102,134,247,117, 14,193, 48, 76,241, 61,247,220,227, 49,207,139,162,
+201, 67,254, 44,246,151,231,247,238,221, 43,117, 61,223, 27,191, 75, 57, 42, 14, 64,184,158, 75, 79, 79,103, 93,121,188,229,125,
+171,213, 90, 65,115, 33, 5, 5,197,117, 47,180, 12, 6, 67, 81,215,174, 93,109, 94,254, 59,239,235,220,170,170,170,158,205, 29,
+ 1,171,213,218,231,159,192, 89, 89, 89,217,172,113,183,217,108,197,142, 9, 74,125, 30, 67,179,248, 95,119,143, 0,160,188,188,
+252, 38, 0,208,233,116,240,183,172, 78, 19, 4, 97,179,231, 79,155,205,214,167, 37,210,180,186,186, 58,131,230, 44, 10, 10, 10,
+ 42,180,154, 0,186, 24,241,223, 3, 45, 33, 90, 41, 40, 40, 40, 40, 40, 40,154, 23, 44, 77, 2, 10, 10, 10, 10, 10, 10, 10,138,
+150, 1,131,134,145, 3,158,208,148,209, 4, 67,174,224,218,217,148,147,114, 82, 78,202, 73, 57, 41, 39,229,188,238, 56,253,113,
+211,209,140, 45, 44,192, 40, 39,229,164,156,148,147,114, 82, 78,202,121,253,113, 94,147,160, 77,135, 20, 20, 20, 20, 20, 20, 20,
+ 20, 45, 4,142, 38,193, 95, 6, 9,154, 48,163,190, 63, 16, 66,194, 0,120, 91, 48,206,204, 48,204,165, 43,224,100, 0, 72, 29,
+155, 56,209,145, 21,128, 5,128,133, 97, 24,226,159,227, 93,182,164, 36, 44,141,216,249, 94,132, 97,120, 65,192,225, 54,109, 90,
+ 31, 98,152, 59,204, 0,160,138,238,212, 89,173, 82, 12, 49, 89,204,201,114, 94,118,162, 70, 87,191,209, 84,158, 87, 72,179, 7,
+ 5,197, 95,130,187, 0, 76, 65, 67,183,146, 25, 0,150,209, 36,161,160,104, 33,161,165, 86,171,247,179, 44,155,224,111,126, 30,
+ 17,142,181,204,138, 47, 93,186,212,179, 9,215, 30,165, 86,171, 7,241, 60,127, 11, 0, 88,173,214, 29,245,245,245,155, 1, 44,
+ 7, 96,187,194, 56,105, 0, 60, 0,224, 17,199,239, 37,142,202, 66,123,133,124, 93, 67, 66, 66,126,224,121,158, 84, 86, 86,246,
+ 6,128,136,136,136,221, 86,171,149,209,106,181,247, 3, 56,210, 68, 62,150,231,249,153,189,123,247,238,191,109,219,182,255, 1,
+152,219, 76,247, 82,206,178,172, 71,129, 34, 8, 66,210, 21,136, 44, 41,128,144,185,115,231, 70, 44, 94,188, 56,189,184,184,184,
+ 11, 0, 36, 36, 36, 28, 29, 61,122,244,161,113,227,198, 85, 17, 66,106, 25,134,177,248,226, 41, 41, 9, 75, 43, 47,205,127,166,
+172,252,196, 3, 0, 16, 19,219,101,153, 68,194, 74, 9, 57,176, 75,217,234,145, 86,237,219, 37, 61,253,221, 87,115,165, 73,201,
+173,177,105,231,193, 27,199,189,248,102,218, 5,224, 19, 42,182,254, 60, 4, 7, 7,239,103, 89, 54,193, 87, 25,247, 84,230,237,
+118,123,113,117,117,117, 79,111,156, 28,199, 37,248,170, 47, 60,237, 19, 4, 33,191,178,178,210,227, 84, 19, 26,141,102, 23,199,
+113,201,129,114,137,159, 54,155,173,216,219, 40, 93,141, 70,179, 95, 34,145, 36,248,138,167,167,255, 4, 65,200,175,168,168,240,
+ 22,206,203,226,222, 28,225,188, 18, 78, 95,225, 20,235, 35, 0,159, 70, 68, 68,220, 92, 85, 85,245, 40,128, 55,181, 90,109, 55,
+137, 68,130,240,240,240, 55,205,102,243,153,144,144,144, 47,107,107,107,119, 2,120, 17, 0, 93, 47,149,130,162,185,160,209,104,
+202,234,235,235,137, 8, 65, 16,136,213,106, 37, 38,147,137, 24, 12, 6,162,211,233, 72,125,125, 61,209,106,181,164,182,182,150,
+ 84, 85, 85,145,200,200, 72,247,201, 27,189,181,225,118,209,104, 52,121, 89, 89, 89,166,130,130, 2, 98,177, 88,136,197, 98, 33,
+133,133,133,228,163,143, 62, 50,105, 52,154, 60, 0, 93,188,156, 59,196, 75,101,113, 27,128,165,233,233,233,230, 53,107,214, 16,
+163,209, 72,116, 58, 29, 89,182,108, 25,185,225,134, 27,204, 0,150, 58,142, 97, 3,228, 4,128,190, 49, 49, 49,197,103,207,158,
+181,111,220,184,209, 18, 18, 18,146, 29, 18, 18,146, 93, 88, 88,104, 63,123,246,172,208,170, 85,171, 98, 0,125,155, 16, 78, 0,
+ 24, 57,126,252,248,178,194,194, 66, 50, 96,192,128,195, 46,251, 25,248, 95,231,110,136, 39, 39,139, 16, 18, 67, 8,137, 69,195,
+ 36,151,151,109,132,144, 88,199, 49, 97, 1,114,170,242,243,243, 91, 71, 71, 71,103, 49, 12, 99,118,231, 99, 24,198, 28, 29, 29,
+157,149,159,159,223,154, 16,162,242,197, 89,124,126,222,147,107,215, 12,174,209, 93, 58, 69,116,151, 78,145,255,125, 61, 80,251,
+212,184, 71,151,198,182,237,190, 32, 52, 33,109,238,137, 83,167,231, 19, 66,230,111,222,151, 55,127,242,231,191,206,191,119,220,
+236, 47, 34, 18,211,159,106, 66,122, 94, 13, 40, 39,128,208,208,208, 82,157, 78, 71, 8, 33,196,110,183, 19,139,197, 66, 76, 38,
+ 19,209,235,245,164,190,190,158,212,213,213, 57,203,121,109,109,173,243,123, 84, 84,148,215,242, 30, 22, 22, 86,102, 48, 24, 26,
+213, 29,102,179,217, 89,127,232,245,122,162,215,235,137, 78,167,115,110,245,245,245, 36, 46, 46,174,200, 71, 56, 47,138,225, 20,
+ 4,129,216,108, 54, 98,177, 88,156,188, 70,163,177,209,102, 50,153,136,201,100, 34,137,137,137, 1,135, 51, 16, 78,163,209, 72,
+ 18, 18, 18, 74,188,113,134,135,135,151, 25,141,198, 70,156,174,241,119,231, 21,127,199,196,196,148, 54,133, 51,144,112,250, 74,
+ 79, 7,230,230,230,230, 18,131,193, 64,226,227,227,171,238,191,255,126,171,221,110, 39,107,214,172, 33,233,233,233,194,192,129,
+ 3, 45,149,149,149,228, 95,255,250, 23,241,241, 82, 72,203, 17,229,164,184, 18, 71,139, 97, 24,168, 84, 42,124,255,253,247, 94,
+151,227,112,253,222,166, 77,155, 64,175,217, 51, 57, 57,121,235,246,237,219, 21,177,177,127, 76,136,109, 54,155, 17, 22, 22,134,
+231,158,123, 78,118,215, 93,119,181, 31, 58,116,232,238,115,231,206, 13, 0,176,223, 15,223,125,145,145,145,159, 77,154, 52, 41,
+250,193, 7, 31, 68, 68, 68,163, 73,183, 49,106,212, 40,220,127,255,253,210,220,220,220,135, 22, 46, 92,248,208,188,121,243, 74,
+235,235,235,199, 1,248,209, 23,169, 66,161,184, 39, 46, 46,238,139,237,219,183, 71, 69, 69, 69, 33, 37, 37,133,125,253,245,215,
+219,119,232,208, 65,145,144,144,192, 94,188,120, 17, 63,255,252,115,252,195, 15, 63,188,162,172,172,236,105,139,197,178, 50,128,
+184,203, 34, 34, 34,222,124,250,233,167, 91,105,181, 90,219,129, 3, 7,242,196,253, 50,153,108,106, 70, 70, 70,175, 45, 91,182,
+124, 11,224,203, 43,113,178, 8, 33, 90,252,209,196, 39,194, 42,254, 31,136,179, 69, 8,145, 29, 62,124, 56, 60, 35, 35,227, 71,
+147,201,212,253,153,103,158, 57, 63,125,250,116,133, 70,163,209, 0, 96,180, 90,237,165, 41, 83,166,152,103,207,158,253, 70,231,
+206,157, 7,239,218,181,235, 62, 66,136,213, 33,200, 46,231, 99, 24,103,120,138, 46, 84, 96,235, 78, 65,246,206,196, 87, 19, 62,
+156,150,124,110,223,241, 34,129, 83,104,240, 75,206, 49,148, 85,213,227,215, 93,199, 17, 19, 17,204, 72,229,124, 90, 72,252, 13,
+ 3,106, 47, 28,207,129,143, 25,210, 41,154, 7, 12,195, 64,169, 84,226,151, 95,126,185,108,233, 42, 79,203, 90,113, 28,135,208,
+208, 80,191,171, 27, 4, 5, 5, 97,227,198,141, 30,215, 94,244,180,164, 79, 72, 72, 8,124,189,108, 48, 12,131,160,160, 32,236,
+216,177, 3, 44,203,122, 92, 26,200,125,159, 74,165, 2,235, 99,173, 43,145, 51, 39, 39,199, 47,151,248,169, 86,171,129,134,166,
+127,239,133, 82, 46,199,246,237,219,189,198,217,253,187,218,177,222,171, 63,206, 29, 59,118, 52, 90,250,203,125, 73, 48,215,223,
+ 42,149, 10,140, 31,210,176,176,176,222, 9, 9, 9,216,187,119, 47,150, 47, 95, 30,158,150,150,134,211,167, 79,131, 97, 24, 76,
+159, 62,157,185,225,134, 27,248,210,210, 82,244,235,215, 15, 63,253,244, 83, 31,173, 86, 75, 11, 12,197, 95, 2, 66, 8, 15,224,
+ 70, 0,145,104,232,118, 83, 7, 32, 20, 13, 43,105,200, 0, 84, 1, 80, 56, 54, 19,128,122, 0,173, 28,167, 87, 58,234, 22, 87,
+129, 80,225,186,248, 52, 33,164,151,131, 91, 92,161, 34,210,229, 88,241, 26,238,191,221, 63, 61,114,115, 0,176,122,245,106,241,
+ 97, 54, 48, 51, 51,115,171,107,228, 2, 17, 89,226, 58,101, 30,202,180,251, 16, 77,185, 74,165,250, 97,247,238,221,138,200,200,
+ 63,226, 96, 50,153, 80, 87, 87,135,250,250,122,212,213,213, 33, 56, 56, 24,203,151, 47, 87, 12, 30, 60,248,135,186,186,186, 14,
+142, 68,243,198, 57,235,226,197,139,209, 54,155, 13, 50,153,231, 46, 74, 44,203,162, 83,167, 78,120,243,205, 55, 49,108,216,176,
+152, 65,131, 6,205,114, 19, 90,151, 13, 37, 85, 42,149, 95, 28, 56,112, 32, 74,169, 84, 34, 47, 47, 15,197,197,197, 24, 63,126,
+124,107, 65, 16, 80, 84, 84,132,211,167, 79,227,194,133, 11, 88,184,112, 97,212,136, 17, 35,190,240, 32,180, 60, 13, 79,125,230,
+229,151, 95,238, 24, 22, 22,198,126,244,209, 71, 53, 58,157,238,255, 28,251,223,153, 51,103,206, 99,253,251,247,143,250,247,191,
+255, 77,118,236,216,177,216,113,227,188,166,167,107,159, 44, 71, 51, 31, 28,153,239,164,219, 57,157, 92,254, 7, 33, 36, 6,128,
+137, 97,152, 26, 15,156, 12,128,144,161, 67,135,190, 98, 50,153,186,111,223,190,253,204, 45,183,220,146, 8,224,162,152,249, 66,
+ 66, 66, 84,179,102,205,138,206,204,204,204,189,245,214, 91,187, 15, 29, 58,244,149,138,138,138,233,132,144, 10,151, 62, 91, 78,
+ 78, 65,192,225,152,216, 46,203,114,118,141,123, 96,203, 14,179,244,213, 23, 39,159,111,211, 58,169,246,112, 94,181,253,120,126,
+ 5,234, 12, 54,220,123,107,195, 2,230,189,187,180,193,103,223,111,199,115, 47,189,197,255,184,108,209,253,103, 8, 84,245, 37,
+199,215,248, 72,207,171, 5,229,132,179,137, 9, 60,207,227,142, 59,238, 0,195, 48,151,173,229,201,243, 60,118,237,218,133, 91,
+111,189, 21, 60,207,227,137, 39,158, 8,136,147,227, 56, 12, 29, 58,212,185,142,162, 43,159,187,104,240,162, 9,178,221, 42, 91,
+112, 28, 7,150,101,189, 46,164,237,206,233,175, 94, 18,195,233,139,203,245, 63,127,225,116, 44,121, 20,176,200, 10,148, 83, 12,
+ 39,199,113,232,211,167, 15, 14, 29, 58,228, 83,116,121,209,151,141,226,126,233,210,165, 49, 29, 58,116,200,153, 59,119,110, 56,
+ 0, 84, 85, 85, 57, 23,188,151, 72, 36, 56,117,234, 20,204,102, 51,222,125,247, 93,139, 86,171,253, 55, 45, 71,148,179, 37, 57,
+125,105, 17, 0,253, 39, 78,156,216, 51, 43, 43,107,122, 70, 70,198,119, 59,119,238, 92,202, 48,204,106, 66, 72,166,248, 57,113,
+226,196,180,172,172,172,233, 19, 38, 76,120,115,198,140, 25,199, 24,134, 89, 13, 0,238,191, 29,117, 73,166,155,136,139, 20,121,
+ 28,101,174,209,177,158,126,187,127,122,226,110,228,104,101,102,102, 50,142, 72, 50,174,149, 90,160, 66, 43,144,181,251, 56,142,
+123,126,250,244,233,209,190, 68, 86,125,125, 61, 74, 74, 74,144,152,152,136, 39,158,120, 34,122,238,220,185,207,219,108,182,143,
+125,208, 74, 37, 18, 9,246,238,221,139,242,242,114,116,237,218, 21,201,201,201,141, 14, 56,123,246, 44,214,174, 93,139,154,154,
+ 26,244,232,209, 3,104,232,220,237, 17,221,186,117,123,183, 83,167, 78, 67, 89,150,181, 41, 20, 10, 28, 62,124, 24,221,187,119,
+199,247,223,127,143, 54,109,218, 64,169, 84, 34, 55, 55, 23, 93,187,118,197,214,173, 91, 17, 25, 25,137,244,244,116,155, 86,171,
+221, 86, 93, 93,189,249,220,185,115,239,122, 11,103,124,124,252,228,167,158,122, 74, 86, 82, 82, 34,124,243,205, 55,219, 1,108,
+ 7,240,252, 91,111,189,245,248,176, 97,195,162, 14, 30, 60, 88,187,111,223,190, 61, 94, 68, 86, 32, 78,150,205,253,161,100,183,
+219, 77, 6,131,193,108, 50,153,172, 44,203, 22, 50, 12, 99,182,219,237, 29,188,153, 16, 99,199,142,109, 91, 89, 89,249,220, 75,
+ 47,189, 84,224, 16, 89,167,208,208, 1, 30, 0, 96,179,217, 76,245,245,245,218,140,140,140,196,135, 31,126,248,204,210,165, 75,
+159, 27, 59,118,236,242,111,190,249,166, 30,128,193,157,176, 77,155,214,135, 36, 18, 86,170,171, 11,207, 95,177,252,203,151,215,
+174,122,190,117, 81,209,133,246, 17,173, 34,117, 82,117,100,201,242, 37, 95,239, 7, 96, 46,169,208,226,200,217, 82,240,188, 4,
+ 39,138,106,209,255,246, 81,252,153,188,105,125, 1,172,161,239,114, 45,255,178, 40, 46, 66,189,101,203, 22,159,142,214,174, 93,
+187,192,243, 60, 20, 10, 5,102,207,158,237,147, 84, 20, 6,162, 91,228, 79,204,136,139,163,251,114,159, 4, 65,112, 46,244,238,
+190,253,223,255,253, 31, 94,122,233,165, 70,215,112,136, 13,198, 31,167,183,240, 37, 38, 37,161,188,172,172,209,190, 64, 22,165,
+183,219,237,224,121, 30, 11, 22, 44, 64,102,102, 38, 86,175, 94,237,243,243,142, 59,238, 0,203,178, 36,144,244,236,211,167, 15,
+ 44, 22,139, 51,204,167, 78,157,242,200, 59,111,222, 60,127,193,188, 11,192,148,238,221,187,107, 6, 13, 26,132,156,156, 28,220,
+127,255,253, 38,139,197,146, 7, 0,119,222,121,103,234,220,185,115,101, 7, 14, 28, 64, 68, 68, 4,127,254,252,249,255,129,118,
+144,167,104, 97,120,210, 34,226, 51, 47, 43, 43,107,186,187,136,113,133,248, 63,195, 48,171,103,204,152,145,233, 42,138, 92,127,
+139,174,147,155,136, 75,115,117,164, 92, 69,148, 55, 1,229,246,188,117, 61,190,194,163,208,114, 68,108,160,171, 11, 36, 86,190,
+254, 68,150,143, 55,199, 70, 8, 9, 9, 25,126,239,189,247, 58, 69,142,209,104,116, 10, 44, 81,100,137,191,115,115,115,209,179,
+103, 79,105, 72, 72,200,240,170,170,170,143, 3, 16,113,136,139,139, 67,101,101, 37,142, 30, 61,138,196,196, 68, 88,173, 86,172,
+ 95,191, 30,181,181,181,224,121, 30, 82,169, 20, 22,139,207,190,219,232,212,169,211, 29,139, 23, 47,238,185,104,209,162, 75,226,
+ 27,221,146, 37, 75, 64, 8, 65,100,100, 36,244,122, 61,202,202,202,176,121,243,102,216,108, 54,168,213,106,164,164,164,200,238,
+185,231,158,190, 83,166, 76,225,125, 8,173, 62,247,223,127,127,136, 70,163,193,139, 47,190, 72, 44, 22,203, 12,199,190,201,227,
+198,141,139, 40, 44, 44, 52, 63,249,228,147,123, 45, 22,203, 71,162,153,232, 42,112,188,220, 88,175, 78,150,213,106, 21,211,180,
+160,190,190, 30,173, 90,181, 74,116,117,182,188,137,193, 29, 59,118,244, 1, 32,153, 58,117,106, 16,128, 50,215, 48,152,205,102,
+212,215,215, 67,167,211, 89,107,107,107,203, 95,123,237, 53,219,210,165, 75, 37,142,115, 78,120, 18, 90, 12,115,135, 89,163, 81,
+202, 8,145,188, 53,127,254,124,245,176, 97,195, 88,181, 90,141,186,186, 58,205,175,235,214,169, 7, 15,234,155, 50, 61,235,195,
+ 13,154,132,174,101, 59, 14,231,227, 66,105, 45,204, 86, 43, 82, 98, 67, 26,252, 48,138, 22,135, 99, 32,139,211,209,114, 21, 21,
+ 57, 57, 57,184,253,246,219,157,101, 93, 42,149, 54,114,190,252,113,114, 28,135,219,111,191,253, 50,135,103,203,150, 45, 30,221,
+ 39,127,112, 21, 69,238,226,200,147, 0, 99, 89,214,239, 2,235,162,155,231, 73,108,185,186,250,110,226,205, 95, 51, 7, 56,142,
+195,184,113,227,192,243, 60, 94,127,253,117,112, 28,135,244,244,116,112, 28,135,140,140, 12,240, 60,143, 91,111,189,181,201,113,
+223,189,123, 55,186,119,239,238, 12, 83,122,122, 58,122,245,234, 5,142,227,208,175, 95, 63,240, 60,143,161, 67,135, 6,194,249,
+102, 93, 93, 93, 55,181, 90,141,220,220, 92, 72, 36, 18, 48, 12,115, 26, 64, 55, 0,136,141,141, 61,163, 6,111,130,189, 0, 0,
+ 32, 0, 73, 68, 65, 84,215,235,219, 26,141, 70, 60,245,212, 83,140,217,108,238,250,250,235,175,191,101, 52, 26,169,208,162,104,
+ 49,184,107, 17, 23, 24, 38, 76,152,240, 38,195, 48,171, 69,135,202,221,121,242,244,219, 67,221, 36, 58, 80,251, 28,101,181,151,
+155,136,171, 96, 24,102, 31, 33,228, 78,111,231, 2, 48,187, 9,171, 70, 77,135,174,205,134,126, 29, 45,177,242, 13, 84,104,249,
+131,209,104,188, 49, 42, 42,202,171,200,114,253, 52,155,205, 72, 78, 78,134,209,104,188,177,169, 15,141,216,216, 88, 88, 44, 22,
+124,249,229,151,144, 74,165,144, 74,255,208, 23,102,179,111,179,232,248,241,227, 5,187,119,239,238,222,163, 71,143,176,159,126,
+250,169, 98,192,128, 1,145,195,134, 13,131, 66,161,128,193, 96,128,213,106, 69,239,222,189,209,169, 83, 39, 20, 23, 23,227,215,
+ 95,127,173,236,208,161, 67,171, 61,123,246, 8,165,165,165,231,124, 80,223, 54,120,240, 96, 48, 12,131,117,235,214, 85, 2,216,
+ 39,151,203,215, 78,155, 54, 45,204,108, 54, 11,163, 71,143, 62, 95, 93, 93,253, 18, 0,139, 76, 38,155, 51, 96,192,128,140,236,
+236,236,111, 5, 65,152,221,212,140,234,158,182, 58,157, 14, 65, 65, 65,129, 76, 37,193, 87, 87, 87,119, 1, 0,149, 74, 21, 14,
+224,140, 51,135, 27, 12,141,196,176,217,108, 54,134,135,135,171, 0,192,113, 14,239,133, 51,210,102,195,138,115,231,242,131, 93,
+251,207,133,134,134,226,145,135, 31,102,111,233,211, 71,214,237,198, 27,135,190,253,201,162,239,227, 34, 52,230,148,184, 8, 88,
+237, 86,100,111, 88, 47, 16,193,186,129, 86, 59,127,142,208, 18,197,134,187,163,197,243, 60,182,110,221,122,217, 62,169, 84,138,
+255,254,247,191, 1, 9, 3, 81, 84,121,107, 58,115,107,234, 98,252, 9, 24,158,231, 33,145, 72,176, 96,193, 2, 8,130,128,151,
+ 95,126,185, 81,115,162, 43,127, 64,118,158,139, 8,236, 52, 89, 0, 96, 70,241, 76,185,243,124,247,240, 58,206, 9,200, 37,155,
+ 59,119,110, 64,142,214,157,119,222,233, 87,184,186,182, 48,184,134,235,208,161, 67, 30,121,231,207,159,239, 55, 61,237,118, 59,
+214,172, 89,227, 20,169, 34,222,126,251,237,167,100, 50, 89,244,182,109,219, 80, 90, 90, 10,157, 78,135,250,250,122,244,238,221,
+ 59,133,101,217,195,165,165,165,133, 39, 78,156,184,151,150, 30,138, 63,209,209, 50,205,152, 49,227,216,140, 25, 51, 60, 58, 86,
+238,206,146, 47,231, 73, 20, 88, 14, 65, 20, 41,138, 55, 52,116,171,217,231,239, 92, 0, 50,247,166, 67,159, 70,144,155,138,156,
+226,169,242, 13,164,249, 48, 64, 59,157, 99, 24, 6, 70,163,209,163,192,114, 21, 7, 22,139, 5,213,213,213,176,219,237, 87, 60,
+215,151,167, 55, 89,127, 66,235,232,209,163,255,122,252,241,199, 75, 66, 66, 66,186, 85, 84, 84,148, 11,130,112,235,174, 93,187,
+ 34, 57,142,131, 70,163,129, 70,163,193,218,181,107,161, 84, 42, 49,110,220,184,114,187,221,158, 19, 28, 28, 28, 97, 48, 24,126,
+ 47, 45, 45,125,219,171,130,225,249,161,253,250,245,195,129, 3, 7,112,233,210,165,141, 0,210, 31,125,244,209,219, 91,183,110,
+205, 76,155, 54,205,120,246,236,217,217, 0,202, 85, 42,213,226,197,139, 23, 15,234,209,163, 71,240,232,209,163,177,117,235,214,
+249, 0,140,129,198, 89,167,211, 53, 18, 88, 90,173, 22,117,117,117, 80,169, 84,182, 0,211,140,199, 31, 35, 12, 65, 8,113,222,
+ 27,135,155, 37,222, 31,194,113,156, 56,170,209,155,200,130, 74,165,154,186,104,209, 34,133,251, 32, 5,187,221,142,178,178, 50,
+104, 52, 26, 76,122,251,109,233,123,227,255,221, 93,162,142,222,197,178, 12,204, 22, 82, 67, 4,243,122, 93,217,131,219,128,119,
+105,205,243, 39, 64, 20, 6,119,223,125,247,101,205,133, 82,169, 20, 27, 55,110,196,136, 17, 35,156, 47, 46, 61,122,244,240,251,
+114, 37, 10,131,187,238,186,203,233, 12,173, 95,191,222, 99,179,159,232, 72, 5, 34, 8,197, 99, 95,120,225, 5,112, 28,135,207,
+ 62,251, 12,175,188,242, 10, 88,150,197,204,153, 51,193,178, 44,222,121,231,157,128, 69,166,171,128, 41,252,176,225, 51,225, 21,
+ 45,170,230, 69, 3, 0,130, 53, 26, 49, 66, 77,170,123, 56,142,115, 58, 89, 55,222,120, 35,120,158, 71, 70, 70, 6, 56,142,115,
+ 58, 89,195,135, 15,119, 77, 71, 18, 8, 39,199,113,200,203,203,115,134, 57, 35, 35,163,145,147,197,113, 28,238,188,243,206, 64,
+130, 57, 61, 52, 52,116, 74,167, 78,157, 58,207,154, 53,139,151, 72, 36, 24, 60,120,112,106, 76, 76,204, 57,155,205, 22, 49,117,
+234, 84,165,135,115, 20, 0,186,117,238,220, 89, 69, 75, 13, 69, 11, 58, 90, 83, 60,252, 21,230,218,231,170, 9, 47,146,171, 93,
+143, 23, 57,220,197,145,195, 33,203,241,199,229,233, 92,127,224, 68, 5,233,203, 82, 15, 68,104, 57,108,103,159, 23, 83, 42,149,
+ 71,202,203,203, 51, 20, 10, 69, 35,145,229, 73,112, 73, 36, 18,148,150,150, 66,169, 84, 30, 49,153, 76,205,118, 19,253, 53, 29,
+ 2, 48,158, 62,125,122,188,203,239, 33,195,135, 15,255,102,227,198,141,177,217,217,217,216,179,103, 15, 34, 35, 35, 49,119,238,
+220,139,101,101,101,255, 2,176,177,178,178,210,239,117,219,182,109,219, 69,173, 86, 99,199,142, 29, 0,176, 21,192,191,159,123,
+238, 57,198,106,181, 98,222,188,121, 58, 0,235, 66, 67, 67,215, 44, 95,190,188,123,183,110,221,100,217,217,217,218, 61,123,246,
+252, 22,160,200,178, 11,130,112,153,192,114, 77,211,224,224,224, 64, 28, 45,107, 72, 72,200, 81,173, 86, 59,202, 96, 48,104,229,
+114,121,176, 86,171, 53,185, 10, 44,145,159,227, 56, 62, 47, 47,175, 4, 64, 74, 72, 72,200, 81,120,105,230,228, 56,110,240,224,
+193,131, 57,247,123, 80, 86, 86,134,210,210, 82, 88, 44, 22,244,232,209,131,145, 48, 86,201,165,162, 35,110,211, 58, 80,145,245,
+ 39, 57, 90, 68, 44,235,226, 40, 65, 79, 35, 13,215,175, 95,239,252,205,178, 44,190,254,250,235,128, 68,209,198,141, 27,125,118,
+ 88,119,107, 58,244,107,141,139,199,127,254,249,231, 32,132, 56,157, 44,150,101, 49, 97,194, 4,200,229,114, 76,155, 54, 13, 19,
+ 38, 76, 0,199,113,126,155, 14, 93, 5, 76,210,235,122,215,151,163,134, 66,225,232, 15,197, 48,140,171,216, 98, 2, 21,111,190,
+220,188, 64, 90, 2, 92, 57,197,243,130,130,130,188,118,132,119,227,244,117,129, 95, 0,228,199,198,198,238,200,200,200, 8,217,
+191,127, 63,102,206,156, 41, 53,153, 76,109,178,179,179,157,215,245,148, 94, 58,157, 78, 65, 75, 14, 69, 75,184, 89, 62,254,174,
+112,235, 95,197,184, 54,227,249,248,116, 63, 30, 46,251, 92,121, 43, 24,134,177,122,184, 94,133, 7,113,229,126, 13,215, 99, 42,
+188, 58, 90,254, 42, 11,127,130, 43, 16, 71, 75,175,215,255,182,110,221,186, 94, 15, 63,252, 48,231,171,217, 80,167,211, 33, 58,
+ 58, 26,199,142, 29,179,233,245,250,223, 2,112,202,154, 83,104,185, 35,187,188,188, 92, 98,181, 90,209,190,125,123,196,199,199,
+195,104, 52,162,166,166, 70, 2, 96, 99,128, 28, 82,149, 74, 37, 1,128,154,154, 26,160, 97,168,105,106,135, 14, 29,112,224,192,
+ 1, 84, 87, 87,255, 8, 96,216,148, 41, 83,122,244,238,221, 91,250,253,247,223,235,159,121,230,153, 31,173, 86,107, 64, 74, 67,
+ 16, 4,179,205,102, 75,102, 89,214, 82, 83, 83,115,193, 53, 61,163,163,163,195, 85, 42, 21, 83, 86, 86,102, 13, 68,104,117,235,
+214,109,239,249,243,231, 49,117,234,212,138,233,211,167,119,168,171,171,187, 84, 91, 91,107,115, 21, 91, 70,163,145,109,213,170,
+149,124,222,188,121, 10, 0,232,214,173,219, 94,111, 66, 75,167,211,181, 86, 42,255,120, 49, 54,153, 76, 40, 45, 45, 69,105,105,
+ 41,202,202,202, 80, 87, 87,135,148,148, 20,232,245,250, 68, 90,205,252,101, 66,171, 81,243,153,107,249,118,125,144, 55,165,172,
+187, 10,152,187,239,190,219,217,183, 75,116,200,196,109,197,138, 21,238, 29,204, 3, 18, 90,159,127,254, 57, 94,120,225, 5, 4,
+ 5, 5, 97,214,172, 89,141,154, 14,221,197,129, 32, 8, 76, 32,113, 79,126,195,128,210, 57,225,224,121, 30, 17,207,148, 53,106,
+162,243, 32, 56, 2, 10,231,244,233,211,155,165,233,208,149, 51, 49,177,161,168, 44, 88,176, 0,163, 70,141,194,182,109,219,174,
+184,233, 48, 45, 45,109,201,234,213,171, 67,142, 31, 63, 14,173, 86,139,138,138, 10,152, 76, 38, 20, 23, 23,123,109, 21,112,212,
+229, 65,180,228, 80,252,201,245,212,190, 63,147,183, 57,175,199,249,121,128, 7, 44,180, 2,113,180, 76, 38,211,172, 23, 95,124,
+241,185, 33, 67,134,132, 7, 7, 7,163,164,164,228, 50,145, 85, 95, 95, 15,181, 90, 13,131,193,128, 85,171, 86,105, 77, 38,211,
+ 44,127,226,192,106,181, 34, 42, 42, 10,149,149,149, 16,188,244,159,102, 89, 22, 10,133, 2,245,245,245,128,159, 78,230,158, 30,
+ 24, 22,139, 5, 86,171, 21, 86,171, 21, 22,139,197,239, 91,178,187,153,167, 82,169, 68,225, 1, 0,186,184,184,184,246, 65, 65,
+ 65, 40, 40, 40, 0, 26, 70,246, 13,185,253,246,219,249,170,170, 42,242,228,147, 79,110, 39,132, 60, 5,223,179,227,155,115,114,
+114,146, 1, 64,161, 80,228, 2, 64,113,113,177,181,166,166,166,145, 83,168, 84, 42,201,136, 17, 35, 98, 9, 33,200,201,201, 73,
+150, 74,165, 4,222, 71, 53, 26, 87,174, 92,121, 60, 36, 36,100,105, 86, 86,214,195,153,153,153,199,186,116,233,146,172,211,233,
+202, 13, 6,131,193,104, 52, 18,137, 68, 34, 13, 11, 11, 11,218,176, 97,195,153, 93,187,118, 13,209,104, 52, 75, 87,174, 92,121,
+220,155,243,166, 82,169,138,245,122,125,146,120, 79, 93, 69, 86,105,105, 41, 8, 33,200,207,207,135, 82,169, 60,239,175, 89,151,
+162,229, 32,190, 84,185, 59, 47,238,251, 2, 21, 89,174,194, 96,195,134, 13, 62,231,208, 10,148,211, 85, 20,189,242,202, 43,152,
+ 51,103,206,101,142,214,180,105,211, 0, 0,111,191,253,118,192,125,180, 68,247,170,116, 78, 56, 98, 94,168,110, 20,118, 0, 96,
+196,240, 53,173,204,131,227, 56, 76,157, 58,245,178, 78,234,174, 77,123, 1, 54,241, 53, 10,103,121,121, 57, 56,142, 67,120,120,
+ 56, 30,121,228, 17, 12, 29, 58,212,217, 4,217, 84,222,147, 39, 79,238,120,227,141, 55,186,166,165,165,225,253,247,223,175, 14,
+ 13, 13, 13,254,207,127,254,195,213,212,212, 48,190, 28, 45, 42,180, 40, 40,154, 65,104,137, 5, 44,208, 81,135, 94, 42,203, 33,
+104, 60,215, 70,173, 94,175,127,228,182,219,110,251,105,217,178,101,138,182,109,219,226,228,201,147,168,174,174,134,217,108,134,
+ 84, 42, 69,108,108, 44,106,106,106,240,245,215, 95, 27,244,122,253, 35, 0,106,253,112,190,213,179,103,207, 47, 62,254,248,227,
+160,244,244,116, 84, 87, 87,163,190,190,222, 41,132, 24,134,129, 70,163,129, 66,161,192,222,189,123,177,126,253,122, 3,128,183,
+252,112,122, 82,115,176, 88, 44, 78,193, 21,128,208,114,229, 84,137,174,142, 94,175, 7, 0,107,235,214,173, 99, 0, 32, 63, 63,
+ 31, 0, 10, 83, 82, 82,166,180,109,219,150, 89,188,120, 49, 33,132,172,247, 34,178,156,156, 12,195, 84, 19, 66, 46, 1,136, 49,
+155,205, 82, 0,168,173,173,181,180,106,213, 42, 74, 46,151, 11, 10,133, 66, 8, 10, 10, 18, 74, 74, 74,108, 54,155, 77, 10, 0,
+253,250,245, 51, 3, 40,117, 91,163,208,149, 83, 32,132,104,231,207,159, 63,101,244,232,209, 25,125,250,244, 73,123,246,217,103,
+143, 62,249,228,147,108,124,124,124, 88, 93, 93,157,241,244,233,211,151, 62,249,228,147,186,221,187,119, 15,225,121,254,220,252,
+249,243,167, 0,208, 50, 12, 35,120,226,180,217,108,191,101,103,103,255, 43, 51, 51,147,187,112,225, 2,202,202,202,156, 34,171,
+172,172, 12,157, 58,117,194,174, 93,187,236, 22,139, 37,187, 9,233,217, 92,160,156, 13, 47, 33, 68, 44,235,222, 4,150,248, 50,
+ 21, 40,167,171, 40, 26, 53,106, 84, 35, 23, 75, 42,149,226,135, 31,126,240, 88,111,120, 40, 87,141,226,238, 58,199,215, 27,111,
+188,209, 72,180, 77,154, 52,201,107,117,230, 47, 61, 69,158,218, 5,241,141, 71, 29,122, 41,231,190,194, 41,214,157, 60,207, 99,
+210,164, 73, 1, 59, 90,184,188,143,214,101,156, 98,220, 7, 12, 24, 0,189, 94,239, 20,178,222, 28, 45,127,233,105,183,219, 95,
+152, 51,103, 14,209,104, 52, 55,107,181,218, 71,207,159, 63,191, 80,175,215,223, 84, 91, 91,235,211,209, 50,153, 76,114, 90,142,
+ 40, 39, 90,102,126,174,235, 71,104, 57, 30,146,104,221,186,117,163,181,179, 88,150,109,180, 53,165,159,129, 3, 27,242,242,242,
+238,187,229,150, 91,190,125,225,133, 23,130,211,211,211,249,164,164, 36,232,116, 58, 20, 20, 20,224,216,177, 99,182,149, 43, 87,
+106,245,122,253,163, 0, 2, 25,117,182,232,248,241,227,235,135, 13, 27,246, 78,239,222,189,159,158, 60,121,178, 36, 53, 53, 21,
+181,181,181, 8, 11, 11, 67, 84, 84, 20, 78,157, 58,133, 85,171, 86,217, 43, 43, 43,191, 0,240, 30, 60,180,161,250,123,225,183,
+ 88, 44,120,232,161,135, 32, 8, 2,102,207,158,141, 64, 22, 84,118,129,197, 98,177, 16, 0,140,163, 63,151,222, 49,187, 52, 78,
+159, 62, 13, 0,231,146,147,147,131, 1, 32, 59, 59,155, 65,195,252, 90,129,188,225, 19, 66,136,211,217,234,212,169, 83,129,123,
+229, 40, 58, 89,162, 11,230, 47,220, 12,195, 24, 9, 33,229,122,189,126,216, 43,175,188,242,206,231,159,127,254,240,231,159,127,
+126,217,113, 26,141,102,233,204,153, 51,223,123,224,129, 7,202, 25,134,241,218,143, 76,167,211,189, 61,102,204,152, 7,142, 28,
+ 57, 18, 28, 20, 20, 4,157, 78,135,170,170, 42, 88, 44, 22,164,164,164,160,188,188, 28,139, 22, 45,170, 51, 24, 12,239,210,226,
+248,215,192, 85, 24,120,115,181, 2, 16, 89, 94, 93,157, 95,126,249,197,227, 28, 85, 77,229,116, 23, 27,129,206,109,229,235,165,
+ 72,156,150,198,211,148, 17, 77,172,215, 46,227,229, 56, 14, 31,125,244,145,115,210, 86, 79, 78, 86, 83, 28, 45,145, 51, 60, 60,
+188,193, 38, 87, 42, 33, 8, 2,238,188,243,206,171,225, 21, 0,140,115,153,241,125,250,107,175,189, 54,165, 83,167, 78,169, 0,
+228,174,105,208, 68, 23,159,130,130,194,159,208,178,219,237,197, 29, 59,118,108, 84,193,249, 91,204,212,106,181, 22, 7,120,221,
+245, 58,157, 46,101,230,204,153, 47,170, 84,170, 33,122,189,190,171,163,226, 56,162,211,233,178, 77, 38,211,167,104,218, 34,208,
+ 21, 0,158,223,189,123,247,236, 97,195,134, 77,187,245,214, 91, 71,142, 31, 63,158, 33,132, 96,222,188,121,228,236,217,179, 43,
+ 28, 46,214,217, 43, 73,164,240,240,240,227, 95,127,253,117,244, 79, 63,253, 4,171,213,138, 79, 63,253, 20,193,193,193,199,171,
+171,171, 3,165, 40,223,180,105,211, 55,125,250,244,121,108,215,174, 93,139, 0,252,190,117,235,214,133,125,251,246, 29,179,107,
+215,174, 37, 0,142,109,222,188,121, 97,239,222,189,199,236,219,183,111, 57,128, 67, 77,168,124,157,206,150,205,230,185,165,209,
+139,147,229,139, 83, 75, 8,177, 60,254,248,227,227, 31,120,224,129, 47,247,237,219,119, 83, 77, 77, 77, 87, 0, 8, 13, 13, 61,
+210,171, 87,175,189,203,150, 45, 59,229,112,178,252,117,214,175,208,233,116, 35,186,118,237,250,227,251,239,191,175, 74, 75, 75,
+227,218,183,111,143,194,194, 66, 28, 61,122,212,246,191,255,253,175,222, 96, 48,220, 13,224, 18, 45,142,127,157,208, 34,132, 32,
+ 52, 52,180,209, 75,148, 56,228,191,169,205,133,174, 15,102,113,169, 30,119, 94,111,156,190,166, 77, 16,161, 86,171,157,147,155,
+ 6,210,101, 65, 16,124,207,199, 70, 8,113,114,138, 91, 0, 34,203,239, 8, 65,199, 18, 56, 1,115, 6, 50,189,131, 74,165,130,
+213,106,117,242, 6, 48,242,179,169,106,241, 23, 0,191, 88,173,214,211, 0,218, 81,113, 69, 65,209,130, 66,235,210,165, 75, 61,
+ 91,248,218, 90,147,201,244,158,201,100,122, 79,220, 97, 52, 26,175,150,243, 44,128, 7, 54,109,218,244,241,166, 77,155,196,118,
+132,169,240,191, 94,162, 79,156, 60,121, 50,147,231,249,255, 46, 93,186,180, 55, 33, 4, 33, 33, 33,187, 11, 11, 11,255,211, 20,
+ 14,187,221,254,248,174, 93,187,158,131,163, 47,147,197, 98,121,124,199,142, 29, 47,162, 97, 61, 38,216,237,246,199,247,236,217,
+227,252,221,196, 7, 37, 33,132,152, 8, 33,113, 94, 14, 49, 53,209,129, 19,157, 45,243,178,101,203,234, 1, 28,198, 31,243,100,
+ 89, 29,155,209,173,185,208, 23, 54,235,116,186,246,147, 38, 77,154, 46,145, 72, 6,235,116,186,120,149, 74, 85,100,179,217,126,
+211,235,245,111,161, 97,141, 42,138,191, 8,102,179,249, 66,199,142, 29, 57, 79, 47, 80,190, 30,228,190, 94,172,236,118,123,113,
+135, 14, 29,252,190,156,121,224,188,224, 67, 52,156, 75, 73, 73, 97, 3,229, 18, 97,177, 88,202,125,133, 51, 37, 37, 5, 77,229,
+244, 23,247,228,228,100,143,113,247, 35, 8,189,198,221,102,179, 93, 17,167,175,244,244, 5,131,193,112, 41, 50, 50,178,222,104,
+ 52,242, 38,147,137,183,217,108,141,236, 71,133, 66, 81, 97, 48, 24,104,225,161,160,184, 26,161,245, 15,199,126, 52, 44, 47,209,
+ 92, 48, 29, 57,114,228, 49,167, 61, 85, 94,126,165, 60,238, 74,178,222,207,239,166, 8,163,102,119,132, 28, 66, 74,223, 76,116,
+149,245,245,245, 79,138, 63,196, 62, 32, 20,127, 61,170,170,170,110,110,110,206,234,234,234,102,127, 81,171,172,172,204,104,129,
+184,247,188, 94, 57,125,161,164,164,228,102, 63, 66,140, 22, 28, 10,138, 0,193,210, 36,160,160,160,160,160,160,160,160,104, 25,
+ 48,104, 24, 57,224, 9, 77, 25, 77, 48,228, 10,174,157, 77, 57, 41, 39,229,164,156,148,147,114, 82,206,235,142,211, 31, 55, 29,
+205,216,194, 2,140,114, 82, 78,202, 73, 57, 41, 39,229,164,156,215, 31,231, 53, 9,218,116, 72, 65, 65, 65, 65, 65, 65, 65, 65,
+133, 22, 5, 5, 5, 5, 5, 5, 5, 5, 21, 90, 20, 20, 20, 20,174, 72,109,221,186,245,137,212,212,212, 11, 0,198,182,240,181,
+ 30,233,221,187,119,149, 92, 46,223, 0, 32,149, 38, 61, 5, 5, 5, 21, 90, 20, 20, 20,215,180,200,234,218,181,235,246,147, 39,
+ 79,118,202,206,206,142,139,143,143,255,176, 37, 47,214,179,103,207, 15,182,109,219, 22,190,110,221,186,219, 98, 98, 98,114,174,
+ 80,108,165,182,105,211,230, 68,106,106,106, 49,128, 71,154, 57,136, 99, 51, 50, 50,170,101, 50,217,122, 42, 4, 41,174, 3,116,
+ 1,208,149, 10, 45, 10, 10, 10,138, 22, 20, 89, 59,119,238,140, 48, 26,141, 56,121,242, 36, 42, 42, 42, 14,181,228, 5,115,115,
+115, 47,237,220,185, 19, 9, 9, 9, 88,178,100, 73,100,114,114,242,182, 38, 10,154,212,174, 93,187,110, 63,113,226, 68,167,236,
+236,236,248,168,168,168, 79,154, 51,124, 55,221,116,211,180,109,219,182,133,109,216,176, 97,104,100,100,228,149, 10, 65, 10,138,
+191, 51,228, 0, 30, 99, 24,102,111,151, 46, 93,142,164,165,165,253,206, 48,204, 46, 0,163,112,237,206,221, 25, 24, 86,175, 94,
+189,117,245,234,213, 91,105, 30,161,160,160,104, 6,164,165,165,165,233,116, 58, 29,169,168,168, 32,159,125,246, 25, 9, 15, 15,
+183, 0,248, 13,192, 74, 15,219,155, 0, 52, 1,114,107, 28,199,123,226,249, 45, 60, 60,220,242,217,103,159,145,252,252,124,114,
+252,248,113,146,154,154,106, 8, 80,208,164,118,237,218,181, 82, 12,243,218,181,107, 9,199,113,235,155, 51, 81, 52, 26,205,177,
+156,156, 28,114,246,236, 89,178, 97,195, 6, 18, 29, 29, 93, 78,197, 22,197, 53,130, 36, 0, 31,168,213,234,234,187,238,186,139,
+124,245,213, 87,100,213,170, 85,228,199, 31,127, 36,179,102,205, 34,131, 6, 13, 34, 50,153,236, 2,128,215, 1,132, 94, 79, 90,
+132,113, 68,140, 0, 24, 8, 0,153,153,153, 84,108, 81, 80, 80, 92, 45,118,234,245,250, 12,189, 94,143,186,186, 58,180,110,221,
+ 26, 60,207,123, 60,176,188,188, 28, 59,118,236,192,184,113,227,142,151,150,150,246,135,239,117, 47,195,186,119,239,190,115,243,
+230,205,169,193,193,193,206,157,130, 32,192, 98,177,192,106,181,194, 98,177,192,100, 50,193,100, 50, 65, 38,147, 65,161, 80, 32,
+ 60, 60,252, 40,124, 55, 97, 56,221, 55,131,193,128,131, 7, 15, 98,244,232,209, 21, 85, 85, 85,253, 1,228, 54, 99,186,164, 70,
+ 69, 69,229, 44, 90,180, 40, 50, 37, 37, 5,231,207,159,199, 19, 79, 60, 81,121,238,220,185,126,205,124, 29, 10,138, 63, 19, 19,
+238,187,239,190,105,209,209,209,108,151, 46, 93, 16, 27, 27, 11,147,201, 4,131,193, 0, 66, 8, 56,142, 3, 33, 4,181,181,181,
+200,201,201,193,230,205,155, 77,151, 46, 93,250, 26,192,167, 0,242, 92, 68,214, 53,169, 69,156, 66, 43, 51, 51,147,161,121,133,
+130,130,162,153,112,164,182,182,182,139,201,100,130, 78,167, 11,232,132,252,252,124,140, 29, 59,246,120,105,105,233, 45,240,188,
+168,188,166,123,247,238,123,114,114,114, 82,141, 70, 35,180, 90,255,235,206,203,100, 50, 4, 5, 5, 33, 34, 34, 98, 23,128, 62,
+222,222,196,187,116,233,178,127,215,174, 93,225, 6,131, 1,135, 14, 29,194, 35,143, 60, 98,169,174,174,222, 14,192, 91,224,171,
+209,176,142,234, 57, 15,255, 37, 2,120,209,241,134,239, 9,170,200,200,200,190,139, 23, 47,150,182,109,219, 22,122,189, 30,163,
+ 70,141,170,206,205,205,237, 5,160,128,102, 29,138,127, 32,114, 79,158, 60,217,193,110,183,163,178,178, 18, 38,147, 9,122,189,
+222, 41,180, 36, 18, 9, 8, 33,176,217,108,206, 23,163, 3, 7, 14, 32, 59, 59,155,228,231,231, 79,118,148,165,107, 86,139, 80,
+161, 69, 65, 65,209, 18, 72,237,208,161,195,161, 95,127,253, 53, 72, 42,149, 98,213,170, 85,152, 60,121,178,181,186,186,122,155,
+187,120,137,142,142, 78, 91,184,112, 97,114, 74, 74, 10,126,255,253,119,220,127,255,253,111, 1,152,238,129,243, 77,173, 86, 59,
+205, 98,177,224,208,161, 67, 24, 51,102, 76, 65, 89, 89,217, 49,119, 17,147,156,156,220,239,147, 79, 62,225,123,244,232, 1,173,
+ 86,139,145, 35, 71,234, 79,157, 58,213, 27,192, 49, 47, 97,253,164,186,186,250, 21,187,221,142,186,186, 58, 36, 36, 36, 64, 42,
+149,250,140,156,193, 96, 64, 82, 82,210,174,138,138,138,203,196, 91, 68, 68,196,166,243,231,207, 15, 82, 40, 20, 62, 57, 44, 22,
+ 11,138,139,139, 33,147,201, 96, 50,153,208,174, 93,187,175, 1, 60, 78,179, 14,197, 63, 81,104, 29, 62,124,184,195,119,223,125,
+135,238,221,187,163,115,231,206,168,175,175,119,138, 46,179,217, 12,171,213,122,217, 73, 90,173, 22, 47,191,252,114, 30, 28,205,
+231,215,170, 22, 17, 59,166, 77, 17,219, 68, 51, 51, 51, 7,208, 60, 67, 65, 65,113,181, 21,111, 94, 94, 94,250,144, 33, 67,182,
+173, 88,177,162,213,240,225,195,209,174, 93, 59,254,222,123,239,141,212,235,245,131, 93, 15, 44, 43, 43, 11, 27, 51,102,204,254,
+162,162,162,100,199,174, 94, 94, 56,123, 5, 7, 7, 35, 63, 63, 95, 20, 89, 61,225,214,204, 40,147,201,214, 31, 62,124,152,151,
+201,100,216,183,111, 31,198,142, 29, 91, 89, 80, 80,224,175, 89, 46,212,108, 54, 67, 34,145, 0, 0,138,139,139,253, 70,238,252,
+249,243, 16, 4,193,228,233, 63,150,101,229, 7, 14, 28, 64, 92, 92,156, 79, 14,150,101,221, 5, 93, 13,205, 54, 20,255, 80, 88,
+205,102, 51,122,246,236,137,130,130, 2, 28, 56,112,192, 41,184, 42, 43, 43, 81, 82, 82,210,232,224,189,123,247,226,224,193,131,
+232,223,191,191, 59,207, 53,169, 69,156,202,113,245,234,213, 3, 28,145,219, 74,243, 12, 5, 5, 69, 51, 33, 53, 46, 46, 46,103,
+209,162, 69,145,177,177,177, 24, 52,104, 80, 81,105,105,105, 27, 15,199,173, 36,132,220,157,159,159,143,182,109,219,174, 2,112,
+207,149, 28,147,152,152, 88,177,111,223,190, 86,199,143, 31,199, 35,143, 60, 82,225,232,243,229,175,239, 83,114,167, 78,157,246,
+109,216,176, 33,156,101, 89, 28, 59,118, 44,144,166,195, 66, 52,244, 47, 57,231,225,191, 68, 0,147, 0,132,123, 57, 87,213,161,
+ 67,135,190,251,247,239,151, 50, 12,131,194,194, 66,177,233,176,167,131,151,130,226,159,134, 17,113,113,113,255,123,238,185,231,
+ 66,122,247,238,141,226,226, 98, 92,184,112, 1,151, 46, 93, 66,122,122, 58,210,210,210,112,246,236, 89,172, 95,191, 30, 7, 15,
+ 30,132, 92, 46, 71, 66, 66, 2,212, 75,191,195,127, 25, 28, 7,144, 70,181, 8, 5, 5, 5,197, 85,136, 45,169, 84,186, 62, 62,
+ 62,190, 28,158,231,165, 10, 27, 57,114,100,137,221,110, 39,103,207,158, 37,104, 24, 61, 8, 47, 66,139,156, 61,123,150, 68, 71,
+ 71,231, 3, 8,243,112,204,216,152,152,152, 34,165, 82,121, 20, 77,156,214,161,125,251,246, 21,167, 78,157, 34, 69, 69, 69,100,
+221,186,117, 36, 34, 34,162, 37, 70, 4,166,118,236,216,177,178,174,174,142, 24,141, 70,146,147,147, 67, 18, 19, 19, 43, 64, 71,
+ 30, 82,252,243, 17, 12, 96,106, 74, 74,138,241,227,143, 63, 38,235,215,175, 39, 11, 22, 44, 32,211,166, 77, 35,227,199,143, 39,
+ 25, 25, 25, 36, 35, 35,131,140, 26, 53,138,188,242,202, 43,228,246,219,111, 39,106,181,186, 22,192,189, 52,233, 40, 40, 40, 40,
+154, 23,137, 0,102, 57, 4,213,202,145, 35, 71,150,152, 76, 38,114,225,194, 5,242,195, 15, 63, 16, 52, 76,221,224, 9,111,150,
+150,150,146,210,210, 82,113,106,132,124,252, 49,173,195, 87, 14,222,171, 18, 65, 73, 73, 73, 21,251,247,239, 39,133,133,133,100,
+237,218,181,196, 33,216,154, 13, 10,133, 98,131, 86,171, 37, 70,163,145,108,218,180,137, 78,239, 64,113, 45, 34, 10,192,220, 27,
+110,184,193, 58,123,246,108,178,114,229, 74,242,217,103,159,145, 17, 35, 70,144,215, 95,127,157, 60,248,224,131, 36, 50, 50,210,
+ 4, 32, 11, 64, 8, 77,174,171, 7, 93,217,156,114, 82, 78,202,233,142,245,199,143, 31, 39, 34,236,118, 59,185,112,225, 2,217,
+176, 97, 3,137,137,137, 57,134,198,243,105,185,114,106, 58,119,238,124,242,212,169, 83,228,252,249,243,196, 98,177, 56, 57, 78,
+158, 60, 73, 0,108,109,134,112,166,198,199,199,151,111,217,178,133,156, 58,117,138,196,196,196, 20, 53,103,220,147,146,146,202,
+ 43, 42, 42,200,166, 77,155, 72,100,100,164, 63,145, 69,243, 18,229,252, 39,115, 38, 1, 88,220,163, 71, 15,251,156, 57,115,200,
+211, 79, 63, 77, 18, 19, 19,237,142,151,162,248,235, 73, 8, 93,223,179,180, 82, 80, 80,252, 21,144,239,222,189, 27,114,185,220,
+185,227,247,223,127,119,157, 71,203,219,188, 13,218, 19, 39, 78,220, 50,124,248,240,109,115,230,204,233,236, 58,138,105,203,150,
+ 45, 0, 96,106,134,176,229, 94,184,112,161,255,176, 97,195, 62,141,136,136,184,177,180,180,244,157,230,140,120, 97, 97,225, 43,
+ 93,187,118,157, 94, 87, 87,167,213,235,245,163, 64,231,206,162,184,118, 81, 8, 96,244,129, 3, 7, 62, 60,112,224,192, 91, 0,
+ 8,128,247, 1,156,184,222, 18,130, 10, 45, 10, 10,138, 63, 27, 99,159,124,242, 73,247,206,226,251, 0,252,159, 15,145, 37,226,
+ 82, 65, 65, 65,159, 59,239,188,243, 57, 52, 30,157, 40,118, 78,111, 14,228,154,205,230,161,238, 35,165,154, 9, 75, 74, 75, 75,
+151,208, 44, 64,113, 29,225, 24,128, 7,175,231, 4,160, 66,139,130,130,226,207,198, 57, 0, 79, 92,197,249, 90,120,158,103,139,
+130,130,130,226,111, 7,186,168, 52, 5, 5, 5, 5, 5, 5, 5, 5, 21, 90, 20, 20, 20, 20, 20, 20, 20, 20,255, 44, 48,240, 62,
+114, 32,187, 9, 60, 87, 50,162, 33,155,114, 82, 78,202, 73, 57, 41, 39,229,164,156,215, 29,167, 63,238,108, 80,180,168, 0,163,
+156,148,147,114, 82, 78,202,249,207,230,100, 28, 27,235,216,196,223,127,231,184, 51,127,227,184, 95, 47,156,215, 36,254,170,206,
+240,226,141, 16,208, 48,228,147,226,239, 7,215, 2, 66,232,125,162,160,160,104, 98,221, 33,113,121,216,218, 29, 27,254,134,117,
+137,171, 40, 16,174,242,185,212, 18,113,191,158, 57,175,121,161,117,163, 74,165,154, 44,147,201, 82, 24,134,177,235,116,186, 35,
+ 38,147,105, 62,128, 93, 87,121,205,175,162,163,163,199, 86, 85, 85, 9, 44,203,130,101, 89, 48, 12, 3,150,101,193,243,188,161,
+182,182, 86,115, 37,164,145, 93, 70,188,202, 49,204, 11,118, 98,159, 95,126,116,213, 52,127,251, 41,124, 23, 24,169, 84,122, 95,
+120,120,120,104, 69, 69, 5, 97,217,134,174,124, 18,137, 68, 92, 8,215, 86, 91, 91,251, 77,160,100, 97, 97, 97,123,195,195,195,
+ 67,197,243, 25,134, 65, 85, 85, 85, 77,121,121,249, 77, 0, 16, 20, 20,180, 67,165, 82, 69,112, 28, 7,137, 68, 2,137, 68, 2,
+189, 94, 95, 85, 85, 85,117, 11,189, 21,255, 76, 44, 95,190, 92, 50, 44,254,137,118, 28, 49,116, 99, 89, 18, 34, 8, 76,173,141,
+ 81,252,190,254,194, 87,103, 2, 57,127,212,168, 81,118,154,138,127, 30,100, 50,217,236,232,232,232,127,215,215,215,235, 25,134,
+ 33, 12,195,128, 97, 26,222,179,220, 63,237,118,123,113, 85, 85, 85, 79, 63, 15, 91, 94, 38,147,205,140,137,137, 25,163,215,235,
+245, 14, 62,143,188, 0, 96,181, 90,139, 43, 43, 43,123, 6, 84,215, 71, 70,206, 87, 40, 20,143,234,245,122, 29,195, 48,130,235,
+127,132, 16,215,135,249,217,202,202,202,126,254,132,129, 76, 38,251, 52, 58, 58,250, 95,142,184, 59,195,121,181,113,143,142,142,
+ 30,163,211,233, 2,226,244, 17,247,203, 56, 91, 34,156,127, 83,206,107, 95,104,165,167,167,127,183,103,207,158, 14, 60,207, 3,
+ 0,140, 70, 99,215,185,115,231, 62,246,198, 27,111,100, 1,152,120,133,215, 91,216,175, 95,191,135,114,114,114,216,149, 43, 87,
+178,189,122,245, 2,195, 48,176,219,237,176,219,237,232,210,165,139,226, 74, 35, 18,162, 82, 78, 56,184,241,191, 65, 55, 14,121,
+242,133,114, 96,154,191,253,190, 4, 38,128,183, 1,164, 52, 49, 8, 21,142,116, 57,232, 69,108,236,100, 89,182, 73,156,130, 32,
+228, 95,186,116,169,143, 15, 1,211,236,156, 14,145,117,127,191,126,253, 66,178,179,179,153,162,162, 34, 70,161, 80, 64, 16, 4,
+216,237,118, 88,173, 86,220,112,195, 13, 77,114, 66, 67, 67, 67, 53, 19, 38, 76,104,119,199, 29,119,224,135, 31,126,192, 99,143,
+ 61,134,190,125,251,230,149,151,151, 3, 0, 84, 42, 85,196,241,227,199, 59,132,135,135, 67,175,215,163,182,182, 22,183,221,118,
+ 27,170,170,170,254,209,133,235,230,244,132,247, 25,150,113,206, 21, 69,108,246,234, 61,191,151,188,125,181,188,225,225,225, 7,
+229,114,121,180, 95,181,236,242, 32, 51, 26,141,101,213,213,213,221,253,156,146, 4,224, 46,137, 68,210,158,227,184,142, 0,146,
+108, 54, 91, 52, 0, 72,165,210, 50,137, 68, 82,104,181, 90, 79,153,205,230,211, 0,126,129,143, 5,144,135,197, 63,209,142,177,
+233, 71,214,153,132,225,202,182, 89,169,250,179, 19,114,149,114,253,218, 97,241, 79,172, 8, 84,108,253,133, 72, 5,176, 12, 13,
+ 11, 74, 63,141,134,121,128,174, 6,241, 0,238, 70,195,154,143,201, 22,139,165, 18,192, 1, 52,244, 67,201, 3,144, 24, 25, 25,
+185, 68, 16, 4, 83, 85, 85,213, 19,240,176, 80,117,239, 30,173,247,179, 44,155, 32,122, 2, 2,177, 23,239, 62, 80,220, 44, 15,
+ 40,150,101, 63,205,204,204,252,215,138, 21, 43,148, 7, 14, 28, 80,118,238,220,217,249, 66, 36, 8, 2, 26,107, 23, 32, 57, 57,
+217,159,171,193,177, 44, 59,123,228,200,145, 15, 47, 94,188, 88,121,238,220, 57,101, 92, 92,156,147,211, 85,108,137,136,139,139,
+ 11, 52,239,127, 53,116,232,208,209,139, 22, 45,226, 87,173, 90,165,104,213,170, 21, 34, 34, 34, 32,149, 74, 47, 59,246,150, 91,
+110, 17,252, 71,157,253,244,158,123,238, 25,253,253,247,223, 43,247,236,217,163,236,210,165, 11, 36, 18,201, 85,199,125,196,136,
+ 17, 15,127,247,221,119,202, 35, 71,142, 40,219,183,111, 15,209, 84,112,231, 99, 89, 22,173, 91,183, 14,136,243,238,187,239,126,
+120,217,178,101,202,131, 7, 15, 42, 59,118,236,232, 76, 79, 66,200, 21,135,243,111,206,121, 93, 56, 90, 50,139,197,130,173, 91,
+183,130,101, 89,132,135,135, 99,236,216,177,216,184,113,227,132, 77,155, 54,173,190, 2,103,235, 43,135,200,226, 1,224,199, 71,
+ 71, 32,159, 7,198,149,155, 33,149, 74,113,246,236, 89, 72, 36,146, 38, 91,139,114,185,124, 12, 33,100,146,254,194, 62,185,193,
+ 96,133,177,100,191, 82,161, 80, 56, 31, 0,250, 18,199,254,139,251,149, 10,133,226,172, 68, 34,153, 90, 95, 95,191,208, 27, 95,
+251,246,237,191, 61,118,236, 88, 39, 79, 5,215, 23,244,122, 61,218,180,105,147, 88, 93, 93,221,222,211,255, 60,207, 39,156, 59,
+119, 46, 74, 38,147,129, 16,226, 44,196,238,159,226,119,139,197,130, 27,110,184,193,226,235,154,190, 56,109, 54, 27,130,130,130,
+ 32,186, 81,102,179, 25,245,245,245,254, 56, 25,169, 84,122,159, 40,178, 0, 96,233,210,165,136,137,137, 65, 84, 84, 20, 84, 42,
+ 21, 20, 10,133,147, 51, 80, 72, 36, 18, 12, 27, 54, 12,239,190,251, 46,178,178,178,240,218,107,175, 53,170,104,121,158, 71,120,
+120, 56,214,173, 91, 7,141, 70,131,196,196, 68,136, 2,255, 31,109, 11,178, 76,248,174,253,231,157, 14,237,237,183,118,226,110,
+238,206,125,238,120, 84,130,101, 1, 65,104,120,116, 50, 12,136,205, 42, 92,218,127,164,228,157, 0,210, 51,174,176,176, 48, 42,
+208, 52,178,217,108,136,139,139,147,248, 57,108,120, 90, 90,218,143,207, 62,251,172,180,125,251,246,140, 84, 42, 5,199,113,224,
+ 56, 78, 20,232,137,132,144, 68, 65, 16, 6,150,149,149,145,185,115,231,126,184,101,203,150,123, 1,172,245, 88,177, 16, 67,183,
+ 58,147, 48,124,219, 33,220, 52,114,200, 27, 88,183,124,194, 77,253,210, 5, 4, 43, 13,103, 0,252,157,133, 86,106, 90, 90,218,
+161, 61,123,246, 4, 89, 44, 22,244,238,221,123,119,110,110,110, 15, 92,217, 12,238, 97, 0, 62,153, 56,113,226,232,103,159,125,
+ 86, 18, 26, 26, 10,153, 76,134,186,186, 58,156, 57,115,102,204, 55,223,124, 67,190,248,226,139,255, 3, 16, 92, 88, 88,152,177,
+119,239, 94, 12, 26, 52,232, 69, 0, 47, 95,174, 8, 36, 9, 59,246, 22, 68,137,191,239, 30,214, 85,154,209,147, 45,107,112,113,
+220,143, 38, 16,236, 66,241,222,195, 23, 2, 17, 98, 31,142, 24, 49,226,145, 21, 43, 86,168, 1, 96,222,188,121,184,239,190,251,
+ 16, 30, 30, 14,165, 82, 9,169, 84, 10,158,231, 27,125,250,121,216, 74, 0,124,248,224,131, 15,142, 92,188,120,113, 48, 0, 44,
+ 94,188, 24, 35, 70,140, 64, 68, 68, 4,130,131,131, 33,147,201, 32,145, 72,154,156,152,225,225,225, 95,245,189,233,166,199, 23,
+ 45, 90, 4, 0,120,235,165,151,112,199,205, 55, 67,173, 84, 64,169,144, 65, 76, 11,153,132,199,237,227, 94,240,171, 47, 1,124,
+124,223,125,247, 61,240,253,247,223, 7, 3,192,129, 3, 7, 80, 94, 94,142,232,232,104, 40, 20, 10,200,100, 50,103,156, 25,134,
+129, 66,161, 8, 40,238,247,221,119,223,200,239,190,251, 46, 24, 0, 22, 46, 92,136, 97,195,134, 57,227, 46,151,203, 33,149, 74,
+ 27,109,238,162,211, 19,231,189,247,222, 59,114,217,178,101,193, 0,240,205, 55,223, 96,200,144, 33, 8, 11, 11,115,166,167,200,
+213,148,123,244, 55,231,188, 62,132,214,161, 67,135,238, 87,169, 84, 51, 0, 68,202,100,178,208,135, 31,126,184,245,227,143, 63,
+142, 7, 31,124, 16,155, 54,109,122,170,137, 66,139,137,142,142, 30,155,147,147,227,124, 66,155,201,101,130,169,201, 15,112, 7,
+ 38,237,127,234,169,152,172, 51,245,216,189,247, 20,130,192, 50,123, 63,254, 56,210,120,250, 52,236,102, 51,222, 59, 91,215,176,
+223, 70,152,173,175,140,139,185,113,246,255, 77, 2,176,208,135, 11, 32, 55,153, 76,200,203,203,107, 82, 32,138,138,138, 32, 8,
+130,201,151,187, 32,149, 74,113,244,232,209,203, 84,189, 39, 36, 38, 38,250, 42,128,126, 57,215,175, 95,143,241,227,199,227,212,
+169, 83, 16,151, 42, 9,128,147, 9, 15, 15, 15, 21, 69,150, 40,130, 20, 10, 5,120,158,103, 56,142, 99,196,166, 61, 71,225, 10,
+ 72, 24,179, 44,139,111,191,253, 22, 31,124,240, 1, 94,127,253,117,204,159, 63, 31,221,186,117,251, 35, 19,114, 28,180, 90, 45,
+194,194,194, 16, 22, 22,214, 72, 32,254,147,225,126,155,103,206,154,163,132, 64, 26, 58,129, 16, 1, 16, 0, 2, 2,129, 8, 40,
+187,112, 6,147,223,253, 40,224,167, 15,207,243, 56,125,250,180, 51, 31,136,206,176, 40,140, 92, 93,131,164,164, 36,191,121, 73,
+ 42,149, 78,249,249,231,159,101,223,126,251, 45,190,255,254,123, 48, 12, 3,185, 92, 14,149, 74,133,208,208, 80, 68, 68, 68, 56,
+183,132,132, 4,230,127, 61,184,254,121, 0, 0, 32, 0, 73, 68, 65, 84,255,251,159,180, 91,183,110, 83,180, 90,237, 90,207,247,
+156,132, 40,219,102,165,142, 28,242, 6, 0, 96,228, 27, 4,151,242,166,221,200,214,188,243,119, 94, 68, 54,181,107,215,174,219,
+119,238,220, 25,164,215,235, 33, 8, 2,214,174, 93,171, 28, 50,100,200,182,130,130,130,126, 77, 21, 91, 73, 73, 73,171,118,238,
+220,121, 75,100,100, 36,106,107,107,161,213,106, 97,181, 90, 33,145, 72,144,152,152,136, 15, 63,252,144,185,231,158,123,158, 31,
+ 51,102,140, 81,161, 80,136,206, 70,146,231,188,212, 56, 51,205,253,236,243, 80, 66, 26,242, 15, 17, 72,163,207,234,242, 66,188,
+244,202,228,128,194,216,186,117,235,167,127,248,225, 7,181,171,179,228, 42, 2, 92, 69,150,184,249, 17, 6,108,155, 54,109, 30,
+ 95,178,100,137,147,179, 85,171, 86,224, 56, 14, 60,207,131,227, 56,176, 44,139,109,219,182, 97,198,148,137, 8,139,140,195,156,
+207,230,249, 13,103,100,100,228,252, 97,195,134, 61,186,112,225, 31, 85,119,215,182,109,113,231, 45, 55, 35,170,149, 6,173,194,
+130, 27,210, 73, 96,240,251,169, 2,191,207, 35, 0,108,235,214,173,159, 88,190,124,185,218,245,133, 80,140,171,248,242, 44,186,
+248,102,179, 25, 61,123,246, 12, 40,238,174,156,162,219, 38,138, 54, 49, 61,197,235,136,229,213, 79, 56, 31, 23,133,176, 67,112,
+ 54,226,224,121, 30,203,215, 45,242,234,102, 95, 41,103, 83,239,187, 59,103, 97, 97, 33,166, 79,159, 14,241,165,205,181,171, 80,
+124,124, 60,230,204,153,227,183, 94,114, 43, 3,189, 0, 68,186,236, 50, 3,144,185,124, 86, 48, 12,179,207,195,113,226,126,222,
+209, 98, 21,137,134,126, 99,117, 0, 66, 61,240,121,227,169,116, 60,243, 34,221,142,111,116, 29,175, 66,107,245,234,213, 98, 41,
+ 30,152,153,153,185,213,241,189, 70, 46,151, 23, 41,149,202, 24, 0,117,107,215,174,197,127,254,243, 31, 56,172,213,187, 67, 66,
+ 66,142,121,112,117, 14,153, 76,166, 55, 0,148, 57,118,137, 67, 52,217,234,234,106, 97,227,198,141,236,226,123,135,194, 76,128,
+244, 73, 51, 48, 44, 51, 19,235,227,101,144, 0,184,233,100, 37,148, 74, 37,167,213,106,173,174,253,182, 60,244,221,202,118,203,
+ 80,146, 32,142, 67,239,237,107, 48,126,251, 26,220,164,146,161,106,197, 50,212,237,200, 1,203, 50,232,175,106,133,215, 30,217,
+136, 62, 26, 57,100, 38, 29, 88,150,245,148,179,157,156,121,121,121,163, 52, 26,205, 12,183, 4, 14, 4,249,104, 88,199, 9, 94,
+194, 9, 66, 8,186,117,235, 6,134, 97,156,110,129,184,137,133, 78,220, 14, 30,244,216, 2,233,149,211,209, 4, 7,149, 74,133,
+223,126,251,205,121,204,224,193,131, 97, 52, 26, 17, 30, 30, 30, 16,103, 69, 69, 5, 41, 41, 41, 97, 22, 47, 94, 12,158,231, 17,
+ 17, 17, 1,165, 82,201, 44, 90,180,104,162, 84, 42, 77, 48, 26,141,130,217,108,134, 76, 38,155, 35,222, 31,142,227,116, 90,173,
+ 54,194, 27,167, 68, 34,193,179,207, 62,139, 87, 95,125, 21,243,231,207,199, 83, 79, 61,117,153,227,101, 52, 26,209,170, 85, 43,
+167,216,242, 80, 0, 91, 98,184,111,203,114, 10, 4,199, 14,174,199,241, 35,217, 16,236, 2,236, 2, 1, 33,118, 8, 54,224,192,
+198,221, 29, 46,230,151,196, 19,144,134,174,183, 0,228,181,245,182, 1, 17,178,142, 0, 86,110,173, 50,207,246, 23, 78,142,227,
+ 96, 52, 26,241,243,207, 63,227,228,201,147, 88,187,118, 45, 12, 6, 3, 90,181,106,133,208,208, 80,220,124,243,205, 24, 51,102,
+ 12,146,146,146,252,198,157, 16,178,176,168,168, 40,189,111,223,190, 76, 77, 77, 13,106,106,106, 96, 48, 24, 96,183,219, 97,179,
+217,192,113, 28,130,130,130,160, 80, 40, 16, 29, 29, 13,163,209, 72, 76, 38,211, 66,111,156,130,192,212,234,207, 78,200, 93,183,
+124,194, 77, 35,223, 32, 88,241, 1,131,118,109,228,250,223,246, 7, 63,190,114,251,107,183, 1, 32, 2,113, 90, 11,196,106, 23,
+ 42, 95,157,248,201,243,127,250, 61,186, 92,100, 69, 24, 12, 6,212,213,213, 53,216,250, 50, 25, 86,172, 88,209,234,174,187,238,
+202, 41, 41, 41,233,239, 67,108, 93,198, 25, 28, 28,156, 40,145, 72,112,244,232, 81,124,241,197, 23,248,237,183,223, 80, 86, 86,
+118, 41, 46, 46, 46,100,224,192,129,236, 75, 47,189,132,244,244,116,124,253,245,215, 65,254, 56, 9, 33, 40,204,219,134,194,211,
+219, 33, 8, 13,174,117,195,230,249, 59, 9, 48,238, 58,157,206,120,232,208, 33,245,151, 95,126,137,168,168, 40, 36, 39, 39, 67,
+169, 84, 34, 40, 40,168,209, 67,214,245,193,235,175,108, 26, 12, 6, 99, 97, 97,161,250,187,239,190, 67, 68, 68, 4,146,146,146,
+160, 84, 42, 33,147,201,192,113, 28, 24,134,193,226,197,139,177,244,221, 71, 80,120,234, 8, 70,220,121,155,223,112, 42,149,202,
+ 71, 23, 46, 92,216,200, 2,137, 14, 11, 3,199,179,144,240, 12,194, 6,223, 11, 0,184,180,233, 39, 95,179, 67,186,114, 50,117,
+117,117,198, 61,123,246,168,247,239,223, 15, 65, 16,144,148,148, 4,189, 94, 15,141, 70,227,140,255,198,141, 27,113,207, 61,247,
+224,219,111,191, 69, 70, 70,134,223,184,215,215,215, 27,143, 28, 57,162, 94,178,100, 9,194,195,195,209,186,117,107,103,220,197,
+141,231,121, 72, 36, 18,164,164,164,160,182,182, 22,106,181,218,239, 61, 58,112,224,128,122,201,146, 37, 8, 11, 11, 67, 66, 66,
+130,211,113, 19,197,209, 7,159,191,219,136, 32,136,137,189,106,206,166,222,119,119,206, 17, 35, 70,160, 93,187,118,208,104, 52,
+ 80,169, 84, 78,110, 95,156, 94,180,136, 83,111, 51, 12,179,218,165, 76,100, 50, 12,179,218,245,211,219,113,142,175,253, 39, 78,
+156,216, 51, 43, 43,107,122, 70, 70,198,119, 59,119,238, 92,234,141,207, 27,207,196,137, 19,211,178,178,178,166,187, 30,239,225,
+ 58,222, 29,173,204,204, 76,198, 17, 73, 6, 64,114,143, 30, 61,246,109,218,180, 41, 60, 56, 56,216,121,240,249,243,231, 81, 83,
+ 83,131,224,224, 96,205,204,153, 51, 53, 3, 7, 14, 68,116,116,180,243, 13, 32, 47, 47,239,134,212,212, 84, 45, 0,119,223, 86,
+ 96, 89, 22,125,250,244,193, 49, 71,107,199,176,204, 76, 36, 36, 36, 56, 59,121, 4, 5, 5,225,249,231,159,103,198,143, 31,207,
+137,110, 6, 33, 4, 6,131, 1,177,177,177, 10, 95,174, 14, 0,164, 25, 42,241,211,192,254, 96, 25, 64,127,112, 47,164, 50, 6,
+172,132, 65,119, 82,133, 95, 7,245, 7, 3,192,124,120, 23, 2,112, 97, 14, 2,184,173,101, 28, 14,130, 51,103,206, 4,228,104,
+ 57,226,197, 92, 41,167,232,104,236,220,185, 19,118,187, 61, 80, 78,194,178, 44, 84, 42, 21, 98, 98, 98,160, 80, 40,160, 84, 42,
+153,239,190,251,238,237,228,228,228,216,241,227,199,179, 90,173,150,237,211,167, 15,238,187,239, 62, 78,108,226, 76, 75, 75,243,
+ 27,151,173, 91,183,226,139, 47,190,192, 83, 79, 61,229,209,209, 98, 24, 6,145,145,145,208,104, 52,184, 86, 32, 0,176,216,172,
+208,215, 27,156, 77,186,118,187, 29, 71,182, 28,238,144,127, 56, 47,109,245,119,223,242, 0, 96,220,242,147,235,105,177,247,125,
+190, 44,117, 64, 24,191,103,235, 37,235, 30, 95,121,158,227, 56,140, 29, 59, 22, 89, 89, 89,120,244,209, 71,177,118,237, 90,188,
+243,206, 59,248,247,191,255,125,153,171,229,239,205,209,106,181,254,247,177,199, 30,123,106,197,138, 21, 29,223,120,227, 13, 86,
+116,180,148, 74, 37, 24,134,129,209,104,132,201,100,130,193, 96,192,169, 83,167,132, 39,159,124, 50,215,108, 54,255,215,107,115,
+ 37,163,248, 93, 41,215,175,109,155,192,182,211, 21,124, 20,220,247,230, 36, 3,163,232, 81,123,111,234, 16, 50,124,108, 82, 24,
+ 8, 1, 17, 0,129, 0, 38,147, 14,207, 63,255,162,228, 47,188, 85, 78,145,101, 52, 26,113,232,208, 33, 12, 26, 52, 8, 69, 69,
+ 69, 56,113,226, 4, 58,116,232,128, 69,139, 22, 69, 62,252,240,195, 57,229,229,229,253, 3,117,182,142, 28, 57, 50,241,198, 27,
+111,252,180,190,190,190,186,190,190,254, 83, 0, 75, 1,212,156, 57,115,166,243,153, 51,103,230,174, 95,191,190,223,228,201,147,
+ 37,110,125,116, 36,222,236, 81,171,213, 6,131,193,228, 83, 96,137,191, 9, 17, 2,138, 56,195, 48,164, 99,199,142,184,235,174,
+187,192,243, 60,148, 74, 37,212,106,117,163,102, 51,119,193,229,171,254, 0, 32, 48, 12,131,184,184, 56, 12, 31, 62, 28, 82,169,
+180, 17,167,152, 15,135, 15, 31,142, 23,222,155,132,255,190,112, 43,190,120,172, 3,134,188, 95,230, 51,156,122,189,190,126,243,
+230,205,138, 87,159,122, 10, 55,182,111,143, 86, 26, 13,218, 68, 71, 66, 33,151, 65,234, 26, 38, 38, 32,147,157, 0, 16, 36, 18,
+ 9,186,116,233,130,178,178, 50, 20, 20, 20,160,160,160, 0, 44,203,162,111,223,190, 78, 23,230,244,233,211,120,239,189,247, 96,
+ 50,153, 2,142,123,251,246,237,113,235,173,183, 66, 38,147, 65,169, 84, 54,106, 50, 20,211,180,174,174, 14,237,218,181,195,202,
+149, 43,145,154,154,234,151,179, 83,167, 78, 24, 48, 96, 64,163,244, 84, 40, 20, 78, 81, 4, 0, 69,123,234,157,215,136,143,143,
+111, 18,231,134,189,231,241,229,198,205, 48,153, 5,104,245,214, 70, 39,196,182,210, 96,251,146, 55, 2,138,187,200,185, 96,193,
+ 2,212,212,212, 56,141, 3,241,165, 92, 52, 81, 90,183,110,141,121,243, 60, 59,153,110, 90,196,211, 51, 47, 51,192,231,173,120,
+156,152,185,228, 89, 89, 89,211,221,207,247,199,231,250,191,219,249,102, 55,113, 86,214,164,166, 67,185, 92,254,230,230,205,155,
+195,107,107,107,113,250,244,105,176, 44,235,108, 83,231, 56, 14, 22,139, 5,103,207,158, 69,120,120, 56,202,203,203, 33,151,203,
+ 33,145, 72, 96, 54,155, 1,160,187,183, 7, 56, 33, 4, 47, 84, 52,116, 17, 90, 23, 39, 69, 33,128, 59, 43, 26, 10,134,216, 33,
+254,135, 31,126,128, 90,173, 70,112,112,176,243,211, 95, 51,210,145,130, 51, 40,227, 25,176,187,182,129, 97, 1,150, 1, 24, 9,
+192,178, 4, 44,195,128,221,149, 3,134, 1, 84, 17, 97, 77,173,128,253,117,140,247,217, 1,222,155,251,228,201,197,114,255,190,
+101,203, 22, 4,202,217,174, 93, 59,168,213,106,231,182,126,253,250, 70,142,150,221,110, 71, 68, 68, 68, 32,156,164,193,141, 16,
+ 16, 21, 21, 5,158,231,153, 69,139, 22, 77, 76,249,127,246,174, 59, 60,138,106,125,191, 51,219,119,147,108, 54, 61, 33, 33,148,
+ 0, 82, 34, 77,225,194,165,151, 0, 66,104, 34, 69, 46, 4, 17, 81,138,168, 40, 17,129, 31, 42, 32,161, 73,147, 42,200, 37, 32,
+ 72,151, 46, 69,164,131, 5, 20, 36,129, 64, 8, 9,164,111,234,246, 50,237,247, 71,118,227,102,179, 73, 54, 33,194, 5,231,125,
+158,121,118,167,189,115,206,156, 51,103,222,243,157,239,124,211,176, 97,200,244,233,211, 73,129, 64,128,235,215,175, 35, 33, 33,
+ 1,245,235,215,119,219,103,171,168,168, 40,235,147, 79, 62, 97, 62,249,164,100, 14, 69,100,100, 36,138,138,138,114,237,251, 53,
+ 26, 77,126,159, 62,125,202,248,109,228,229,229, 61,219,158,240,182,251, 72, 91,105, 24, 76, 38,232,180,134, 82,235, 80,110,102,
+142,234,227, 15, 63, 16, 45,155,250, 6, 0,224,195,149,107,160,221,248, 87, 67,118,224,195, 81,129, 67,191,220, 53, 19,192,224,
+202,248,117, 58, 29, 76, 38, 19, 34, 34, 34,112,249,242,101,104,181, 90,244,235,215, 15, 4, 65,148,206, 16,173, 6, 44, 25, 25,
+ 25,157,162,163,163,127, 93,177, 98, 69, 68,243,230,205, 9,189, 94, 15,131,193, 0,199,223,155, 55,111,114, 59,119,238, 76, 49,
+ 24, 12,255,182,153,206, 93,226, 68,198, 55,201,125, 67,223,220,251,227,117, 65,116, 96,163, 36,101, 70, 97, 4,157,159, 33,213,
+107,140,119, 76, 12,151, 0,142, 1, 24,176,224,104, 22,140,109,216,235,105, 65, 46,151,127,117,241,226, 69, 63,147,201,132,107,
+215,174, 97,204,152, 49,150,188,188, 60, 9, 0,252,231, 63,255,177,108,223,190, 93,210,168, 81, 35,108,219,182, 45,224,213, 87,
+ 95,221,163,215,235, 95,116,147,250,219,172,172,172,111,157, 55,250,249,249,173,126,248,240, 97,119, 71,159, 31,154,166, 75,147,
+227,242,193,100, 1,138,162, 96, 52,154, 81, 92,172,133,197, 74,217,218, 76, 22, 12, 67,219,126, 89,208,182,118, 84, 34, 22,122,
+181,125, 49, 88,199,113, 28, 72,130, 40,186,246,103,118,221,202, 68,187,171, 33, 46, 55,173, 89,206, 96,236,179,204,252,252,252,
+ 32, 18,137,240,237,183,223,226,198,165, 19,144, 8, 56, 48, 52, 5,154,178,130,161, 44, 16, 9, 4,248,241,250, 3, 68, 53,243,
+114, 75, 16,250,251,251, 99, 64,199,142,136,238,216,177,100,122,155, 80, 8, 79,169, 20, 10,177,172,196,146, 5,128, 99, 72,119,
+131, 8,176,246,116, 6, 5, 5,225,183,223,126,195,180,105,211,176,120,241, 98,200,229,242,210,217,207,183,111,223,198,238,221,
+187, 17, 21, 21, 85,237,188,219, 45,120, 51,103,206, 68,102,102, 38, 86,174, 92,137,151, 94,122, 9, 34,145, 8, 69, 69, 69,248,
+247,191,255,141,156,156, 28,183, 56, 29,135,247, 36, 18, 73, 25,235,147, 93, 0, 86,183,140, 28, 57,223, 24, 18,130, 67,151,118,
+130, 0,129,171, 59, 62, 40, 35, 10,215,239,186, 80,109,206,185,115,231,150, 73,167, 59,214, 44,119,225,100,117,170,242, 56,130,
+ 32,174,217,141,173, 51,103,206,156, 69, 16,196,145,153, 51,103,206,138,139,139,187,229, 14,159,171,253, 4, 65, 28,181,137,176,
+ 1, 14,219,174, 85, 75,104, 41, 20,138,246,158,158,158,184,119,239, 30,250,245,235,103,201,207,207, 79, 18,137, 68, 77,242,242,
+242,164,185,185,185, 48, 24, 12,186,249,243,231, 63, 0, 32,239,208,161, 67,163, 31,127,252, 17,143, 30, 61,194,246,237,219, 1,
+224,128,107,159, 13, 18, 44,203,150, 86, 10,231,110,155, 64, 32,192,149, 43, 87,112,229, 74, 89,215,175,205,155, 55, 87,249,194,
+120,245,251,195,184,126,253, 58, 28,195, 3,216,255, 59,110,147,201,100, 64,229, 51, 60,202,160, 42,199,248,170, 28,224, 93,193,
+ 93,223, 47, 87, 51,115, 42, 66, 70, 70, 70,133,231, 95,185,114,165,140, 69,171, 42, 78,129, 64, 0,134, 97, 32,151,203, 9,177,
+ 88, 76,136,197,226, 48,187,200, 18, 8, 4,165, 15,140, 84, 42,133, 84, 42, 45,211, 75,173, 8,153,153,153, 61, 50, 51, 51, 43,
+220,175, 86,171, 59,169,213,106, 60,143,176, 82, 20,140, 6, 11,180, 58, 35, 62,143,251,111,201,198,207,241, 51,128,159, 59,189,
+ 51, 13,147,251, 70,245,172,238, 48,181,253,126, 7, 6, 6,226,220,185,115, 32, 8, 2,123,246,236,129,183,183, 55,250,246,237,
+ 11,165, 82,137,153, 51,103, 98,248,240,225,213,109,204,138,243,243,243, 59,189,255,254,251,191, 46, 93,186, 52,188,110,221,186,
+176, 88, 44,176, 90,173,176, 88, 44, 72, 78, 78,198,206,157, 59, 31, 25, 12,134, 78, 0,138,171, 34, 59,145,241, 77,242,254,243,
+ 31,102,246, 30,249,170,241,118,206, 15,200,206,206, 7, 77,103,128,101,104, 88,105,166,196,194, 71,211,160,105, 6, 98,177, 64,
+185,244,139, 15, 78,177,224, 64,146,132, 5,192, 43, 79,170,140, 84, 42, 85,164, 90,173,198,221,187,119, 17, 19, 19,147,157,159,
+159,159, 8,160, 23, 0,228,231,231, 95, 28, 51,102, 76,243,248,248,248,224, 6, 13, 26,192,211,211, 83,169,215,235,171,162,244,
+ 4, 48, 25, 64, 31,148,248,129,216, 81, 0, 96, 62, 73,146,210,107,215,174,149,155,105,119,254,252,121, 0,248,217,117, 15,200,
+102,209, 50,153,160,206, 47,196,132,119,230,252,213, 51, 2, 87, 70, 92,112,224, 48,233, 93,200, 0, 32, 47, 39, 25,111, 76,152,
+ 38,173,170, 67,224,234, 69, 88, 13, 31,157, 50, 29, 53,123, 29,245,244,244, 44, 25,126, 59,184, 19, 71,191,124, 7, 96,172,224,
+ 40, 35, 96, 53, 0, 86, 29, 88,139, 1,132, 88, 14, 80, 70,183,132,150,167,167, 39, 60,229,114, 4,170, 84,224, 56, 14, 66,129,
+ 0, 34,145, 16, 44, 5, 16, 12, 81, 42, 72, 89,247, 2,131,148,118, 42,229,114, 57, 82, 83, 83, 49,121,242,100, 88,173, 86, 12,
+ 25, 50, 4, 22,139, 5, 38,147, 9, 70,163, 17, 13, 27, 54,132,193, 96,112,139,207, 62, 91,209,211,211, 19, 98,177, 24, 31,124,
+240, 1, 94,126,249,101,204,155, 55, 15,177,177,177,104,216,176, 33, 38, 77,154,132,157, 59,119, 34, 50, 50,178, 42, 94,206,177,
+140,236,247,211, 46,182, 28,135,248, 0, 84,187,140,156, 57, 9,130, 44, 35,216,236,203,123, 99,123, 85,155,115,209,162, 69, 80,
+171,213,229, 44, 89,246,255,161,161,161, 88,183,110, 93, 77, 71,134,236,214,163, 32, 23,251, 6, 56, 91,162, 56,142,107,103,243,
+157, 50,199,197,197,221,138,139,139,139, 38, 8,226, 72, 92, 92, 92,116, 69, 22, 45, 87, 60, 46,246,187,253,210, 18, 58,141,141,
+118,119,220,105,191,209,190,190,190,130,240,240,112, 82,169, 84,162,168,168, 8, 1, 1, 1,156, 90,173, 30,169, 80, 40, 62,251,
+238,187,239, 26,233,116, 58,220,190,125, 27,171, 87,175,254, 25,192,170,202,132,214,177, 0,155,233,216,102,201,114, 92, 31, 56,
+112, 32, 26, 52,104, 80,198,154, 37,151,203, 43,173, 60,246,125,118,139,144, 64, 32,192, 11, 47,188, 32, 79, 73, 73, 49,138,197,
+ 98,132,133,133,201,179,179,179,141, 98,177,184,218, 51, 93,170,114,140,175,202, 1,222,149,240,105,215,174, 93, 25, 11,150,227,
+175,227,255, 67,135, 14, 85, 57,116,104,231,108,222,188,121,233,253,242,242,242,178,159, 11, 0,232,215,175, 31, 88,150,133,191,
+191,191, 91,156,118, 81,107,115,128,135,201,100, 98,181, 90, 45,121,237,218, 53, 72, 36, 18,120,121,121,149,250,234,200,100,178,
+ 82,107, 38, 15, 87, 13, 2, 11, 11, 69,193,104, 52, 66,167,211, 1, 0,146,255,220, 87, 86,136,153, 53, 53,230,183, 55,176, 5,
+ 5, 5, 56,113,226, 4,126,248,225, 7,188,252,242,203, 46, 69,117, 53, 4,151,186,160,160,160,243,140, 25, 51,174, 46, 88,176,
+160,142,175,175, 47,172, 86, 43, 30, 62,124,136, 45, 91,182,100, 26, 12,134,206,213,105, 96,192, 1, 20, 69,195,100, 48,163, 88,
+163,197,103, 95,108,173,176,234, 1, 64, 65,238, 29, 12, 28, 52, 92,242, 36,203, 41, 51, 51,115,122,231,206,157,191,208,106,181,
+ 69, 6,131, 97, 56,128,101,142,253,169,252,252,252, 46,131, 6, 13, 90,225,235,235,251, 82,110,110,238, 44, 55, 40,103,166,166,
+166,206,170, 87,175, 94,153,141,102,179, 25,245,234,213,123, 33, 55, 55,119,116,215,174, 93,255, 15,128,175,195,110, 47, 0, 39,
+ 1,172,171,168, 46,217,135, 14,117, 58, 35,148,170, 16,100, 60, 56, 87,101, 66,196, 2, 19, 56,150,173,180, 13,177,119,128, 43,
+ 90,170,152, 25, 87, 46,169,246, 99,237, 47,236, 87,134,141,197, 43,147, 23, 65, 33, 2, 22,190,209, 9, 13, 85, 0,228,190, 16,
+119,253, 24,132,202,118,143, 38, 31,118,139, 60,118,195, 6, 92,183,181,199, 97, 1, 1,152, 49,114, 36, 56, 10,184,156,144,128,
+ 93, 63,253,132,145, 61,122, 64, 33,147,185,221, 97, 97, 89, 22, 98,177, 24,201,201,201,184,124,249, 50,154, 53,107,134,123,247,
+238,149, 9, 67,193,113,156,187,249, 47,205,187, 84, 42,133, 72, 36, 66,118,118, 54,162,163,163, 33, 22,139,177,117,235, 86,156,
+ 59,119, 14, 51,102,204,192,248,241,227,209,189,123,119, 36, 38, 38,186,197,201,113, 92,185,217,138,206,195,185,213, 45, 35,103,
+ 78,231,247,126, 77,202,221,206,185, 96,193, 2,151, 19, 42,220,225,116,165, 69, 92,148,221, 53, 71, 49,100,183, 60, 57, 10, 35,
+231,117, 0, 62,246,109, 51,103,206,156,229,238,121,142,235,118,139, 88,117,134, 48, 75,133, 86,116,116,116,153,156, 23, 20, 20,
+ 92,189,122,245,106, 11, 15, 15, 15,220,185,115, 71,162, 84, 42, 91,216, 27,116,146, 36,177,103,207, 30,175,254,253,251,159, 90,
+182,108, 89, 24,203,178,200,201,201,193, 71, 31,125,164,163,105,122, 20, 0,186,162, 23,120, 85,150,169,195,135,203, 63,108, 7,
+ 15, 30,116,107, 8,196, 46,164,132, 66, 33,124,124,124,140, 70,163, 17, 10,133, 2, 62, 62, 62, 70,131,193, 0, 15, 15, 15,251,
+ 88, 49,137,191,102, 42, 84,101,125,170,202, 49,222,217, 1,190, 74, 36, 36, 36,184,117,156,109,168,213,173, 90,158,154,154, 90,
+ 97, 67,114,238,220, 57,176,182,134,214, 93, 78, 91, 47,143,179, 11, 63,133, 66, 1, 95, 95, 95, 72,165, 82,200,229,242, 50, 34,
+ 75, 42,149, 86,249,224, 84, 21,144, 84, 38,147,253,226,225,225,161,178,239, 23,137, 68,208,106,181, 69, 5, 5, 5,237,159,233,
+161, 67,112,160,173, 52,140, 70, 19,116, 90, 99,173,243, 91, 44, 22, 72,165, 82,236,220,185, 19,157, 58,117, 66,135, 14, 29,202,
+137,172, 26,154,231,211, 11, 10, 10,186,175, 90,181,234,231,229,203,151,251,232,116, 58,252,247,191,255, 45,214,233,116,221, 1,
+164, 87, 75,108,178, 28, 40,171, 21, 6,147, 25,122, 93,201, 61,184,127,107,223,255, 90, 81,237,204,206,206,222, 89,201,254,251,
+ 52, 77, 71,219,227,190,185,129,127,213,171, 87, 15,217,217,217,101, 54,166,165,165,129, 97, 24, 51, 74,226,100,189,233,104, 72,
+198, 95,209,179, 43,234,197,151, 88, 71,141,102,232,116, 37, 86, 16,147, 62,175,118,234,169, 77,108, 84,228,147, 85,147, 58, 68,
+ 16, 68,169,211,247,212,169, 83,113,243,198, 13,244,170,163, 65,195, 96, 47,112,154, 12,136,123,126,138, 63,212,114, 44, 91,113,
+172,218,220,187, 29, 92, 32,150,237,222,237,114,223,253,193,131,171,149,247,164,164, 36,200,229,114, 48, 12, 83,238,125, 83,221,
+252, 59, 10,152, 21, 43, 86, 96,198,140, 25,216,186,117, 43,110,222,188,137,214,173, 91,163,119,239,222,200,205,205,197,141, 27,
+ 55, 96, 54,155,221, 78,167,163,223, 92, 82, 74, 2, 78, 95, 62,142,180,244, 7,200,204,126, 84,227,114,119,228,116, 22, 90,251,
+ 79,255,142, 97, 81,109,107,196,249,217,103,159, 33, 55, 55,183,140, 37,203,177, 93,170,200,162,229,172, 69,156,144,231,228, 11,
+101, 95,183, 56,137, 30,231,117,231,227, 1, 32, 23,128,160,138,243,156,215,243,226,226,226,206,218, 45, 97, 54, 94, 65, 85,254,
+ 89,101, 44, 90, 78, 88, 52,120,240,224, 65,171, 87,175, 14,144,201,100,165, 51,144,102,206,156,137, 25, 51,102, 32, 34, 34, 2,
+254,254,254,161, 42,149, 10,249,249,249, 88,188,120, 49, 82, 83, 83, 39,194, 69,160, 61,103,161,213, 37, 69, 11,137,228,175, 14,
+171,221,178, 5, 0,227,199,143, 47,103,209,178, 23, 80,101,160, 40, 10,126,126,126, 48, 24, 12, 16, 8, 4, 24, 50,100,136,224,
+207, 63,255,100,250,246,237,139,161, 67,135, 10,110,220,184,193, 12, 24, 48, 0, 2,129, 0, 61,123,246,212,236,223,191,255, 67,
+ 0, 95,186, 33,182,106,205, 49,222, 94,201,220,141,125,228,142,184,172,140,147, 32, 8, 24, 12, 6, 8,133,194, 82, 71,121,119,
+ 56,237, 67,135,142, 15, 32, 73,146, 80,169, 84,165,141,135,221,162,101, 23, 90, 85,241, 86, 21,144, 84,161, 80, 40,239,220,185,
+211,200, 62,241, 34, 47, 47, 15, 61,123,246,188, 91, 80, 80,240,108,155,180, 88,192, 74, 51,208, 25, 77,208, 25, 13,181, 70,107,
+127, 30, 54,110,220,136,196,196, 68,152, 76, 38,124,245,213, 87,165,147, 10, 28, 69,214, 99, 8,174,100,185, 92,206,246,235,215,
+ 15, 87,175, 94,133, 84, 42,165, 80,131,248, 87, 44,199,194, 74,211, 48, 25,141,208, 85, 61,228,246,188,160, 84, 85, 39, 38, 38,
+194, 98,177, 96,222,188,121,204,175,191,254,122, 22, 37, 1, 80,237, 22,188,209,221,186,117,155,239,225,225,161, 58,122,244,232,
+123, 0,182, 86,246,242,166,104,155,104,175,197,251,232, 56, 34,224,202, 39,171, 38, 97, 86, 28, 95,172, 44,203, 98,226, 91,111,
+161,119, 29, 13,134,190, 20, 0,125,214, 93, 40,188, 3, 64,168,234, 99,217,138, 99,184,149,226,182, 43, 38, 7, 0,253,186, 13,
+ 70,171,102,229,195,131,117,238, 85,210, 39,187,248,227, 47,200,201,203,172,118,222,245,122,125,133,150,171,106, 88,180, 74,159,
+ 57,251,253,107,211,166, 13,154, 52,105,130,179,103,207,162,109,219,182,184,119,239, 30,238,221,187,135,212,212, 84,220,188,121,
+ 19,133,133,133,213, 46,163,239, 79,238, 66,161,182, 0, 18,177, 4, 5, 69,121, 72,203,120,128, 32,191,224,199, 46,119, 59,154,
+ 14,248, 12, 0, 80, 39,192,187, 90, 66,203,145,115,201,146, 37,229,196,251,227,134,236, 33, 8,226,151,202,214,171,123,254,147,
+ 68, 69, 66,235,129, 90,173,238, 48,114,228,200,153, 0,218,217,182, 21, 3,216,125,234,212,169,193,129,129,129, 61, 58,118,236,
+ 40,148, 72, 36,184,124,249, 50,246,239,223,191, 21,192,174,202, 46, 36,145, 72,140,245,235,215,151,219, 43,162,253, 65, 84, 42,
+149,130,197,139, 23, 19,155, 55,111,174,208,202, 85, 85, 1, 21, 23, 23, 67,175,215,195,219,219, 27, 86,171, 21,253,250,245, 99,
+ 18, 19, 19, 33, 22,139, 49,104,208, 32, 38, 33, 33,161,180,160, 55,109,218, 20,102, 52, 26,255,253,195, 15, 63,244, 1,208,181,
+ 26,247,202,238, 24,239, 9, 55, 29,224, 43,234,229,185, 3,119,135,227, 42,226,156, 54,109, 90,141, 56,197, 98, 49,109,143,252,
+ 78,146, 36,172, 86, 43,218,182,109,139,220,220,220,210,135,198,195,195,163, 84,100,185, 35,180,170, 10, 72, 42, 20, 10, 97,177,
+ 88,208,181,107, 87, 16, 4,129, 53,107,214, 60, 31,195,145, 44, 75,120,122,250,161, 78,157, 23, 16, 16,104, 2,203,214,238, 87,
+101, 98, 99, 99,203,136, 41, 87,145,151,237,247,191, 38,176,115,185, 51, 75,182,178,183,163,125,200, 75,175, 55, 61,115, 69, 24,
+ 24, 24,216, 33, 55, 55,247,160,211,230, 2, 0,243, 43,233, 88,150, 22,244,163, 71,143,208,183,111, 95, 28, 63,126, 92,112,224,
+192,129, 94,135, 14, 29, 74,184,123,247,238,163,182,109,219,214,125,251,237,183,165, 93,187,118, 69, 94, 94, 30, 94,122,233,165,
+207, 51, 50, 50, 42, 17, 90,182,251,104, 50, 67,175,175,125,235,168, 43,107,214,227,188, 24,237,117,114,238,220,255, 67,239,144,
+ 34, 12,105,237,141,248, 35,151, 48,186,141, 28,176, 72,171,205,103, 79,139,111,157, 6,168, 31,217,161,220,126,169,178, 36,150,
+107,253,200, 14, 32, 31,221,171,118,222, 29,211,236, 44,170,106, 98,209,115,188,159, 19, 38, 76,192,199, 31,127,140, 62,125,250,
+224,222,189,123, 56,127,254, 60,238,221,187,135,105,211,166, 33, 50, 50, 18,173, 91,183,174, 22,231,161,211,123,161,209, 21,131,
+ 36, 72, 20, 20,231,195,100, 54, 34,118,210,220,199, 46,247,210,151,255,233, 56, 0,192,190, 83,215,107,204, 57,123,246,108,100,
+103,103,151,177,100, 61,142, 95,214,179,142,202,162,165, 61, 0, 48,209,121,163,197, 98,241,154, 55,111, 94,148,191,191, 63, 8,
+130,192,138, 21, 43,224,235,235,219, 9,192, 45,139,197,146,167,215,235,103, 56,136,144,222,176,197,218,200,201,201,113, 57,111,
+ 95,175,215, 91,163,162,162, 68, 33, 33, 33,101,102, 27,122,120,120, 84,100,221, 41,229,180,239,163,105, 26,177,177,177, 88,184,
+112, 33,194,195,195, 49, 96,192, 0, 68, 71, 71,131, 32, 8,244,235,215, 15, 3, 6,252, 53,148,171, 82,169,196,199,143, 31,239,
+ 70,146,100,130,195, 11,164, 12,167, 43,216, 29,227, 41,138,114,215, 1,190, 12,167,189,178, 77,155, 54, 13, 11, 23, 46,196,172,
+ 89,149,187,122,108,216,176, 1, 40,239, 79,245,183,115, 22, 20, 20,148,105,236, 21, 10,197,154,161, 67,135, 10, 31, 61,122, 84,
+ 70, 92, 57, 46, 46, 26,162, 50,156, 85, 5, 36, 21, 8, 4, 8, 10, 10,194,130, 5, 11,224,231,231,135,224,224, 96, 87,129,252,
+170, 44,163, 26,224,111,229,100, 56,246,218,210, 69,255,215,249,191,219, 15,137,164, 18,224,202,249,125,208, 20,150, 29, 78, 50,
+ 91,255,154, 74, 45,105,219, 11,150,235, 63,186, 85,151,236, 98,250,179,207, 62,195,103,159,125, 86,105,130, 54,110,220,248,216,
+121,119, 83,108,149,231,100, 57, 66,225,225, 3,153, 71, 29,180,136,244, 1,203,209,255, 83,101, 84, 1,126,253,229,151, 95, 6,
+249,249,249, 33, 61, 61, 61, 64, 36, 18, 13, 42, 99,174, 50, 26, 81,191,126,253, 23,212,106,245,191,171,226,156, 54,109,154,121,
+206,156, 57,210, 81,163, 70, 97,232,208,161, 24, 53,106,148, 84, 44, 22, 55,230, 56, 14, 86,171, 21,233,233,233,248,241,199, 31,
+161, 86,171,111, 87,150, 78,150,227, 8,185, 66, 5,153, 71, 8, 90,188,168, 2,203,210,181,146,119, 71,171,184,163, 53,171,154,
+ 34,203,101,253, 4,128, 95,127, 60,136,185, 31,188,136,173, 71,127,198,234, 95,128, 86,170, 92,180, 8, 80,131, 85,223,198, 71,
+163, 95,198,178, 29,191, 1, 0,206,159,171,178,140,184,202,234,160,201,104,125,172,188, 59, 90,174, 28,175,227,134,143, 86, 57,
+ 78,123, 39, 81,171,213,162,168,168, 8,241,241,241,120,227,141, 55,144,155,155,139,212,212, 84,220,189,123, 23,223,125,247, 29,
+ 20, 10, 69,141,202,232,195,183,102, 99,206,178,233,224,192,161,105,163, 22,152, 57,249, 51,180,107,213,241,177,203,221, 25,110,
+ 88,179, 42,228, 92,185,114,101, 77,235,210, 63, 78,104,185,132,191,191,255,168,110,221,186,193,100, 50, 33, 32, 32, 0,169,169,
+169, 32, 73, 50, 2, 40, 25,194, 11, 13, 13,221,173, 86,171, 35,220,229, 19, 8, 4,160,105,186,212,247,199,190, 0,192,192,129,
+ 3,113,248,240,225, 42,123, 20,193,193,193,168, 91,183, 46,222,127,255,253,114,179, 28, 28,103, 58,200,229,114, 28, 61,122, 52,
+187,160,160,160,128,227,184,106, 77,115,179, 59,198, 95,188,120,209,109, 7,120, 71, 88,173,214, 71,119,239,222, 13,217,184,113,
+163,160,146,151, 95, 41,206,159, 63, 79,163,138,161,154,191,131,211, 85,207,148,227,184, 10, 69,150, 59, 97, 4,170, 10, 72, 42,
+ 20, 10,145,148,148,132,185,115,231,130, 32, 8,236,219,183,239,185,120,184,254,188,147,191,153, 36, 73,159,129,175,116,110, 9,
+130,128,213, 82,126,164,218,179, 80, 87, 42,178,134,126,185, 11, 7, 62, 28,233,142,232, 73,190,112,225,130,239,198,141, 27,133,
+238,148,251,133, 11, 23,104,142,227,170, 61,236,103,127,225, 88,173, 86, 24,141, 53,179,162,112, 28,119, 57,238,139, 57, 81,219,
+190, 61, 38, 34, 8, 11,174,156,219,135,226, 34,215,238, 12, 18,145, 16,155,227,247,211, 98,145,224,209, 83, 46,186,181, 67,134,
+ 12, 25,245,213, 87, 95,181,112,181,211,141, 73, 48,169, 38,147, 9, 25, 25, 25, 48, 24, 12,123, 63,249,228, 19,235,177, 99,199,
+222,124,245,213, 87,209,186,117,107,132,132,132, 32, 43, 43, 11,201,201,201,136,143,143,231, 46, 93,186,180, 23,192,148, 42,238,
+227,193, 69, 95,204,137,137,223,113, 76, 66, 18, 86, 92, 57,191, 15,197, 78,162,189,188,117, 90,132,111,182,238,183,138,197,162,
+ 59, 85, 89,139, 28,173, 89,181,249, 98, 28, 52,102, 50,134,174, 90,141,136,118,125,177,104,113,111,124,243,197,112, 44,239, 39,
+134,117,207,104,180,122,109, 27,118,206,235, 15, 0,168,243,141,155,214, 18,161, 24, 15, 93, 88,172,138,138,101, 54,113, 83, 61,
+171,169, 61,239,149, 89,174,170,107,209, 34, 73, 18, 13, 26, 52, 64, 68, 68, 4, 58,117,234,132,182,109,219,162, 71,143, 30,184,
+113,227, 6,110,220,184,129,105,211,166, 85, 38,178,170, 44,163,238,255,142,194,207, 93,238, 60,118,217, 56,151,123,109,192,157,
+186, 52,121,242,100, 0,248, 71, 89,183,170, 45,180, 52, 26,205, 13,150,101, 91,122,123,123,219, 45, 82,165,251,210,210,210,192,
+178,172,161,186, 5, 99,177, 88,236,193, 49,203,196,101,178, 59,199, 87,246,224,115, 28,199, 20, 20, 20,160, 91,183,110,232,210,
+165, 75,233,240,137,227,226, 32, 76,112,224,192, 1,112, 28, 87,109, 39,107, 7,199,120, 29,170,233, 0, 15, 0,185,185,185,125,
+187,118,237,122, 74, 40, 20,186,245, 21, 77,150,101, 83,115,114,114, 94,121,210,156,174,202,135,101,217, 10, 69,150, 59, 13, 81,
+ 85, 1, 73,133, 66, 33, 60, 60, 60,240,253,247,223,195,223,223,255,185,122,192,110, 36,170,151, 84,182,191,155,159,228, 28,128,
+128,161, 95,238,122,120, 46,223, 90,111,232,151,187,210, 14,124, 56, 50,188,178,115,178,179,179,251,140, 28, 57,242,184,187,229,
+ 78,211,244,131,236,236,236,106,135, 75,224, 56, 14,119,238,220, 97, 39, 76,152,144,167, 86,171,135,215, 36,255, 51,231,174, 94,
+190,240,243,169,126,253,162, 58,180, 3, 9, 88, 42,118,254,229, 8,128, 19,138, 4,143,102,204, 90,249,214,240,225,195,159,102,
+177,105,178,179,179, 59, 13, 27, 54,108, 10,254,114,157, 40, 35,164, 80,193,236,106, 27, 86,213,173, 91,247, 69,129, 64, 32, 5,
+ 48, 23, 64,218,165, 75,151,214, 94,186,116,169, 15,128,127, 9, 4,130, 16,134, 97, 50,108,157,158, 93, 0,254,168,186, 30,229,
+190, 13,142, 13,235,215,251, 95,125, 65, 16,156,197, 98,174,162,131, 4, 14, 28,199,137,197,162, 59,191,222,200,106, 85, 89, 71,
+202,225, 11, 28,181, 62,100, 63,101,202, 20, 76,153, 50,165,180, 62,173, 89,211, 5,123,255,188,136,215, 90,165,195,252,117,103,
+ 16,202,112,183, 59,124, 0, 48,251,255, 38,212, 90,218, 28,243,238,104,209,114,245, 28, 84,199, 71, 75, 32, 16, 32, 47, 47, 15,
+ 73, 73, 73,200,201,201,129,193, 96, 64, 98, 98, 34,172, 86, 43, 10, 11, 11,241,226,139, 47,214, 56,157,181, 85, 70, 79,147,243,
+159, 56,124, 88,109,161,101,181, 90, 63,109,208,160,129, 72, 38,147,181, 96, 24, 6, 28,199,129, 97, 24,206, 38,106,170, 61, 11,
+ 79, 36, 18,153,154, 52,105, 66,184,154,157, 96,255,239,225,225, 97,172,196, 90, 18, 87,191,126,253, 79, 8,130, 16, 84,212, 11,
+177,255,103, 89,150, 17, 10,133,113, 53,188, 87,143,235, 24,175, 87,171,213, 29,107,185,252,254, 14, 78,231,242,209, 55,107,214,
+172,244,139,246,206, 49, 81,108, 31, 91,213, 87, 33,206, 43, 13, 72,170,215,235,179,250,246,237,203, 56,238,119, 12,104,250, 92,
+131,224,210,250,143,122,179,222,185,124,107, 61, 0,176,139, 45,112, 92, 90, 37,103, 25,179,179,179,187,253,221, 73, 75, 73, 73,
+177,252,235, 95,255,250, 86,171,213, 78, 6, 80, 99,111,254, 89,159,174,153,245, 12,150,140, 6,192,194, 26,158,155,150,159,159,
+223,211,105,219, 31,118, 65,101,143,107, 87,109,209,126, 59,175,214, 99,139,209, 52,157, 30, 17, 17, 81, 45,203, 13, 69, 81,233,
+ 85,237,119,142, 17,230,136, 91,240,198,172,171, 64,201,228,239,124,183, 56, 77, 38, 83, 65,199,142, 29, 69,213,204, 91,174,187,
+121, 15, 9, 9, 65,157, 58,117, 74,127,237,112,222, 94, 85, 58,105,154, 78, 15, 11, 11,131,191,191,127,133, 17,223,157,125,178,
+220,225,172,237, 50,170,140,179, 78,157,109,181,206, 89,211,116,242,112, 15,189,121, 78,158,147,231,124,102, 57, 5,252,253,228,
+ 57,121, 78,158,243, 9,114, 62,151,224,189,212,120,240,224, 81, 17, 24,254, 22,240,224,193,131,199,227,129,168, 68,149, 86,103,
+166, 79, 77,148,237,105,158,147,231,228, 57,121, 78,158,147,231,228, 57,255,113,156, 85,113,215,246, 76,227,231, 26,188, 89,149,
+231,228, 57,121, 78,158,147,231,228, 57,121,206,127, 44,248,161, 67, 30, 60,120,240,224,193,131, 7, 15, 94,104,241,224,193,131,
+ 7, 15, 30, 60,120,240, 66,139, 7, 15, 30, 60,120,240,224,193,131, 7, 47,180,120,240,224,193,131, 7, 15, 30, 60,120,161,197,
+131, 7, 15, 30, 60,120,240,224,193,131, 7, 15, 30, 60,120,240,224,193,131, 71, 9, 8, 0, 56,114,228, 72,233, 7, 1,163,163,
+163, 9,254,182,240,224,193,131, 7, 15, 30, 60,158, 36,158,107, 45,226,152, 57, 30, 60,120,240,224,193,131, 7, 15, 94,139,212,
+ 14, 72, 94,108,241,224,193,131, 7, 15, 30, 60,120,177,197,103,140, 7, 15, 30, 60,120,240,224,193,139,172,103, 10,101, 44, 90,
+188,224,226,193,131, 7, 15, 30, 60,120, 60, 77,177,245,140,106, 17,206,182, 56,174,243,224,193,131, 7, 15, 30, 60,120,240,120,
+ 76,129, 85,217, 47, 15, 30, 60,120,240,224,193,131, 7,143, 90, 18, 92,246,255, 79, 76,104,241, 95, 54,231, 57,121, 78,158,147,
+231,228, 57,121, 78,158,243, 31, 11, 33,127, 11,120,240,224,193,131, 7, 15, 30, 60, 30, 27,142, 86, 44,130, 23, 90, 60,120,240,
+224,193,131, 7, 15, 30,181, 39,178, 8, 87,235,252,183, 14,121,240,224,193,131, 7, 15, 30, 60,254, 38,240, 22, 45, 30, 60,120,
+240,224,193,131, 7,143,199, 3, 1,126,232,144, 7, 15, 30, 60,120,240,224,193,227,111, 21, 91, 46, 55, 86, 52,115,224,116, 53,
+200,107, 50,251,224, 52,207,201,115,242,156, 60, 39,207,201,115,242,156,255, 56,206,170,184, 79,227,217, 67, 55, 0,103, 1,116,
+183,253, 86, 40,188,106, 27,252,212, 87,158,147,231,228, 57,121, 78,158,147,231,228, 57,159,119, 84, 24,168,148,119,134,231, 81,
+ 21,132,168,124,136,185,170,253, 60,120,240,224,193,131,199, 63, 77,108, 17,225, 72,218, 0, 0, 32, 0, 73, 68, 65, 84,113,142,
+ 47, 73, 87,104, 12, 96, 22, 0,111,135,109,191, 0,136,115, 58,110, 7, 0,133,195,186, 30,192, 60, 0,247,170, 76, 13,199,137,
+109,252, 82,219,194, 2, 48, 1, 48, 3,208, 18, 4, 65,241,101,246,212,209, 17, 64,180,237,255, 17, 0, 87,170,185,255,185, 66,
+ 72, 72,136,220,199,199,167,207,245,235,215, 37,137,137,137,184,112,225, 2,183,121,243,102,107, 97, 97,225,201,172,172, 44, 35,
+ 95, 93,158, 11,244, 5, 48,211,246,127, 17,128, 19,143,201, 71, 40, 20,138,105, 30, 30, 30,253,165, 82,105, 29,154,166, 9,131,
+193,144,169,215,235, 79,209, 52,253,165,173,221,171, 46, 6,251,250,250,190,217,180,105,211,198,169,169,169, 25,153,153,153, 59,
+ 0,236, 1, 48,188, 78,157, 58,163,235,215,175, 31,122,231,206,157,123, 5, 5, 5,223, 0, 56,248, 20,211,201,131,199, 63, 9,
+ 68,101,214, 8, 87,152,203,113,220,232, 50, 12, 68,121,142,158, 61,123, 14, 58,121,242,164,130,101, 89,216, 23,185, 92, 78, 3,
+ 24, 87,133,200,242,187,124,249,114,189,201,147, 39, 15,205,204,204,124, 89,171,213,182, 7, 0,133, 66,241,115, 96, 96,224,175,
+171, 86,173,250,142,227,184,116,130, 32,180,213,204,168, 80, 36, 18,189,225,227,227,211,159,166,233,182, 28,199, 65, 36, 18, 93,
+ 47, 44, 44, 60, 65, 81,212, 55, 0,106, 34,222, 36, 66,161,112,138, 84, 42,237, 75,211,116, 75, 0, 16, 10,133, 55,205,102,243,
+ 9,154,166,215, 2,176,212,128, 83, 38,145, 72,166, 40,149,202, 40,139,197,210, 18, 0, 36, 18,201, 77,141, 70,115,202, 98,177,
+172,181, 9,206,167, 13, 33,128,104,142,227, 68, 0, 32, 16, 8, 6,183,111,223,190, 30, 65, 16, 44, 65, 16, 28,199,113,196,207,
+ 63,255,220,134, 97, 24,210, 86, 63,162, 1,252, 10,128,126, 22,159, 16,127,127,255,133, 44,203,214,169,180,208,100,178,151,175,
+ 95,191,222,116,247,238,221,204,215, 95,127, 93, 52,126,252,120,207,201,147, 39, 11,215,172, 89,179, 54, 43, 43,235, 61,231,227,
+253,252,252,150,147, 36,233,239,206,245, 89,150,205,203,207,207,159,254,180,242, 31, 19, 99, 42, 99,238,142,143,151, 53, 2,144,
+ 94,195,250,253,247,113,154, 98, 56, 0,136,151,197, 55,138, 49,197, 36,219,255, 63, 46,175, 3,102,174, 59,173,237,202,113,192,
+148, 40, 47,242,113,133, 86,104,104,104,124, 76, 76,204,168,150, 45, 91, 10, 57,142, 3, 69, 81, 48,155,205, 77,175, 92,185,210,
+125,223,190,125, 47,107,181,218,225,213,164,124,235,227,143, 63, 94, 48,127,254,124,127,145, 72, 68, 80, 20,213,104,247,238,221,
+109,223,126,251,237,247, 55,110,220, 88,119,196,136, 17, 94,246,237,115,231,206,109,183,104,209,162,134, 0,190,124, 10,233,228,
+193,227,159,134,110, 40,235,163,245, 57,128,207, 42, 19, 90, 30,182,151,103,142,205,146, 5,135,223, 82,156, 57,115,230,144, 80,
+ 40,180, 91,180,218,235,245,250, 32, 39, 43,152, 43,145, 85,127,204,152, 49, 29,247,238,221,187,112,196,136, 17,217, 10,133,162,
+201,171,175,190,170, 37, 8, 66,176,123,247,238, 54, 17, 17, 17,242,129, 3, 7,142,233,217,179,231,135, 28,199, 93, 32, 8, 66,
+237,102, 38, 91,248,250,250,238, 95,178,100, 73,189,190,125,251,138,253,253,253,193,113, 28, 50, 51, 51, 67,143, 30, 61,218,239,
+243,207, 63,255,176,160,160, 96, 8,128,132,106,220,184,118,114,185,124,239,231,159,127, 30,210,175, 95, 63, 97,112,112, 48, 76,
+ 38, 19, 18, 19, 19,123,159, 56,113,162,235,198,141, 27,223, 51, 26,141,175,217, 4,134,187,104,239,237,237,189,239,191, 31,127,
+ 28,212,225,141, 55,132,190,190,190,224, 56, 14,106,181,186,247,197,109,219,186, 79, 90,178,228,189,226,226,226, 97,174,238,247,
+211,132, 68, 34, 33,183,111,223,222, 90, 34,145, 0, 0, 44, 22, 11, 34, 35, 35,137,231,229, 9, 33, 8, 34, 44, 51, 51,211, 91,
+ 44, 22,187,220,207, 48, 12,186,118,237,218, 64, 44, 22,227,203, 47,191,164,242,242,242,218,124,245,213, 87,215,119,238,220,233,
+191,118,237,218,215, 0,148, 19, 90, 36, 73,250,167,167,167,187,228,100, 24, 6, 86,171, 21, 52, 77,195, 98,177,160,121,243,230,
+ 79, 53,255,241,241,178, 48, 0,211, 99, 98, 76, 31,216, 54,125, 9,224, 67, 0, 41,168,225, 55,187,254, 6, 78,199,250,182,220,
+225,255, 99,167,213, 1,245, 0,224,216, 13, 19, 0,248, 62,238,125,245,240,240,104,246,250,235,175, 11,213,106, 53, 68, 34, 17,
+172, 86, 43,178,179,179, 17, 25, 25, 41,248,246,219,111, 95,168, 46, 95,163, 70,141,198, 47, 90,180, 40,224,216,177, 99,214,237,
+219,183, 91,162,162,162, 68,227,199,143, 87,118,237,218,181,121, 88, 88, 24,185,101,203, 22,243,169, 83,167,168, 49, 99,198, 72,
+226,226,226, 2,142, 30, 61, 58, 48, 33, 33,225,203, 39,157, 78, 30, 60,254,129, 56,139,191, 66, 60,216,127, 43, 21, 90,112, 16,
+ 87,131, 1, 64, 36, 18,181, 9, 10, 10,138,167,105, 58,216,102,213,201,206,201,201,249,146,162,168,223,109,199, 30,100, 89,118,
+ 80, 85,150,172, 49, 99,198,116, 60,126,252,248,178, 43, 87,174, 20,231,231,231, 7, 31, 58,116,200,244,225,135, 31,166, 2, 64,
+ 74, 74, 74,195,129, 3, 7,134, 78,157, 58, 53,189, 79,159, 62,171,122,244,232,241, 46,199,113,167, 8,130,208, 87, 37,178, 34,
+ 35, 35, 47,159, 63,127,222, 75,165, 82,149,217, 81,191,126,125,188,251,238,187,226, 65,131, 6, 69,244,234,213,235, 82,114,114,
+114, 23, 0,127,186, 35,136, 26, 55,110,124,250,204,153, 51,158, 62, 62, 62, 40, 42, 42, 66,118,118, 54, 12, 6, 3,148, 74, 37,
+ 70,140, 24, 33,238,214,185, 83,221,169,211,222, 59,157,158,145,209,219, 77,177,213,190, 83,139, 22,167,119,198,197,121, 82, 15,
+ 31, 66, 46,151, 67,167,211, 1, 0,188,188,188,240,114,131, 6,194,223,182,109, 11, 29, 29, 27,123,250,215,164,164,222, 79, 73,
+108, 73,109,191,102, 0, 71, 4, 2,193, 96,137, 68, 66, 14, 30, 60, 24,167, 79,159, 38, 76, 38,147,208,102,221,161, 7, 15, 30,
+ 12,185, 92, 14,139,197,194,162,100,232,144,126,150,159, 18,137, 68,130,228,228,228, 50,219,180, 90, 45,212,106, 53,242,243,243,
+ 97, 54,155, 81, 84, 84, 4,150,101, 9,185, 92,174,102, 89, 22, 36, 73, 58, 11,128, 50, 16,139,197, 72, 74, 74, 42,179,141,166,
+105,232,245,122,152,205,102, 88,173, 86,104,181, 90,185,151,151, 87, 99,127,127,255,116, 0, 7, 11, 10, 10,190,204,201,201, 73,
+123,194,217,207,179, 11,162,248,120,217,125, 0,146,255, 69, 78, 7, 75, 86,168,109,253,143, 90, 74,171, 29, 15,143,252,110, 10,
+183, 89,199, 30,212, 2, 31, 11, 0, 23, 46, 92, 64, 78, 78, 14,242,242,242,160, 86,171, 17, 22, 22, 6,142,227,170, 61, 28,151,
+156,156,188,238,197, 23, 95, 36,110,221,186,117, 2,192,154,221,187,119,143, 43, 40, 40,152, 57, 99,198, 12,223,165, 75,151, 22,
+196,198,198, 46, 2,176,117,247,238,221,239, 52,107,214,172,255,237,219,183, 55, 62,141,116,242,224, 81,219,224, 56,174, 29,128,
+ 0,123,219, 98,107,119,253, 28,214,111, 16, 4, 97,113, 56,206, 98,107, 27,156,127,237,176,175,171, 9,130,248,213,225, 60, 53,
+ 65, 16,191,214, 52,153, 78,191, 37,157,110, 0, 56,114,228, 8,103, 95, 92,157, 25, 24, 24, 56,173,103,207,158,203,174, 93,187,
+214, 60, 43, 43,203, 39, 43, 43,203,231,218,181,107,205,123,246,236,185, 44, 48, 48,112,154,195,141,112, 62,245,180,195, 62,241,
+229,203,151,235,237,223,191,127,209,233,211,167,139,219,180,105, 99, 57,115,230, 12,221,167, 79,159, 92,219, 11,154,238,211,167,
+ 79,238, 79, 63,253,196,116,232,208, 65,126,252,248,241, 71,151, 46, 93, 90,190,119,239,222, 32,142,227, 4,174, 56,109, 16,169,
+ 84,170,239,207,157, 59, 87, 78,100, 57,162,110,221,186, 56,114,228,136, 82,165, 82, 29, 4, 32,174, 40,157, 54,200,100, 50,217,
+190,159,126,250,201,211,203,203, 11,185,185,185, 16,137, 68, 8, 12, 12, 68,113,113, 49,178,179,178,144,118,247, 46, 72,139, 5,
+ 43,190,152,239, 37,151,203,247,186,104,236,203,113,122,123,123,239,219,185,112,161,103,254,233,211,248, 99,193, 2, 88,173,214,
+210, 33, 87,171,213,138, 75,147, 39, 67,253,227,143,216, 50,119,174,167,183,183,247, 62, 0,178, 42, 56,107, 3,142,156,147, 1,
+ 20,216,150,201, 0,174, 68, 70, 70, 94, 75, 76, 76, 68,151, 46, 93,176,103,207,158, 86, 51,102,204,152, 60, 99,198,140,201,123,
+246,236,105,213,165, 75, 23, 36, 38, 38, 34, 50, 50,242, 26,202,250,103,253,221,233,252,219, 56, 25,134, 41,179,176,236, 95,239,
+152, 58,117,234,228,238,223,191, 31, 35, 70,140, 32, 37, 18, 73,214,200,145, 35,165, 23, 47, 94,228,108, 34,211,237,116,154, 76,
+ 38, 24,141, 70,232,245,122,164,164,164,200,151, 44, 89,210,249,179,207, 62,107,116,250,244,233,208, 89,179,102, 77, 10, 8, 8,
+184, 30, 20, 20, 84,239, 9,231,221,234,244,127, 5,128,140,106, 90,136,254,110, 78,206,118, 62, 98, 76, 49,173, 29, 26,216,234,
+242, 86,118, 63,179,109,105,213, 3, 72,123,156,186,212,179,103,207, 23, 27, 53,106, 20,180,251,150, 15, 10,197, 77,193,138, 85,
+ 96,197, 42, 48,126,237,144, 44,121, 5,225,225,225, 65,158,158,158, 29,171,153,206,237,183,110,221,250,151,173,167,156, 15, 96,
+ 89,108,108,236,231, 4, 65, 92,136,141,141,157, 15, 96,153,109,251,130,219,183,111,119, 0,176,243, 41,165,243,153,120,222,121,
+206,255, 45,206, 42,180, 72, 0, 65, 16, 71, 8,130, 56,242,201, 39,159,244, 0,224,231,180,254,111,199,227, 0, 72, 92,253,218,
+ 23,135,237, 1, 28,199, 13,112, 56, 47,160,134,201, 39, 92, 44,127, 9, 45, 0,136,142,142, 38,162,163,163,237, 59,126, 33, 8,
+226, 16,128, 95, 68, 34, 81,155,214,173, 91, 15,254,225,135, 31,188, 2, 2,254,186,126, 64, 64, 0,246,238,221,235,213,162, 69,
+139,193, 34,145,168, 13,128, 95,148, 74,229,161, 74,172, 48,170,201,147, 39, 15, 29, 59,118,172,166, 77,155, 54, 0, 80,148,144,
+144,160,232,208,161,131,158,166,105,130,166,105,162, 67,135, 14,250,132,132, 4, 5, 69, 81,218,118,237,218,121,244,234,213, 43,
+117,250,244,233, 99, 92, 8, 14, 71,188,190,120,241,226, 48, 31, 31,159,202,148, 48,180, 90, 45,130,130,130, 48,121,242,228, 96,
+145, 72,244,102,101,119, 75, 40, 20, 78, 89,188,120,113,160, 74,165, 66, 97, 97, 33,194,194,194, 96,177, 88,144,148,148, 4,147,
+ 94, 7, 74,171, 1,165, 41,130,250,254, 61,168, 68, 66,140, 25, 20, 29, 36, 20, 10,167, 84, 97, 45,153,242, 77,108,108,144, 37,
+ 53, 21, 41,123,246,128,161,203, 27,127,104,171, 21, 55, 55,109,130, 41, 61, 29,139, 38, 76, 8,146, 72, 36, 83,158,176, 37,107,
+ 41,199,113,114,142,227,228, 4, 65,172,234,216,177,227,183,114,185,124,114, 92, 92, 92,223,147, 39, 79,246, 59,127,254,124,119,
+154,166, 69, 52, 77,139, 46, 92,184,208,197,100, 50, 9,165, 82, 41,132, 66, 33,135,231, 20, 34,145, 8, 98,177, 24,114,185, 28,
+157, 59,119,190,191,121,243,102, 42, 44, 44, 76,180,111,223, 62,159, 58,117,234,120,172, 89,179,166, 72,171,213, 46,118,151,207,
+106,181,194,108, 54,195,104, 52,194,100, 50,225,204,153, 51, 13,166, 78,157, 42, 52,153, 76,204,192,129, 3, 11, 40,138, 50,199,
+198,198, 42,125,125,125, 63,124,146,249,140,137, 49,177, 54,203,211,109,155,104,121,128,199,244,121,250, 59, 56, 1, 88,108, 62,
+ 89,118,248,219,184, 45,181,116, 43,104, 0, 58,155,208, 50, 59, 61, 31, 45, 29, 44,190, 85,162,168,168,104,227, 55,223,124, 19,
+ 70, 74, 85,184,104,233,143,239,216,207,113,210,123, 13,114,235,125,132,192,176, 70, 24, 53,106, 84, 32,199,113,107,106, 33,205,
+ 95, 1,232, 10, 96, 85, 77, 78,126, 2,233,172,231,225,225,177,199,203,203,235,162,135,135,199, 30,216,134,103, 31, 7, 81,141,
+208,123, 80, 51, 50, 61, 42, 2,220,160,102,100,122, 84, 35, 62,212,192,243, 2, 39, 45,226, 8, 53,199,113,209, 28,199, 69, 47,
+ 90,180,104,161,195,251,221,190, 46,119,211, 50, 22,205,113, 92,116, 25,133, 84, 34,176, 30,219,232,230, 98, 41,209, 20,142, 74,
+210, 33,115,165,179, 11,131,130,130,226,227,227,227,189,156, 25,179,178,178,160,209,104, 48,103,206, 28,175,177, 99,199,190,151,
+158,158, 30, 83, 69, 34, 36,217,217,217,109, 71,143, 30, 45,179, 90,173,133, 44,203,146, 26,141, 70,232,237,237,205,216, 15,240,
+246,246,102,138,139,139, 69,122,189, 94,192, 48,140,121,236,216,177,146, 9, 19, 38,188, 12, 64, 80, 17,105, 64, 64, 64, 84,255,
+254,253, 43, 28, 58,160, 40, 10,122,189, 30,122,189, 30, 86,171, 21,157, 59,119,150,110,222,188,185, 79,110,110,238,250, 10, 21,
+135, 84, 26, 21, 21, 21, 37, 42, 40, 40,128,183,183, 55,210,210,210,240,224,193, 3,152,117, 58, 88,117, 26, 88,117, 90,208, 90,
+ 13, 56, 77, 49,242,239,221, 65,135,102, 77,197, 59,164,210,190,122,189,126,121, 69,156, 74,165, 50,170,195,184,113, 66, 15, 15,
+ 15,116, 31, 93, 50,207,224,120,179,102,224, 24, 6, 44,195,128,161,105,244, 77, 74, 2, 69, 81, 32, 73, 18,237, 10, 10,132,202,
+109,219,162,212,106,245,178,167, 81,217,165, 82,169,112,251,246,237,175, 75, 36, 18,112, 28, 71, 88, 44, 22,156, 60,121,242, 31,
+247,208, 75, 36, 18,200,100, 50, 88,173, 86,212,175, 95,223, 56,122,244,232,203, 95,124,241, 69, 56, 73,146, 30, 98,177,248,135,
+252,252,252,133, 89, 89, 89, 41,238,242, 81, 20, 5,139,197, 2,139,197, 2,163,209,136,251,247,239, 7, 55,104,208,128,152, 60,
+121, 50, 99, 48, 24, 26,174, 94,189, 58,249,228,201,147,138,197,139, 23,191, 10,224,221, 39,157,223,152, 24, 83, 51, 0,205,226,
+227,101, 98,155,229,215,242, 63,198,201,161,196,241, 29,241,178,248, 68, 0,234, 90, 20, 89, 18, 0,222,225,126, 66,189, 72, 0,
+ 29, 0, 47,155, 40,120,149, 32,136, 14,205,155, 55,247, 73, 76, 76, 44,228, 56,238, 42,128,239, 0,100, 85, 70,198,178, 44,193,
+178, 44,222,110, 95,132,201, 29, 5,160,168, 98, 20, 23, 23, 35, 45, 45, 13, 9, 9, 9,248,249,231,132,154, 62,155,111,122,122,
+122,246,145,201,100,245,105,154, 38,117, 58, 93,154,193, 96, 56,205,178,236, 70,212,192, 71,237,239, 74,167, 29, 30, 30, 30, 75,
+102,205,154,213,201,219,219, 27,191,255,254,123,195, 93,187,118, 45,209,235,245,143,229, 92, 47, 19,145, 91,150,175, 92, 19, 26,
+ 26,168,194,141,243,135, 67, 23,110,216,189, 5, 96,195,120,153,242,236,195, 73,139, 56,138,161, 95, 57,142, 27, 64, 16,196, 17,
+103,161, 84, 45,179,211, 99,158, 95,133, 69,203,249,195,210,101,133, 86, 5, 10, 18, 52, 77, 7, 59, 90,178, 56,142, 67, 86, 86,
+ 22, 50, 50, 50,160, 86,171,225,227,227, 3,171,213, 26,236, 78,251,160,213,106,219,251,249,249, 25, 68, 34,145,217,104, 52, 66,
+161, 80,176, 34,145,136,179, 93,135,176,205, 90,100,204,102, 51, 33, 20, 10, 41, 47, 47, 47, 79,179,217,220, 20,149,248,146,113,
+ 28,215,222,207,207,207,229, 62,179,217, 12,157, 78, 7,189, 94, 15,157, 78, 7,179,217,140,160,160, 32,208, 52,221,182,210, 46,
+ 45, 77,183, 12, 8, 8, 64,102,102, 38,228,114, 57,210,211,211, 97,209,105, 97,213,106, 65,235, 53, 96,138,139,193,106, 52, 96,
+245, 26, 80, 22, 3, 66,155, 52,131,125, 70, 98,133,221,112,139,165,165,159,159, 31,244,250,191,220,205, 56,155,192,162,105, 26,
+180,205, 57,218, 62,156,232,239,239, 15,251,140,196, 39, 4, 51,128, 25, 36, 73,174,146, 74,165,194, 73,147, 38, 33, 43, 43,171,
+ 76,157,152, 52,105, 82,169, 79, 86,215,174, 93, 47,200,100, 50, 90,173, 86,195,108, 54,139,158,215,135,158, 32, 8, 16, 4, 81,
+ 82, 70, 52, 13,127,127,127,125, 94, 94,222,207, 69, 69, 69,175,215,132,143,162, 40,251,140, 46, 24,141, 70,112, 28,135,223,127,
+255, 29, 50,153, 76,196, 48,204, 45,154,166, 21, 34,145, 8,164,205,249,235, 73,193, 54, 35,240, 75, 0, 97, 54, 11,209,155, 40,
+113, 56,207,112,209,144,184,117,235,220,228,172,190,112, 51,197,216, 45, 77, 25,168,217,112,164, 43,116,111,170,146, 44,143,235,
+ 16,168,106, 61,208, 67,175,144, 8,244,108, 90,235,250,255, 93,154,176,107,236,152, 55,189,230,205,155, 87,207,223,223, 95,150,
+156,156,108,154, 63,127,126,131,237,219,183, 19, 40, 25,166,171, 16, 15, 31, 62, 60, 48,107,214, 44,223,254,253,251, 55,148, 74,
+165, 68,113,113, 49,212,106, 53,114,114,114,240,224,193, 3,238,198,141, 27,247,205,102,243,158,234, 36, 50, 36, 36,100,243,235,
+175,191, 62,246,165,151, 94, 18,217, 45,164,122,189,190,205,185,115,231, 6, 29, 63,126,188,139, 94,175,175,118,189,124,244,232,
+209,158,217,179,103,123,188,242,202, 43, 77,165, 82, 41, 89, 27,233,116, 4, 73,146, 65,158,158,158, 56,125,250, 52, 84, 42, 21,
+ 72,146, 12,122,220,250,106,178,178,161,117,130,253, 96,186,180, 28, 77, 3,234,193,100,101, 67,121,137,242,252, 88,180, 42,120,
+215,183,179, 91,164,170, 16, 75,198,153, 51,103,206, 34, 8,226,200,204,153, 51,103,185,178,104,217,254, 50,142,199, 57, 28,111,
+174,109,177, 85,173, 64,147, 44,203, 34, 35, 35, 3,153,153,153,200,200,200, 64,126,126, 62, 72,146, 4,199,113,238,204, 62,227,
+ 8,130, 96, 79,157, 58,229,115,249,242,101,125,187,118,237,138,236,254, 47, 52, 77, 19, 20, 69, 17, 54,191, 24, 34, 45, 45, 77,
+124,241,226, 69,213,237,219,183,131,108,189, 85,182, 10, 83, 96,185,109,118,129,229,184,152, 76, 38,200,100, 50,247, 84,135,237,
+ 69,248,251,181,107, 37, 34, 75,167,181, 13, 25, 22,131,209, 20,131,211,107, 33, 97, 40, 72,192,129, 48, 25,220,190,127,142,176,
+139, 44,171, 77,104, 89, 44, 22, 80, 20, 5,150,101, 65,211, 79,197,175,124, 93,171, 86,173,218, 30, 56,112, 96,124, 70, 70,249,
+119,225,144, 33, 67,240,238,187,239, 98,234,212,169,183, 7, 12, 24,112,227,240,225,195,152, 50,101, 10, 88,150,109, 13,160, 24,
+192,241,231,237,161, 55,155,205,165, 22, 40,147,201, 4,171,213, 10, 84,227,179, 10,206,117,211, 94,182, 52, 77,219,185,137, 3,
+ 7,246,227,194,133, 11,100, 66,194,173,176, 73,147, 38,219, 29,238,159,116, 86,211, 81, 50,115, 79, 98,107, 40, 44, 40,241,127,
+170, 40,164, 66, 4, 42, 31,178,227, 42,227,124, 28,180,218,208,106,196, 7, 31,124, 16,133,146, 25,206, 41,143,105,209,122, 69,
+ 66, 18, 95, 79,107,233, 43,251,176,149,159, 94, 34, 36,116, 73, 95,207,210, 61, 8, 87,234,131,234, 42, 44, 97, 13, 84,117, 22,
+ 46,252, 34,228,246,237, 59,230, 57,115,230, 36,142, 28, 57, 50,240,195, 15, 63,108,190,111,223,190, 46, 38,147,233, 27, 0, 69,
+ 21, 25, 93, 6, 13, 26,116, 53, 48, 48,176,193,134, 13, 27,114, 31, 61,122,228, 67, 81,148,135,213,106,101,245,122,253, 3,163,
+209,120,218,106,181,158, 6,112,173, 58,137,245,242,242,106, 53,110,220, 56, 81, 81, 81, 17,132, 66, 33,172, 86, 43,114,115,115,
+209,169, 83, 39,193,161, 67,135, 90,212,228, 6, 20, 22, 22, 46,255,230,155,111,206,238,220,185,179,143, 82,169,124, 73, 42,149,
+ 6, 3, 96,180, 90,109,142, 94,175,255,163, 38,233, 44,211,206, 49, 76,206,181,107,215, 34,148, 74, 37, 30, 62,124, 8,134, 97,
+114, 30,183, 14,200,196,228,163,155,231, 15,213,109,230,223, 0, 23, 47, 95,133, 76, 76, 62,226, 67,125, 61,247,176,251, 80,193,
+ 81, 64,185, 16, 72,151,227,226,226,228,139, 22, 45, 66, 92, 92,220, 45, 87, 22, 45,187,224,138,139,139,187,101, 63,206,225,248,
+243,143,145,198,138, 45, 90, 21, 41, 72,160,100,118,161, 90,173,246, 81,169, 84,165, 2, 43, 51, 51, 19,153,153,153,144, 72, 36,
+ 72, 75, 75,131, 68, 34,201,114,167, 19, 34,151,203,127,107,211,166,205, 11, 41, 41, 41,226,249,243,231,215,189,118,237,154,178,
+ 83,167, 78, 47,202,229,114,134,227, 56,152, 76, 38, 50, 49, 49,209,115,217,178,101,161,237,219,183,183,180,111,223,254,250,238,
+221,187,141,168, 36,254, 21, 65, 16,191,100,101,101, 53,172, 95,191,190, 93,180,149, 17, 87,142,130, 11, 40, 25,242, 20, 10,133,
+215, 43, 75,168, 80, 40,188,153,148,148,212, 91, 33,147,194,162,213,192,170,211,128,214,106,193,104,139,193, 20, 23, 3,122, 13,
+ 36, 52, 13, 17, 67, 65, 46,147, 33, 35, 61, 29, 66,161,240,102,101,156, 18,137,228,102, 78, 78, 78,111,149, 74, 85,250, 18,165,
+104,186,100, 97, 24, 88,104,186,212,162, 37, 18,137,240,232,209, 35, 72, 36,146,155, 79,186, 38,147, 36,201,216, 67, 56, 84,144,
+ 15, 4, 5, 5,177, 29, 58,116,192,148, 41, 83,192, 48,140,173, 24,136,238, 0, 46,162,196,191,229,153,132, 43,113,107,119, 90,
+ 55, 26,141,208,233,116, 40, 44, 44, 20,202,229,242, 23, 66, 67, 67,175, 90, 44,150, 61, 52, 77,111,121,240,224,129,166, 34, 78,
+155, 48, 43, 21, 93, 44,203,130,227, 56, 48, 12, 3,138,162, 32, 22,139,217,115,231,206, 99,217,138, 37,136,223,178,157, 27, 52,
+104, 16,113,232,208, 33,176, 44,155,254,132,179,111,177,137,150,202, 26, 13,231,144, 10, 31,161,242,144, 10, 21,113, 58,246,254,
+ 28,183, 17, 46,142, 41,135, 15, 62,248,224, 4, 74,134, 12,243,108, 98,238,113, 56,191, 44,250,238, 11, 25,104, 70,111, 62,183,
+ 83,247,237, 93,141,126,222,183, 43,127,179, 72, 4,154,151,187, 5,181,108,216,224, 5,129, 74,229, 67,174,223,184, 42,127,199,
+246,189,201, 15, 31, 62,212,172, 93,187,182,227, 11, 47,188,224,253,199, 31,127,132, 86, 36,180, 20, 10, 69,227, 55,223,124,115,
+ 92, 97, 97,161, 56, 62, 62,126,119, 86, 86,214,111, 40, 9, 45,227, 56,131,122, 0,128,173, 54, 33, 26,100,107,231, 46, 2,152,
+ 95, 89,127,141, 32, 8,252,244,211, 79,229,102, 7,178,143,167,206, 85,141, 26, 53, 26,145,146,146,114, 33, 39, 39,103,152,243,
+ 78,177, 88, 60,175, 73,147, 38,125,111,221,186,245, 57,128, 99,213, 33, 54, 24, 12,177,123,247,238, 93, 42, 16, 8,234, 48, 12,
+147,105, 52, 26, 99, 31,219,162, 69,177, 19,226,214,239,218,100,180, 48,225,114,137,224,161,137, 98,223,226,117,200,243,107,205,
+178, 65,237, 96,141, 82, 3, 32,156,214,255,176,189,140, 44, 28,199,217,143, 85, 59, 88,177, 44, 78, 86, 48, 87,251,212,143, 17,
+ 44,157,171,168,141,171,200,162,245, 9,128,246, 0,126,201,201,201, 89, 53,118,236,216,101, 59,118,236,240,210,104, 52,200,201,
+201, 65,110,110, 46,132, 66, 33,148, 74, 37,214,173, 91,103,204,201,201, 89,229,120, 14,202, 71,144, 7, 0,147,191,191,255,111,
+219,183,111, 15,254,250,235,175,133, 49, 49, 49,105, 3, 6, 12,104,186,110,221,186, 20,177, 88,204, 49, 12, 67,152,205,102,226,
+237,183,223,142, 88,177, 98, 69,170, 64, 32, 80,140, 24, 49,130,240,240,240,248, 5,149,132, 13, 80,171,213,167,190,255,254,251,
+161,211,167, 79,151, 90, 44, 22,151,150, 44,251, 54,149, 74,133, 75,151, 46, 89, 10, 11, 11, 79, 86, 97,197, 56,245,195,177,163,
+ 93,255, 51,114,164,152,210,106, 64,105, 53,160, 53, 26, 48,218, 34, 16, 58, 13, 68, 12, 13,185,152, 69,112,152, 12,180,209, 19,
+ 71,127,253,131, 50,155,205,149, 6, 54,212,104, 52,167, 46,198,199,119,111, 95,175,158,240,210,180,105,176, 82, 20, 94, 73, 74,
+ 42, 21, 87, 86,171, 21, 7, 91,182, 4, 67, 16,104, 61,113, 34,238,209, 52,173,209,104, 78,253, 47, 62, 12, 55,110,220,200, 29,
+ 61,122,244, 53,150,101,219,226, 9,125, 52,243, 73,128,162,168,114,214, 40,134, 97, 74,172,142, 37,150, 3,201,209,163, 71,187,
+ 38, 38, 38,138,255,252,243, 79, 92,184,112,161,245,142, 29, 59, 62, 9, 15, 15,111,249,240,225,195,236,170,196,155,171,160,191,
+176,249, 31,238,222,185, 7,239,188,243, 14,145,157,157,141,239,190,251, 14, 85, 5, 79,253, 59, 16, 19, 99, 98,227,227,101,117,
+225,228,247,228, 34,164,194,239,112, 51,164, 66, 69,156,166,152, 18, 43,153, 44,190, 36,216,168, 41,166,100, 56, 80, 22, 95,165,
+165, 12, 49,166, 24,141,205, 33, 62,171, 22, 56,245,160, 25,185,229,220, 78,221,128, 99, 15,181, 87,178,140,243, 1,156,128,137,
+225,238, 93,231,110,188,244,146,143, 63, 0,152, 77, 76,112,227,198,141,187, 9,133, 66, 9, 0,120,122,122,190,228,231,231,183,
+ 46, 63, 63,191,179,171, 50,141,142,142,238, 16, 24, 24,216,230,248,241,227,127,100,101,101,221, 2,240,179,243, 65, 17, 17, 17,
+115,110,223,190,221, 78, 36, 18, 17, 85,212, 17, 0, 64,183,110,221, 94,144, 74,165,126,199,238,122, 67, 35,110, 4, 78, 80, 12,
+ 8,101, 96, 84,173,144, 38,110,142,176,176,171,126,133,133,133,173,139,139,139,255,168,102,209,247, 24, 58,116,232,150,248,248,
+248,176,110,221,186,113,215,175, 95, 39,157, 71, 17, 34, 34, 34,250, 92,185,114,165,237, 91,111,189,181, 97,215,174, 93,147, 81,
+118,166,109, 85, 72,179,197, 27,172, 53,156, 74,198,105,128,169,103,179,153,241, 10,229, 31,128,234,132, 92,120,140,240, 12,143,
+149,196, 10, 13, 24, 21,108,111,111,139,137,213,158,162,168,223,111,220,184,113,112,196,136, 17,186,252,252,124,248,249,249,161,
+126,253,250, 32, 8, 2,235,214,173, 51, 62,120,240, 96,159, 45,150, 86,251,204,204,204, 65, 54,177,229, 10,218,213,171, 87,239,
+218,182,109,155,234,218,181,107, 2,154,166,149, 77,155, 54, 53, 92,190,124,217, 83, 36, 18,113, 98,177,152,189,118,237,154, 34,
+ 34, 34,194, 68, 16,132,244,199, 31,127,204,191,122,245,106,248,140, 25, 51,190, 65,217,105,226,206,216,185, 96,193,130,140,148,
+148, 20,152,205,102,104, 52, 26, 20, 23, 23,151, 46, 69, 69, 69, 40, 46, 46,134, 72, 36, 66,118,118, 54,246,239,223,159,101,139,
+ 18, 95,153,101, 99,237,154,117,235,213, 89, 15,211,160, 84,200, 65,107,138,192, 20,231, 3,218, 98, 72, 40, 43, 60, 68, 12,234,
+ 54,146, 67,166, 80, 34, 71,163, 67,252,229, 95,179,109, 81,226, 43, 54, 23, 88, 44,107,223, 93,177, 34,135, 22,139, 81,111,248,
+112, 88,109, 67,133,142, 66,139, 33, 8,132,247,234, 5,210,219, 27, 11,247,237,203,177, 69,137,127,162, 96, 89, 86, 96,177, 88,
+ 42,203, 7, 88,150, 77, 79, 76, 76,220, 5,224, 44, 65, 16, 28, 65, 16, 28, 74,130,181,233,158,229, 7,153,162, 40,204,157, 59,
+ 23, 98,177, 24,115,231,206,197,167,159,126,138,101,203,150, 97,253,250,245,248,246,219,111,113,244,232,209, 6, 23, 47, 94, 20,
+159, 63,127,158,139,139,139,203,139,136,136, 16, 76,156, 56, 81, 37,151,203, 63,168,140, 51, 54, 54, 22, 94, 94, 94,136,141,141,
+197,146, 37, 75,176,121,243,102, 28, 60,120, 16,151, 46, 93,130, 64, 32, 96,211,211, 31,193,100, 50,113,171, 87,175,206, 56,120,
+240,160,113,213,170, 85, 16, 10,133,196, 83,106, 36, 62,176, 9, 42, 71, 75,144,115, 72,133,124, 0, 43, 81,181,111, 84, 69,156,
+144,197,199,215,181,137,163,100, 7, 65,116, 24,192,116, 84, 62,189,218,206, 49, 25, 64,112, 45,112,206,150,143,254,191, 68,213,
+166, 59,247,175,100, 25,103, 3,248,193,158, 39,165, 82, 41, 63,112,224,123, 33, 0,236,219,187, 95,148,148,148,228,253,253,247,
+223,203, 2, 3, 3,241,237,183,223,202,228,114,121, 96, 5,156,204,193,131, 7,205, 18,137,196,111,194,132, 9,253,218,181,107,
+247,190,173, 35,218, 11, 64, 11,148,204, 94,140,186,127,255,126,130,191,191,255,221,147, 39, 79,234,221, 41, 32,173, 86,251,205,
+214,173, 91,235, 23, 48,190, 56,166, 31,138,120,118, 41,142,170,182, 32,173,222,167, 80,212,121, 25,175,191,254,122, 29,134, 97,
+ 54, 85,179,220, 95, 31, 50,100,200,214,248,248,248,176, 9, 19, 38,100, 95,191,126, 61, 7, 64, 60,128,237,142,203,237,219,183,
+243,198,142, 29,155,181,105,211,166,144, 17, 35, 70,172, 7, 48,140,127,245,243,224, 81,182, 47,132,170,102, 29,186,120,225,150,
+254,207,205,205, 93, 93, 88, 88,120,233,222,189,123,239, 89, 44,150, 16,130, 32, 56,177, 88,156,157,147,147,179,202, 33, 96,169,
+ 43,191,146,222,176,197,218, 32, 8,130,226, 56, 46,189, 71,143, 30, 31,244,234,213,235,171, 35, 71,142,152,186,119,239,142,189,
+123,247,250,247,232,209,195,192,178, 44,119,236,216, 49,255,190,125,251, 26,206,158, 61,171,127,251,237,183,155, 54,105,210,100,
+ 98,108,108,172,154, 32, 8,214, 21,167,253, 93, 86, 84, 84, 52,164, 95,191,126,151,246,237,219,167, 84,169, 84,160,105, 26, 6,
+131, 1, 6,131, 1, 28,199,193,219,219, 27,106,181, 26,243,231,207,215, 20, 23, 23, 15,118, 33,220,156, 57, 77, 38,147,105,216,
+228,247,167,159, 90,245,249, 92,175,240, 6, 13,144,127,199, 4,218,100,128,136, 35, 81,247, 5,111,136, 37,114,220, 75,210,226,
+163, 93, 7,180, 70,147,233, 53, 23,189,229,114,156,197,197,197,195, 98, 62,253,244,244,134, 25, 51, 60,219, 4, 5, 65, 32, 16,
+192,108, 54,131, 97, 24,136, 68, 34, 68,198,196, 64, 28, 16,128, 57,187,118,233, 53, 26,205, 48,148,255, 20,143, 51,103,109,192,
+145,115,242,141, 27, 55,198, 54,107,214, 12,147, 38, 77,194,144, 33, 67,202, 28,248,253,247,223, 99,253,250,245, 48,155,205, 99,
+ 1, 92, 7,176, 14, 37, 67, 29,112, 18, 89,127,119, 58,107,157,147, 97,152,194,164,164, 36,229,210,165, 75, 9,171,213,138,207,
+ 63,255, 28,118,193,105,175,215, 83,166, 76,169,227,229,229,133,207, 62,251,204,146,151,151,215,115,201,146, 37,103,182,111,223,
+238,255,205, 55,223,188, 14, 32,214,153,147,101,217,220,155, 55,111,122,109,216,176,129,164,105, 26,203,151, 47, 47, 55, 60, 57,
+126,252,120, 88,173, 20, 4, 2,161,197,100, 50,183,144,203,229,201,126,126,126,114,174,172,115,215,147,188,159,161, 40, 9, 97,
+224,232,248,110,113,244,207, 66,197, 33, 21,170,195,169,150,197,199,119, 55,197,196,156,181, 9,162, 68,219, 49,123,237, 38,253,
+106,112,218, 5, 97, 77, 56, 79,217,150, 42, 97, 50,153,160, 86,171,145,151,151, 7,149, 74, 5,129, 64, 64, 84,148, 78,179,217,
+252,231, 71, 31,125,116, 99,211,166, 77,189,175, 92,185, 50,240,252,249,243, 61, 78,159, 62,109, 74, 75, 75,163, 41,138,226, 66,
+ 66, 66,132,157, 59,119,150,245,239,223,223, 67, 42,149,146,179,103,207,206,251,226,139, 47,252, 81,214,135,205, 57,239, 2,130,
+ 32,240, 97, 87, 45, 98,123, 8, 96,177, 88, 81, 84, 84,132,140,140,116, 36, 36, 36,224,202,149, 59,224, 56,142,172, 70,185,251,
+ 1,152,253,221,119,223,133, 74, 36, 18, 98,215,174, 93,117,118,237,218, 85,165, 37,117,199,142, 29,117,118,239,222, 61,207, 54,
+122,145,254, 44, 62,239, 60,231,255, 44,231,179, 12,231,200,240,168, 82,104,217,218,249,246,176,125,148,148,162,168, 95, 92,132,
+112,248, 4,192, 92, 7, 43, 88, 85,230, 60, 13,199,113, 23,122,247,238, 61,165, 87,175, 94, 43,250,244,233,147,149,149,149,213,
+112,249,242,229, 97, 52, 77, 91, 19, 18, 18,200,228,228,228,180,223,126,251,173, 81,147, 38, 77, 38,222,190,125,251, 28, 65, 16,
+ 86, 55, 50,152,144,156,156,220,169, 71,143, 30,251, 39, 78,156, 24,222,161, 67, 7,137, 74,165,130, 80, 40, 68, 74, 74, 10,254,
+248,227, 15,203,238,221,187,211,139,138,138,170,243, 9,158, 95, 82, 51, 50,162, 70, 76,125,111,223,196, 33, 3,253,255,213,244,
+ 5, 73, 72, 72, 8, 96, 52,226,206,195,108, 92,189,243,135,117,243,133,171,106,179,217, 60, 12,238,127,130,231,151,223,238,221,
+235,221,115,198,140,125,243,254,243,159, 32,100,101, 9, 67, 66, 66, 32,145, 72,240,224,193, 3, 36,179, 44,189,120,227,198, 28,
+155,200,122,210, 81,225,165, 0,150,178, 44, 43, 4, 0,185, 92,142,119,223,125, 23,142,159,220, 89,191,126, 61,140, 70, 35, 0,
+ 8, 9,130, 88, 10, 96,203,179,110,197,178,163,160,160, 96,206, 43,175,188, 18, 39, 20, 10, 43,140,122,235,227,227, 3,173, 86,
+ 11,154,166,153,140,140,140, 59, 62, 62, 62, 16,137, 68,224, 56,206,229,115,148,159,159, 63,103,216,176, 97, 11, 72,146,172,200,
+242, 1,165, 82,153,118,230,204,153,198,111,189,245, 22,249,223,255,254, 55,101,194,132, 9,210, 51,103,206, 48, 28,199,237,127,
+210,247,160, 75,151,157,192,134,152,215, 0,188, 6,148,115,120,207,176,109,171, 86, 72,133, 46, 93,118, 98, 3,254,226,116, 28,
+198,179, 11, 34,155, 21,170,185, 44, 62,126, 5, 74,252, 44, 42,229,238,178,179, 11, 54,196,160, 86, 57,221,129,163,246,213,235,
+245, 96, 24,166, 50,107,222,239,123,247,238, 93,241,219,111,191, 5, 76,153, 50,165,225,127,254,243, 31,101,143, 30, 61, 60, 29,
+ 15, 48, 26,141,236,225,195,135,245,235,215,175, 47,190,112,225, 66,234,248,241,227, 59, 84,150,206,135, 15, 31, 30, 93,184,112,
+161,119,255,254,253,155, 0, 40,245,207, 82,171,213, 72, 75, 75,195,159,127,254,153,102,181, 90, 15, 85, 35, 75,249, 0,230,141,
+ 26, 53,106,233,182,109,219,234, 76,152, 48, 33,123,247,238,221,127,162, 36, 96,177, 51, 84, 67,134, 12,105,185,109,219,182,144,
+ 9, 19, 38,100,163,196,143, 44, 29, 60,120,240,176,163, 59,202,251,105, 85, 58, 50,177,213, 98,177,112, 38,147,137, 51, 24, 12,
+156, 78,167,227,224,250, 43,240, 7, 51, 51, 51,185,244,244,116,238,225,195,135, 92,106,106, 42, 7,224, 91, 39,197,235,170,193,
+242,216,177, 99, 71,163,208,208,208,207, 21, 10,197, 9,129, 64,160, 17, 8, 4, 26,169, 84,250,131,159,159,223,167,139, 23, 47,
+ 14,229, 56, 78, 92,137,138,174, 8, 66,145, 72,244, 86, 96, 96,224, 65, 95, 95,223,116, 31, 31,159,244,192,192,192,131, 34,145,
+232, 29, 0,162, 42,148,121, 69,144, 9,133,194,143, 60, 60, 60, 78, 73,165,210, 92,169, 84,154,235,225,225,113, 74, 40, 20,126,
+132,202, 3,169, 86,202, 41,145, 72, 62, 10, 8, 8, 56,165, 84, 42,115,149, 74,101,110, 64, 64,192, 41,137, 68,242, 56,156,143,
+211, 43,177, 11, 45, 3,103, 3, 65, 16, 84,235,214,173, 55,180,109,219,118, 93,219,182,109,215,181,106,213,234,107,155, 85,146,
+179, 89, 91, 12,168, 56,120,227,223,153,206,167,198, 25, 25, 25,185,125,219,182,109,236,156, 57,115, 52, 77,154, 52, 41,152, 51,
+103,142,102,219,182,109,108,100,100,228,246,154,114, 6, 5, 5,213,139,140,140, 44,216,180,105, 19,157,148,148,196,109,218,180,
+137,142,140,140, 44,112,138, 12,255, 36,242, 78, 0,136,176, 89,127, 14, 1,216,131, 18,231,247, 80, 0, 68,140, 41,134,179,205,
+ 62, 60, 1,160, 79, 5,101,239, 46,103,152, 41, 38,134,179,249, 84,157, 4,144,232,176,222, 13,101,253,191,158, 4,167, 75,180,
+104,209,226, 30,231, 0,139,197,194,169,213,106, 46, 41, 41,137,187,112,225, 2, 23, 22, 22,118,207, 13, 78, 63, 0,111, 3, 56,
+ 28, 28, 28,124,187, 99,199,142, 15, 59,117,234,244,176, 94,189,122, 41, 34,145,232, 10, 74, 34,188, 71,218,150,165, 0,154, 84,
+193,217, 81,165, 82, 45, 12, 11, 11, 59,212,184,113,227, 75,245,235,215,191,226,235,235,123, 68, 38,147, 45,194, 95,145,177,171,
+ 91,231,123, 12, 29, 58, 52, 77,167,211, 49, 47,189,244,210,109, 87, 39, 53,107,214,236,162, 78,167, 99, 70,142, 28,153, 14, 32,
+250,159,240,188,243,156, 79,133,243, 31,133,198, 54,193,116,208, 97,249,196,197,113,159, 56, 29,179,213,118,110,149, 5,193,113,
+156,128,227, 56, 15,142,227,188, 57,142,243,229, 56, 78,197,113,156, 39,199,113,210, 42,204,223,124,197,254,251, 56, 39,219, 4,
+148,193,246,223, 25, 85,237,127,174,239,103,104,104,168, 79,187,118,237,166, 30, 56,112,224,163,251,247,239,127,116,224,192,129,
+143,218,181,107, 55, 53, 52, 52,212,231,113,210, 25, 20, 20, 84,175,121,243,230, 95, 53,107,214, 44,189,121,243,230, 95, 57,137,
+172, 39,153,119,137, 77,196, 52,179, 45, 13,109,219, 8,148,196,194, 90,107, 19, 54, 17, 21,244,212,170,195,105,231, 59, 4,160,
+175,109, 57,100,219, 22,246, 20, 56,203,161, 65,131, 6,199, 91,182,108,121,175, 85,171, 86,201,173, 90,181,186,215,162, 69,139,
+123, 77,155, 54,189, 23, 17, 17,113,175,110,221,186,247,252,253,253,143,215,160,140,124, 1,132,160,252,103,192,158,118,157,239,
+ 30, 25, 25,121, 85, 38,147,185,140, 13, 38, 20, 10,231,181,106,213,234, 38, 74,102, 74,242,237, 39,207,201, 11,173,255, 33,240,
+149,240,217,227,148,162,242,207,140, 84,181,159,191,159,207, 54,167,203,111,117,217,132, 76, 67,155,192,145,212, 2,167, 35,159,
+189, 78, 69, 56,136,166,167,193,201,215, 37,158,147,231,228,133, 86,173, 67,200,223, 2, 30, 78, 48, 63,230,126, 30,207,197,104,
+ 60,126, 0, 0, 32, 0, 73, 68, 65, 84, 54,170, 19, 19,235,113, 56, 93,241,221,127,202,156, 60,120,240,224, 81, 91,109,103,119,
+ 0,231,236,189,194,138, 84,105,117,102, 19,212, 68,217,158,230, 57,121, 78,158,147,231,228, 57,121, 78,158,243, 31,199,105,199,
+138, 10,182,223,113, 90,255,250, 25, 21, 94, 79, 36, 76, 15,111, 86,229, 57,121, 78,158,147,231,228, 57,121, 78,158,179,166,152,
+248,140,138,172,110,246, 21,126,232,144, 7, 15, 30, 60,120,240,224,193,163,246, 80,117, 28,173, 61,123,246, 8,236,255, 71,141,
+ 26, 53,158, 97,152,169,246,117,129, 64,176,230,187,239,190,219, 82,217, 21,134, 15, 31,206, 84,198,233, 10, 85, 93,199, 21,103,
+139, 38,202, 73,126,222,138,247,138,138, 13, 43, 83, 50,153, 11, 38,147,169,185,125,159, 76, 38, 75,220,178,101,203,221,218, 78,
+231,248,241,227,155, 56, 95,167,126,152,168,187,175,151,236,221,130, 34,221,242, 91,247,116, 95,243,117,236,169,192, 31, 64,180,
+151, 76, 60,168,133, 74,220,241,207,124,211,101,189,149, 57,140,146,217,176,133,207, 99,134,131,131,131,155, 42,149,202, 49, 0,
+ 90, 24, 12,134, 64,133, 66,145, 11, 32, 65,163,209,108,207,206,206,190,227, 46, 79,183,250, 72, 3, 16,110, 91,125,120, 46, 21,
+245,220,217, 87, 21,250, 68,192,196, 1, 82,130,128,245,100,242, 95,206,232,125, 27,193,196,114,229,183,247,105, 4, 11,199, 65,
+ 76, 0,230,147,247, 33,123,142,138, 74, 9, 32, 10, 37, 33, 28,110,160, 36,252,132,129,127,100,121,240,120,174,224, 60, 84, 88,
+186, 46,172, 64, 76,116, 21, 11,137,175, 56,112, 42,128,243, 51,155,205, 34,137, 68, 2,139,197, 2,133, 66,190,246,237, 9,227,
+ 63, 7,137, 34,138,198,187, 91,182,108,169,241,151,174,171,115, 29, 0, 63, 57,159,239,163,148, 47, 56,123,248, 99,159,174, 3,
+ 22, 47,178, 60,200,139,213,106,181,164, 84, 42,133,217,108,134,183,183,119,167, 73, 19, 39,190, 68,138, 56,139, 88,236,113,121,
+197,138, 21,217, 53, 77,231, 7, 31,124, 16,108,181,154,254,205,178,172,196, 98,177, 72,157,175,227,173,240, 88,124,246,240,199,
+138,110,209,139, 62, 7,120,161,245, 20, 32,169,231,227,113,110,229,168,238,205, 58,182,104, 12, 54,225, 60, 76, 22,235,160,179,
+233,186, 65,159, 94,201,156,158,174,179,182, 69, 45, 4,172,252, 31,130,160, 97,195,134, 83, 2, 2, 2, 70,110,220,184, 81,220,
+176, 97, 67,200,100, 50, 24,141,198,144,251,247,239,135, 76,154, 52,169,155, 92, 46,223,149,146,146,178, 22,238,125, 8, 46,252,
+236,214,255, 3, 0,116, 26, 51, 63, 28, 37, 31,139, 54, 56,239,235, 62,110,126, 56,128, 25, 40,251, 97,228, 44,148,132, 80,112,
+213,234, 72,142,108, 91,134, 65, 99, 63, 18, 2,152, 84,154,120, 18,248,225,219, 85,232, 55,234,189, 50,219, 9, 14,194,195,219,
+150, 33,122,236, 71, 21,126, 71,177,111, 99,130, 98, 89,174, 66, 75, 60, 73, 18,244,137,123,156,171, 15, 12,231,160, 36, 6, 88,
+ 57, 74,148,124,208,217,229,241, 3,154, 10,114,172, 20,227, 50,224,172, 88, 36,200, 61,122,135, 41,119,110, 76, 27, 80, 20, 83,
+210,182,138,133, 96, 14,166,120,159,157, 61,123,182, 48, 58, 58, 26,155, 55,111,238,252,245,215, 95, 79,212,106,181, 63,218,238,
+ 91, 50,255,248,242,224,241, 92, 11, 46,215, 66, 75, 40,192,134, 67,251,182, 52,202,201,205, 67,204, 91, 31, 98,231,206,157, 40,
+ 44, 44,132,143,143, 15, 36, 98,177,104,229,210,255, 11, 86, 42, 61,130, 99, 38,198,110, 0,208,180,166,169,169,230,117, 26, 59,
+159, 79,216, 62,165, 35, 20,144, 34,137, 68, 66,238,218,181, 11, 69, 69, 69, 80,169, 84,144, 72, 68,228,138, 69,159,200,149, 74,
+ 79,249,155,147,103,118, 70, 73,252,159, 26,193, 98,209,117, 62,176,115,139, 82,173, 86, 99,220, 59,177,112,190,142, 88, 44,102,
+236, 47, 22,190,142, 61, 21,204,222,248,238,216,102, 47,122, 1,214, 91,151, 32, 18, 8,160,240,246, 65,148, 80, 0, 1,129,230,
+ 49, 39, 82,103, 1,248,244,121,201,108,195,134, 13,167, 12, 31, 62,124,228,130, 5, 11,196, 36, 89, 18,114, 78,175,215,195,104,
+ 52, 34, 52, 52, 20,103,207,158, 21,207,153, 51,103,228,247,223,127,143,148,148,148,213,213,229,191,117,235, 86,253,240,240,112,
+ 19, 0, 12,108,233,229,188,175,158,125, 31, 0,120,121,121, 85,201,231,167,242, 48,223,186,117,181,133,253,188, 41,189, 66,153,
+ 10,182,155, 0, 40, 42,227, 98, 89, 78,120,242,171, 73, 21,238,127,107,193, 14,250,198,158, 11, 77, 27, 54,108,104,116,220,238,
+233,233, 89,209, 41, 65, 58,157, 46,220,121,163,253,120, 43,197, 4, 86,116,189, 62,239,174,119, 41,192, 40, 6,194, 29, 59,118,
+ 0, 0,190,252,104,180, 96,211,207,121, 66,161,176,164,169, 93,186,116, 41,230,205,155, 39, 57,113,226, 68,255,109,219,182,245,
+ 63,120,240,224,202,138,132, 42, 15, 30, 60,158, 73,145,229,248, 91,177,208, 34, 9,194, 75,233,229,137,215, 94,127, 27,199,143,
+255,128,174, 93,187,150,238,107,208,160, 1,134, 15, 27,140,239,182,174, 0, 0,175,199, 73,209,227, 94,167,176, 88,255,105,191,
+145, 95,205,127,152,173,187,114,228,200, 17,116,233,210,165,204,249,175,143,120, 13,223,126,179, 20,149, 68,153,119, 11, 4, 71,
+138,189,148, 30, 24, 21,243, 14, 92, 93,103,226,184, 33, 71,250, 14, 95,213, 59, 39, 95,191,130,175,103, 79, 30,141,130,253,250,
+180,108,214, 20,133,251,215,226,143, 34, 19,142,103,154,240,102,212,191, 16,233, 43, 71, 23,154, 65,176,135,168,103,182,158,122,
+ 46,132, 86,112,112,112,211,128,128,128, 50, 34, 75,171,213, 66,167,211, 65,163,209, 64,171,213,130, 36, 73,196,198,198,138,207,
+157, 59, 55, 50, 56, 56,248,180, 27,195,136, 15,109,150, 44, 64, 32,210,205,157, 59,215, 28, 24, 24,104, 86, 40, 20,156, 80, 44,
+213,118, 31, 55,223, 11, 0, 72,161, 88,187,114,229, 74, 75,104,104,168, 73, 40, 20, 74,222,123,239, 61,210,157, 52,155,205,102,
+206,145,211, 98, 49,151,110, 95,188,120,177, 37, 40, 40,200,172, 80, 40, 56,171,213,125,163,227,205, 7, 5,144,138, 5,144,138,
+ 5,144, 73, 68,240,170,223, 14,210,194, 63, 65,211, 52,150, 44, 89, 98, 13, 14, 14,182, 40, 20, 10, 78, 34,145,136,167, 77,155,
+ 86,101, 58,199,143, 31,207,169, 84, 42,171, 66,161, 16,207,155, 55,175,220, 76,161, 51, 55, 50, 32,151,136,160,144, 10,209,184,
+ 65, 24,164,156,209,237,180, 10, 4,101,189, 17,164, 82, 41, 58,119,238,140, 22, 45, 90,224,224,193,131,221,121,161,197,131,199,
+115,129, 10,103, 24, 10, 1,224,200,145, 35,221, 80,242, 65, 68, 68, 71, 71, 19, 37,103,112,152, 49,101, 24,222, 28, 55, 10, 12,
+195,150,126,231,139, 32, 9, 76,126,163, 63, 88,214,157, 17,137,170,167,120,214,224, 58,165,156, 28, 65, 10, 0,160, 81,189, 16,
+110,226,155,255, 1,195,178,127, 13,148, 8,128,183,199,245, 43,217, 86, 11,233, 20,128,193,135,147, 94,133,171,235, 52,109, 84,
+135,164,173, 38, 16,101, 63,246,248,119,124,108,147,231,116,129, 22,117, 67, 34, 40,163, 17, 38, 19,133,248, 59, 5,198, 83, 25,
+250, 64, 82,149,170, 94,245, 90, 7,153, 64,157,137,122, 94,146,198,217,122,234,185,200,187, 82,169, 28,179,113,227,198,114, 34,
+ 43, 39, 39,135,212,233,116,176, 90,173,172, 86,171, 5,195, 48,152, 57,115,166,104,206,156, 57, 99,178,179,179,231,217, 53,143,
+ 43, 78,155,223,213,140, 91,183,110,213,155, 61,123,182,181,103,207,158, 15, 27, 52,104,160, 23, 8, 4, 8, 9, 9, 89, 21, 21,
+ 21,229,187, 96,193, 2,107,255,254,253, 83, 5, 2, 1, 26, 55,110,172,255,243,207, 63,235, 1,144,187,155,119, 71,206, 45,103,
+214,112, 0, 64, 16, 4,162,162,162,210, 26, 55,110,172, 23, 8, 4,184,123,120, 49,231,238,253, 20, 9, 73, 52, 9,245,182, 53,
+ 34, 4, 32,247, 44,245,196,139,138,138, 74,111,218,180,169,142, 36, 73,220,188,121, 51, 12,229, 63,107, 85,142, 83, 46,151, 83,
+175,191,254,250,195, 59,119,238,184, 58, 30, 66, 1,137, 14, 77,109, 6,172,208,182, 64,250,197, 10,211, 41, 18,128,158, 51,101,
+180, 80, 37, 3,164, 94,254,102,141, 70, 3,165, 82, 89, 98, 33,179, 90,241,251,239,191,163, 99,199,142,221,246,236,217,115,142,
+127,222,121, 78,158,243, 47,184,210, 34,207,160, 53,203,241, 67,247,101,124,180,206, 58,103,138, 97,104, 52, 8, 15,194,226,255,
+ 27, 15,134, 97,193, 48, 12,104,219, 47,195, 48,160,172,214, 90, 73,217,227, 92,199, 71, 41, 95,240,195,174,119,125,122, 14, 89,
+218, 43,110,246,184, 83, 12, 3,176, 44, 5,138, 2, 24,150, 2,203, 48,160,168,218,113,205,161, 88, 22,245,194,130, 17, 55,123,
+ 28,156,175,179,253,187, 61, 3,207, 28,138, 85,116,141, 94,244,225,221, 52,195, 18, 94,216, 63, 89,200,196, 82, 33, 39,148,193,
+ 98,161,161,181,176, 22, 0,122, 19,197, 90, 57, 15,127, 25, 0, 8, 73,226,121,154, 93,219,162, 97,195,134,101, 68,214,178,101,
+203,252,215,173, 91, 23, 10, 0,195,134, 13,203,232,213,171, 87, 94, 82, 82, 18, 66, 66, 66,136,188,188,188, 1, 0,222,179,157,
+ 59, 3,192,186, 10,120,245,225,225,225,166,128,128, 0,179, 93, 16,145, 36, 9,161, 80,136,240,240,112, 83, 96, 96,160,185,113,
+227,198,122,177, 88, 12,146, 36, 97, 23,122,110,117,243, 8, 2, 2,129, 0,118, 78,103,107,143,157,179, 58, 16, 9,201,242,205,
+155, 3, 39, 73,146, 46,175, 87, 97, 29,146,201, 56, 0, 21, 30, 47, 32, 29,154, 71, 97,229, 30, 2,241,191, 67, 4,224, 44,199,
+113,184,126,253, 58, 82, 82, 82, 32, 22,139, 17, 28, 28,140,121,243,230,193,108, 46,209,187,195,135, 15,239, 6,224, 38,255, 4,
+243,224, 81,138,179,207,160,192,114,182,106, 85,238,163,117,228,200,145,110,209,209,209,231,236, 2,168, 68,236,184, 16, 63, 20,
+ 13,138,178, 2, 28, 87, 43, 66,171,162,235, 48, 12, 91,233,117,236, 62, 90, 44,203, 9, 93,138, 44,150, 5, 77, 81,181,114,247,
+ 88,134, 2,203, 82,112,117, 29,130, 32, 25, 91,131, 47,230,159,147, 39,143,224,240,122, 36, 21,222, 0, 23,104, 19, 66,253,164,
+ 18,228, 25,209,240,133,102,130,223, 13, 20, 46,221, 72,132,191,167,242,185, 41, 23,131,193, 16, 40,147,201,160,215,235, 75, 45,
+ 89,235,214,173, 11,181, 88, 44, 36, 0, 8,133,162, 48, 53, 27, 42, 99, 88,192, 91,153,133,194,194, 98, 63,142,227, 8,155,224,
+ 89, 10, 96, 11, 42,137,238, 47, 22,139, 75, 5,138,163, 0,146, 74,165, 53, 18, 48,118,216,197,153, 88, 44,118,185,221,121,120,
+173, 42,136, 29,133, 22,184, 18,171,150,147,216, 18, 8, 4,176,251, 70, 85, 5,137, 68, 82,154,119, 87, 16, 10, 28,174, 39,168,
+190, 43,166,213,106,133, 78,167, 67, 81, 81, 17,100,178, 18,131, 25,199,113, 32, 8,226, 61, 0,239,243, 79, 49, 15, 30,174,181,
+200, 51, 44,182, 92, 11, 45,148,152,236, 8, 0,160, 41,171, 75,241,179,231,240, 37, 60,204,214, 35,216,255, 23,112,213,140,122,
+ 58,114,228,200,173, 33, 33, 33, 29,236,235, 82,185,167,223,196,119, 63, 3, 77, 91,225, 37, 39,241,214,152,126,101, 68, 86,137,
+ 69,203, 82,225, 55, 65, 10,139,245,159,246, 27,190,122,190,183,210,239,138,179,248,137,139,191,246, 90,161,198, 28, 70,146,191,
+162,144, 8, 97,134,191,253,217,120,135,198,253,198,174,245,115,167,187,109, 15, 36, 72,209,107,147, 86, 77,228,132,158,205, 21,
+164,246,252,199,227,254,117,192, 81,204,249,250,250, 30,233,243,218,202,222, 57, 5,188,143,214,211,128,151,183,138, 12,123,185,
+ 59, 94,126,239, 43,156,249,228, 99, 14, 40,132, 95, 72, 40,217, 99,202, 23,240,124,121, 32,174,190, 53,134, 5, 10,158,139,188,
+ 42, 20,138, 92,131,193, 16, 98, 52, 26,161,209,104,160,209,104,202, 10, 2,145,136,152,248,206, 84,127,145, 88, 2,202,106,193,
+241,237, 95, 84,201,105, 15,225, 48,176,165, 23, 4, 34,137, 54,161, 97,195, 85, 66,161, 16, 36, 73,226,240,218,143,223,219,191,
+252, 93, 47, 0,184,113,100,173,102, 84,236,154,213, 36, 73,194,108, 54, 75,171,147,238, 71,143, 30,133,153,205,102,147, 77,160,
+217,133, 31, 30, 60,120, 80,215,108, 54, 27, 29,183,187, 3,185,194, 11, 80, 53, 0, 20,129,229,172,103,169,169,169,117, 40,138,
+ 50, 8,133, 66, 88, 44, 22,183, 84, 17, 73,146,226,155, 55,111,134,177, 44,235,242,248, 22, 17,117,128,224,150,128,196,219,237,
+ 60,115,110,116, 68,109, 98,235,137, 69,144,230,193,227, 89,177,108, 61,131,207, 4, 81,193,255, 82,161,213,253,200,145, 35,156,
+ 99, 15,145,166, 40,155,200,250, 75,244, 48, 12,139, 76,181, 9, 73, 73,119,177,114,229, 74, 92,186,250,145,247,130, 5, 11,164,
+115,230,204, 49,143, 28, 57,114, 57,203,178,173, 72,146,188,129,191,134, 42,202, 90,133, 88,182,238,181,107,215, 26,218,215, 41,
+138,130,151,151, 23,188,188,188,208,180,113, 88, 57,145,197, 48, 12,172,149, 12, 29,218,125,180, 8,142,229, 40,138, 1,195,178,
+165,226,167, 80, 99, 14, 59,116,250,122, 35,135,195, 95,176,255,233,220,174,121,197, 98,112,210,188,210,124,236, 90, 63,119,250,
+130,205,155,165,133, 76,192,180, 81,175,189, 25, 57,124,212, 24,188,254,234, 43,221,204, 22,203, 65, 1,201,177, 84,233,245, 64,
+130,131,179,143, 22,143, 39,132,228, 34, 61, 37,146,202,225, 25, 92, 31,119,117,140, 88, 32, 16,252,114,191,200, 32, 38, 5, 66,
+144, 66, 49, 18, 10, 77,212,115,148,221,132,228,228,228,144,186,117,235, 66,163,209,128,166,105,118,216,176, 97, 25, 66,161, 40,
+ 76, 40, 18, 17,209,163,166,178,217,217,153, 20, 73, 10,192,113, 12, 94, 25, 62,137,144,202,228, 98,171,197, 66,163,100,232,208,
+149, 53,203, 49,132,131, 87, 84, 84,148,175,125, 38,224,254,229,239,122, 57,236, 83,190,244,210, 75,190,142,179, 14,221,180, 22,
+ 17, 35, 71,142,148,135,135,135, 19, 0,240,235,246,217,118,235, 25, 49,112,224, 64, 89,120,120,137, 31,254,143,107,223,117,155,
+211, 95,193, 1,197, 15,128,226,212,114,150,172,129, 3, 7, 74, 27, 54,108, 88,173,103,209,230, 0, 95, 97,236, 46, 15, 33, 13,
+100, 95,119,139, 43,166, 13,168, 80, 79, 8,151,191, 66, 66,226,233,103,238,240,241,137,159,121,177,197,131,135, 91,112,210, 34,
+207, 20,186,217, 4, 98,119,219,111,169,224, 18, 2,128,205, 68, 71, 56,232, 44, 80,180,181,156,200, 98, 24, 6, 34,194,140,149,
+ 43, 87,226,253,247,223, 7, 0,241,244,233,211, 15, 44, 88,176, 96, 40,203,178,173, 56,142,235, 66, 16, 68,101,189,198,179, 33,
+ 33, 33, 57, 28,199,137, 72,146,236,178,118,237, 90,223,254,253,251,195,203,203, 11, 28,203,149, 19, 89, 12,195,194,106,181, 84,
+248,153, 91, 31,165,124,193, 15,123,166,249,244, 28,188,180, 23,195,178,167,236, 34,139,101, 24,128, 45, 57, 41, 63, 55, 3, 39,
+143, 31,196,134,245, 27, 10, 65,112,183,193,129,181,137, 65, 84, 32, 6, 91, 93,252, 53,177, 75,231,118,205,177, 96,243,102,233,
+173,107, 89, 7,166,126, 48, 43,114,248,168, 49,216,243,221,118,144,116,209,117, 71,145,197, 80, 44,138, 11,243, 6,254,196,251,
+104, 61, 45,248,158, 60,117,138, 24, 51,102, 12,171,213,106, 33,150, 72, 88,138,162, 4,255,254,247,191,153,247,223,127,159,204,
+206,206,134, 70,171, 19, 2,240,197,115, 96,214,210,104, 52,219, 39, 77,154,212,237,252,249,243, 98,146, 36,161,209,104,208,163,
+ 71,143, 60, 53, 27, 42,155,248,206, 84,255,204,204, 12, 90, 41, 23,154,197, 98, 17,114,115,115,217,110,253, 71, 27, 71,141,127,
+191,206,251,179,227, 54,102, 93, 94,191,206,157,107, 56,206, 4,116,222,183,105,211, 38, 75,104,104,168, 73, 42,149, 74,198,141,
+ 27,231,214,248,161,197, 98,225, 22, 47, 94,108,118,158, 93,104,177, 88,184,149, 43, 87, 90,194,194,194,204,114,185,156,163,168,
+170,253, 62, 73,146,160,223, 90,176,131,166,105,186,140, 21,203, 46,178, 40,150,208,125,245,213, 87,214,176,176, 48,139, 66,161,
+224,164, 82,169,216,157,116, 78,157, 58,149,243,241,241,177,122,120,120,136, 99, 99, 99, 31,107,214, 33,197, 64,184, 96,109,105,
+120, 7,169,151,151, 23,180, 90,109,105, 90, 67, 66, 66,120,177,197,131,135, 11,148,211, 34,207,166, 21,206,189, 56, 90, 44,160,
+203,201,205, 11,244, 15,170, 15,154,166,109, 11, 5,154,162, 48,237,237, 81, 88,190,254, 43, 0,176,139,173,168,233,211,167, 31,
+ 0, 80,101, 99,182,107,215,174,249,211,167, 79, 87,230,228,228,156,216,186,117,171,239,232,209,163, 49, 99,198, 12, 44, 93,186,
+ 20, 34,137, 12,190, 1,117, 75,175, 99,191,110,158,186, 0, 28, 56, 93, 5,118, 58,107, 73, 35, 5,161, 95, 64, 61, 80, 12, 5,
+150,162, 64, 81, 20, 8, 65, 73,214, 78, 30, 63,136,209,111, 76,133, 72,170,244, 89,179,114,137, 49,242,229,144,161,115, 38, 76,
+ 48,187, 97, 4, 36,111, 93,203, 58, 48,245,253,216, 40,187,200,218,183,125,253,237, 47,103, 14,222, 41,149, 8, 75,175, 67,177,
+ 44, 72, 82,192,251,104, 61, 37,145, 37,149, 74,247, 30, 59,118,236, 94,219,182,109, 9,189, 94, 15,138,162,144,151,151,135, 3,
+ 7, 14, 36,112, 28, 7, 31, 31, 31, 28, 59,118,140, 29, 61,122,244, 94,179,217,252,218,179, 46,182,178,179,179,239,200,229,242,
+ 93,179,102,205, 26, 53,115,230, 76, 17,203,178, 72, 74, 74, 2, 8,130, 19,137, 37, 32, 73, 18, 34,145, 16,197,197, 26, 86,225,
+169,202,178,114, 2,133, 72, 44, 1, 41, 16, 87, 54, 77,248,161, 45, 24, 41, 72,161, 88,107,159, 9, 40, 22,139,113,117,207, 50,
+ 77,247,113,243,149, 0, 32,150,202, 11,251,244,233,147,214,188,121,115,253,111,191,253, 86, 15,229,103, 29, 58, 63,159,244,144,
+113,177, 2,133, 92,166,143,138,138,122,104,231, 76, 61,181, 70, 51,102,242,108,130, 16, 72,244,209,209,209,105,145,145,145,122,
+129, 64,128,196,131, 75, 52, 67,198,197,202,136, 74,130,172,158,184,199,189,117, 99,207,133,166, 95,124,241, 5,213,191,127,255,
+ 71,118,127,177,212,212,212, 58, 3, 6, 12,144,174, 88,177,130, 26, 48, 96, 64,250,139,255,207,222,117,199, 53,113,254,225,231,
+ 46,155,189, 71, 16, 68, 69, 81, 20,112,139, 11,197, 58,107, 29,173,226,194,189, 71,157,173,179, 14,220, 74,221,168,117,214, 90,
+220, 84,171,162,214, 81, 23, 42, 46, 16, 7, 67, 69, 1, 25, 97, 67,128,144,157,187,223, 31, 36, 52, 32, 35, 65, 91,107,127,121,
+ 62,159,124,146,220,189,247,220,123,251,185,239,251, 29, 94, 94,197, 36, 73, 34, 50, 50,210,185, 58, 75,149, 6, 70, 70, 70,138,
+ 9, 19, 38,188,123,254,252,121,109,163, 14,171,133,139,139, 11, 40,138, 66,183,110,221, 32,145, 72, 12,150, 45, 3, 12,248,111,
+162, 98, 30,173,170, 51,195, 43,148,138,111,167,204, 94,185, 19, 32, 76,181,238, 2,127, 25,150,104, 16,223,127,255,157, 9, 0,
+ 35,141,216,154, 59,119,110,141,101, 78,180, 68, 86,155,128,128, 0, 44, 94,188, 24,155, 55,111, 86,253,248,227,143,140,248, 87,
+137,242,177,211, 87, 20, 84, 88, 15,104,208,197,148,130,250,182, 50,190,124,161,104,133,239, 87, 27, 86,166,101,150,220, 25, 59,
+109,105,217,221, 75, 5,160,144,224,171, 0, 96,207, 79, 63,137, 88, 92,115,147, 33,195, 71, 1, 64,207,157,219,130,206,172,193,
+129,154,197, 22, 77,120,124, 59,119,129,149, 70,100,237,218,186,246,185, 5,145, 25, 60,243,187, 24,133,246,122, 0,192,218, 12,
+103,124,191,218,208, 59, 43, 79,180,221,112,158,253,115,224,112, 56,171,175, 95,191,110,226,237,237, 77,228,230,230, 66,165, 42,
+ 61, 34,114,185, 28, 66,161, 16, 69, 69, 69,144, 74,165,104,221,186, 53,185, 99,199, 14,147,153, 51,103,174,150,201,100,211, 63,
+247,237,126,251,246,237,174,115,231,206,225,214,173, 91,195, 22, 45, 90,196,114,116,116, 36, 44, 44, 50, 9,133, 92, 6,128,166,
+179,179,179, 41, 99, 83, 75,129,173,131,243,187,244,140, 44, 15,133, 92, 6, 74, 37,175,210,219, 92,157,222,225,251, 23, 47, 94,
+212,219,180,105,147, 76, 59, 18,112,248,130,157, 59, 90,183,110,109, 29, 28, 28, 44,235,215,175, 95,178,198,121, 93, 23,103,248,
+ 43,111, 48,251,197,139,103,205, 42,114,250, 77,222,116, 80,195,169, 29,141,216,255,187,189, 7, 27, 53,106,100,237,233,233,153,
+ 92, 29,111,131, 6, 13,196,124, 62, 95,214,164, 73,147, 98, 22,139, 85,106,201, 82, 40, 74, 26, 52,104, 64, 57, 56, 56,200,154,
+ 54,109, 90,172,175,211,190,145,145, 17,173,177,138, 85, 6,125,162, 14, 89, 12, 40, 3, 2, 2,202, 50,195,127,223,168,145, 96,
+212,168, 81,252,121,243,230,225,224,193,131,184,123,247,238,123, 98,191,107,215,174,184,125,251,246, 74,252,135, 18,235, 26, 96,
+192,255, 25,170,207,163, 85, 17,135, 14,133,252, 9, 45,159,166,202,176,102,205, 26,174,218,146,213,115,206,156, 57, 16,139,197,
+ 86,149, 52,235, 1,117,174,141,202, 68, 86, 80, 80,208, 49,154,166,157, 1,116, 86,169,168, 7,251, 15, 28,234, 86,213,250,134,
+ 12, 25,242, 30, 39, 77,144, 12,146, 36,138, 57, 44,250,201, 79,251, 14, 30, 41,215,190,212,249,189, 49, 8, 60,221,185, 45, 72,
+ 12,160,103, 69,177,133,191,202,140,148,113,106, 48,117,218,212, 50,145,181,115, 91,208, 85,207, 54,117,191, 89, 58,113,117,165,
+226,108,245,138, 41, 38, 36, 73,116,172,224,163,245, 30,231, 71,128,129,243, 47,116, 11, 8, 8,104,238,227,227, 67,106,139, 44,
+153, 76, 86,150,184, 83,227, 44,158,150,150,134,174, 93,187,146,205,155, 55,247,122,248,240, 97, 55,252, 85,206,233,115,221,118,
+213,219,183,111,119, 56, 58, 58, 94, 91,190,124,249,168,156,156,156,175,242,243, 11,108,194, 14,173, 70,159, 33,211,136,174,125,
+ 71,136,100, 52,147,151, 42,200,108,114,243,226, 81,235, 75, 39,118, 65, 46,147, 77, 1, 16,135,191,210, 59, 84,228, 44,209,164,
+113,104,210,164,137, 72, 91,168,212,173, 91, 87,226,228,228, 36,245,244,244, 44,155, 94, 69, 52,223,123,219,174, 47,167,218,255,
+ 75, 84,211,254,212,136,182,138,105, 35,140,141,141,161, 17, 95,250,244, 83, 59,218,178,210, 27,101,205, 81,135,101,156,234,244,
+ 14,229,116, 90, 72, 72, 72,143,144,144,144, 54, 0,158,160,180,214,161, 2, 40, 29, 74,212,114,154, 15, 84,127, 12,215,187,129,
+243,255,149,243,115, 70, 87,252,229,155, 5,148,250,106,221,170, 82,104,213, 4,141,227, 59, 0,114,238,220,185,249, 98,177,216,
+106,212,168, 81,213, 46,147,145,145,113,240,240,225,195,229, 68,214,160, 65,131,198,133,134,134, 94,203,202,202,170,213, 86, 89,
+153, 27,173,185,117,126,161, 85,215,126, 27,230, 0,248,177, 10, 67, 30,229,217,134,255,205,206,109, 65,103, 42,136,173, 95, 1,
+ 12,170, 74,149,246,250,114, 32,142, 30,218,169,241,237, 50,122,254, 56,237,210,176,168, 85,149, 70, 43, 90,154,114, 87,169,251,
+ 49,207,224,163,245,207,128,205,102,251, 45, 90,180,136, 45, 18,137,222, 19, 89, 21,133, 86, 97, 97, 33,158, 62,125,138,177, 99,
+199,114,163,163,163,253,228,114,249,141,255,194, 62,200,200,200,136, 87, 39, 35,157,173, 73,225,192,229, 25,177, 71,140,159,227,
+ 92, 22,117,120, 98, 23,164, 18, 49, 0, 48,117, 73,239,192,100, 50,217,209,209,209,174, 26,171,149, 92, 46,231,106,166, 63,126,
+252,216, 85,147, 91, 75, 34,145,232, 28,117,248,119,113, 62,123,246,204, 89, 19, 29,169,137, 46,100, 50,153,236,200,200, 72,103,
+ 13,167, 84, 42,213, 41,234,144,195,225,176,163,163,163,157, 85, 42,213, 71,139, 58,212, 22,198, 40,173,179, 88,174,214,162,218,
+183,140, 32, 8,130, 54, 12, 27, 26, 96,192,103,143,138,145,146,213, 23,149,174, 9, 26,199,119, 61, 22, 97,186,184,184,244, 26,
+ 62,124,120, 57,145,229,239,239,175, 58,125,250,244, 77, 62,159,159, 73,146,100,188,190,253, 40,243,209,194,123,111,144, 32, 73,
+242,105,231,182, 77, 65,146,228,211,165, 19, 39, 74,215,224, 64, 57,177,117,246,204,201,222,169,249, 49,149, 75, 51, 0, 54,246,
+117, 16, 48,238, 91, 4,140,251,214, 10, 64, 39,160,234,104,197,234,250, 97,192,223, 3,130, 32, 56, 78, 78, 78,207, 37, 18, 9,
+ 8,130,128, 84, 42, 45, 19, 88, 69, 69, 69, 16, 10,133,101,255,229,114, 57,178,179,179, 81,183,110, 93, 16, 4,241,159,246,163,
+147,203,229,202, 69, 43, 55, 29,102, 48,217, 74,138,146, 19,114,185,124,188, 62,215,249,162, 69,139, 72, 84,226,123, 53,115,230,
+204, 74,167,127, 42,206, 37, 75,150, 84, 26, 37, 56,115,230,204,106,163, 7,171,194,119,223,125,247,209,162, 14,117,191,125, 25,
+ 96,128, 1,255, 49, 84, 26,186, 87, 43,161, 69,146,228,211, 74,162, 11, 9, 0, 52, 73,146, 79, 43,201,114,160,124,247,238,221,
+ 74, 75, 75,203, 41, 34,145,232,143, 65,131, 6,205,245,247,247, 87, 1,165, 14,242,181,221,162,124,161,104,133, 95,255,141,243,
+ 10,138,165,193, 21,231, 85,180, 60,105,196,214,174,237, 65,187,207,132, 30,247,207, 72, 79,221, 93,213,182, 85, 37,168,170,138,
+ 86, 20, 22,138, 87,250,245,223, 56, 39,191, 80,108,240,209,250,135,160, 82,169,174, 24, 25, 25, 17,154, 98,202,218,214,171,194,
+194, 66,148,148,148, 64, 93,146, 6, 0, 80, 92, 92, 12, 11, 11, 11,168, 84, 42,250, 63,182, 43,164, 0,230,171,173, 85, 0, 48,
+ 63,241,230, 14,237,115,251,153,246,188,106,172, 89, 2, 93, 10, 68, 87,182, 92,117,243,254, 6,206,204,106, 10, 68, 87,135, 76,
+ 61,249, 50, 1,128,205, 98,100, 85, 85, 60,154,205, 98,100, 85,227,183,175,231,123, 3, 65, 3, 88,105,184,178, 13, 48,224,243,
+125,255,255, 84, 43,238, 97,224, 52,112, 26, 56,255, 17, 78,174,250,163,235, 60,195,254, 52,112, 26, 56, 13,156,255, 54,206,202,
+ 48,249, 51, 17, 90,116, 37, 31, 0,181,180,104, 25, 96,128, 1,255, 58, 72,107, 57,207, 0, 3, 12, 48,192,128, 15,199,123,197,
+164,181,103, 84,165, 74,245,137, 38,168,141,178,189,102,224, 52,112, 26, 56, 13,156, 6, 78, 3,167,129,243,255,142,179, 38,110,
+237,229, 39, 3,216,247,153,136,173, 79, 18,208, 98, 48,171, 26, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,172, 45, 12, 67,
+135, 6, 24, 96,128, 1, 6, 24, 96,128, 1,255,231,208, 47, 97,169, 1,149,160,238,192,165,160,176, 68,189, 59,131,144,114, 54,
+240,191,182,137,254,254,254, 12,125,218, 39, 38, 90,146, 81,224,111, 54, 55, 97,247, 47, 22, 41, 54, 83, 81, 43,130,107, 58, 17,
+109, 27,180, 26,109,204, 51,158, 46,147,201,234,155,154,153,101,229,229,102,239,201,123,247,108,151, 86, 27,243, 7, 15, 30,240,
+125,124,124,210, 1, 20,105,189, 41, 24, 96,128, 1, 31, 19,150, 77, 93, 64, 16,227, 1,250,175,176, 75,138,142,129, 48,238, 80,
+185,118, 22, 30,227, 64, 18,205,180,166,136, 65, 99, 63, 10, 98, 83,106,120,224, 88, 38, 36, 36,184, 54,108,216, 48, 25, 64, 65,
+197,181, 87, 50,207,112,157, 27,240, 57,163, 43,202, 39, 44, 45,187, 22, 62, 92,104, 53, 26, 84, 31, 74,114, 12,104,140, 4,129,
+104, 36,134, 14,174, 21,143,219, 55,117, 64, 49,219, 1,104, 5,208,173, 76,140,120, 45,197, 50,121, 22, 69,211,163,241,230,228,
+ 19,189,249,234,251, 79, 67,213,229, 44, 86, 34, 49,244, 39,189,248, 40,250,135, 71,183, 79,115, 45,141, 9, 52,108, 61,104, 1,
+202,103,112,174, 45, 56, 0,124, 73,146,108,102,108,108,204, 47, 41, 41,201,166, 40, 42, 5,165,227,211,249,181,228, 36, 1, 76,
+ 48, 53, 49,233,227,106,198,105,245, 46, 71,152, 86,164, 80,133,163, 52,161,107,254,199, 58,163, 74, 69,150,227,190, 57, 35,124,
+198, 6,205,234, 1, 75,191,141, 11, 74,128,234,132, 22,225,220,184,227,217, 97,195,135,248,205,152, 60,214,180,142,157, 41, 4,
+ 57, 34,155,159, 14,134,108, 10, 9, 57,218,111,226,176,158,125, 0, 96,245,234,213, 95,187,184,184,212, 99, 48, 24,137,203,150,
+ 45,251,117,197,138, 21, 52, 81,117,165,114,190,250, 28,214,220,240, 77, 0,120, 2,104, 0,224, 45,128, 23, 40,159,101,188, 54,
+248, 44, 56,235,212,169,227, 68, 81,212, 68, 7, 7,135,175, 50, 51, 51, 47,144, 36,121, 32, 45, 45, 45,253, 83,222,117,104,154,
+222, 75, 16,196,100,154,166,247,233,241, 61, 69,159,117,240,120,188, 76,137, 68, 98,175,254,157, 37,145, 72, 28,254,174,237,249,
+ 39,215,245, 15,189,127, 79,186,114,231, 69, 31,237, 73,189, 58, 55,171,228,142, 66, 52,187,114, 39,166, 75,249,118,158,170, 42,
+238,129, 4, 77,211, 88,185,114, 37,177,106,213,170,113,110,110,110,141, 72,146,124,185,124,249,242,114,169,111, 42,206,211,186,
+206, 13, 98,203,128,207, 21,250, 21,149,174, 17, 77,253, 77, 32,161,253, 1, 98,108,215,182, 45, 59, 79, 25,221,159,160, 25, 60,
+140,152,180, 80,169, 55,151,235, 88, 46, 24,226, 53,222,205, 26,207, 29,210,191, 7,217,198,179, 30,248,118, 22, 0,201,194,222,
+139, 73, 54,193, 65,203,118, 3,240,169, 69, 47, 87,188,137, 56,102, 47, 40, 80,129, 32, 0,130, 0, 72, 2, 40,150, 80,232,245,
+245,152, 21, 0,126,210,243,174, 68, 90, 26, 19,152,123, 76, 2, 0,140,143,112, 80,234,217,217,217,141,155, 61,123,182,137,167,
+167,167, 37,143,199,227, 72, 36, 18,135,132,132, 4,187,101,203,150,121,138,197,226,243, 0, 30,233,201, 89,183,161,179,211,201,
+224,185, 19,218, 53,111,224, 10,150,172, 24,148, 84,228,242, 42,225,117,135,169,187, 79, 77,138,201,147, 12, 71, 45, 74, 38,228,
+228,228, 16, 0, 96,107,107, 75,151, 23, 89,237,199,110,157,215, 11,115,183, 92, 65,137, 68,118,164, 58, 14,235,122, 45, 70,125,
+243,205, 64,191,181, 63,204, 52, 77,203,149, 35, 58, 81, 12,107, 83, 54, 86,204,159,198,145, 74, 21, 29,118,255, 26, 50,121,231,
+134,133,251, 85, 42,213, 23, 0,218,168, 84,170,199, 0,126, 93,185,114,101, 85, 55,223, 85, 0,150,168, 79,232,163, 12, 6,227,
+106,183,110,221,234, 79,156, 56,145,104,221,186, 53, 34, 35, 35, 27, 28, 59,118,172,199,133, 11, 23, 18, 85, 42,213, 51, 0, 47,
+161, 46,123,162, 3, 88, 0, 26, 51, 24, 12,239,127, 51, 39,159,207, 55,146,201,100, 99,156,157,157, 39,119,236,216,209,187,127,
+255,254, 68,227,198,141, 17, 31, 31,223,250,210,165, 75, 43,194,195,195,159,165,166,166,238,227,112, 56,135, 5, 2,129,248, 31,
+127,142, 19,196,100, 0, 78,106,157,188, 82,135,239,116,148,230,146, 18,232,186, 14,137, 68, 98,175, 41, 97, 67, 16,132,253,223,
+185, 61,122,174, 43,150, 32, 8,107,117, 91, 84,247, 77,146, 36,148, 74,165, 72,165, 82,185,213,192,217, 88,253, 34,165,179,214,
+ 5, 80, 93, 34,104, 35, 0,232,213,169, 89, 30, 8,196,148, 89,180,222,127,201,140, 41, 19, 96, 52,154, 93,185, 27, 99, 93,206,
+ 10, 86,241, 45,118,229, 74, 98,197,138, 21, 8, 12, 12,236, 15,192,151,162,168,112, 15, 15,143, 29,229, 40, 41,170,108,222,138,
+ 21, 43,182, 87,115,157, 27, 96,192,231, 2, 63,232, 83, 84,186,202,247, 31,183,193, 93,160,194, 88, 87, 27,123,255, 89, 19,135,
+ 26,121,122, 52,132, 4,166, 72,202, 81,225, 98,216, 37, 0, 56,161,159,213,105,104, 27, 38, 83,114, 56, 40,112,126, 19,223,118,
+158,120,158,166,192,227, 52, 21, 74, 18, 21, 96,144, 10,168, 40, 26,160, 33,169,237, 86,167,230, 43,113,231,165, 12, 36, 1, 48,
+ 72,128, 36, 9, 48,200, 90,146, 81,178, 87,171, 15, 69,121,230,100, 82, 0, 37,123,245,129, 7,164,153,187,187,251,168, 85,171,
+ 86, 89,102,100,100,152, 68, 70, 70,130,203,229,194,202,202,138,193,231,243,157,182,108,217, 34,158, 53,107,214, 87,114,185, 60,
+ 9, 64,142,142,156, 30,125,219,120,223,219, 23,180,218, 66,241,224, 18, 10,142,255, 6, 6, 73,131,109, 98,138,250, 70, 70,184,
+244, 77, 67,107,255,176,196,211, 15, 51, 69, 30, 0,210,106, 34,139,139,139, 99, 72,165,210,225,230,230,230,237, 89, 44,150, 3,
+207,170, 30,149,206,108,147,155, 77, 52,120,155,101, 95,210,101, 94, 15,135, 62,155,231,116,195,220, 45, 87,176,237,216,253, 95,
+ 90, 33, 99,121,117,121,179,141,141, 77,167,204,154, 62,209, 52, 53, 71,142, 53,167,115,112,232,118, 33,198,248,154, 97,238,151,
+ 22, 8, 24, 49,204,228,212,111,161, 83, 0,236,215, 90, 36,222,195,195,131,136,139,139,171,236,230,107, 5, 96,161, 76, 38, 35,
+217,108, 54,193,227,241, 70,173, 93,187, 86, 62, 98,196,136, 84, 77, 3, 95, 95, 95,248,250,250, 18, 69, 69, 69, 13,110,220,184,
+209, 32, 36, 36, 68, 25, 17, 17, 17, 11,224,108,213, 22, 11,163,119, 18,137,216,133,103,100, 84,242,211,238,221,155,187,116,233,
+ 66,113,185,127,165,159,170, 13, 39, 0, 88, 88, 88,236,183,183,183, 39, 22, 47, 94,156,254,177, 56,235,213,171,119,165, 93,187,
+118,221,122,245,234,197,236,212,169, 19,156,156,156,202,230,217,218,218,194,215,215,151, 72, 73, 73,105, 30, 30, 30,190,251,202,
+149, 43, 59,158, 60,121,114, 35, 41, 41,169,215, 63,108,209,218,167, 22, 19, 2, 61,219,127,246, 32, 8,194,116,239,222,189,246,
+154,154,140, 10,133, 2, 42,149,170,236, 91,243,161, 40, 10, 42,149, 10,107,215,174, 85,137, 68, 34, 93,246,145, 72,235,173, 89,
+243,161, 42,251,230,112, 56,182,154,132,189, 53,220,217, 99,248,220,130,166, 38, 38, 38,174, 0,250,194,174,209,194,242, 13, 74,
+223,159, 69, 34, 81,178, 64,106, 25, 3,160, 75, 53,108,150,171, 86,173, 26, 19, 24, 24, 56, 80,203, 74,235, 61,100,200,144,138,
+101,175,188,213,223, 34,130, 32,110,146, 36,121, 30,192, 33,124, 68,171,187, 1,255, 45,208, 52,221, 22,128,157,214, 36, 25, 74,
+ 71,133,160,126, 78, 18, 0,108, 42, 76,215,110,167,249,206, 86, 79,183, 83, 47, 71,107,241,102, 19, 4,241,168,150, 93,188,133,
+ 42,252,180,152, 0, 16, 22, 22, 70,247,235,215,143,208,124, 87, 46,138,252, 47, 78, 24, 49,160,207, 87,221, 59,130,228, 89,225,
+ 85, 22, 16,241,142, 6,147, 84,128, 4,141, 7,119,111,208, 96, 82,135, 43, 44, 85,181,245,164,222,224,239,188, 61, 61, 54, 30,
+ 8,154,205,136,205, 98,226, 80,120, 9,228,146, 98,100,103,188, 67, 86,122, 50, 4,169,111,145,246,238,237, 51,128, 88,161, 51,
+231,123, 7, 6, 80, 81,234,119, 64, 10,168, 38,242,178,102, 78,185, 40,174, 65, 99, 79,207,124,142, 10,144,139,226,116, 88,125,
+ 85,156, 94,141, 26, 53, 26,241,195, 15, 63, 88,191,120,241,194,168,164,164, 68,122,233,210,165,248,164,164, 36,115, 62,159,159,
+ 55,109,218,180, 70, 78, 78, 78,230,131, 6, 13,226, 28, 63,126,252,107,148, 15,107,173,138,211,115, 64,251,150, 17, 7,119,108,
+ 53,201, 61, 21, 12, 89,194, 83, 92, 20,136,112, 55,179,132,110, 96,193, 37,190,109,110, 7, 83, 46, 19,171, 59, 57,153,246, 61,
+147,176, 81, 65, 81, 1,213,113,222,187,119,143,111,108,108,188,101,228,200,145,252,153, 51,103,114, 85, 76, 75,102,104, 68,174,
+197,194,221, 17, 78, 37, 82, 57, 99, 68,183,122,152, 55,210, 27,243,182, 93,215,136,172,201,245,235, 23, 80, 81, 81, 85,115, 42,
+228,242,250,206,246,230,136, 78, 18,227,208,237, 66,252,249,131, 19,186,175, 77,199,160, 86, 76,120,212, 53,133, 82,174,104, 60,
+100,200,144,195,234,183,246, 71, 0,190, 30, 50,100, 72, 19, 6,131,113, 29,192,239, 53, 29, 35, 30,175,242,234, 41, 86, 86, 86,
+232,218,181, 43, 60, 60, 60,152, 93,186,116,241,174, 32, 96,202,113,202,229, 50, 62, 69,209, 48, 51, 51, 51,178,177,177,177, 50,
+ 51, 51,203,173,236, 65,165, 15, 39, 0, 88, 91, 91, 15,238,218,181, 43,243,216,177, 99, 57,137,137,137, 15, 70,140, 24,241,214,
+220,220,188,156,245,215,196,196, 4,141, 26, 53,194,178,101,203,152,125,250,244,169,145,211,193,193,161,103, 72, 72, 8, 8,130,
+ 40,123,104,191,103, 44,118,117,133,163,163, 35,250,246,237,203, 28, 60,120,112,207,164,164,164, 90, 93, 71,122,224, 90, 37, 22,
+173,149, 21,142, 83,149,195,111,149,181,215,225,184,103,105,172, 75,106, 62,124,192,181, 89,237,112, 39,143,199, 43,179, 66, 85,
+178,174,247, 56, 73,146,196,210,165, 75, 65, 16, 4, 88, 44, 22,216,108,118,165,223,126,126,126,250,246, 51,133, 32, 8,146,205,
+102, 47,100, 50,153, 19,165, 82,169, 51,143,199, 75, 87,169, 84,191, 72,165,210,181, 0, 20, 52, 77, 91, 86, 33,178, 42,229, 52,
+ 49, 49,113,125,245,234,149,123, 85, 29,145, 74,165,240,246,246, 6,164,136,173,142, 51, 33, 33,193,213,205,205,173, 49, 0, 77,
+137,182,219, 52, 77,119,209,250,175,141,219, 52, 77,127,169,254,253,242,205,155, 55,174, 13, 27, 54,204,255,167,206, 79, 3,231,
+191,143,179, 6, 45, 98, 71, 16, 68,152,113, 48, 25,151, 0, 0, 32, 0, 73, 68, 65, 84,214,181,218, 79,243,127,209,162, 69, 75,
+214,175, 95,255,130, 32,136, 48,237,233,218,237,180,191,213,247,155, 48,154,166,251, 45, 94,188,216,115,195,134, 13,235, 52,109,
+255, 14,145,168,143, 69,203, 60, 91, 98,130,240,119,230, 96, 50, 84, 96,146, 4,152, 12, 0, 52,129,228,164, 4, 20, 21, 22,220,
+ 65,226,233, 68,221, 44, 89,254,157, 90,180,240, 10, 58,186,109, 1,249,115,120, 9, 10, 68, 18,196, 61,185,137, 71, 55,127,207,
+ 80, 41, 85,191,131,160, 31, 3,100, 36,222, 82,241, 64,104,237,106, 92, 16, 52,179, 84,104,169,197, 85, 57,177,245,201,208,188,
+ 73,147, 38,195,150, 45, 91,102, 27, 21, 21,197, 19, 10,133, 69, 71,143, 30, 77,151, 74,165, 73, 0, 46, 39, 39, 39, 55,217,190,
+125, 59, 39, 40, 40,200,203,203,203,139,127,242,228, 73, 89, 37,229,140,222,227,156, 63, 54, 32, 98,226,172, 57,188,216,147,187,
+192,137,141,196,210,167, 57,170, 63, 5, 37, 63, 0,216,134,148,226, 78,217, 18,229,213,173, 93, 93,200,122,102,108, 52,180,228,
+248,197,229, 73,170,181,100, 25, 27, 27,111, 9, 9, 9,113,109,219,182, 45, 9, 0,225, 47,149,220,133,187, 35,156, 46,175,239,
+ 68,116,106,102,131,172, 2, 41,102,239,138,198,165,136,172, 63, 52, 34,171,166, 78,154,153,153,101,167,102, 21, 58,216,152,242,
+ 48,186,179, 41,186,175, 77,135,127, 27, 46,184,108, 2,241,137, 25,104,232, 86,143,136,190,115,182,141, 90,100,181, 21, 8, 4,
+ 0,208, 6, 64, 98, 74, 74, 10,223,199,199, 71,168, 69,151, 15, 96, 35,135,195, 89, 74, 16, 4,221,182,109,219,104, 47, 47,175,
+ 98, 43, 43, 43,136,197, 98, 72,165, 82,176,217,108,136,197, 98, 36, 39, 39,227,193,131, 7,176,178,178,210,235, 64, 21, 23, 23,
+195,204,204, 12, 20, 69,125, 48,167, 74,165, 34,246,236,217, 99,242,226,197, 11,147,208,208, 80,135,185,115,231,230, 54,109,218,
+244,241,176, 97,195, 94,219,219,219, 75,159, 62,125,138,123,247,238, 33, 63, 63, 31,237,219,183,215,137, 83, 38,147,129,201,100,
+ 66, 44, 22,131,203,229,130,201,100, 66,169, 84,130,162,168, 50,241, 85, 92, 92,140,188,188, 60,176,217,108,200,100,178, 79,241,
+ 6,250,158,133,170,186,225,183,218, 88,180,180,133,154,142, 34,171, 38, 75, 84,149,195,157, 5, 5, 5, 70,150,150,150, 11, 1,
+ 8,106, 90, 23, 65, 16, 96, 48, 24, 96,179,217, 32, 8, 2, 93,186,116,193,132, 9, 19,208,170, 85, 43, 36, 36, 36,224,248,241,
+227,120,244,232, 17, 88, 44, 86, 89,123,157,199, 39,252,252, 24, 60, 30,239,222,128, 1, 3, 60,127,248,225, 7, 94,189,122,245,
+ 16, 27, 27, 91,119,195,134, 13, 11,175, 93,187, 54, 80, 36, 18,181,209,220,237,170,183,210,171,135, 4, 75,135, 11,251, 74,165,
+ 82,196,198,198,234,179,204,123,104,216,176, 97, 50, 73,146,175, 41,138, 10, 7,224, 77,211,116, 23,130, 32, 46,161,212, 47, 81,
+ 27, 34,154,166,191, 36, 8,162, 16,192, 51,146, 36, 95, 82, 20,149,108,176,219, 24,160,195,125,165, 95,197,255, 4, 65,132,173,
+ 95,191,190, 95,101,226,170,146,107,179,220,244, 13, 27, 54,172,211,250,255, 33, 22,213,174, 40,239, 12,239,167,182,114,253, 37,
+180,194,194,194,170, 87, 32, 20, 6,133,157, 62,118,191,187, 28,174,158,173,125,181,172, 67, 52, 34, 31,220, 3, 64,255,162, 83,
+ 87,248,253,140, 72, 6,243,151, 61,235,102,146,123,111,150, 32, 37, 61, 11,247, 46,254,130,108, 65,210, 33,128,158,139,196,208,
+194, 15, 62, 18,245, 6,121,217,219,216, 90, 74,228, 52, 40, 26,192,123, 98,235,147,160, 85,227,198,141, 7, 71, 68, 68,216, 74,
+ 36, 18,222,157, 59,119, 74, 66, 66, 66, 50,228,114,249, 77, 0,119,213,109,162,178,179,179,135,168,133, 9,131,201,100,114,228,
+114,121,117,190, 11,173,230, 79, 28,115,103,227,158,131,188,215,207,163,177, 61,244, 34, 10, 74, 74, 84, 55,179,196, 95, 3,208,
+ 40,250,235, 81, 57,226, 52, 26,180, 11,139, 36,192, 55, 97, 57,198,229, 73,120, 64,229, 67,178, 82,169,116,196,200,145, 35,249,
+ 26,145, 5, 0, 57, 69, 10,102,137, 84,193,232,212,204, 6,173,187, 13, 65,228,141, 83, 56,121, 59, 13,110,118,198,183,235,155,
+ 20,232,180, 71,179,179, 4,123,182, 6,239,221,186,113,229,124,206,188,190, 22,240,111,195, 2,143, 77,192,220,152,133,181, 59,
+246, 43,162, 30,220,126,202,231,243,195, 0,124, 45, 16, 8,192,231,243,139, 1,188,100, 48, 24,137, 42,149,170, 50,167,238,229,
+ 0, 28, 14, 31, 62, 76, 42, 20,138,226,132,132, 4, 56, 58, 58,194,193,193, 1, 22, 22, 22,136,139,139,195,159,127,254,137,248,
+248,120, 80, 20,133, 22, 45, 90,232,117,176,114,115,115,241,244,233, 83,244,237,251,213,220,236,236, 44,115, 43,107, 27,209,157,
+240,219,155,106,195, 73, 81, 20, 1, 0,158,158,158,240,244,244,228,165,165,165, 57,135,133,133,217,175, 89,179,230,157,171,171,
+235, 81,177, 88, 92,206,114,160,171,208,210,136, 11,141, 8,228,241,120, 96,179,217, 40, 44, 44, 68,102,102, 38,138,138, 74,131,
+ 54, 45, 45, 45, 63,137,208,170,194, 66,245,209,218,255,205,226,240,189,225, 78, 75, 75,203,145, 0, 22,234,184, 45, 80, 42,149,
+ 96,179,217,240,241,241, 65,112,112, 48, 30, 61,122,132,223,127,255, 29,117,235,214,197,216,177, 99, 65,146, 36, 94,188,120,161,
+111, 23,169,136,136,136,133, 95,127,253,181,231,225,195,135,121,201,201,201,136,143,143,135,165,165, 37,130,131,131,185,147, 39,
+ 79,110,120,227,198,141,229, 40, 13,126,169, 30, 90,209,133, 34, 35,254, 80,111,111,239,247,154, 56, 58, 58, 90, 92,190,124,217,
+190, 76,128, 85,140, 72,124, 31, 5,203,151, 47,223,234,225,225,177, 77, 61, 92,232, 11,192,132,166,105,191,208,208, 80, 2, 0,
+252,253,253,105,130, 32, 52, 15,164,103,167, 78,157,234, 22, 23, 23, 71, 7, 6, 6, 26,124,180, 12,168, 74,139, 76,214, 92,147,
+ 85, 9, 40,125,132,154,182,197, 75,131,197,139, 23,123,174, 95,191,254,225, 7,138, 44,237, 55, 38, 90, 35,182,202, 30,166, 85,
+ 14, 25,150,217,190, 72,190,163,189,141,245,162,177,157, 64, 81,128, 82, 5, 40, 85, 52, 68, 37, 98,196, 62,127, 84, 2, 30, 17,
+170, 83,119,184,156,160, 53, 63,204,105, 16,157, 74, 34, 61, 95,142, 91,103,247,210,217,130,164,193, 72, 60, 53,254,227,136,172,
+161,222,142, 14,246,183,142,237, 93, 77, 62,122, 43,131,138, 42,213, 89, 20, 69,151,253,254, 4,112,180,179,179, 11,184,127,255,
+190, 29,151,203,229,189,122,245,138, 58,117,234, 84,190, 92, 46,191,166, 37,178, 0,160, 83,155, 54,109,148,166,166,166, 16,137,
+ 68,114,185, 92, 46,169, 70,100, 57,251,181,106,126,123,227,158,131, 60,137, 76, 6,161, 88, 10,134,141,125, 69,145, 5, 0, 29,
+187,185,215,169, 67,240,204, 64, 3, 72, 42,148,167, 87, 37,178, 0,128,203,229,246,152, 57,115,102,185,186,120,182,102, 44,165,
+ 49,151,165,186, 27,147, 67, 69,222, 56,133,240, 23, 57, 20,143,205, 80,217,209,111, 27,232,186, 3, 10, 82, 99,246,252,126, 46,
+236,234,119,203,130,138, 75, 68, 69,112,115, 50, 66,113,145, 16,107,215,111, 84, 68, 68,132,223, 92, 56,119,106,135, 83,167, 78,
+109, 64,169, 51, 56, 0,188, 60,117,234,212,152,101,203,150,253,138,191,210, 60, 84, 68,122, 64, 64, 64,106,179,102,205,132, 30,
+ 30, 30,194,220,220, 92,196,196,196, 32, 63, 63, 31,219,183,111, 71,108,108, 44, 52, 22, 65,157,124, 85,222, 23, 72,200,207,207,
+ 51,165,105, 26,249,121,185, 38, 63,252,240,131, 69,109, 56, 85, 42, 85,185,107,171, 78,157, 58,152, 54,109, 26,187,164,164,196,
+242,221,187,119,230,218,243,116,229,148,201,100,208, 88,134,104,154,134, 76, 38,131, 80, 40,132, 76, 38,195,235,215,175,203, 68,
+150,122,253,159,204,162,165,249,205,227,241, 50, 53,231,178,102, 8,142,199,227,101, 85,213,254, 67,160,181, 46, 90,253, 91, 95,
+113, 88,227,246,232,120,220,193,102,179, 49, 97,194, 4, 60,124,248, 16, 9, 9, 9, 96, 48, 24, 16,137, 68, 40, 41, 41, 65,207,
+158, 61,193,225,112,244,181,104,209,108, 54,123,228,146, 37, 75,120,137,137,137,200,201,201,209, 56,211, 67,165, 82, 97,238,220,
+185, 70, 92, 46,119,164,190,166,123,129, 64,208,251,245,235,215,141, 43,126, 50, 50, 50,132,218, 62,133,181, 69,104,104, 40,225,
+239,239, 79,251,251,251,211, 26,193,101,128, 1,149,161, 10, 45,178,175, 42,139,214,199,176,138,105, 44, 91, 80, 7,136,212, 2,
+ 26,145,213, 85, 75,120, 17, 26, 11,151,110, 67,135,110, 67, 91, 58,216, 88,223, 56,188,107,149,105,216,115, 2,169, 41, 73,200,
+ 22, 36,163, 77, 7, 63,196, 62,143, 6,165, 80,157,198,235,208,154, 61, 57,235,249,187,123,120, 52,157,222,181,131, 23,130,194,
+138,241, 42,242, 50, 10,178, 5, 59,145,116,234,244, 71, 57, 66,174,254,205, 29,236,173,111,252,186,107,149,229,165, 24, 18, 41,
+ 41, 73, 56,251,235, 86, 90, 33,151, 22,160,124, 36,151,222,111,205, 70,148,140, 83, 92,144, 9, 89,145, 10, 60,178,132,167,231,
+ 32, 69, 6,128,240,173, 91,183,118,111,223,190, 61, 39, 32, 32, 32, 35, 63, 63,255, 44,128,251, 90,109,154,185,187,187,247, 13,
+ 14, 14,118, 72, 73, 73,193,181,107,215, 50, 80, 26,250, 95, 21, 82,111, 71, 63,223,253,231,175,251,231, 27, 53,104,130,237, 75,
+190, 83,134, 62,138, 25, 0,224,146, 86, 27,143, 30,222,238, 97,107,190,159, 65, 82, 81,127,224,105,114, 38,222, 10,165,127, 86,
+ 69,152,147,147, 67,148,148,148,184, 90, 90, 90,106,159,144,224,155,136,164, 11,134,186,167,247, 92,120,199, 73, 34, 87,129,203,
+ 34,233,217, 3, 93,211, 31,158, 13,181,201,145,228, 16,154,104,196,154, 48,105, 88,143,129,187, 66,206,140, 14, 11,187, 48, 93,
+ 46,149,120, 53,105,210,152,126, 28,113,227,233,194,185, 83,251,212,242,136,155, 62,124,248,144,100, 48, 24,229, 4,186,182,133,
+ 72, 95, 75,145, 62,208,149,179,162,208,210, 64,169, 84, 18,181,229,148, 74,165,101, 66,171,226,195,189, 50,193,248,119,108,191,
+ 62, 22, 42,237, 33, 67,141, 63,157, 68, 34,177, 87,251,108, 57,124, 76,139,214,135, 68, 34, 86, 55,124,169, 79,255, 72,146, 4,
+ 69, 81, 96,179,217,104,209,162, 5,194,194,194, 96,109,109, 13,115,115,115,152,155,155,195,200,200, 8, 54, 54, 54,101, 66,139,
+ 36,117,142,210,161,165, 82,105,221,186,117,235,226,245,235,215,224,241,120,101, 31, 46,151, 11, 79, 79, 79,136, 68,162, 58,248,
+148,182,123, 3, 12,248,123,239, 43, 97,218, 98,137, 32,136,176, 69,139, 22, 45,169, 45,223,162, 69,139,150, 84,102,225,250, 64,
+193, 85,206,186,197,212, 86,144,149, 42, 73,181,200, 58,180,115,165,249,153, 39, 64,106,106, 34,174,158,220, 81,164,144,203,242,
+ 41, 74,225,250, 54, 62, 26, 32,241,139, 78, 93, 32,233,118, 3,251,118, 35,174,190,144,161,176, 32, 27, 47, 31, 95, 78,130,152,
+179,248,163,137, 44, 7,219, 27,135,119,173,180, 60,255,156, 64, 74, 74, 18, 46, 29,219, 94,168,144,203,123, 32, 49,244,241,135,
+ 80,143,100,179, 7,178, 93,222,245,155,232,155, 14, 21,161,194,200,216,184, 47,179, 50, 48, 80,112,167,250,200, 48,109,100,103,
+103,159,221,186,117, 43,241,227,143, 63,118,149, 72, 36,191, 1,208, 54, 81,122,185,185,185, 13,223,183,111,159,117, 74, 74, 10,
+235,206,157, 59,162, 27, 55,110,208, 0,206,215, 96,113, 89,208,115,252, 52, 70,171,122,117,102, 70, 37,165, 13, 0,240,135,214,
+108,207,126,173,155,221, 61,184,126,185,153,226,110, 40,138, 5, 41, 88,124, 55,181, 16,128,206,251, 91,161, 80, 64, 40, 20, 66,
+ 81,156,171,108,195, 23, 9, 3,135,216, 75, 51,243, 37, 76, 22, 85,162,244, 48,207,146,222,200,125,203, 48, 54, 54,214,107, 95,
+238, 90, 63, 63, 4, 64,200,144, 33, 67, 14, 63,139,184,208,134,207,231, 95,240,240,240, 32, 0,160,138, 8,195,170,176, 10,192,
+220,142, 29, 59, 18, 62, 62, 62, 15,182,109,219,118,165, 58,177, 82, 27,139, 86, 77,208,149,147,162, 40,178,138,253, 75,212,150,
+ 83,219,162, 85,147,208,250,148, 22,173,202, 68,139,182, 72,212, 22, 66,255,134,168,195,234,196,148, 62,253,211,248,201,177,217,
+108, 68, 71, 71,195,197,197, 5,114,185, 28,102,102,102, 48, 51, 51,131,169,169, 41,138,138,138,192, 98,177,160,231, 54, 83, 60,
+ 30,239, 93, 76, 76, 76, 99, 59, 59, 59,168, 84,170,114, 98,235,213,171, 87, 48, 49, 49, 73,211,215,162,197,231,243, 47,171,163,
+ 14,203,193,209,209,209,226, 99,236, 87,109, 75,150,191,191,191, 97,136,208,128,106,173, 89, 85, 88,181,178, 43, 88,162,100, 90,
+255,179, 81,154,195,173,159,250, 55, 42,249, 45,171,100, 90,238,250,245,235,111,104,249,119,101,127,224, 38,104, 82, 60,148,139,
+112, 97,214,100,201,178,183,182,186,113, 96,123,160,249,201, 72, 32, 45, 37, 17,183, 78, 7, 11,149, 42,249, 23,160,104, 65,196,
+181,211,161, 32, 80,130,183,161,183,116,187, 69,160, 85,171,166,174,248,253,133, 2,217,169,175, 64,211,212, 33,100,133,148,124,
+240,209,113, 27,212,194,222,218,246,198,161,224, 64,139, 51,209, 4, 82, 83, 18,113,245,100,112,161, 82, 81,210, 29,137,167, 35,
+107, 75, 59, 1,176, 98,152,240,118, 15,246,107, 53,212,213,205, 25, 20,173, 0,197,166, 49,104,129, 45,243,101, 84,201,239,225,
+ 60,225, 73,170,152,154,158,118, 95, 55, 7,186,226,226,226,223, 1, 60, 70,249,244, 10,205, 27, 53,106, 52,116,247,238,221,118,
+169,169,169,188,168,168, 40,241,222,189,123,179, 40,138, 58, 3, 64,151,161,212,239,162,146,210, 14,160,124,190,156,230,243,199,
+ 7, 68, 4,140,155,200, 75,188, 22, 2,171,196, 88,124,127, 55, 93,245, 50, 95, 54, 66,109, 93,171, 20,182,182,182,116, 78, 78,
+ 78,114, 65, 65, 65, 99, 19, 19, 19,228,230,230, 34, 47, 47, 15, 66,161, 16,210,194, 60,165,141,170, 64, 68, 40,243,192, 98,177,
+144,149,162,128, 74,165,202,208,213,154, 5,192,106,213,170, 85,147, 40,138,210,100, 68, 44, 23, 93,168,213, 78,115, 62, 52, 30,
+ 50,100,200, 97,173,168, 67,109,103,120, 77,122, 7, 66,157,222,161,253, 31,127,252, 17,215,167, 79,159,212,202,196, 10,151,203,
+213,219, 81,186,170, 40,198,218,112, 86,101,209,170, 56, 93, 31, 78,205,240,165,198, 9,190,226,116, 13, 24, 12, 6, 40,138,130,
+ 14, 65, 21,127,171,104,209,142, 14,172,141,200,169,112,108,170, 77, 28, 90,203, 72,196,143,106,209,210, 28, 11, 54,155,141,115,
+231,206, 97,220,184,113, 80,169, 84, 48, 54, 54,134,169,169, 41, 76, 76, 76,112,250,244,105,104,210, 63,232,163, 95, 21, 10,197,
+145,245,235,215, 47,217,179,103,143, 17, 77,211,224,112, 56,101, 66, 43, 48, 48, 80, 44,151,203,143,232, 36,180, 52, 25,223, 41,
+ 58,198,196, 68, 89,109,212, 97,101,203, 84,225,175,101,185,106,213,170, 49, 20, 69, 13, 68,133, 20, 14, 21,218,149, 75,253, 96,
+ 72,239, 96,128, 14,247,147, 71,255,226,238,105, 4, 22,161,101,201, 42, 19, 92,100,117,226,197,206,202,242,198,254,237,129,230,
+ 71, 31, 17, 72,124,251, 22, 55,127,219, 81, 42,178,222,156,124,130,228,208, 76, 36,134,118,198,219,208,222, 58,191, 61, 17, 68,
+ 43, 39,123, 75,228,137, 40, 20,230,188, 3,104, 68,125, 12,145,101,103,101,119,227,231,224, 64,139, 83, 79, 72, 36, 38, 38,226,
+234,201, 29, 66,165, 82,242,197,135,136,172,145,108,246,192, 70,238,206, 9, 75, 39, 13, 28,234,211,208, 17, 54,239,226,112,126,
+236, 80,172, 62,254, 13,204,236, 24,104,215,215, 12, 19,214, 58, 14,229,123,114, 95,243, 59, 99,160, 30,212,218, 34,171, 85,253,
+250,245,135,222,191,127,223,214,219,219,155, 23, 31, 31, 47,217,187,119,111,150, 88, 44,190, 2, 32, 90, 15, 78,109,145,213,106,
+209,228,177, 17, 27,247, 31,230,145,108, 14,130,142,156,199,172,219,169,170, 11,201,133, 67, 80,126, 88,177, 82, 72,165,210,107,
+193,193,193, 82,146, 36,145,151,151,135,156,156, 28,100,101,101,149,125, 23, 20, 20,128,193, 96,224,250,245,235,178,194,194,194,
+251,186,118,240,222,189,123,245,211,210,210, 60, 4, 2, 65, 27,245, 39, 30,165,209,133,166, 90,211,218, 8, 4,130,174, 0, 30,
+105,166,167,166,166,214,123,240,224, 1,191, 38,126, 51, 51, 51,176,217,236,114, 22, 45, 46,151, 11, 7, 7, 7, 40,149, 74,156,
+ 56,113, 2, 0,242,170,227, 96,179, 57, 2,146, 36, 64,209,148,148,199,227, 81,124, 62,191, 82,129,165, 15,167, 26,169, 95,126,
+249,165, 36, 50, 50,178, 82,139, 86,109, 56,105,154, 46,233,213,171, 23,210,211,211,193,227,241,202, 30,214, 26, 65, 69,146, 36,
+184, 92, 46, 50, 50, 50, 48,101,202, 20,208, 52, 93,242, 79,223,121,180,125,154,212, 98,136, 0, 64,168,133,208,123,126, 90,186,
+250, 64,105,134, 6,105,154,134, 70,112, 85,152, 95,182, 46, 93,178,183, 87,240,233,154, 92, 80, 80,176,177,180, 59,244,222, 10,
+223,251,244,120, 40,148, 9,173,216,216, 88, 28, 62,124, 24, 5, 5, 5,224,112, 56,200,207,207,199,193,131, 7, 17, 19, 19, 3,
+ 14,135, 3,205,190,208, 85,191,249,248,248,108, 12, 15, 15,143, 25, 49, 98,132, 56, 58, 58, 26, 98,177, 24,209,209,209,232,221,
+187,183,228,238,221,187, 9, 98,177,120, 21,116, 25, 58,212,100,124, 87,151,215,145, 74,165,136,138,138,170,244, 83,213, 50, 21,
+145,144,144,224,170, 82,169, 26,211, 52,237, 75,211,180, 57,212, 41, 28,212,255,181, 63, 95,170,231,153,211, 52,237,171, 82,169,
+ 26, 37, 36, 36,184, 26,228,132, 1,159, 41,110,105,137, 45, 90, 75,100,221,170,222,162, 69,145,193, 7,118,172, 52, 63,242,144,
+ 68, 74,114, 2, 30, 95,220, 45, 84, 81,138, 47,244, 44,135,211, 3, 90,185, 54,120, 70, 38, 94, 20, 81, 26,206, 92,152,147, 2,
+208,140,218, 8,173,114,156,160,200,224,131, 59, 2, 45,142, 61, 38,144,158,242, 6,119,207,238, 18, 42,149,210,238,120, 27, 26,
+ 85, 27,206,145,108,246, 50, 22,131, 88,218,171, 83, 75,118,231,150,238, 48,201, 74, 66, 70,106, 58, 78,196,102,231, 37,228, 75,
+ 39,222, 37,228, 72,126, 35, 61,208,119,146,181,181,149, 35, 11,253,166,218, 88,223, 63, 95,248, 59,193, 18,201,105, 57,189, 94,
+112,183,172, 44, 69,249,126,190, 15, 71, 51, 51,179, 17,143, 31, 63, 54,231,241,120, 70,143, 31, 63,166,246,238,221,155, 43, 22,
+139, 47, 2,136,208,105,219,223,135,115, 91,119,183, 91,235,118,237,231, 21,139, 74, 32,146,201,193,117,224,171,206, 68, 60, 31,
+140,170, 19, 96,150,227,228,114,185,199,142, 29, 59,214,183, 75,151, 46,174, 94, 94, 94,100, 94, 94, 30,138,139,139,203,156,171,
+237,236,236, 16, 27, 27, 75, 37, 38, 38,166,115,185,220,227,186,246,179, 99,199,142,137, 36, 73,198,171,135,209,226, 81, 33,186,
+ 80,171,105, 99,129, 64,208,150,207,231,223, 2, 96,172, 21,117,168,205,169, 73,239,176, 4, 0, 73, 16,196,163,232,232,232,226,
+ 62,125,250,192,200,200, 8, 34,145, 8,117,235,214,133, 82,169,196,197,139, 23, 17, 25, 25, 41,162, 40,234, 86, 37,226,181, 92,
+ 63, 37, 18,113, 93, 0,164,184,164,164,197,152, 49, 99,186,206,155, 55,175, 92, 72,186,189,189, 61,172,173,173,245,226, 4,128,
+188,188,188,166,127,252,241,199,156,232,232,232,239,250,246,237,107,177,100,201, 18,110,253,250,245,161, 82,169,200,218,114,230,
+231,231, 91, 68, 69, 69,109,234,220,185,243,140, 62,125,250, 48,215,173, 91, 7, 11, 11, 11,168, 84, 42, 24, 25, 25,161,176,176,
+ 16,171, 86,173,194,157, 59,119,148, 52, 77,239, 18, 10,133,223,235,121, 46,225, 67,175,205,170, 44, 64, 85,165,100,168,162,253,
+223,222,207, 10, 62, 93, 80,167,112, 88, 88, 69, 6,123,232,122,206,107,132, 22,131,193, 64, 82, 82, 18,246,238,221,251, 94, 30,
+ 45, 77,250,135, 42,184, 43,219,118,250,230,205,155, 42,130, 32, 58, 60,126,252,120,225,232,209,163, 39,138, 68, 34,103, 19, 19,
+147,116,133, 66,241,139, 88, 44, 94,139, 82,127, 84,182, 62,247, 16,145, 72,148, 92, 89,212, 97,197, 54,128,101,181,156, 21,210,
+ 59,148, 75,225, 80, 97,153,114,169, 31, 42, 73,239,240,183, 31,119, 3,231,191,146,243,115, 23, 91, 85, 39, 44,125, 15,173, 38,
+179, 88, 98,133,119,120, 2,241, 33, 34,235,125,107,137,164, 36, 97,249,177,119, 45,101, 82, 9, 68,194,204,151, 72, 58,145,245,
+ 65,155,165,238,231,237, 4, 2, 73,137,111,240, 48,108, 87,105, 63,223,134,214,186,159, 4,176,248,167, 75,161,108,194,194, 26,
+ 79,231,140, 67,122,129, 8,151,222,230,159,164, 75,164,211,143, 0,249,184, 3,144, 74,105,248,193, 31, 50,118,251, 14,178, 24,
+106, 91,135,133, 45,243,127, 1,111,145, 13,187, 93,247, 46,250,212, 64,204,224,241,120,225,219,183,111,239,225,235,235,203, 29,
+ 50,100, 72,101, 14,242,250, 34,245,209,171, 55, 63, 93,216,179,121,190,141,119,123,236, 92,182, 64,117, 44,226,121,197, 40,196,
+106,225,225,225,161,186,119,239,222,188, 41, 83,166,108,233,209,163,135,211,128, 1, 3, 56,117,235,214, 5,151,203,197,155, 55,
+111, 16, 30, 30, 46,123,251,246,109,122, 73, 73,201,188,230,205,155,235,147,227, 44,127,249,242,229, 27,213,235, 32,212,195,133,
+109,160,142, 46,212, 52, 82, 39, 45,109, 3,192, 56, 48, 48,112, 52, 0, 84, 17,246,189, 28,192, 30, 0, 76,154,166, 51, 66, 66,
+ 66, 58,156, 61,123,182,195,220,185,115,217,125,251,246,197,253,251,247,113,245,234, 85,185, 92, 46,143, 80, 11, 87, 93, 75,229,
+ 80, 0,162,148, 74,229,243,160,160,160, 14, 12, 6, 99,185,102, 70, 76, 76, 12, 14, 29, 58, 84, 27, 78, 37,128, 77,153,153,153,
+ 63,133,132,132, 44,191,118,237,218,248, 49, 99,198,152, 43, 20, 10,196,198,198,226,231,159,127,174, 21,167, 80, 40,156, 99,107,
+107,187,244,226,197,139,191, 92,185,114,229,235, 81,163, 70,145,179,102,205, 66,112,112, 48,126,251,237, 55, 74,165, 82,157,101,
+177, 88, 99,114,114,114, 68,159,226,174,163, 30,134, 75,215,179,214, 97,141,188, 31, 50, 52,168, 35, 4, 31, 74,160,217, 14, 63,
+ 63,191, 50, 43,163,198, 10,167,221,134, 32, 8,189,135, 14, 1, 88,210, 52, 77, 1,216,133,210,250,162,218, 89,225, 25,248, 43,
+115,188,174,140,205, 4, 82,203, 24, 72, 17, 91,125, 81,105, 75,128, 70,179, 26,216, 10,150, 47, 95,190,117,197,138, 21, 91, 43,
+166,112,208,110, 84, 49,245,195,202,149, 43, 97, 72,239, 96,192,127, 21,149, 11,173,168,125, 10, 69,131,193, 75,182,175, 91,176,
+ 66,169,144, 9,105,200,253,241,230,116,244,135,174,140,166,232, 69,215,143, 6, 6,131, 70, 62,173, 82, 46,252,224,222,255, 77,
+253, 36, 44,172, 81,180,106, 26,126,123,145, 78,103,136, 20,223, 28,145,203,203, 89,131, 74,125,178,168, 97, 55, 36,249, 39,172,
+156, 88,103,230,124, 97, 67, 92,200, 27,173,247,122,178,178,178,206,109,221,186,149,220,188,121,115,215,146,146,146,138, 14,242,
+181,197,130,254, 51, 23, 49,218, 53,114,157,249,240,117,242, 64,232, 48, 92, 88, 17, 29, 59,118, 20,196,197,197, 5, 92,185,114,
+101,196,237,219,183,123,136, 68, 34, 87,130, 32, 96,108,108,156, 44,149, 74,175,113,185,220, 99,122,138, 44, 0,192,138, 21, 43,
+232,149, 43, 87, 18,113,113,113, 52,131,193,248, 19, 64, 34,131,193, 72,210,118,130,215,158,174, 89, 38, 48, 48, 80,151, 7,226,
+237,226,226,226,200, 85,171, 86,117, 89,181,106, 85, 11,181, 85,232, 54,254,242,249,210, 23, 10, 0,183,217,108, 78, 58, 65, 16,
+206,108, 14, 87,116,239,222,189,107, 31,200, 89, 34,151,203, 23,166,164,164,108,217,178,101,203, 90, 19, 19,147,182, 49, 49, 49,
+127,126, 8,167, 90, 68, 13,182,182,182,118, 58,124,248,240,169,131, 7, 15,182,103, 50,153,247, 9,130, 24, 34, 20, 10, 63,105,
+ 81,105,117,129,232,149,122,212, 58,212,137,247, 99, 39, 41,253, 59,132,155, 74,165, 42, 94,186,116,105, 86, 69,225, 85,209,122,
+165,249,175, 78,229,162,203, 62,213, 39,138,178, 6,225, 66, 20, 3, 64,105,237,194,210,178, 58,186, 22,149, 6, 32,174,233, 58,
+ 39, 73,242, 44,128,151, 36, 73,190,174, 24,232,162, 61,111,229,202,149, 53, 93,231, 6, 24,240, 89, 67,135, 59, 91, 32, 9, 4,
+214,214,147,246, 31, 52, 87,126,156,126, 6,176,217, 43, 73, 96, 62, 0,130, 6,182, 28,145,203,127,168,110, 65,199,142, 88, 75,
+ 19,152,171,222,153,235, 50,238, 98, 77, 45,182,189, 14,116,168, 63,168, 39,103, 19, 84, 95, 80,246, 61, 78,127,127,127, 70, 21,
+ 15,243,114, 69,165,171, 66,104,104, 89, 22,255,170,250,169,125,190,153, 61,120,240,192,201,199,199, 71,128,242, 78,255,149, 77,
+167,245,220,118, 6, 0,213, 71,222,159,159, 5,167,155,155, 27,231,205,155, 55,178,127,215,181,105,224,252, 87,114, 90, 54,117,
+ 1,129, 73,208,206, 29, 84,173, 69, 75, 75,160,209,244,207, 40,136, 77,169,162,159,154,235,220, 50, 33, 33,193,181, 97,195,134,
+201, 0, 10, 42,244,163,178,121,180,225, 24,253,223,115, 86,134,201, 40, 95,138,206,128, 74, 14,132,129,211,192,105,224, 52,112,
+ 26, 56, 13,156, 6, 78, 3,103,109,133,214,103, 13, 18, 6, 24, 96,128, 1, 6, 24, 96,128, 1, 6,252, 45, 32,170, 81,165,250,
+152, 4,107,163,108,175, 25, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,252,191,227,172,137, 91,123,249,207,117,232,240, 31,
+235,183,193,172,106,224, 52,112, 26, 56, 13,156, 6, 78, 3,167,129,243, 67, 4,203,103, 13, 38, 12, 48,192, 0, 3, 12, 48,192,
+128,207, 6, 61,220,193,103,170, 64,254,241, 70,167, 32,170, 26,209,199, 13,117, 0,224, 99,241,253,159,130, 15,224, 43,173,255,
+ 23,160,142,140, 55, 8,173,207, 23,141, 0, 44, 1,160, 93,139,236, 33,128,245, 21,218, 29, 5,160, 93,144, 80,132,210, 58,129,
+175,245, 89, 25, 73,146,235,187,116,233, 50,253,206,157, 59,155,149, 74,229,170, 90,244,215,149,207,231,111, 36, 8,162, 53, 0,
+ 22, 65, 16,111, 50, 51, 51,215, 43,149,202, 15,137, 90,105,224,232,232,184, 1, 64, 75,146, 36, 89, 4, 65, 36,100,102,102,174,
+ 81, 42,149, 55, 63,128,211,204,193,193,161, 19, 77,211,142, 0, 24, 44, 22, 43, 55, 45, 45,237, 1,106,153, 91,201, 63, 48,150,
+ 93, 40, 82,178, 0,192,220,132,169, 8, 13,108, 42,215,117,154,225, 20, 55,192,128,255,111,208,165,145,201,229,208,219, 13,107,
+105, 37,190, 87, 1, 68,175,250,216,113, 57, 17,223, 87,181, 60, 81, 73, 84,115, 69,206,222,110, 88,171,162, 75, 57,122,185, 97,
+211,229, 55,168, 54,210, 94, 23, 78, 13,246, 1,228,100, 29,170, 20, 16,186, 69, 95,255,219,241, 21,202, 15, 21,150, 13, 29, 86,
+ 43,180,134,185,131,175, 98,130, 25, 26, 11, 77, 24,175, 25,128, 22,234,135,252,107,148,230, 42, 42,250,192,206,125, 46,156,255,
+ 54, 44,167,105, 58,160,220,201, 90, 73, 30,162, 47,190,248, 98,192,149, 43, 87,140, 53,245,238, 40,138,130,145,145,145, 18,192,
+ 88, 61,214,101, 63,108,216,176, 69, 7, 14, 28,192,208,161, 67,151,134,133,133,109, 5, 80,172,235,194, 86, 86, 86,254,150,150,
+150,193,251,247,239,183,107,223,190, 3,193,225,112,240,230, 77,130,243,148, 41, 83,188,226,226,226,206,102,101,101, 77,212,119,
+227,173,173,173, 71, 90, 90, 90,110,217,187,119,175,109,231,206,157, 65, 16, 4, 34, 35, 35,157,231,204,153,211,226,221,187,119,
+199, 51, 51, 51,103,232,203,105, 99, 99,227,110, 97, 97,209,109,231,206,157, 70,157, 58,117, 2,143,199, 67,116,116,180,233,212,
+169, 83, 29,211,210,210, 98, 51, 51, 51,111,233, 43,178,158, 69,158,255, 90, 41,151, 6, 1, 0,147,205, 93,208,126, 75,196,249,
+103, 55,206,247,175,105,154,127, 96,236,239, 6,177,101,128, 1, 6,104, 99,164, 19, 28,105, 26,243,175,252,188,140, 4,128, 94,
+227, 87,207, 26,233,132,205, 71,210,171,174, 97,171, 39,223,247, 99,234, 32,248,112, 26, 50, 63,164,159,251, 0,114, 14,147, 57,
+171,157,143,143,237,183,119,239, 38,200,129, 95,254, 79, 14, 81,165,195,156, 85, 10,173,193, 77,177, 74, 89,106, 49, 33,250, 52,
+196,241,171,137,140,240, 47,190,248,162,225,132, 9, 19,136, 86,173, 90, 33, 50, 50,210,253,248,241,227, 95, 93,184,112, 33, 65,
+165, 82, 69, 2,120, 1,221,179, 90,179, 0,120, 50, 24,140,214,255,114,206,127, 51, 76,212,226, 42, 19,127, 37, 58,125, 47,225,
+233,245,235,215,207, 49,153, 76,141, 69,171,157, 72, 36,114,168, 96, 5,211, 5,245, 20, 10, 5,226,227,227, 65,146, 36, 11, 64,
+125,188, 95, 82,163, 42, 56, 27, 27, 27,239,142,120, 24,105, 67, 48,141,144, 47, 1, 32,145,131, 99,234,128, 3,135, 66,172,231,
+205,158, 49,248,230,205,155,225, 69, 69, 69,191,234,209,159,250, 38, 38, 38, 91,159, 62,125,106, 99,108,108, 12,138,162, 80, 84,
+ 84, 4, 71, 71, 71,236,223,191,223,114,222,188,121, 1,133,133,133, 55, 37, 18,201,111,250,136,115, 11, 11,139,110,207,159, 63,
+ 55,210, 20,148,150,201,100,112,118,118,198,209,163, 71,185,179,102,205,106, 90, 80, 80,144, 42,147,201,222,234, 74, 88, 40, 82,
+178,148,114,105,208,225, 93,129, 46, 0, 48,102, 70, 96, 16,167,200,252,162, 46,211, 10, 69,202, 11, 0, 12, 66,203,128,127, 26,
+173,109,109,109, 67,115,114,114,110, 1,152,136,143, 99,105,112,231,241,120,205, 41,138,114, 36, 73, 18, 12, 6, 35, 67, 36, 18,
+ 61, 5,240,170,182,132, 54,110,126,253,193, 53, 30, 7,154,106, 65, 2, 32, 72, 50, 90, 37, 47, 57,148,251,234,230,249, 15,226,
+228, 24,141, 7,232, 22, 36, 64, 17, 36,249,148, 82,150,236,207,137,191,121,233,223,114,112,238, 11,209,216,205, 81,247,194,152,
+ 31,131,111,120, 3,240, 73, 10,228,209, 36,221,135, 21,103, 2,125,103,207,158,237, 56, 99,250,116, 98,220,216,177,141,110,221,
+185, 67,116,213,167, 90,193,231,137, 42, 29,223, 43, 21, 90,254, 77, 97, 69, 3, 11,143, 7, 47, 33,153, 12, 6, 49, 98,246,250,
+128,131,187, 54,145, 61,251, 15, 41, 27, 62,241,245,245,133,175,175, 47, 17, 20, 20,212,232,207, 63,255,108,116,244,232, 81,101,
+ 68, 68,196, 83, 0, 39,170, 90, 89,111, 55,136, 41,128,199,102, 49, 69, 35,150,253,186,215,199,199, 7, 92, 46, 23, 31,194, 9,
+ 0, 61, 27,146,111, 89,214, 13,158,142,152,185, 60,185,125,251,142,244,199,224,252,140,240, 16, 40, 43,106,109,229,226,226,210,
+ 73,169, 84,242, 0,128,201,100, 74, 82, 82, 82,102,162,180, 54, 32, 0,156,165, 40,106,128, 30,220, 36,128, 21, 3, 6, 12, 88,
+250,237,183,223,162,110,221,186,152, 53,107, 22, 20, 10, 69,228,165, 75,151,150, 3,216,128, 26, 46, 30,123,123,251,229,187,119,
+239,182,102,114, 76,208,106, 97, 34, 4, 5, 74, 0,128, 41, 23, 56, 55,141,198,172, 89,179,204, 31, 63,126,188, 70, 31,161,101,
+111,111,191,106,255,254,253,214,198,198,198,160,105,186,172, 22, 99,113,113, 49,138,139,139, 49, 99,198, 12,243,216,216,216,141,
+250, 8, 45, 7, 7,135, 78, 59,119,238, 52,226,241,120, 40, 46, 46,102,203,229,114,162,168,168, 8, 37, 37, 37,180, 76, 38,147,
+207,156, 57,147,251,226,197, 11, 63,129, 64,240, 22, 6,252, 91,192, 0,240, 13,139,197, 26,212,176, 97,195, 54,175, 95,191,126,
+162, 84, 42, 79, 3, 56,253, 17, 94,166,186, 59, 57, 57,173, 77, 79, 79,223, 9, 32,228,255,101,135, 58, 56, 56,156,190,119,239,
+158,203,238,221,187,199,110,222,188,249, 34,128,223, 62,128,142,205,102,179, 7,119,237,218,213,101,204,152, 49, 28, 7, 7, 7,
+ 72,165, 82, 36, 38, 38,154,159, 60,121,210, 53, 58, 58, 58, 85, 93, 17, 67,231, 23, 10, 27,247,142,166, 96,154, 31,239,208,177,
+ 83,231,161,131,191, 49,115,176,177,128, 88,166,194,235,100, 65,221, 63, 46,158,235, 26,199, 54,186, 39,151, 11,135,231,190,186,
+ 87,172, 47,103,183,110,221, 59,247,232,222,221,204,194,210, 2, 66,145, 28,111,146,210, 92,111, 92, 61,239,203,100, 26,221,166,
+ 8,197,168,172,231, 87, 75, 62,229,177,153, 5, 48, 69, 60,155,230, 45, 58,182,122,220,107,194,154, 54, 52, 77,131,164,177,163,
+162, 53,107, 22,192,220, 81, 90,246, 75, 47, 62,208, 52, 77, 16,216,164,109,205,234,237,134,181, 52,141,239, 65,130,232, 93,195,
+ 48,165, 6,189, 0,174,165,181,181,207,212,201,147,137,162,194, 66, 68, 71, 71,151, 84, 20, 89, 91,235,128,125,155, 68,189,179,
+ 41,181, 23,219,255, 82,107, 86,165, 67,135, 58,231,209, 50, 54, 54,174,116,186,133,133, 5,186,117,235,134,245,235,215, 51, 1,
+180,174, 48,187,124,145, 85,128, 27,182,103, 49, 44, 76,184,100,221,186,117,205,204,205,205, 63,152, 19, 0, 64, 83,245, 59,214,
+165,191,124,244,235,146,177,215,142,110,241, 20, 21, 21,176, 42, 54, 49, 53, 53, 69,227,198,141,177,116,233, 82,221, 56, 63, 28,
+255, 40,167,163,163, 99, 19, 95, 95,223,214,215,111,221,178, 76, 79, 79,231,166,167,167,115,175, 92,191,110,217,161, 67,135,214,
+142,142,142, 77,202,118, 21, 77,235,211,207,213,187,118,237, 90,126,246,236, 89,210,215,215, 23, 86, 86, 86,232,214,173, 27, 46,
+ 94,188,200,220,188,121,243, 58, 0, 75,107,234, 39, 73,146,157,125,125,125, 9,208, 52, 50,132, 74, 60, 88,223, 4,209,155, 60,
+ 80, 36,161,145, 39, 44,132, 88, 44,129,177,177, 49, 15,165,195,189,186,110,123,199, 14, 29, 58, 16, 0,202,196, 85, 81, 81,233,
+167,184, 88, 4,153, 76, 14, 46,151,107, 6,128,167, 43, 39, 77,211,142,157, 58,117, 2, 0,200,229,242,178, 55,188,130,130, 2,
+ 66, 40, 20, 66, 38,147,129,197, 98,177, 81,179, 95, 99, 25,167,185, 9, 83,193,100,115, 23,140,153, 17,152, 50,102, 70, 96, 10,
+147,205, 93, 32, 51, 43, 84,233, 50,205,220,132,169,248,196,231,167, 29, 73,146, 63,187,185,185,197,146, 36,121, 24,128,227, 7,
+114,182, 5,176,206,200,200,232,154,135,135, 71,138,177,177,241,117,181, 80,239, 80, 75, 78,142,177,177,241,245,117,235,214,157,
+122,242,228,201,208, 63,255,252,179,254,179,103,207, 6, 7, 5, 5, 29, 55, 53, 53, 13, 71,121,191, 68,189,175,205,250,245,235,
+ 31,124,240,224, 65,219,142, 29, 59, 30, 0,192,253, 72,215, 59, 3, 64, 75,232, 84,145,227,147, 28,119,167, 86,173, 90,185,240,
+120, 60,244,232,209, 3, 0,252, 62,132,147,205,102, 15, 94,186,116,169,219,178,101,203, 56, 2,129, 0,215,175, 95,199,195,135,
+ 15,161, 84, 42, 49,109,218, 52,238,152, 49, 99, 26,152,153,153, 13,214,171,159, 76,243,227,179,231,204,237, 51,127,214, 36,179,
+167,239,228, 56,116,237, 29,126,143, 16, 32,171,132,131,254,131,199, 88,244, 30, 56,172, 55,135,107,113, 92, 95,206, 69, 11, 23,
+246,153, 60, 62,192, 44, 70, 64,225,220,253, 12,220,143, 23, 66,201,178, 68,223,193, 19,173, 90,116,234,243, 21, 19,172, 95, 62,
+245, 49,218, 15,180,159, 61,123,182,221,130, 77, 71,238, 58,181,253,102, 71,118, 62,124,181,133,143, 59, 96,105,109, 98,242, 77,
+124,215,174,147,140, 74,235,197, 86,203, 89,142,175,245,192,224,172,124,116,209,246,207,234, 98,141, 70,234, 97, 69,198,149,159,
+151,145, 52,129, 89, 35,157,202,221, 7, 42,237,231, 77, 96,232,236,185,115, 89, 22, 86, 86,216,181,107, 23,164, 34, 81, 57,159,
+217,238, 46,232,115,205,152,153,218,192,195, 57,182,155, 43, 17,254, 31,124, 95,153, 92,165, 69, 43, 44, 44,140,238,215,175, 31,
+ 1, 0,161,177,200, 31,220, 20, 27,135,125,187,110, 41, 65, 18,116, 61,207,142, 49,117,220,154,137,108,108,108, 80, 82, 82, 2,
+169, 84, 10, 54,155, 13,137, 68,130,119,239,222,225,254,253,251,176,178,178,210,171, 39,133,133,133, 48, 53, 53,133,169,169,233,
+ 71,225, 92, 60,182, 7,247, 77, 74, 54,247,242,253,155, 93,183, 79,255,173,189, 91, 75,191,103,221,135,205,122,110,110,231, 36,
+121,246,236, 25,238,221,187,135,252,252,124,248,248,248,252, 87, 14,230, 67,181, 79,214, 67, 0, 86, 13, 27, 54,116,190,124,237,
+182, 85,177,132, 50, 79,202, 84,176, 40,138,130,177, 49, 95,121, 34,244,156,112,232,224,254, 68, 70, 70, 70, 22,128,135,106,113,
+ 91, 83, 77, 69, 30,128, 38,254,254,254,139,166, 79,159,142,132,132, 4, 76,154, 52, 73,252,240,225,195,220,142, 29, 59,218,236,
+223,191,223,104,222,188,121,184,117,235,214,138,176,176,176, 51, 0, 18, 1, 84, 90,171,141,166,105, 54,155,205,134, 82, 45, 27,
+228, 42,170, 76,223, 23, 22, 22,130, 22,231,131,205,102, 51, 0,216, 65, 71, 63, 58,138,162,216, 44, 22,171, 76,100,189,203, 44,
+196,187,172, 18, 20, 22,203, 32, 22, 43, 33, 19,211, 96, 24,219, 48,129, 36, 7, 0, 73, 80,170, 87, 0, 0, 0, 32, 0, 73, 68,
+ 65, 84,186, 90, 71,120, 60, 30,148, 74, 37,138,138, 74,187,161,177,148,201,100, 50, 8,133, 66, 48, 24, 12, 83, 0,230, 0,242,
+116, 33, 84, 59,185,255,174, 30, 6,196,163, 35, 3,108, 95, 95, 88, 92,110,154,185, 9, 83, 17, 58,175, 41,195,198,185,197,157,
+150, 67,127,241, 40,155,246,105,253,179,184,118,118,118, 55, 78,157, 58,213,180, 81,163, 70, 72, 76, 76,244, 24, 50,100,136,143,
+ 64, 32,104, 9,253,107, 50, 26,147, 36,185,113,204,152, 49,211, 71,140, 24, 65,184,187,187,131,201,100, 66,169, 84, 58, 39, 36,
+ 36,116, 59,121,242,228,194,131, 7, 15,238, 87,169, 84,223, 65,119,191, 63,146,195,225,156,216,187,119,111, 23, 31, 31, 31, 28,
+ 62,124, 24, 15, 31, 62,164,218,182,109, 75,142, 30, 61, 26,174,174,174, 62,163, 71,143,254, 93, 42,149,246,173,165,101,203,181,
+ 67,135, 14, 46, 12, 6, 3, 29, 59,118,100,223,187,119,175, 21,128,123, 31,184, 79, 77,157,157,157,111,249,249,249,181,188,118,
+237, 90, 84, 70, 70,134,159, 30,219, 11, 0, 3,157,156,156,130, 44, 44, 44,172,244,184,199,150,164,165,165,125, 15, 32, 84,199,
+ 69,218,183,110,221, 26,201,201,201,104,210,164, 9,216,108,118, 7,185, 92, 62, 5, 64, 31, 0, 63, 0,136,213,163,191,238,221,
+187,119,119,241,243,243, 35, 66, 67, 67,203,252, 67, 73,146,132, 82,169, 4,155,205, 70,251,246,237,201,200,200,200, 58,143, 30,
+ 61,114,135, 14,195,136, 54,110,126,253, 59,118,238,218,185,139, 79,115,114,115,232,107,168, 40, 21, 24,132, 18, 76,130, 2,165,
+224,130,203,102,192,221,179, 13, 35,254,197, 83, 31,153, 84,222, 63,247,213,181,243,186,112,246,233,213,211,183,105, 19,119,114,
+251,239,111, 80,144, 22,171, 74,139,187,157, 67, 50, 72, 52,109,253,133,173,123,179,150,140,150, 62,126,172,244,196, 23,221, 36,
+146, 46, 61,242, 19,110, 95,251, 20, 23,228, 74,128,225, 92,199,246,155,126, 61,253,216,130,244,116,209,201,208,243,207, 75, 20,
+184, 15, 0,183, 0,162, 47,208,220,187, 93,187,174,251, 55,108,176,225,243,249,172, 81, 35, 70, 40,247, 69, 69, 69,161,138,161,
+223,149, 0,195,214,209,177,199,212,169, 83, 25,130,244,116,250,228,233, 11,207, 52,124, 40,125, 75,241,110,238,236,209, 15,162,
+120,189,134, 41,251, 3, 28, 7, 71,199,166, 83,166, 76, 65, 70,122, 58, 14,135,132, 20, 75,128, 8,141, 21,235, 28, 3, 59,155,
+185, 57,142, 91, 48,113, 0,225,194,183,197,212, 21,251, 58,116,147,103,185, 65,240,215,241,215,214, 34,159,177,200,154, 92,169,
+208,170,136,223, 98,177,220,140,141,250, 39, 79, 30, 35,179,139,228,162,132,132, 4,216,218,218,130,207,231,195,194,194, 2, 49,
+ 49, 49,184,126,253, 58, 94,190,124, 9,138,162,208,162, 69, 11,189,122,147,147,147,131,167, 79,159,194,202,202,234,163,113,186,
+185,216,225, 91, 23, 59,118,102,110, 33,251,218,195,151, 62,251, 22, 15,110, 70,122, 12, 62,168, 93, 36, 86, 38,147,225, 63,130,
+178,232, 66, 23, 23,151, 78,135, 14, 29, 98, 75,149, 48,115,159, 18,241,163, 72,162, 50, 1, 0, 19, 30, 67, 20, 25,212,248,187,
+213,171, 87,139,198,143, 31,239,145,146,146,178, 94, 7, 91,255,218,238,221,187,207,167,105,154, 53,123,246,108, 0,192,152, 49,
+ 99, 10,239,223,191,239, 14, 32,235,250,245,235, 78, 19, 38, 76,120,117,227,198, 13,227,185,115,231, 50,148, 74,101, 12,147,201,
+164,195,194,194, 86, 1, 8,124,239,137, 72,146,143,163,162,162,234, 57,185, 54,134,171, 13, 9,223,165, 47, 75,111,112,198, 20,
+ 82,147,222, 32,238,217, 67, 56, 58, 58, 90,240,249,252,216,212,212, 84,121, 90, 90,218, 66,145, 72,180,187,134, 62, 70, 71, 70,
+ 70,242, 93, 93, 93, 81, 92, 92,140,212,236, 18,204, 58,109,140, 66,113,169, 17,131, 5, 49, 90,186, 52, 54, 51, 34,101, 15,179,
+178,178,228, 50,153,108,153, 80, 40, 60, 84, 29, 39,139,197,202,125,246,236,153,105,221,186,117, 33,145, 72,232,188,188, 60, 66,
+ 36, 18,161,168,168,136,184,112,225,194,215, 2,129,160,109,253,250,245, 9,103,103,231, 85, 2,129, 64,156,150,150, 54, 73,151,
+161, 73,181, 96, 82, 49,153,204,205,147, 39, 79, 30,122,230,204,153,199,161,129, 77, 7,106, 13,151, 88,120,122,122, 94,110,222,
+188,153, 83,200, 38,239, 29, 0,126,252, 23,156, 91,227,150, 44, 89,210,212,218,218, 26, 83,167, 78,197,202,149, 43,177,124,249,
+242, 70, 83,167, 78,157, 12, 96,171, 30, 60, 70,142,142,142,143,182,111,223,238,209,169, 83, 39, 92,188,120, 17,199,142, 29,195,
+219,183,111,149,245,235,215,103,250,248,248, 96,197,138, 21,232,221,187,247,164,153, 51,103,118, 77, 79, 79,111,165,163,248, 24,
+191, 98,197,138,129,157, 59,119,198,216,177, 99,165, 55,111,222, 28, 10,224,202,213,171, 87,191,184,117,235, 86,232,145, 35, 71,
+140,214,173, 91,215, 99,222,188,121, 83, 1, 4,215, 98,251,191,238,210,165,180,134,114,231,206,157, 17, 20, 20,212,251, 3,133,
+ 22,199,198,198,230,194,225,195,135, 91, 54,110,220, 24,163, 70,141,106, 53,116,232,208, 11,249,249,249, 61, 1,232,116, 67,170,
+ 83,167,206,198,179,103,207, 54,172,106,100,161, 50, 72,165, 82,235,111,190,249,102, 67, 82, 82,146, 94, 66,235,232,209,163,248,
+254,251,239,209,162, 69,139,230,237,219,183,223, 51,101,202, 20,248,251,251,119,143,137,137,113, 64,105,212,114,141,224,241,120,
+205,135, 15, 31,206,121,240,224, 1, 0,192,211,211, 19, 45, 91,182, 68,114,114, 50, 30, 63,126, 12,169, 84, 10, 7, 7, 7, 12,
+ 26, 52,136,151,148,148,212, 60, 39, 39,167, 70,161, 69,114,141,199, 13,236,215,215,236,220,125, 1, 84,148, 18,109, 26,154,195,
+199,195, 30,241,169,133,136,140, 77,133, 74,198,134,185,181, 13, 58,116,237,101,157,145,246,118, 92, 46, 80,179,191, 22,215,120,
+220,160,129, 95,153,158,139, 72, 71, 65,122, 28,253,250,225,153,235, 10,137,104, 18, 0, 60,254,243,248, 30, 71, 27,163,158,238,
+173,219, 48,252,122, 14,176, 58,125, 44, 99, 92,254, 63, 83,219,239, 61,220,114,193, 94, 87, 86,206,152, 5, 1,190, 52,203,202,
+249,161,153, 66,177, 83, 51,175, 55,208,107,225,146, 37,237, 39, 78,158,204,163, 40, 10, 71,126,253,181,240,105, 84, 84,252,100,
+128,154, 82, 5,223, 78,192,117,232,192,129, 92, 51,115,115,204,153, 53, 11,102, 10,197,141,178, 93, 2,116,159, 51,127,126,167,
+ 25, 51,102, 24,237, 89, 53,253,113,239, 9,107, 90, 83, 52, 77,104,134, 41,143, 86,111,138,107, 59, 97,224, 64,152,153,155, 99,
+246,236,217, 32,228,242,203,101, 2,138,137, 27,227,191,246,245, 9,232,223, 25, 4, 8, 28, 11,187,131,215,201,217,207,110, 8,
+240,230,115, 85, 85, 21, 80,165,143, 86,181, 67,135, 69,114,100,118,255,106,176,192,221,221,189,168, 81,163, 70, 69,185,185,185,
+120,254,252, 57,242,243,243, 17, 28, 28,140,184,184, 56, 80, 20, 85,107, 1, 67, 81, 20, 62, 54, 39, 0, 56,216,152, 99, 84,223,
+118, 76,169, 68,196,203,206,206, 46, 55,124,244, 31, 18, 90,101, 80, 42,149,188,250,245,235,131, 4, 8, 97,137,194, 52,227,104,
+ 23, 34,227,104, 23, 66, 88,162, 48,149,201,100,164,169,169, 41,164, 82, 41, 79, 7, 42,214,151, 95,126, 57,255,204,153, 51,172,
+181,107,215,194,203,203, 11,114,185, 28,247,239,223, 79, 5,144,165,110,147,126,251,246,237,116,141, 16, 94,191,126, 61, 78,159,
+ 62, 77,244,232,209, 99, 97,101,231,147, 64, 32,216, 56,101,202,148,188,146,162, 60,236, 29, 38, 70,232,168,108,252, 60,240, 45,
+ 70,216,156, 66, 94,230, 59,236,219,183, 15, 87,175, 94, 35,174, 92,185,202,190,121,243,166,201, 87, 95,125,181,163, 78,157, 58,
+ 97,213,117, 50, 61, 61,125,237,140, 25, 51, 10,138,138,138, 80, 84, 84, 4,177, 88,130, 60, 17,240,108, 75, 83, 60,219,210, 20,
+ 18,202, 8,187,118,238, 38,159, 61,123,102,251,246,237, 91,167,254,253,251,111,225,243,249, 7,171,227, 76, 75, 75,123,240,237,
+183,223, 74, 10, 11, 11, 33,147,201,228, 42,149, 74, 38, 22,139, 21,199,143, 31,159,107, 99, 99,211,225,226,197,139,172,171, 87,
+175, 49,111,222,188,197,190,126,253,186, 69,183,110,221, 78, 56, 56, 56,252,162,139,165,140,193, 96,108, 11, 9, 9, 25,183,107,
+215, 46, 7, 31, 31,159,102, 21,134,162,248, 61,123,246,172,247,235,175,191,214, 9, 10, 10, 90,136,210, 0,148, 79, 10, 91, 91,
+219,153, 3, 7, 14,196,174, 93,187,112,254,252,249,121, 59,118,236,192,151, 95,126, 9, 39, 39,167,111,161,251,176, 23, 0,252,
+184,117,235, 86, 15, 15, 15, 15,140, 25, 51, 70, 54,105,210,164,239, 14, 29, 58, 84, 63, 60, 60,156,253,203, 47,191,212,155, 58,
+117,234,236,128,128, 0, 73,131, 6, 13, 16, 28, 28,220,144, 36,201,109, 58, 93,223, 14, 14,115, 71,140, 24,129, 77,155, 54,225,
+230,205,155,131, 81,250, 64,149, 1,184,116,247,238,221,254,235,214,173,195,224,193,131,225,236,236, 60,187, 54,150,167,166, 77,
+155, 46,235,211,167, 15,194,195,195,209,170, 85, 43,116,232,208, 97, 30, 0,219, 90,238, 78,210,212,212,244,196,161, 67,135,124,
+235,213,171,135, 53,107,214,192,205,205, 13, 7, 15, 30,244, 53, 49, 49, 57, 1, 29,221, 55, 44, 44, 44, 76,141,141,141,177,112,
+225, 66,122,240,224,193,121, 53,125,230,205,155, 71,115,185, 92, 88, 89, 89,233, 26,248, 98,196,227,241, 58,122,121,121,225,254,
+253,251,184,122,245, 42,150, 46, 93,138,185,115,231, 34, 59, 59, 27,195,135, 15, 55, 6,224,175,199,118,219,219,217,217,161,176,
+176,180, 46,188,151,151, 23,158, 60,121,130,236,236,108, 56, 59, 59, 35, 35, 35, 3, 54, 54, 54,104,220,184, 49, 40,138,178,215,
+141,146,246,178,181,182, 64, 86,190, 20, 76, 40,209,218,221, 22, 55,158,231,226, 93,182, 12,246, 54,150,200,200,202, 70, 29, 27,
+ 30, 92, 92,234,130,166, 41, 47,157, 20, 48,131,108,205,229, 25, 33,175, 72,142,180,216,155,185,114,149,116, 74, 65,226,221,148,
+130,196,187, 41,114,169,100,202,227, 59, 87,115,235, 57, 24,193,197,197, 5, 4, 77,181,251, 20,215,227,144,186,112, 49, 49, 98,
+142,185,250,243, 50, 34,108,255, 98, 66,154,251,174,109, 31,135, 82,203,178, 29, 80,127,200,240,225, 29,191,251,238, 59, 94,102,
+102, 38, 21, 48,108, 88,222,218,192,192,107,127,212,240, 98, 80, 12, 52,234,217,179, 39, 72, 0,127, 92,185, 34,202, 0, 82, 1,
+192, 1,112, 25,240,205, 55, 93,150, 44, 90,100,148,147,155, 75,221, 79, 40, 62, 23,151, 69, 15,178, 86,161,190, 46,254, 89, 42,
+192, 91,195,123,249,242,101, 90, 12, 60, 6, 0, 63, 23,124,219,171,147,167,207,232,129, 93, 32,200,202,199,236,181, 63, 99,207,
+201, 91,151, 45, 20,244, 23,255,161, 71,241,228, 90, 9, 45,245,208,207,123,211, 74, 74,222, 31, 61,248, 80, 1,243,119,112, 86,
+134,255,162,208,210, 64,161, 40, 29, 37,145, 41, 40,200, 20,148,230,173, 22, 98,177, 88,103,138,203,151, 47, 31,158, 53,107, 22,
+182,108,217,130, 87,175, 94,129,205,102,195,203,203,139, 15,192, 84,115,207,111,221,186,181, 61, 73,146,136,143,143,199,230,205,
+155, 49,126,252,120,250,222,189,123, 7, 81,121,190,148, 39,121,121,121, 59,167, 76, 26, 95,144,159,249, 14, 10,113, 62,178,210,
+222, 64, 42, 42,192,154,245, 27, 81,162, 96, 34, 67, 40, 71,134, 80, 14,146,107,141, 61,251, 15, 49,154, 54,109,218,135,193, 96,
+244,171,166,159,247, 51, 51, 51,247, 79,155, 54,173, 32, 35, 35,163,108,251,100, 10, 26, 50, 69,249,243,213,216,216, 24,219,182,
+109,179,112,119,119, 31,200,100, 50,187, 85,195, 41, 72, 73, 73,137,155, 54,109,154, 44, 51, 51, 19, 66,161, 16,231,206,157,235,
+ 95,175, 94, 61,171, 13, 63,110, 33, 68,114, 38, 50, 10,228,200, 40,144,131, 99,106,143, 19,161,103, 24,141, 27, 55, 14, 96, 50,
+153, 29,106, 18, 89, 71,142, 28, 25, 61,108,216, 48,179, 31,127,252, 49,239,236,217,179,187, 0,104, 31,144,248,109,219,182,157,
+ 60,113,226, 68,209,252,249,243,173,131,130,130,230,125, 98,177,213,109,216,176, 97, 77, 40,138,194,169, 83,167,158, 1,216,122,
+230,204,153, 71, 82,169, 20,195,135, 15,175,175, 30, 70,210, 5,109, 3, 2, 2,166,251,250,250, 98,206,156, 57,242,107,215,174,
+181, 6,176, 5,165, 67,185, 52,128,100, 0, 59,110,221,186,213, 98,230,204,153,210,118,237,218, 97,236,216,177,227, 1,248,214,
+192,219,113,196,136, 17, 30, 20, 69,225,248,241,227, 79, 1, 92,172, 48,255,122,104,104,232,125,153, 76,134,145, 35, 71, 54, 0,
+160,207,141,156,205,229,114, 79,173, 94,189,218, 50, 45, 45, 13,163, 71,143,150,198,199,199, 35, 48, 48,208,200,194,194,226,162,
+214, 53,160, 51,184, 92,238,190,159,126,250,105,160,183,183, 55,166, 77,155, 38,219,189,123,247,172,233,211,167,203, 90,183,110,
+141, 93,187,118, 13,228,112, 56,122,149,232, 72, 79, 79, 47,136,141,141,181,169,233,147,154,154,170,107,120,190,177,169,169,105,
+132,167,167,103,161,151,151, 87, 27,165, 82,137,152,152,152, 55,135, 15, 31,166,188,188,188,176,115,231, 78, 4, 5, 5,161, 95,
+191,126, 96, 48, 24, 58, 11, 45, 6,131, 1,185, 92, 14, 99, 99, 99, 48,153, 76,188,121,243, 70,147, 90, 6,108, 54, 27, 0, 96,
+ 98, 98, 2, 35, 35, 35,144, 36,169, 83, 52, 26, 65,128, 46, 44, 81,128,197, 34,193, 36, 41,196, 37, 11, 33, 87, 80,224,177, 25,
+ 96, 49, 9,128,166, 96,105,194, 2,143,195, 0, 73, 16,148,142,156, 16,138,228,224,176, 73,176,216, 28,130, 84,170,140,202, 30,
+142, 76,149,145,145, 17,135,176, 53,231,130,199,254, 23,149, 5, 38, 74, 29,203,199, 1, 44,147,186,117,135,110,218,188,153, 83,
+ 88, 92,140,193,131, 7,231, 37, 61,122, 20, 34, 6, 30,117,173, 33, 72,137,100, 50,221,253,186,118, 69,100, 84, 20,138,242,243,
+ 95, 3,165,206,241, 28, 39,167, 97,219,182,109,227,136, 37, 18, 12, 30, 52,168,224,213,157, 59, 71, 82,138, 17,118, 60,185, 84,
+136,213,120,220,217,108, 71, 13,175, 48, 63, 63, 31, 40, 77, 33,225, 96,103,186, 97, 70, 64,111, 20,149, 72,176, 96, 99, 8, 21,
+ 21, 39,248, 54, 60, 21, 95,157, 73,135,240, 63,246, 24,158, 92,225, 3, 64,135,132,165, 26,235, 82, 77, 98, 69, 42,149,126,116,
+ 1,244,161,156,149,137,196, 15,229,252, 55,130,201,100, 74, 94,190,124,201, 49,183,113,162,108,204, 88,249,245,198,223,177, 0,
+ 0,107, 83,166, 80,174, 82, 80,233,233,233,224,114,185, 18, 29,135, 27, 38,237,219,183,111, 13,128,102, 76, 38, 51,236,208,161,
+ 67, 68, 72, 72,136,213,136, 17, 35, 18, 98, 99, 99,211, 60, 61, 61, 93, 15, 29, 58,100, 14, 0, 59,118,236,160, 79,156, 56,209,
+ 27,165, 41, 51,170,204,227,146,153,153, 25,152,155,155,123,111,198,140, 25,193, 28, 14,199,202,196,196,196, 38, 60, 60,156,144,
+200,105,180, 93,146, 92, 22,137,104,110, 68,226,246, 98,115, 76,158, 60,153, 17, 27, 27,187, 62, 45, 45, 45,172, 26,206,133, 5,
+ 5, 5,225,175, 94,189,218, 98,225,220,210,206,196,117,137,133,207,226,120, 0,128,171, 45, 11,164,250,190, 88, 80, 80,128,236,
+236,108, 76,159, 62,221, 42, 33, 33, 97, 97, 90, 90,218,141,106,172, 90,183,114,114,114, 82, 95,188,120,225,199, 98,177, 56, 38,
+ 38, 38,109, 35, 34, 34, 8,137,140, 66,243,133,201,200, 43, 46,237,167,181, 41, 19,143, 87, 59,224,219,111,191,101,190,126,253,
+122,163, 64, 32,232, 92,233,205,140, 36,131,180, 69,214,130, 5, 11,162, 1, 52, 0, 80,110,104, 84,165, 82, 17, 35, 71,142,124,
+ 14,192,107,254,252,249,214, 52, 77,207, 91,184,112, 97, 30,128,189,255,244,185,100,110,110,190, 97,202,148, 41, 56,113,226, 4,
+242,243,243,183, 1, 64, 97, 97,225,214,163, 71,143, 30,159, 52,105, 18,126,253,245,215, 13,217,217,217,127,160,230, 80,237, 47,
+135, 15, 31,142, 75,151, 46,225,207, 63,255, 92, 6, 32,166,138,118,175,194,195,195, 23,158, 61,123,118,251,136, 17, 35,240,243,
+207, 63,247, 1, 80,157,131,108,207,222,189,123,227,226,197,139,200,205,205,221, 85, 89,131,130,130,130,221,231,206,157,107,223,
+187,119,111,172, 95,191,190, 39,128,235, 58,108,186,135,133,133,197,161,237,219,183,183,245,246,246, 70, 64, 64,128, 68, 46,151,
+247,153, 63,127,254,249, 99,199,142,153, 29, 62,124,184,205,228,201,147, 31,168,115,190,221,215,201,148, 69,146,235, 54,111,222,
+ 60,193,207,207, 15,243,230,205, 83, 94,190,124,121, 0,128, 43,127,252,241, 71,194,130, 5, 11, 46,108,222,188,153,177,105,211,
+166, 9,179,103,207,206,166, 40,234, 83,137,235,213, 59,118,236,104,223,171, 87, 47,188,121,243, 6,247,239,223,135, 92, 46,255,
+ 53, 34, 34,226,118,163, 70,141, 86,203,100,178,243, 38, 38, 38, 99,204,204,204, 60, 91,182,108,249,197,227,199,143,141,161,155,
+159, 94,102, 98, 98,162,165,133,133, 5,148, 74, 37,158, 61,123,134,186,117,235, 66, 46,151,227,237,219,183,240,246,246, 6,155,
+205, 70,102,102, 38,180,172,229, 53,136, 34,242, 89, 66, 82,122, 3,107, 51, 19, 64,197,195,147,248, 84,216,217, 90, 65, 69,144,
+200,200, 16,160,101, 19,103, 16, 4,129,130,220, 12, 16, 4,241, 92, 23, 78, 21, 77, 69,190, 75,207,170, 99, 99,198,133,119,251,
+ 94, 54, 17,127,100,135,152, 55,232, 52,153,201, 32, 24, 28,174,233,222, 9, 99,199,218, 82, 20,141,130,220, 76, 48, 73,242,225,
+167, 56, 64,167,222, 33,165,171, 27,239, 73,175, 9,107, 90, 18, 52,104,177, 28,135,127,206, 68,190, 49,208,114,199, 15, 63, 88,
+218,216,218, 34, 32, 32,128,202, 77, 75,187, 86,162, 99, 98,229, 6,141, 26, 57,152,154,153,225,238,221,187, 96,148,250,216,226,
+ 32,224, 17,180, 96,129,141,189,163, 35,198, 79,152, 64,101,190,123,119, 93, 12,164,235,211,215, 6,110,110, 44, 13, 47,169,230,
+ 21, 48, 48,107,254, 0, 95,174,137, 17, 23,235,246,156, 65, 74,142,232,120,132, 0,123,254,163,246,142,125,213, 90,180,170,114,
+ 62, 43,117,170, 54,174, 86,172,240,120,188, 50,107,138, 30,111,122, 31,157,179, 38,252, 29,156,159, 16,139, 1,156, 5,176, 56,
+ 37, 37, 37,110,194,132, 9,114,165, 92, 90,116,111, 77,131, 69, 81,235,235, 77,139, 8,228, 79,251,125,150,197,162, 18, 97, 94,
+209,142, 29, 59, 20, 41, 41, 41,113,218,203,212,192,253, 14,192,197, 95,126,249,101,247,169, 83,167,224,229,229,133,152,152, 24,
+123,145, 72,212,234,249,243,231,214, 30, 30, 30, 8, 9, 9,193,137, 19, 39,182, 0,184, 90,157,200,210, 64,169, 84, 94,203,200,
+200,104,156,156,156,220,208,210,210, 82, 97,105,105,137,138,145,136,133, 98, 10,185, 5, 66, 88, 91,219,192,220,220,188,190, 14,
+226,252, 98, 70, 70,134, 59,101,213,164,139,123,206, 54, 97,228, 58, 23, 68,174,115,193,197,133, 78,224, 91,114,144,159,159,143,
+236,236,108,100,103,103,131, 32, 8, 40, 20,138,166, 58,112,190, 21, 8, 4, 7,222,189,123,119,214,193,193, 1,102,102,102,160,
+ 1,100, 20, 40, 16,189,201, 3,209,155, 60,144, 81,160, 64, 97, 81, 17,234,213,171, 7, 51, 51,179,170,134, 40,200, 58,117,234,
+244, 29, 54,108,152, 25, 0,168, 5, 84,119,154,166,167, 85,242,153,170, 84, 42, 59,105,218,126,255,253,247,214, 0,122,255,195,
+231, 19, 3,192,140, 73,147, 38,181,225,241,120,216,185,115,231, 91, 0, 71, 52,247,250,221,187,119,199, 3,192,172, 89,179, 60,
+ 1,204, 67, 21,153,160,203, 76, 67,108,118,235,166, 77,155, 34, 34, 34, 2, 0,206,212,176,238,208,123,247,238,161, 81,163, 70,
+224,241,120,109,107,104, 91,223,197,197, 5,241,241,241, 0,240,164,138, 54, 79,226,227,227, 75,135,123, 8,162,190, 14,219, 62,
+176, 87,175, 94,207,110,220,184,209,182, 99,199,142,152, 48, 97,130,236,193,131, 7,125, 1,220,126,242,228, 73,183,145, 35, 71,
+138,220,221,221,113,235,214, 45,143,145, 35, 71,222, 35, 73,114,141, 14,156,227, 87,173, 90,181,248,235,175,191,198,170, 85,171,
+232,147, 39, 79, 6, 0,184,162,158,119,249,248,241,227,163,215,174, 93, 75, 15, 26, 52, 8, 43, 87,174, 92, 12, 96, 90,117,100,
+ 34,145, 72,168, 82,169, 32, 18,137,116, 50,201,235,218,222,214,214,246,203, 94,189,122, 97,233,210,165,168, 83,167, 14,206,159,
+ 63, 79, 3, 8, 3, 16, 46,147,201,186, 0,216, 44, 18,137,126,143,136,136, 64,207,158, 61,217, 40, 95, 98,164,186,245, 63, 59,
+122,244,168,212,194,194, 2,174,174,174,104,208,160, 1, 50, 50, 50,144,148,148, 4,111,111,111,180,110,221, 26, 74,165, 18, 7,
+ 14, 28,144, 20, 21, 21,233,148,147, 79, 41, 19, 29,190,122,225,180,208,198,140, 11,103,123, 11,212,171, 99,141,226,130, 28,100,
+103,164,163,117,211,186,232,218,186, 30,114,132, 50, 92, 14, 59,157, 95, 84, 84,114, 88, 39, 19,190,180,228,208,181, 63,206, 11,
+173,204,216,104,220,196, 19, 35, 39,204,106,217,178,149,207,213,118,237, 58, 93,254,113,195,186,230,221, 59, 52, 37, 82,115, 36,
+184, 20,118, 38, 95, 88, 88,120,232, 83,220,232, 87, 2, 12,137,133,251,237, 93,103, 35, 15, 52,235, 51,233, 64, 92, 42,182, 1,
+128,130,193,240,232,251,229,151, 72, 77, 77,197,233, 83,167, 4, 37,192, 83, 93,249,140,140,140, 72, 0, 16, 10,133,224,170,253,
+238,148, 64,147,175,190,250, 10,217, 57, 57, 56,122,228, 72,246, 37, 32, 74,159,126,246, 7, 56,198, 70,165, 6, 65,161, 80, 8,
+ 2, 40, 4, 0,130,137,190,237,188, 26, 33, 59,175, 16, 55, 30,198, 21,215, 19, 99,122,117, 60,159,177, 35,124,237,124,180, 0,
+228,204,155, 55, 15, 92, 46, 23,124, 62,191, 76, 28,105,196, 10,135,195, 1,159,207,135, 82,169,196,241,227,199, 1, 32,167,218,
+ 55, 60, 64, 58, 96,218,122, 74,170,160, 75, 88, 44,214, 71,225, 84,191, 57, 74, 7, 47,248,153,250,227, 94,229, 65, 49,181,225,
+252, 12,208, 78,157, 19,171, 29,128,252,164,164,164,212,161,131, 7, 8,147, 19, 94,100,136, 10,210, 5,133,185, 41,130,148,183,
+207, 51,150, 44,156, 39, 76, 77, 77, 77, 65,105, 46,173,118,233,233,233,154,101,116,193,188,161, 67,135,254, 52,105,210, 36, 58,
+ 58, 58, 26, 0, 16, 25, 25,137,177, 99,199,210,163, 71,143,222, 6, 96, 81, 45,250, 45, 18,139,197,229,172, 33,114, 21, 85, 54,
+228, 87, 88, 88,136,244,244,116,200,100, 50,157, 21,241,171,203,155, 94,230, 37, 61, 86,120,186,154,192,211,213, 4, 30, 46,198,
+ 32,148,197,101, 34, 43, 59, 59, 91,243,230, 44,209,163,159,133, 82,169,180, 92, 63,181,135, 38, 11, 11, 11,145,145,145, 1,149,
+ 74, 85,213,131,140, 74, 75, 75,187,124,226,196,137, 34, 0,248,241,199, 31,243, 8,130,248,147, 32,136,159, 42,249,236, 97, 50,
+153,119, 53,109, 55,109,218,148,135,247,135,196,254, 78,124,237,237,237,157,191,120,241,226,157,179,103,207,198,158, 61,123, 32,
+ 16, 8, 22,225,175, 92, 60, 84, 78, 78,206,130, 93,187,118, 97,220,184,113, 88,190,124,249,166, 86,173, 90, 21, 2, 24, 89, 21,
+161,157,157,157, 51,147,201, 68, 84, 84, 84, 33,128, 55, 53,172, 63, 35, 42, 42, 42,147, 32, 8,240,249,124,183,234, 26, 90, 91,
+ 91, 55, 52, 51, 51, 67, 90, 90, 26,160,126, 99,174, 4, 73,233,233,233, 52,135,195,129,147,147, 83,163,154, 54,222,202,202,106,
+193,129, 3, 7,152, 47, 94,188, 64,247,238,221, 83,111,221,186,213, 19,128, 38, 36, 61, 42, 50, 50,210,183, 91,183,110, 47,175,
+ 94,189,138,141, 27, 55, 18, 45, 90,180,152, 86, 19,167,171,171,235,212,241,227,199, 35, 56, 56, 24,123,247,238,157, 6,224, 84,
+133, 38,199,118,237,218, 53,107,239,222,189,152, 48, 97, 2,234,215,175, 63,178, 58,190,228,228,228,133,126,126,126,145,175, 94,
+189,210,169,226,129,142,237,187,249,248,248, 52, 20,139,197, 56,116,232,208,155,134, 13, 27, 62, 58,117,234,212, 60,188,255,192,
+254,253,244,233,211, 24, 53,106, 20, 90,180,104,113, 8,192, 8, 93, 46,203,216,216,216,148,235,215,175, 83,108, 54, 27,174,174,
+174,232,215,175, 31, 2, 2, 2,208,188,121,115,200,229,114,156, 62,125,154,122,254,252,121,170, 76, 38,211, 41,151, 82,238,171,
+155,231, 19, 19,255,199,222,121,135, 71, 81,181, 81,252,204,246,190,155,222, 8, 9,161,165,210, 2,132, 94, 2, 33, 8,132,142,
+162, 82, 68, 20,144, 34, 10, 40, 22, 64, 69,154,244, 34, 82,196,130, 8, 8,136,180,208, 4,252, 64, 58, 9, 16, 18, 72, 66, 72,
+175,155, 94, 54,219,119,231,126,127, 36,193, 16, 83,118, 19, 84,208,249, 61,207, 60,155,220,217, 57,123,167,221, 61,251,222,123,
+223,137,191,114,251,198, 37, 35,135,205,130,135,171, 29, 70,135,116,194, 27,227,122,161,179,111, 51,164,230,106,112,225,194,175,
+198,228,228,196,107,150,204, 56,172,210,140,189, 31,117, 53,230,246,101, 19,151, 67,193,215,167, 45, 22,125,244,190,237,242, 79,
+ 22,218,180,109,229,129,168,164, 18,252,122,246,148, 49, 43, 35,253,183,127,106,198,225, 69,128, 39, 21, 80, 18, 54,139, 5, 51,
+ 75, 80,206,174,156, 72,211,206,223,223,219,217,197, 5,225,225,225, 96, 89, 49, 35,244, 34,192,147, 74, 43,122,193, 85, 42, 21,
+170,244, 90,251,248,248,120,120,122,226,100,120, 56,216, 52,253,160,159,149, 9, 70,227, 42,186,161, 31,235, 82,128,118,102,115,
+200, 90, 55,119,242,177, 85, 72,112, 35, 42, 1, 58, 35,185,249, 99, 17,254,209,124,100,127, 33,211,208,200,174,195, 53,219,183,
+111, 15,218,181,107,215,160,121,243,230, 73, 39, 79,158, 12,161, 80, 8,181, 90, 13,119,119,119,152,205,102,156, 62,125, 26, 17,
+ 17, 17, 42,154,166,127,197,159,211, 6,132,160,218, 44,141, 51,137, 16, 85,248, 45,117,208,209, 23, 95,124, 42,154, 0, 32, 77,
+160,229, 5, 45,244,123, 54, 31,188, 60,102,239,153,219,212, 59,175,244, 99,117,246,105, 14, 0,112,118,118,134, 92, 46,183, 90,
+243, 41,240,151,107, 86,239,214,205,201,201,137,203,201,201,201,125,243,205, 55,125,171, 6,190, 11, 4, 2,109,101, 36,171,168,
+182,109, 44,168,167, 1,192,204, 93,187,118, 29, 43, 41, 41, 57,243,222,123,239, 97,249,242,229, 56,126,252,120, 31, 0, 87, 26,
+185,239,230,162,162,162,226,155, 55,111, 58,183,241, 11, 68, 75, 39, 46,250, 46,126, 8, 66, 8,236,197, 4,101,197,133,184,115,
+231, 54,202,202,202,110, 88, 83, 79,131,193, 80,156,155,155,235,224,228,228,132,194,194, 66,228,231,231, 63, 54, 89, 69, 69, 69,
+ 40, 44, 44, 36, 20,245,167,156, 45,245,105,150,231,230,230,170, 99, 99, 99,249,206,205,219,160,149, 19, 15,221, 62,138, 3, 8,
+129,135, 29, 11,101,165,197,184,118,237, 26, 74, 74, 74,254, 87,151, 38, 77,211,243, 39, 76,152,192, 6, 48,233,189,247,222,179,
+ 3,208,241,253,247,223,255, 21, 53,102, 22,114, 56,156, 13,123,246,236,105, 87,213,197,184,112,225,194,245, 0,118,253, 93,215,
+146,189,189,253,252,240,240,112,153,193, 96,192,230,205,155,177,126,253,250,111,240,231, 68,149,225, 95,126,249,229, 86, 22,139,
+ 53,107,246,236,217,152, 62,125,186,184, 75,151, 46,243,178,179,179,127,172, 77, 51, 51, 51,115, 81,231,206,157,151,228,230,230,
+174,176,200, 44, 63,124, 56,173,115,231,206,139,114,115,115, 87,215,119,142, 36, 18,137,196,108, 54, 35, 57, 57,185, 8,168,115,
+124,135, 54, 57, 57, 57,211,108, 54,187,139,197, 98,187,134,174,207,162,162,162, 21, 93,186,116,249, 84,169, 84,158, 5,176,172,
+ 22, 67,126, 55, 59, 59, 59, 96,238,220,185,115, 86,173, 90, 53, 38, 39, 39,103,127, 67,154,169,169,169, 43,130,131,131, 23,199,
+199,199,127,143,186,187,128,191,252,236,179,207, 12,123,246,236,121, 43, 57, 57,121,101, 3,154, 39,242,243,243, 79, 88,113,126,
+235,122,255, 99, 77, 54,155,253,254,170, 85,171, 88,219,183,111, 7, 33,100,173,217,108,174,171,158, 81, 71,142, 28,217,221,171,
+ 87,175,201, 7, 15, 30, 20, 6, 4, 4, 76,215,233,116,251, 26,186, 62,213,106,245,225,131, 7, 15,142,137,138,138,114,159, 60,
+121,178,208,219,219, 27, 6,131, 1,217,217,217,216,190,125,187, 54, 58, 58, 58,163,184,184,248,176, 53,109,136, 73, 95,250,202,
+213, 11, 71,247,165, 60,140,238,209,255,133,145,182,122,131, 59, 4, 5,108, 20, 23,228,224,244,137,195, 69,201,201,137,215,212,
+234,226, 87,172,209, 52,232, 74, 94,190,246,219,177,253, 25,201,177,221,251, 6, 15,181,213,234, 61, 33,224,177, 80,160,204,196,
+233,240,163,133,201,201, 73,191,107,141,186,215,254,169,118,158,237,133,101,236,156,136, 55,103, 12,239, 4,145,173,251, 29, 46,
+176,185, 23, 32,114,112,118,230, 85,222, 59,144, 86,140,121,180, 72, 83, 9,240,219, 84,246, 82,169,213,106,112, 1,253, 20,128,
+235,232,232, 40, 2,128,248,248,120,136, 43,122, 53,172,170,167, 10,144,136,171,233,178, 0,117, 1, 7,205, 90,203, 37, 20, 0,
+100,228, 20, 64,111,172,247,123,227,121,103,103, 53,195,181,179, 49, 2, 60, 0, 33, 82,169,116,249,146, 37, 75,214,222,184,113,
+ 99,109, 88, 88,216, 90,129, 64,176,188,242, 96,243,234, 57, 17,127,155,102, 87, 55,216, 5,183,162, 46,133,182,166,232, 25,125,
+108,205,175,117,147,232, 7, 12, 24,176,181,137,245,108,202,205,242, 87,106, 30, 53, 26,141, 4, 21,221,118, 71, 81,119,151,224,
+135,213,214,231,164,165,165,145,202,191,173,169,167,195,248,241,227,233,178,178, 50,242,210, 75, 47, 17, 52,252, 8,159,122, 53,
+ 5, 2, 65,112,223,190,125,141,202,188, 66, 18,151,148, 73,174, 71,222, 39,103, 46, 92, 37,251, 15,135,147, 45, 91,119,144, 14,
+ 29, 58,232, 1,120, 90,163,201,225,112, 6, 4, 7, 7, 23, 40,149, 74, 18, 27, 27, 75, 46, 93,186, 68, 14, 29, 58, 68,118,236,
+216, 65,182,109,219, 70,154, 55,111,174, 4,224,108,141,166, 72, 36, 26, 57,100,200, 16, 99,113,169,154, 36,103, 22,144,123,177,
+201,228,202,205,123,228,244,133, 43,228,199,125, 7,137,191,191,191,214, 2, 77, 54,155,205,222,178,127,255,254, 82, 66, 8, 25,
+ 57,114,100, 6,158, 76,164,218,114,254,252,249,185,132, 16,178,122,245,234, 2,212, 62, 16,254,175,190,150, 94,104,214,172, 89,
+ 28,143,199, 11, 7, 48,169,129,237, 94,230,112, 56,199, 93, 92, 92,110, 1, 24,253, 15,220, 71, 97, 78, 78, 78,215, 1, 52,244,
+132,131,170,247,141,250,151,220,239,127,133,230, 0, 14,135,115, 9,168,255, 33,194,213,218,235,207,217,108,246, 73, 0, 3,173,
+172,103, 91, 7, 7,135,151,108,109,109,223,177,181,181,125,199,201,201,233, 37, 62,159,223,182, 41,251,110,223, 54,100,184, 71,
+224,136, 35,205, 59, 14, 75,245,232, 20,150,234,213,121,228, 17,251,182, 33,195,155,170,233,217,121,228, 81,143, 78, 97,105, 30,
+157,134,167,180,236, 58,242,136,131, 79,200,144,127,242, 28, 77,106, 6,183, 65, 45, 97, 34,151, 22, 19,114,105, 49, 9,105, 9,
+186,135, 13,252,131, 0,217,224,144,144,117,196,108, 94, 55,102,212,168,117,109, 0,123, 2,176,107, 46,181,105, 6, 2,242,199,
+219,142, 28,185,174, 21,224, 48, 8, 16,247,235,211,103, 45, 49,155,215, 77,120,249,229,117, 30,128, 75,109,122,117,105, 18,128,
+221, 12,112,171,174,235, 0,180, 30,231,133,128, 15,135,123, 17,114,105, 49,249,236, 69,111,210,217, 25,147, 26,208,172, 43, 82,
+244, 92, 71,180,172, 69, 82,217,184,174,172,124,149, 60,133,139,240,169,107,118,119,133,119, 72,107, 42,118,168, 15,167, 16, 21,
+ 83,146, 37,255,194, 70,242,123,189, 94, 79,180, 90, 45, 81,171,213, 68,165, 82,213, 52, 80,143, 13, 89, 86, 86, 22,201,200,200,
+ 32,105,105,105, 36, 37, 37,133,224,143,177, 55, 22,215, 83, 46,151,239,122,241,197, 23,205, 92, 46,119,203,211,216,119, 59, 59,
+187,149,221,186,117, 51,108,218,180,137, 28, 57,114,132,124,253,245,215,100,246,236,217,164, 93,187,118, 58, 27, 27,155, 87, 26,
+163,233,226,226,178,200,199,199,167,224,155,111,190, 33, 63,254,248, 35,217,184,113, 35,249,248,227,143,205,238,238,238, 57, 50,
+153,108,112, 99, 52,157,156,156,118,246,238,221,219,176,115,231, 78,242,235,175,191,146,189,123,247,146,249,243,231, 19, 95, 95,
+ 95,157, 68, 34, 25,107,161, 38,155,195,225,172,155, 49, 99, 70,142,155,155, 91,120,141,117, 98,127,127,255, 91, 19, 38, 76,200,
+ 2,176,240, 95,116,125, 50,154,140, 38,163,249, 23, 24,173, 87,221,208,140, 0,108, 49,143,247,114,191, 62,125,214,242,128,151,
+173, 53, 69, 66, 54,123, 92,175,110,221,214,242,128, 87,170,222, 43,100,179,199,245,235,211,103, 45,151,205,158, 88,151, 94,125,
+154, 4, 96,243, 56,156,133,189,122,244, 88,199, 1, 62,170, 42, 27,208,146,122, 48,255,133,230,164,143, 39,149, 48,209, 9,226,
+127,177,209,122,234,112,254,130,139,240,121,209,124, 86,110,234, 54,149,134,233,168, 21, 17,173,163,168,120,138,122,155, 70,214,
+ 83,244,148,247,189,189,131,131,195,169, 54,109,218,228,181,104,209, 34,203,214,214,118, 31, 0,247, 38,106, 6,184,184,184,252,
+224,236,236,252,208,213,213, 53,202,193,193, 97, 3, 42,178,206, 55, 90,147,203,229,118,115,118,118,254,159,151,151, 87,177,167,
+167,167,210,193,193, 97,127, 45,145, 44, 75, 52, 93, 81,123,163,194,171, 92,199,124,233, 48,154,140, 38,163,249,132,129, 9,109,
+133, 85,131, 90,194, 52,168, 37,204,161, 94,216, 80,221,160,132, 1,162,198,154,162,215, 0, 65,205,247, 55,164,215,144, 38, 1,
+216, 61, 1,105,205,109,134,186,195,223, 66,205,231, 61,162, 85,213,206, 91,151,222,161, 14, 76,127, 65, 37,159, 23,205,103,133,
+ 4,212, 51, 24,185, 26, 43,159,226,103,106,158,242, 62,220,203,207,207, 31,146,159,255, 84,231, 38,196,228,228,228, 76,122,154,
+130, 70,163,241,134, 82,169,236,255, 20,164,234,154,122,109,128,133,211,178, 25, 24, 24,254, 59, 80,128, 25,137,248, 32,164, 45,
+ 54,115,204, 96,157, 78, 66,102,141, 41,121, 26,170, 49,154, 21,152,191,175,165,141,167, 26, 91,207, 63, 80,253, 73, 35, 3,247,
+169,255,206,105,203, 70,197, 24,173, 38, 27, 45, 6, 6, 6, 6, 6, 6,134,191,129,115, 15,153, 31, 98,207, 1,225,120, 50,250,
+ 22, 94,205,136,214, 25,250,180,102, 38, 69, 99,194,167,231, 24, 77, 70,147,209,100, 52, 25, 77, 70,147,209,252,207,105, 86, 81,
+215,179, 83,227,106,252,223,168, 89,124,255, 21,152,126,118, 70,147,209,100, 52, 25, 77, 70,147,209,100, 52,255,237, 52, 58,143,
+ 22, 3, 3, 3, 3, 3, 3, 3, 3, 67,253,212, 25,117, 99,140, 22, 3, 3, 3, 3, 3, 3, 3, 67,211,112, 69,197, 35,170,194,
+241,199,163,170,118, 2, 13, 63,130,231, 9, 86,173, 90,197,106,211,166,141,148,207,231,183, 75, 76, 76,100,205,156, 57,179,201,
+ 19, 9,214,110,216,194,242,244,244,148, 2,104, 87, 80, 84,198,122,253,141,247, 40,230,124, 49, 48, 48, 48, 48, 48, 48, 60, 71,
+ 12,171, 52, 86, 85,175,143, 35, 92, 86, 69,180,150, 45, 91, 6,163,209, 40, 1, 48, 62, 32, 32,224,115,173, 86,171, 61,112,224,
+ 0, 85,153, 45,188, 81,124,180,112, 62, 12, 6,131, 4,192,120, 39, 7,155,207,205,102,179,246,224,241,203,212,139,195,123, 19,
+230,188, 49, 48, 48, 48, 48, 48, 48, 60, 39, 76,171,241,186,211,106,163,197,225,112,216, 44, 22,171,149,209,104, 28, 34, 20, 10,
+207,106,181,218, 75, 77, 49, 89, 85,154, 20,139,213,202,100, 52, 14, 17, 8,132,103,213,234,242, 75,140,201, 98, 96, 96, 96, 96,
+ 96, 96,120,142,176,108,102,228,137, 19, 39,234, 52, 56,124, 62,159, 21, 16, 16,208,219,211,211,243,138,159,159,159,222,221,221,
+253,144, 88, 44,150, 52,177, 98,172, 54,222,190,189,221, 92,157,175,116,106,229,170,119,114,114, 58,196,229,114, 37,204,249, 98,
+ 96, 96, 96, 96, 96,248,111, 82,159, 23,121,134,169,154,105,248,167,167,124, 88, 51, 70,171,163, 82,169,220, 58,106,212,168,238,
+115,231,206,229,177,217,236,230, 18,137,164,157,131,131,195, 19, 81,177, 41, 83,166, 80, 86,105,230,100,111, 93, 62,174, 99,247,
+ 43, 31,117,229,113,217,104, 46,145, 72,218,201,229,242, 39, 52, 39,188, 62,157, 25,183,197,192,192,192,192,192,192,240,172, 82,
+ 53, 46,107, 24,172, 73,239,208,181,107, 87, 65,122,122,122, 39,141, 70,227,196,227,241, 22,142, 24, 49, 34, 96,204,152, 49,184,
+115,231,142, 57, 32, 32,192,173,160,160, 96, 78, 81, 81,209,185,242,242,242, 59, 52, 77, 7, 8, 4,130, 11,251,246,237,147, 2,
+120, 88,151,102,251,142, 93, 4,233,169, 73,143, 53,103,140, 27, 16, 48,105,222, 16,208,167, 54,155, 7,116,240,112, 75,205, 87,
+207,201, 5,209,176,198, 0, 0, 32, 0, 73, 68, 65, 84, 45, 40, 57,167, 46, 87,221, 49,211, 36, 64, 32, 16, 92,248,241,219, 29,
+245,106, 50, 48, 48, 48, 48, 48, 48, 48,252,131, 84, 25,171,112,212,120,164, 26, 7,168, 8,211,133,133,133, 61, 17, 53,226,243,
+249, 95,197,199,199,247,178,179,179,107,197,229,114,205, 47,191,252,178, 96,194,132, 9,200,203,203,163, 85, 42, 21, 59, 48, 48,
+208,249,214,173, 91, 67, 76, 38, 83, 31, 27, 27, 27,117,113,113,177,131, 78,167, 75, 0, 48,167,158,138,124,245, 48, 46,186,151,
+189,173, 93, 43, 62,151,109,158, 61,117,130,224,163,133, 47,128,210, 69,210,230,220, 2,246,231,157,109,156, 55, 92, 45, 31, 18,
+111, 48,247, 41, 87, 8,213, 57, 37, 58, 75, 52, 25, 24, 24, 24, 24, 24, 24,158,115,106,243, 34,207, 17, 13,230,209,234, 95,217,
+ 39, 90,253,193,185,187, 29, 29, 29, 93,164, 82,169,223,180,105,211, 88, 14, 14, 14,136,136,136,160,203,203,203, 89, 92, 46, 23,
+ 92, 46,151, 61, 96,192, 0,169,201,100, 18,159, 60,121,146,122,244,232, 81,158,209,104,252,188,160,160,224, 86, 61, 21,217,221,
+218, 70,224, 34,178,225,251, 29,127,175, 47,203,177, 77, 1,112,230, 51,154,168,114, 89, 28,154,192, 65, 66,179,215,245,161,164,
+ 57, 10, 47,241,236,253,121,212,239,143,138,243,140, 70,227,231,101,101,101,183,152, 75,144,129,129,129,129,129,225, 95, 77,109,
+ 94,228,121,161,122, 30,173, 39, 34, 90,117, 58, 71,103,103,103, 74,171,213,186,120,121,121, 77,115,116,116,156, 40, 22,139,157,
+251,246,237, 43, 50,155,205, 32,132, 64,161, 80,208, 45, 90,180,160,247,237,219,103,186,124,249,114,198,219,111,191, 61,106,214,
+172, 89, 15,134, 14, 29,202, 58,121,242, 36, 93,155,166,141,173, 29,101, 82,151,186,120,180,242,155,214,222,145, 76,244, 82, 24,
+156, 23,143, 16,139, 56,201,249, 32, 14, 28,192,201,139,102,181, 11,165, 87,174, 59,107,250,250, 92, 82,198,251,139, 87,142,122,
+107,234,248, 7, 33,161, 67, 89,231,206,214,174,201,192,192,192,192,192,192,192,240, 15, 51, 13, 21, 81,173,170,215,134,141, 86,
+175, 94,189,168,152,152, 24,202,211,211, 83, 92, 80, 80,224, 15, 96,195,130, 5, 11,130, 8, 33,102,145, 72,196, 22,137, 68,230,
+223,126,251, 77,253,243,207, 63, 95, 54, 26,141,147,244,122,125,145,151,151, 23,149,156,156, 92,231,108,129,174,221,123, 80,247,
+163,238, 80, 30,158,173,196, 5,249, 74,127, 10,100, 67,230, 71,110, 65, 92, 85,145, 25,110,142,108,200,156,204,107, 15, 23,169,
+ 63,250,229,238,101,163,209, 48, 9, 64,145,187,155, 43,149,145,149,205,164,123, 96, 96, 96, 96, 96, 96, 96,120,150,141, 86, 77,
+234,207,163,117,229,202, 21, 2,128,100,102,102,154,141, 70,163,188, 95,191,126,182,108, 54, 27,246,246,246,108,181, 90, 77,151,
+151,151,179, 29, 28, 28,178,184, 92,238,143,229,229,229, 69,163, 70,141,162,142, 28, 57, 82,175, 33,186,117,253, 26, 1, 64, 50,
+ 50,210,205,180, 81, 43,159,217,187,133, 45,199,100, 0, 29,216,139,173, 42,163,104,169, 38,153,237,235, 42,200,226,241,184, 63,
+ 26,141,134,162,209, 97,195,168, 95, 78,132, 51, 38,139,129,129,129,129,129,129,225, 89,166,206, 49, 90, 13,166,119, 80,171,213,
+182, 60, 30, 47, 36, 40, 40,168, 69,121,121, 57,189,108,217,178,244, 77,155, 54,237, 73, 72, 72, 48,218,216,216,180, 18,137, 68,
+239,140, 31, 63,222,225,200,145, 35,164, 79,159, 62, 53, 35,100,181, 62,221, 91,163, 81,217, 10,120,220,144,119,186,201, 90,164,
+ 27,108,105,191,119,110,166,247, 91,114,117,207, 47, 49, 28, 99,123, 59, 77, 43, 59, 62,245,206,248,241, 47, 57,252,114, 34,156,
+244,232,209,221, 34,205, 38,194,104, 50,154,140, 38,163,201,104, 50,154,140,230, 63,171,249,188, 51, 13, 53, 82, 59, 0, 22,100,
+134, 23, 8, 4,125, 61, 60, 60,122,199,196,196,152,175, 93,187, 86,194, 98,177,182, 13, 29, 58,244,208,225,195,135,187,217,217,
+217, 57, 53,111,222,220,249,252,249,243,193, 0, 14,252,254,251,239, 22, 69,159, 68, 2, 94,223, 78,238,138,222, 59,239, 18,243,
+183, 17, 15, 75,204,108,193,182, 1, 99,199, 30,122,123,207,222,110,110, 14, 50,167, 78,174,114,231,147, 39, 79, 7, 3, 56,112,
+237,218,117, 38,162,197,192,192,192,192,192,192,240,172,155,172,157,181,253, 95,111, 68,139,207,231, 55, 99,179,217,254, 25, 25,
+ 25,169, 39, 79,158,140,233,218,181,235,144,212,212,212, 85,132,144, 20,177, 88, 60, 45, 61, 61,253, 97,122,122,186, 94,163,209,
+204,176,162, 50,205,192,226,249, 71,100,105, 82,191, 56,127, 63,166,125,143,193, 67,114,114,178, 86,153, 9, 73,225,139,229,211,
+226,211,242, 30, 94,207,213,233,181, 90,171, 52, 25, 24, 24, 24, 24, 24, 24, 24,158, 57, 26,138,104, 25,204,102,243, 26,157, 78,
+103,251,203, 47,191,100,134,134,134,234, 0,224,171,175,190,162,167, 78,157,122, 57, 49, 49,113,224,131, 7, 15,134,184,184,184,
+ 92, 0, 64, 37, 37, 37, 89, 18,125, 50,208,180,121,141, 94,175,179, 61,255, 91,100,102,223,222,237,117, 0,176,253,203,205,244,
+203,211,230, 94, 78,140,141, 25, 24, 31,125,123,136,139,139,203, 5,179,137, 67,101,231,164, 48, 17, 45, 6, 6, 6, 6, 6, 6,
+134,103,153,170, 25,135,213,255,111,216,104,233,245,250, 60,189, 94, 15, 0, 69,161,161,161, 79,172,251,230,155,111, 8,128,114,
+ 0, 7, 11, 10, 10,172,169, 76,158, 70,163, 1,128,162,190,189,219, 63,177, 98,255,206, 77,143, 53, 85,101,165,204,105, 99, 96,
+ 96, 96, 96, 96, 96,120,158,204,214,159, 96, 49,199,133,129,129,129,129,129,129,129,161, 73, 76,171,235,127, 10,117,207, 28, 56,
+103,197, 7, 52,102,246,193, 57, 70,147,209,100, 52, 25, 77, 70,147,209,100, 52,255,115,154, 13,105,159,195,243, 71,157,131,225,
+255,106,152,169,175,140, 38,163,201,104, 50,154,140, 38,163,201,104,254,219,113,197,147,233, 29, 92,171, 86,112,152, 99,195,192,
+240,124, 67, 14,130,141, 34, 31, 47, 16,226, 6, 54, 63, 27,217,247, 18,169, 79, 65, 55, 89, 83,233,239, 9,145,209, 25, 38, 97,
+ 30,148, 81, 73, 77,213,100, 96, 96,248,247,225,210,115,230,104,138,197,222, 70, 17, 26, 26,101,172,128,167, 73, 17,231,102,167,
+254, 23,189, 69, 54,234,136, 96, 49, 70,139,129,225,121, 39,207,215, 27, 28,172, 4, 11,174, 32,134, 71,112,244, 95, 9,220,143,
+110,178, 38,143, 94, 6, 51,203, 29,196, 16, 15, 39,159, 85, 64,220,125,230, 96,255,251,152, 51,251, 45,242, 32,250, 6,210,210,
+178,208,170,181, 43,188,125,123, 98,211,230,173, 20,115,100, 24, 44,251, 85, 70,237, 12, 25, 62,193, 78, 36,150, 1, 0,104,147,
+ 17,223,204,235,244,171,201,100,218, 13,224, 8, 0,205,127,253, 16,253,237,131,225,185, 92,174, 18, 0, 45, 20, 10, 15,163, 90,
+104,141,129,225, 47,192,181,242, 58,163, 43,175, 59,107,144,114, 56,156, 37, 98,177,248, 55,129, 64,144, 43, 16, 8,114, 37, 18,
+201,111, 28, 14,103, 9, 0,233, 51,211,198,253,208, 78, 12,150,121,136,222, 72, 55, 59,125,175,216, 73,173, 51,123,131,101, 26,
+ 74,190,105, 43,109,146, 38,135, 10,213, 26,104,143, 31,111,170,157,203,245, 38, 63, 16, 52, 73,179, 26, 54, 60, 30,239, 52, 0,
+ 7,230,242,124, 54, 72, 77,138,198,201, 19,235,176,108,233,100,124,183,115, 6,226, 30, 92,111,146,158, 31,208,165, 11,135,179,
+192, 23, 24,128,122,158,167,203,240, 47,129, 34,211,206, 29,255, 49,239,248,190, 47,243,126, 90, 55,131, 28, 93, 25,134,205,155,
+ 55,135, 76,158, 60,249, 71, 15, 15,143, 60, 0, 47, 50, 70,235,111,198,104, 52, 58,229,231,231, 83,187,119,239, 30,161, 80, 40,
+ 30,113, 56,156, 15, 1,240,254, 43, 7, 92, 42,149, 94,149,203,229, 74,133, 66,161,148,203,229,183, 27, 42,255,151,226,237,232,
+232,152,106,103,103, 23, 95,189,208,177,195,232,158,109,122, 77,250,196,222,127,100,191, 38,234,243, 56, 28,206,135, 10,133,226,
+209,238,221,187, 71,100,102,102, 82, 70,163,209,201,138,237,251,218,218,218, 62,184,113,227,198,226,252,252,252,126,233,215,191,
+113,204,185,177,195, 49,245,127,235,250, 71,156,220,178,216,198, 70,113, 31, 64,223,103,226, 72,106,105,103,176,216,193, 49,217,
+106,113,118,169,209, 57, 50, 69, 45, 3,216,253,161,111,194,143,152, 18,218, 25, 32, 3,238,102,104, 36, 87, 11, 29,157,127, 79,
+212,201,193, 98, 5, 67, 75,185, 52,185,193, 97,177,222,162,105,122, 16,143,199,123,135,249,134,122, 54, 16, 8,120, 0, 33,144,
+ 74,132, 0, 8, 88, 77,180, 70,124, 22,171,215,213, 17, 35,150, 45,236,208, 97,142, 47, 48,188, 14,179, 69, 1,120,219,215,215,
+247, 20,128,151,159,226,238,124,225,227,227,147, 9, 96,238,211,106,151, 58,119,238,220, 51, 56, 56,248,147, 78,157, 58,245,123,
+ 90,154,255, 38,114,174,126,245, 75,246,229, 45, 78, 89, 87,182, 58, 21, 39, 93,122,219,213,217,150, 78, 74, 74,194,176, 97,195,
+240,229,151, 95,138, 3, 2, 2,246, 0,112,251, 15,220, 74,129, 85, 63,240, 81, 99,140,150,197, 70,107,156, 23,122,189,210, 18,
+ 23, 95,242, 66,217,248,150, 80, 77,108,137,203, 99,189, 48,160, 49,181,177,183,183, 71,223,190,125,217,153,153,153,162,249,243,
+231,127, 34, 20, 10,147, 1, 12,110,140,150, 72, 36,138, 16,139,197,233, 28, 14,231,137,186,136,197,226, 8,137, 68,146,206,225,
+112, 6, 86, 47,151,201,100, 87,229,114,185, 82, 38,147,221,174,195, 8, 69,200,229,114,165, 84, 42,141,168, 94,206,225,112, 6,
+ 74,165,210, 12,153, 76, 86,179,124,128, 76, 38, 75,175, 89, 94, 23, 92, 46,215, 61, 61, 61,221, 41, 35, 35,195,137,207,231, 59,
+ 87, 47, 79, 75, 75,115, 74, 79, 79,127,162,220, 26, 56, 28,206, 0,137, 68,146, 46, 22,139, 35,106, 43,175,185, 79,117, 81,237,
+216, 13,176,164,220,218,134, 39, 52, 52,244,114,118,118,182,135,141,141,141, 77,245, 21,118, 10,155,193, 63,124,179,117,222,200,
+161,161,111, 57,250,141,106,223, 72,253,193, 66,161, 48,121,254,252,249,159,100,102,102,138,122,244,232,193,102,177,172,250, 61,
+ 17, 50,114,228,200,163, 74,165,178, 89,199,142, 29,217, 38,147, 9, 49,199,150, 64, 28,245, 14,132,201,219,209, 92,148,199,121,
+244,235, 42,247,208,254, 93,142,226, 31, 30, 12, 74, 14,250,241, 64,209,125,105, 66, 28, 31,100,106, 29,135,141,120,145,115, 39,
+ 93,227,104, 52,155,237, 0,118,127,242,157,167,160, 81,154, 28, 99, 31,154, 16,231,243, 41, 92,199,224,151,230,176, 47,164,112,
+ 28,141,102,179, 61, 88,232,215, 24,205,234,151, 63,155,205,158,183,110,221, 58, 22,128,217, 0,248,255, 37, 67, 19,228,134,102,
+ 3, 90,179,111, 6,186,162,215, 83,148, 13,168,188,223,189,155, 42,180,235,187, 83,152, 58,125, 39,218,250,118,111,146,142,158,
+166,227,246, 39, 37,157,153,216,186,117,216,194, 14, 29,166,212, 98,182, 40, 0, 11, 87,173, 90, 53, 41, 38, 38,198,177,101,203,
+150,211,159,210,143,254,141,171, 86,173,122, 63, 38, 38,198,205,203,203,235, 51, 43, 53,235,108,151,108,109,109, 7,239,218,181,
+107,222,176, 97,195,222,234,220,185,115,251,167,161,249, 47,230,203,187,119,239,122,172, 91,183,238,131,169, 83,167,150, 2,192,
+192,129, 3,121, 0,122, 52,185,189, 35,132, 79, 8, 9, 38,132, 12, 35,132, 12, 36,132, 4, 85,254,221,181,114, 25, 70, 8, 9,
+169,241,218,181,114,219,170,245,221,234,208, 24, 86,115,187,106,219,212,252,255,137,191,107, 49, 90,195, 80, 49, 86,107,216, 19,
+ 59,112,226,196, 9, 82,253,181, 38,227,189,240,233,156,158,205,212, 15,142,239, 37,170,244, 36, 82, 20,123,135,220,217,185,130,
+204,233,234,168,126,181, 37,190,176,254,120, 17,114,229,202, 21, 18, 19, 19, 67, 84, 42, 21,121,248,240, 33,233,214,173,155, 70,
+ 44, 22,159, 7,224,101,141,152, 76, 38, 83,158, 63,127,158,132,134,134,150, 72,165,210,181, 85, 55,151, 92, 46, 87, 94,185,114,
+133,132,134,134,150,200,100,178,141, 0,216, 0, 48,118,236,216, 92, 66, 8,113,116,116,204,170, 77,111,228,200,145, 69,132, 16,
+162, 80, 40,170,186,154,216, 50,153,108,227,172, 89,179, 84,183,110,221, 34,182,182,182, 85,229, 44,185, 92,190,118,246,236,217,
+170,200,200,200,234,229,245, 98,103,103,151,110, 54,155,201,241,227,199,137,147,147, 83, 86,181,155, 57,221,108, 54,147,163, 71,
+143,214, 89,183,250, 2, 5, 82,169,116,205,196,137, 19,203, 82, 82, 82,136,189,189,189,178, 90,249,218,201,147, 39,151,165,165,
+165, 17, 7, 7, 7,139,234,104,111,111,175,188,122,245, 42, 25, 51,102, 76,105,245, 99,106,111,111,175,188,118,237, 90, 85,249,
+ 26, 75, 26, 50, 55, 55,183,233, 78, 78, 78, 89, 78, 78, 78, 89, 54, 54, 54,203, 93, 93, 93,115,242,242,242, 8, 33,132,180,106,
+213, 42,183,122, 36,203, 41, 96,196,187,219, 15, 94,187,113, 41,186, 32,175,195,160,183,214, 40, 58,140, 84, 88,113, 12,188,196,
+ 98,241,249,126,253,250,105,210,211,211, 73,121,121, 57,137,138,138, 34, 87,174, 92, 33, 9, 9, 9, 4,128, 37, 79, 24,144, 73,
+165,210, 76,157, 78, 71,235,116, 58, 58, 47, 47,207,156,155,155,107,142, 93,235, 74,200,183,220,199, 75,241,209,225, 36,231,210,
+ 74, 90, 46, 21,103, 0,144,253, 99, 70,107,171,191, 59,217,225,179,255,254, 18,143,216, 75,171, 94, 48,146,148, 11,100,239, 20,
+ 71,227,197,119,155, 61, 34,219,124,127, 38, 59,252,154, 55, 74,115,155,223,222,168,143, 61,226,182,124,246,182, 49, 53, 53,149,
+ 44,152,252,130,233,236,156,102,137,100,187,239,193,198,104, 86,227,149,209,163, 71,171,210,210,210,136,191,191,127, 57,155,205,
+158,250, 95, 50, 89, 33,222,252,204,168, 31, 23,208,195, 3,196, 5, 79,201,108, 5, 56, 57, 57,229,127,255,253,247, 68, 38,147,
+229, 54,214,108,141, 27,213,159,104, 74,206,147, 81, 97, 65,245,222, 35, 47,189,244, 18, 9, 14, 14, 38,115,230,204,105,232, 94,
+162,124,129, 17,187, 59,116, 56, 74,143, 27,103,222,221,161,195, 81, 95, 96, 68,165,193,162, 0,124,176,122,245,234, 72,163,209,
+ 24,249,221,119,223, 69,142, 24, 49, 34, 18,192,130, 38, 30,139, 77, 95,124,241, 5, 49, 26,141,228,187,239,190, 35, 35, 70,140,
+ 32, 0, 54, 55,165, 93,170,138,100, 5, 6, 6,190,123,228,200,145, 27,113,113,113,121, 97, 97, 97,107, 58,116,232,160,104,172,
+230,179,136, 84, 42,109,211,190,125,251, 61,254,254,254,105, 29, 59,118,212,251,249,249,105,189,189,189, 83, 2, 2, 2,190, 23,
+ 8, 4, 94,141,148,237,222,171, 87, 47,243,197,139, 23,201,232,209,163, 73, 53, 19, 82, 47,245,121, 17, 66, 72,208, 7, 31,124,
+240, 33, 0,242,193, 7, 31,124, 72, 8, 25, 86,233, 39,134, 85,255,187,230,107,149,121,170,250,191, 54,141,170,165, 54,205,218,
+ 62,163,198,231,160,142, 72,214,180, 63,237,220,137, 19, 39,250,157, 56,113,226, 98,205,157,123,177, 37,122,206,233,217, 76,163,
+201,203, 38,209, 43,222, 33,191, 5,187,147, 43,253, 93, 72,252,188,209, 36,251,199,141,100,102, 39, 91,245,184,150, 8,182,214,
+104, 69, 70, 70,146,200,200, 72,114,251,246,109,146,156,156, 76, 74, 74, 74,200, 79, 63,253,100,182,183,183,215, 8, 4,130, 85,
+ 0, 68,150,136,201,229,114, 37, 33,132,232,116, 58,178,124,249,114,109,101,164,202, 89,161, 80, 40, 9, 33,164,184,184,152,172,
+ 90,181, 74,171, 80, 40,162, 0,184, 57, 56, 56,164, 39, 37, 37, 17,103,103,231, 90,205,140,173,173,173, 50, 46, 46,174,202, 56,
+ 53,179,181,181,141, 62,118,236,152,129, 16, 66, 50, 50, 50,136,157,157,157, 18,128,179,189,189,253,157, 19, 39, 78, 24, 8, 33,
+ 36, 43, 43,171,170,220, 34,163,165,209,104,200,217,179,103,159,168, 67, 85,249,169, 83,167,158, 48, 96, 22,224,172, 80, 40, 34,
+127,250,233, 39,189,217,108, 38,209,209,209, 85, 38,209,217,198,198,230,246,193,131, 7,245,102,179,153,196,198,198, 90,108, 6,
+ 91,180,104,145, 75, 8, 33, 38,147,137,108,223,190, 93, 87,117, 76,171,202,245,122, 61,249,234,171,175,116,114,185, 60, 18, 64,
+189,209, 55, 7, 7,135, 44,189, 94, 79,138,139,139, 73,183,110,221, 84, 87,174, 92, 33,165,165,165,132, 16, 66, 90,180,104,145,
+ 11, 0, 62,253,166,126,126,227,161,170,244,245,247,183, 30,240, 10,122,117,197,153,155,153, 25,187,142, 68, 68, 58, 4,140,124,
+193,146,160,166, 64, 32, 88,229,234,234,170,253,253,247,223,205, 6,131,129,164,165,165,145,219,183,111, 63,190,198,238,221,187,
+103,145,209,226,112, 56, 75,110,220,184, 97, 48,155,205,116,126,126,190, 57, 55, 55,215,156,155,155,107,170,105,180,200,183, 92,
+146,127,234, 77, 18,190,115,174,158,199,227, 45,249,103,162, 89, 96,147, 29, 62, 35,201, 14,159,200,239, 39, 58,228,151,221,222,
+ 71,200,175,115, 73,226,231, 45,201,146, 23,100,101,244, 14,159, 72,178,195,119, 28,249,180, 31,199, 42,205,157,126,195,201, 14,
+159,200, 47, 94,244, 44,184, 19,121,139, 92,188,120,145,124,181,113, 53,153, 19,210,172,156,222,225, 19, 73,182,249,141,177, 70,
+179, 58, 2,129,224,225,229,203,151,201,165, 75,151,200,103,159,125, 70,196, 98,113,218,211,136,234,145,109,222,158,228,107,239,
+126,228,155,182,174,228,127,253,158,185, 9, 62, 65,110,104, 54,200,155,159,145,127,231, 8, 33,133, 9, 36,103,173, 63,121,193,
+135,219, 84,179, 21,224,228,228,148,151,146,146, 66,114,114,114,200,250,245,235,137, 92, 46,111,148,217, 26, 55,170, 63,209, 20,
+159,171,215,104,141, 28, 57,146,108,216,176,129, 24,141, 70,210,189,123,119, 75,126,180,252,201,108,249, 0, 35, 1,124,184,102,
+205,154,199, 38,107,235,214,173,145,247,238,221,139,244,240,240, 56,217,132, 99,177,121,205,154, 53,143, 77,214,214,173, 91,201,
+189,123,247,136,167,167,103,122, 83,218,165, 65,131, 6,125,158,156,156, 92,186,104,209,162, 3,125,251,246, 93,113,231,206,157,
+140,240,240,240,200,192,192,192, 23, 26,171,249, 20,162, 58,156,202,200, 14,159, 16,194, 37,132, 84,153, 87, 14, 0,110, 85, 64,
+193, 18, 38, 78,156, 40,238,217,179,103,228,132, 9, 19,212,223,127,255, 61, 73, 73, 73, 33, 81, 81, 81,100,205,154, 53,228,147,
+ 79, 62, 33,223,126,251, 45, 25, 51,102, 76,121,183,110,221,110,140, 27, 55, 78,104, 69, 53,253,189,188,188, 74,142, 30, 61, 74,
+246,238,221, 75,120, 60, 94,184,165, 27,214,231, 69,234, 50, 83,117, 25,172,154,235,234, 49, 98,245, 26, 54, 11, 62,239,207,166,
+170,102, 36,164,218,223,255, 11, 11, 11,235,247,167, 47, 31,130,165,211,230,127, 46, 76,254,126, 61,148, 63,125, 9,118,177, 18,
+220,178, 2,232, 46,135,195,120,249, 24, 38,245,232, 33, 18, 81,212, 50,107, 47, 24, 62,159, 15, 62,159, 15, 30,143, 7,181, 90,
+141,172,172, 44,244,238,221,155,117,251,246,109,225,244,233,211,231,138, 68,162, 52, 0,163, 26,188,155,169,138,136,244,213,171,
+ 87,241,230,155,111, 10,246,236,217,211,209,209,209,241,174,217,108,230, 3, 64,108,108, 44,198,143, 31, 47,216,183,111, 95, 59,
+ 55, 55,183,219, 6,131, 65, 44, 16, 8,192,102,179,235,212,227,243,249, 48, 26,141,130,182,109,219, 70,221,189,123, 55, 32, 44,
+ 44,140,155,154,154,138,164,164, 36, 24,141, 70,190,183,183,247,189,219,183,111,119, 28, 54,108, 24, 55, 61, 61, 29,169,169,169,
+143,235, 97, 73,125,245,122, 61, 4, 2, 1,170,119,105, 81, 20, 5,157, 78, 7, 62,159,111,177, 22,135,195, 25,224,235,235,123,
+239,238,221,187,129, 35, 71,142,228,221,186,117, 11, 25, 25, 25, 48,155,205,124, 63, 63,191,123,119,239,222,237, 52, 98,196, 8,
+ 94, 84, 84, 20,148, 74, 37, 44,237, 66,171,122,223,221,187,119, 49, 97,194, 4,254,233,211,167, 59,185,186,186, 70,153, 76, 38,
+ 62, 0,220,187,119, 15,227,199,143,231,159, 57,115, 38,176,121,243,230, 81, 13,116, 37,178, 1,192,104, 52, 98,250,244,233, 18,
+185, 92,142,244,244,116,208, 52, 13,179,217, 12, 0, 40, 40, 42,184,119,247, 94,116,236,164, 87, 94,236,167, 49,232,116,215,110,
+ 70, 60,104,213,194,211,157,162, 72,139, 6,170, 58, 74, 34,145,164,173, 93,187,246,221,148,148, 20,129,175,175, 47, 43, 49, 49,
+ 17,101,101,101,224,241,120,143,175, 49, 75,247,155,207,231,247,247,247,247,231,104,181, 90,208, 52, 13, 0,132,197,170,125,196,
+138,176,248, 50,252,156, 77, 92,145, 72,212,255, 31,249,246, 46,245,183, 7,141, 65,169,121,122,129,192,198, 93, 38,117,245, 6,
+210, 46,161,165,163, 0,108, 22, 91,120, 43, 73, 45, 1,200, 32,120,228,219, 91,167, 73, 15, 74,202,213, 11,140,118,237,164,110,
+238, 30, 40, 40, 40, 64,243, 86,190,208,242, 29,249, 87, 19,202,165,160,172,212,252,131, 62,109,219,182,117,105,211,166, 13,242,
+243,243, 17, 24, 24, 8, 91, 91, 91, 91, 0,131, 26,253,165,243,157,167, 0,165,232, 5,176,214,194, 76,125, 6, 35,103, 37, 18,
+242, 2,201,142, 64,238,179,100,178,228, 82,254,245,125,251,127,106,102,239,225, 7,132,191, 14,103, 27, 1,190,121, 43,208,206,
+ 81, 33, 56,218, 72,179, 21,224,236,236,124,225,198,141, 27, 14, 66,161, 16,183,111,223,134,191,191, 63,214,175, 95,239,104,107,
+107,123,169,113,145, 45, 2, 66,213,109,178,250,246,237,139,217,179,103, 99,207,158, 61,176,179,179,195,132, 9, 19, 26, 50, 91,
+ 36, 22, 56,254, 69, 84,212,119,123, 30, 61, 58, 49,177,117,235,176, 9,222,222,203,103,188,252,242,212,183,223,126, 27,171, 87,
+175,198,209,163, 71,209,171, 87, 47, 76,155, 54,205,152,150,150,182,187,177, 93, 85,107,215,174,157, 51,119,238,220,154,154,134,
+212,212,212, 47,154,212, 46, 21, 20,220,139,138,138,138,125,229,149, 87,250,105,181, 90,221,205,155, 55, 31,120,121,121,185, 3,
+104,209, 88,205, 38, 24, 44,138, 16, 34, 4, 32,174, 92, 36, 0,196,251,246,237, 83,140, 28, 57, 82, 94, 89, 38,170, 92, 26,236,
+222,247,247,247,119,127,248,240, 97,230,188,121,243, 2,247,236,217, 35, 18,139,197, 40, 46, 46,198,215, 95,127,141, 15, 63,252,
+ 16, 20, 69,129, 16,130,111,191,253, 86, 60,101,202,148,160, 71,143, 30,101,122,122,122, 90, 50,164, 69, 32,149, 74, 15, 46, 95,
+190, 92, 78,211, 52, 22, 46, 92,152,111, 48, 24,102, 87,174, 91,100, 99, 99,115, 29, 21,134,187, 62,106,245, 34,213,190, 43, 79,
+212, 56, 54, 97, 53,203,106,174, 35,132,132,213,167, 97,229,185,168,237,243,194,235, 51, 91,213,191,129,250,215,234, 34,129, 14,
+ 46, 94, 62, 40,249,245, 32, 68, 28, 10, 34,118,229,194,161,192, 74,188,135,230, 66, 46,140,132, 4, 52,214,104, 85, 45, 92, 46,
+ 23,106,181, 26,102,179, 25, 31,126,248,161,224,236,217,179,246, 44, 22,235,231,134,116,170, 27,166,248,248,120,248,249,249, 81,
+199,143, 31,119,158, 61,123,182,168,234,115, 74, 74, 74,208,166, 77, 27,234,212,169, 83, 78, 31,127,252,177,180, 62, 51, 67, 81,
+ 20,120, 60, 30,230,206,157, 43,186,121,243,166,157,155,155, 27, 18, 19, 19, 81, 88, 88, 8,169, 84,138,185,115,231,138,110,220,
+184,225,232,230,230,134,148,148, 20,148,148,148, 64, 42,149, 90,109,180,120, 60,222, 19,219, 80, 20, 5,131,193, 96,149, 49, 80,
+ 40, 20,123, 35, 35, 35, 29, 21, 10, 5,162,162,162, 96, 50,153,160, 80, 40, 48,103,206, 28, 81,100,100,164,163,141,141, 13, 98,
+ 99, 99, 65, 8,129, 92, 46,183,170,142, 0, 64,211, 52, 98, 99, 99,209,162, 69, 11, 92,186,116,201,105,198,140, 25,194,170,242,
+132,132, 4,184,187,187,227,210,165, 75, 78, 18,137,100,111, 93, 90, 52, 77, 35, 59, 59, 27, 49, 49, 49, 72, 76, 76, 68, 94, 94,
+ 30,242,243,243, 81, 86, 86, 6,147,201, 4, 0, 16,151,149,134,239, 59,112,252,174, 72, 36, 18,251,123,183,245,184, 23,125, 63,
+ 87, 36, 18,137, 61, 61, 60,188,129, 79, 89,245, 24,194,159, 83, 83, 83,237,167, 76,153,194,203,201,201, 65, 81, 81, 17, 56, 28,
+206,159,174, 45, 62,223,178,161, 64, 38,147,201, 79, 40, 20, 82, 6,131,225,113, 4,140,207,231,227,221,189,106,248, 47,193, 19,
+203,203, 27,115, 65,204, 70,232,245,122,191,191, 61,154, 5, 80,160,244,109, 65, 81,129,215, 19,203,237,250,132,189,194, 67,210,
+105,128, 54, 2, 44, 14,250,119,112,231, 28,189, 87,238, 12,130, 14,208,193,151,144,134,103,126, 17,128, 2, 12,109, 0,170,203,
+217,135, 38,251, 94,163,223,226,101,102,102,130,199,227, 65, 32, 16, 32,112,192, 88,206,190,187, 70, 23, 80,232, 8, 3,124, 44,
+209,124, 34,236, 40, 18, 45,254,228,147, 79, 36,213, 53,167, 78,157, 42, 81, 40, 20,159, 52,218,100,149,139,123,192, 68,230,198,
+100,170, 91, 44, 15,207,241,123,148,171,241, 1, 33,243, 0, 99,167,167, 96,182,250, 11, 4,130, 36, 0,189,155,100,178,100,252,
+107,251,247,255,212,204,174,121,133,201,130, 73, 11,112, 69,112,113,180,193, 55,239, 6,219, 57,218,136,172, 53, 91, 1,206,206,
+206,231,175, 95,191,238, 32, 20, 10, 17, 25, 25, 9, 30,143, 7,161, 80,136,246,237,219, 99,199,142, 29,142,118,118,118, 86,155,
+ 45, 2, 82,107,204,119,212,168, 81,164,111,223,190,152, 53,107, 22,118,239,222, 13,189, 94,143,229,203,151, 35, 53, 53,213, 34,
+217, 88,224,248,170,168,168,239, 87,198,196,196,127, 16, 16,224, 59, 74, 34,177,155, 53, 97,130,226,227,143, 63, 62,113,236,216,
+177,239,134, 13, 27,150,127,243,230,205, 13, 0, 14, 90,121,120, 41, 0, 91,215,173, 91, 55,171,202,184,125,252,241,199,223, 30,
+ 59,118,108,229,176, 97,195,178,111,222,188, 57, 15,192,214,166,180, 75, 52, 77,135,255,252,243,207,119, 69, 34,145,216,199,199,
+199, 35, 58, 58, 58, 87, 36, 18,137, 61, 60, 60,188,251,245,235,199,106,140,102, 99,112,114,114, 26,120,253,250,117,127, 84, 76,
+ 26, 19, 84, 25,173,232,232,104,155,210,210, 82, 27,169, 84,106,227,234,234, 42,171, 50, 91,163, 71,143,182,225,112, 56,245, 94,
+183, 42,149,234,216,162, 69,139, 20,163, 71,143,174,250, 31,151, 47, 95,198,238,221,187, 33,145, 72,158,120,239,136, 17, 35,240,
+230,155,111,218,234,245,250,159, 45,168,238,228,233,211,167,251, 56, 59, 59, 99,241,226,197,186,204,204,204,129, 0, 82, 1, 40,
+ 66, 66, 66, 62,143,142,142,238, 22, 20, 20,116, 0, 64,231,250,238,189,218,188, 72,117,163, 99, 73, 89, 99,223,111,169,217,170,
+ 81, 84,103, 14,173, 39,140, 86, 88, 88,216, 69,212, 49,147,202, 80,168,132, 0,102,136,216, 20,196,236,106,102, 11, 52, 56, 37,
+185,160, 26, 49, 75,165,182, 47, 67, 62,159, 15, 54,155, 13,189, 94, 15, 75, 31, 84, 93,101, 10,228,114, 57,164, 82, 41, 52, 26,
+ 13, 76, 38, 19,132, 66, 97,149, 25,129, 92, 46, 7,151,203, 5,151,203,133, 80, 40,252, 83, 52,169,102, 52,135,199,227, 65, 34,
+145, 32, 59, 59, 27,169,169,169,160,105, 26, 82,169, 20, 18,137, 4,124, 62, 31, 89, 89, 89,200,202,202, 2, 33, 4, 18,137, 4,
+ 18,137, 4,214, 12,184, 54,155,205,181,126,249, 27,141, 70,171, 34, 90, 38,147, 9, 15, 30, 60, 64, 90, 90, 26,132, 66,225,227,
+125, 21, 8, 4, 72, 72, 72, 64, 78, 78, 14,196, 98, 49,228,114, 57, 20, 10,133,197,186, 85,251, 34,147,201, 32, 18,137, 80, 84,
+ 84, 4,181, 90,253,248,152,202,229,114, 72, 36, 18,148,148,148, 32, 55, 55,183,222,125, 55,155,205,200,202,202, 66, 94, 94, 30,
+210,211,211,145,159,159,255,184, 1,170,140, 26, 53, 45,176, 83, 90,138,130,130,130,199,145,200,186, 22, 75,160,105, 26,101,101,
+101,184,126,253, 58, 69,211, 52,138,139,139,233,188,156, 28,243,204, 44, 62,142,126,186,141,252,116,250,142,118,223,201, 72,205,
+225,243, 49,154,173,135,239,105,132,221, 62, 51,225,159,224,171, 0, 5,140,220,208,124,149, 81,144,103,224, 41,156, 3, 66,128,
+164, 83, 0,139, 3, 8,109,209,189, 93, 75,164, 22,153, 37,113, 74,189, 16, 20, 6, 99,171,183,173, 69,154,102,238,160,188, 50,
+163, 32,197,224, 40,247,235,208, 25, 74,165, 18, 2,129, 0, 2,129, 0, 93,122,133, 32,169,192, 44,190,159,169, 17,131, 32,212,
+ 34,205, 63,104, 37,149, 74,123,244,238,221,155,170,174, 57,116,232, 80, 80, 20,213, 30,128,175, 85,141,220,230, 86,124, 24,196,
+221,193, 33,115,239,103,171,221,142, 70,107,189,135,143, 26,107,183,233, 92,174,223,131, 28,157, 23,136,113, 62,136,161,115, 19,
+204, 86, 63,153, 76,118, 98,203,150, 45, 94, 66,161,240, 20,128, 62,141, 17,145,138,216,219, 23,207,122,165,153,109,149,201, 50,
+170, 1,142, 8,224,138, 0,142, 8, 46, 78, 14, 88,246,230, 32, 59,177,144,123,216, 10,195,186,111,235,214,173,142, 53, 77, 86,
+213, 18, 24, 24,136, 37, 75,150, 56,218,217,217,237,181, 68,111,237,154,213,164,184,164, 4, 32, 64,105,169, 10,107,215,172, 46,
+170, 90, 55,122,244,104,210,167, 79, 31,204,154, 53, 11, 43, 87,174,196,201,147, 39,209,189,123,119, 76,155, 54, 13, 65, 65, 65,
+ 13, 73,135, 42, 20,138, 61, 33, 33, 33,215,179,100,178, 55,179, 59,119,230,159, 87, 40, 74, 6,150,148, 40, 60,163,163, 13, 62,
+192, 61, 0, 95,101,100,100,188, 96,133,201,122, 89, 46,151, 71, 14, 28, 56,208, 32,147,201,210,214,175, 95, 63,115,246,236,217,
+ 88,189,122, 53, 22, 45, 90,244, 53,128, 55, 0,124,148,145,145,225, 86,159,201,250,171,218,165,191,170,173, 51,155,205,233, 7,
+ 15, 30, 12, 50, 24, 12,238,149,221,131,130,226,226, 98,121, 97, 97,161,204, 96, 48, 72,104,154,150,216,216,216, 72, 1,136, 39,
+ 77,154,196,185,127,255,190,159,201,100,202,172, 79, 51, 39, 39,231,213,133, 11, 23,230,231,231,231, 3, 0,218,183,111,143,226,
+226, 98, 44, 88,176, 0,239,188, 83, 49, 33,184, 83,167, 78, 32,132, 64,169, 84, 98,237,218,181,202,156,156,156,215, 44,168,110,
+235,182,109,219, 34, 58, 58, 26, 15, 30, 60, 56, 7,128, 70,197, 56,214,146, 59,119,238,220,205,203,203,195,222,189,123,121,205,
+154, 53, 59,134, 58, 82,188,212,231, 69, 26, 3, 69, 81,225,141,217,174, 42,114, 85, 91, 68,172, 14,234,143,104,133,133,133, 81,
+213, 95,159,136, 24, 81,136, 74,139,184, 4,187,128,206, 79, 68,179,196,108, 10, 34,185, 2, 73,233,169,224,129,138,121, 90, 70,
+171,168,168, 8, 51,103,206,212,188,250,234,171, 5, 52, 77,143,181,212, 20, 40, 20, 10, 40, 20, 10,220,191,127,159,140, 25, 51,
+ 70,185,126,253,122, 77,117,163, 21, 31, 31, 79, 66, 67, 67,115, 63,249,228, 19, 85,125, 70,171, 42,162,181,106,213, 42, 77,255,
+254,253,243, 98, 98, 98, 72,149,153,146, 74,165, 88,187,118,173, 38, 56, 56, 88,121,235,214, 45, 82, 85,102, 77, 68,139,197, 98,
+ 61, 54, 90,213,183, 97,177, 88,160,105,218, 42,163, 85, 94, 94,254,234,176, 97,195,148,177,177,177,164,106, 63, 21, 10, 5,214,
+175, 95,175, 25, 52,104,144, 50, 38, 38,134, 84,149,201,229,114,139,205, 96,213,231,203,100, 50,200,229,114,220,191,127,159,132,
+134,134, 42, 55,111,222,172,173, 94,254,224,193, 3, 50, 98,196, 8,101, 89, 89,217,171,245,153,151,170,238, 60,147,201, 4,173,
+ 86,139,252,252,124,164,167,167, 63, 14,167,107, 36,242, 23, 94,121,105,120, 71,141, 70,163,190, 31,255, 48,173,125, 59,127, 39,
+141, 70,163, 78, 77, 75,139, 7, 62,165,235,209, 30, 27, 16, 16, 80, 48,115,230, 76, 77, 81, 81, 81,147,141, 22,159,207,143,229,
+112, 56,164, 79,159, 62, 68,175,215,147,244,244,116, 99,126, 81,145,201,119,197, 10, 18,243,238,187,148, 40, 34, 66, 32,149, 74,
+169, 74, 77, 86, 98, 98, 34, 45, 18,137, 98,255,118,163,197,162, 93, 64,145,222,191, 63, 84,217, 12, 26, 62,158, 79,229,220, 4,
+ 12, 42, 64, 96, 11, 8,108,193,145,216, 99, 72,159, 78,236,239,175,151,186,128,208, 61,193, 19,184, 55,168,201, 37,206, 0,221,
+231,215,120,173,109,239,113,115,248,133,133,133, 96,179,217,143, 77,145, 88, 34,193,192, 81,147, 88,223,222,212,185, 0,164, 23,
+ 40,182,187, 21,247,250,251,139, 23, 47,230, 21, 21, 21,129,197, 98,253,161, 41, 22, 99,198,140, 25, 2,185, 92,190,200,226,198,
+239,160, 31, 15, 92, 65,119,128,188, 19,151,163,117, 59,118, 79,227, 51,127,213, 55,162,128, 78, 65,152,222,223, 73,180, 42, 60,
+ 55,224,110,186,166, 37, 96,126, 23, 38,125,151, 70,152,173, 62, 50,153, 44, 60, 34, 34, 66, 60,116,232, 80,172, 93,187, 86, 34,
+ 18,137, 78, 53,166,225, 47, 87,153,103, 47,221,252,131, 50,106,195, 96,192, 80, 94, 97,176,170, 45,185, 42, 26, 75,190,185, 80,
+ 98, 52,146, 87, 44,213,212,104, 52,147,223,120,227,141,130,195,135, 15,255,201,100, 9,133, 66, 36, 39, 39, 99,249,242,229,133,
+133,133,133, 13,126, 41,174, 95,183, 54, 50,250,238,111,248,246,235,165, 0, 8,182,172,127, 11,215,126,223,111,211,191, 95, 95,
+210,162, 69, 11, 18, 20, 20,132,153, 51,103, 98,217,178,101,136,139,139,131,131,131, 3,222,122,235, 45,244,235,215, 15,235,214,
+173,171,175,145, 10,157, 61,123,246,242,140,140, 12,159, 95,127,253,149,147,151,151,231,180,110,215,174,146, 67, 37, 37,133, 43,
+163,163,227, 62,106,215,174,237, 7, 29, 58,188, 86, 79,234,135, 90, 77,214,172, 89,179,246,101,100,100, 4,158, 59,119,142,155,
+151,151,231, 62,107,214, 44,172, 89,179, 6,139, 22, 45,218, 1, 96, 58, 44,155,240, 98,113,187,196,102,179, 95, 24, 59,118,108,
+ 71,141, 70,163,142,139,139, 75,107,215,174,157,147, 70,163, 81,167,165,165,197, 95,188,120,145,110,140,102, 99, 40, 40, 40,120,
+180,119,239,222,248, 57,115,230, 4,102,100,100,248, 1,176, 47, 43, 43,147,148,149,149, 9,244,122,189,200,214,214,214,182, 83,
+167, 78, 14,211,166, 77,147,222,185,115,199, 47, 35, 35, 67, 85, 25, 69,170, 19,131,193, 16, 87, 84, 84, 20, 54,120,240,224,226,
+162,162, 34,116,232,208, 1,195,135, 15,135,139,139, 11,220,220,220, 48,114,228, 72,120,123,123,163,160,160, 0,175,188,242, 74,
+ 97, 94, 94,222, 96, 0,137, 22, 84,247, 81, 78, 78, 14,122,246,236,137,165, 75,151,134,189,248,226,139, 49,125,250,244, 41,109,
+215,174,157,218,221,221,221,119,211,166, 77,104,214,172, 25, 14, 30, 60,232, 42, 16, 8,246,214, 98,178,234,244, 34, 0,242, 42,
+ 13,143,190,198,107, 94, 3,235, 44,221,182,214,191, 45,120, 95, 77,179, 85,125,249, 83,215, 97,237, 39, 4, 88,178,251,224,247,
+ 90,190, 71, 27, 40,124, 58, 66, 44, 20, 66,196,231, 67,100,107, 15, 29, 77, 99, 87,114,142,186,156,144, 69,214, 94, 60, 53,191,
+ 8, 41,138,194,151, 95,126,105,234,209,163,135,246,194,133, 11, 91, 52, 26,141, 7, 42,178,202, 90,108, 10, 54,111,222,172,158,
+ 59,119,238,221,220,220,220,142, 66,161, 80, 95, 85,190,101,203, 22,245,164, 73,147,162, 51, 50, 50, 2,197, 98,177,186,174,241,
+ 89,213,141,150, 64, 32,208,229,230,230, 6, 77,157, 58, 53,246,171,175,190, 42, 23,139,197,144, 72, 36, 16, 8, 4,250,220,220,
+220,142, 51,103,206,188,187,102,205, 26,181, 72, 36,130, 68, 34,177,170, 91,142, 16,242, 39, 67, 85,189,220, 82, 76, 38,211,133,
+220,220,220,142,115,231,206,189,179,105,211,166,242, 42, 3, 84,189,142,235,214,173, 83, 75,165, 82,171, 34, 90, 85,239,147, 72,
+ 36,216,184,113,163,122,206,156, 57,119,115,115,115, 59, 10, 4, 2,125,181,242,242,217,179,103,223,201,205,205,237,104, 50,153,
+ 46,212,243,107,204, 92, 90, 90, 10, 14,135,131,232,232,104, 29,143,199, 3,139,197, 66, 66, 66,194,227,198,199,206,206,206,191,
+ 99,251,118,190, 63,236, 59,120, 81,196, 19, 8,122, 4,117,241, 75, 76, 73,205, 32,132, 74,105,160,170, 71, 52, 26,141,199,133,
+ 11, 23,182,244,232,209, 67,251,229,151, 95,154,234,138,108, 89,130, 78,167,187,120,251,246,109,163, 80, 40,164,178,179,179, 77,
+108, 54, 27,102,179,153,232,130,130,116,237, 55,109, 34,247, 63,248,128,146, 75, 36, 28, 30,143, 7,177, 88, 76,157, 62,125, 90,
+175, 86,171, 47,254,253, 70, 11, 98, 80, 16, 61,204,213,201,132, 44, 19,133,248, 35, 21, 38, 75,104, 3, 8,109, 1,161, 45,154,
+ 53,115,199,205,100,181, 12, 44,240, 97,182, 32,135, 24, 33, 18, 80, 16, 71, 43, 33,227,242, 69, 84, 78, 78,206, 99, 67, 84,181,
+120,181,241,195,237, 84,149, 20, 20, 17,128, 13,107, 82,144,132,217,219,219,115,178,179,179,255,164,233,239,239,207, 54, 26,141,
+150,167,118,201, 50,187, 2,244,172,248, 28,173,235, 47,119,203,125,222, 93,249,173, 72,100, 46, 6, 34, 54, 35,160,149, 27,222,
+ 29,215,137,255,241,177,188,128, 91, 41,234, 86, 96,147,204, 47, 15,255, 0, 0, 32, 0, 73, 68, 65, 84,233,160, 85,142, 86,212,
+179,183, 76, 38, 59,117,235,214, 45,177, 76, 38, 67, 98, 98, 34,130,130,130,176,115,231, 78,177, 88, 44, 62, 9,192,170,241,120,
+ 55,148, 72, 85,149,153,123,188,127, 48, 45, 39, 42,219,244,132,201,202, 43, 39,120,227,139, 99,197, 69,165,218,177,215,211,235,
+190,127,106,225, 78,113,113,113,232,162, 69,139, 10,242,242,242,158, 48, 89,169,169,169, 85, 95,138,253, 1, 52,248,227,247,127,
+191,157, 9, 92,177,108, 46,110, 69,196, 96, 72,216, 59,184, 29,245, 8, 31, 45, 28, 5, 27,185, 8, 23, 46, 92,192,232,209,163,
+177,116,233, 82, 36, 36, 36,224,167,159,126,162,118,238,220, 73, 93,191,126,157,250,226,139, 47,168, 6,134, 52, 76, 88,185,114,
+ 37,110,221,186,133,161, 67,135,226,210,165, 75, 40, 44, 44,196,254, 83,167, 30,238,125,248,240,163,170, 49, 91,117,164,126,168,
+ 21,185, 92, 62,127,229,202,149,136,136,136,120,172, 89, 80, 80,128,149, 43, 87,102, 0,120,203, 26,147,101, 77,187,212,161, 67,
+ 7,223,125,251,246, 93, 20, 10,133,130,160,160, 32,191,228,228,228, 12, 0, 41,141,208, 44,109, 74, 79, 85,126,126,254,213,157,
+ 59,119, 94, 31, 48, 96,128,120,242,228,201,142, 71,143, 30,181, 87,171,213,110, 2,129,192, 73,175,215,243, 31, 60,120,192, 62,
+116,232,144,203,253,251,247,147,181, 90,237, 77, 75,142, 71,110,110,238,205,184,184,184,193, 29, 58,116,120,176,101,203,150, 12,
+ 87, 87, 87,122,218,180,105,120,227,141, 55,224,232,232,104,222,184,113, 99, 90,159, 62,125,162, 31, 61,122, 20,162, 86,171,239,
+ 89, 88,215,239, 86,172, 88,113,101,223,190,125, 24, 62,124, 56,190,248,226, 11,236,223,191, 31,191,253,246,155,232,247,223,127,
+231,239,220,185, 19, 60, 30, 15,221,187,119, 71,104,104,232,192,202,238, 78, 75,191,151,110, 81, 20, 21, 78, 81,212,185, 26,175,
+183,234, 91,103,197,182,117,253, 93,239,251,106, 84,115,103,141,197,114, 38,180,194,167, 51,218,201,212, 87, 39,118, 39, 57,211,
+122, 19,229,120, 63,114,185,159, 29,153,218,154, 42,159,220,200,244, 14, 26,141,230,241,114,248,240, 97,226,226,226, 82, 46,147,
+201,172, 78,239,224,226,226,162, 44, 45, 45, 37, 93,187,118, 45,116,116,116,124,156,138,192,213,213, 85, 89, 94, 94, 78,186,119,
+239, 94,232,228,228,244, 56,189,131,187,187,123, 58, 33,132,120,122,122,102,213,165,103, 50,153,136,139,139, 75,213, 12, 61,174,
+157,157,221,182,110,221,186, 21, 42,149, 74,226,234,234,250, 56,117,130,163,163,227,218,160,160,160,154,229, 13,213, 55, 61, 35,
+ 35,131,100,100,100,144,230,205,155,103, 85, 47, 79, 77, 77, 37,169,169,169,196,221,221,221,234,244, 14,142,142,142,107,106,169,
+ 75,163,234,232,225,225,161,212,104, 52,164,103,207,158, 79, 28, 83, 15, 15, 15,165, 86,171,173, 42,183, 40,189,131, 72, 36,154,
+ 46, 20, 10,179,132, 66, 97,150, 64, 32, 88,222,162, 69,139,220, 3, 7, 14,144,141, 27, 55, 86, 77, 73,135,163,255,136, 30,109,
+122,190,246,145,163,255,200,249, 77, 73,239, 32,147,201,206,187,184,184,148, 31, 62,124,248,137,235, 75,163,209, 88,156,222, 65,
+ 36, 18,101,168, 84, 42, 90,169, 84, 26,175, 92,185,162,142,136,136, 80, 71, 71, 71,171,147,147,147, 53, 5,185,185, 6,165, 82,
+169, 41, 41, 41,209,221,189,123, 87, 39, 22,255, 51,233, 29,200, 78,239, 54,100,155,239,177, 71, 75,189,238,207,237, 43,214,222,
+ 91,214,145,144,159, 71, 19,114,242, 13, 66, 46,188, 79,110,238,152, 70,122,122, 9,204, 87, 22, 52,143, 39,219,125,126,177, 36,
+ 37, 3,217,217,190, 13,217,230,123,242,225,103, 94,247, 39,247,113,211,238,250,106, 35,185,113,227, 6,137,142,142, 38,137,137,
+137,228,228,145, 3,164,103, 43,113,133,230, 54,223, 99, 86,166,121,232, 37, 16, 8, 84,235,215,175, 39,215,175, 95,127,172,121,
+236,216, 49, 34, 22,139,213,128,101,179,150, 9, 64,145,109,254,163, 76, 95,249,252,254,241, 32,105, 89,193,137,247, 9,185,247,
+ 61, 33, 59, 3, 8,249,174, 27, 33, 7,134, 17,114,252, 53,114,125,227, 56,210,203,139,103, 36,219,125, 46,145, 29,254, 22, 15,
+182,231,114,185,165,135, 15, 31, 38, 89, 89, 89,228,210,165, 75, 36, 34, 34,130,196,198,198,146,180,180, 52, 18, 30, 30, 78,184,
+ 92,174, 22,141,120,108, 89, 55,103,120,134,180,229,101,223, 93,213,139,144,163,175,144,188,189, 19, 72, 88, 59, 89, 97,247,230,
+ 77,202, 71,215,201,222,222, 62, 63, 60, 60,156, 36, 39, 39,147,139, 23, 47, 18, 39, 39,167,124, 0, 22,143,151, 13, 27,210,135,
+ 16,253, 93, 18,220,183, 29,233,208,161, 29,233,215,171, 45,201,124,180,153, 4,117,110, 65,182,109,219, 70,148, 74, 37,105,209,
+162, 5,177,182, 98, 33, 33, 33, 55, 8, 33,145, 67,135, 14,141, 4,112, 58, 36, 36, 36, 50, 41, 41, 41, 50, 40, 40,232, 58,234,
+ 79,253, 80, 39, 3, 7, 14, 52, 16, 66,200,208,161, 67, 9,128,172,144,144, 16,146,148,148, 68,130,130,130,244,141, 57,120,150,
+180, 75,129,129,129, 61, 6, 12, 24,240, 81, 96, 96,224,124, 75,210, 59, 52,160,249,180,146, 80,179, 81,145,252,211, 31, 64,151,
+202,197,175,178,140,221, 4,205,215,184, 92,238, 46, 59, 59,187,223,108,109,109, 47,176,217,236,157, 0, 38,162,113,249,205, 88,
+149, 17,198,179,142,142,142, 9, 29, 58,116,208, 12, 30, 60,152, 12, 25, 50,132,204,154, 53,139,208, 52, 77, 14, 28, 56, 64,150,
+ 46, 93, 74, 90,219,219,155, 54, 2,249,219,129, 41, 96,168, 72, 88, 58,165, 21,117,241,213,150, 40,123,165, 37, 84,175,183,166,
+ 44, 73, 88, 26, 82,151,209,162,105,154,196,199,199,147,224,224,224,114,137, 68,146, 9,203, 19,150, 62,161,233,224,224, 16,225,
+228,228,244,167, 36,154,213,202,159, 72, 88,234,228,228,116,213,213,213, 85,233,232,232,120,187, 54, 77, 7, 7,135, 8, 87, 87,
+ 87,165,131,131,195, 19,201, 61,217,108,246, 80, 7, 7,135,204,154,229, 28, 14,103,128,147,147, 83,122,205,242, 58,246, 29, 46,
+ 46, 46,233, 89, 89, 89, 36, 47, 47,143,120,120,120,100,213, 52, 96, 57, 57, 57, 79, 24, 48, 75, 52, 27,170, 75, 61,117,172, 85,
+211,130, 99,218,152,243, 94,133,119,179,102,205,114,215,173, 91, 71,164, 82,233, 19, 83,158,125,250,190,190,248,198, 67, 85,233,
+ 27, 11,183, 29,168, 37, 97,169,165,201, 65, 7, 75, 36,146,204,224,224,224,242,248,248,120, 66,211, 52,161,105,186, 46,163, 85,
+155,230, 11, 93,186,116, 41,200,207,207, 55,151,149,149,153,210,211,211,117, 73, 73, 73,154,101,203,150, 25,242,242,242,180, 42,
+149, 74, 31, 21, 21,165,115,117,117,205, 3,240,130,181,231,168,145,132,212,236, 62, 35, 59,252,122,145,237,126,225,177,159,120,
+ 62,120,173,155, 68, 23,185,110, 40, 33, 23,222, 39,215,183,189, 65,122,120,241, 43, 12,209, 14,223, 83,228, 91,239,190,100,115,
+ 43,190, 69,154,187, 90,247, 33, 59,124, 79,221, 95,226,249, 96,116,103, 71,253,190,239,119,144,132,132, 4,114,236,208, 94,210,
+189,101,165,201,218,238,119,150,108,243, 11,182, 68,179, 54,179,245,205, 55,223,144,132,132, 4,242,203, 47,191, 88,106,178, 66,
+106, 51, 90, 31,134, 72,139,223,232, 38,212,189,210,137,175, 31, 25,192, 51,132,182,225,153,122,122,114,204, 29, 93, 89,180,159,
+ 35, 72,168,143, 72, 71,182,251, 92, 34,219,253, 6, 91, 90, 79, 62,159,159,134,106, 57,117,106, 46, 2,129, 32,175, 30,163, 21,
+210,160,217,242, 22,100,159, 95, 58,128, 12,239, 32, 43,176,208,100, 53,116, 45,117,114,112,112,200,255,238,187,239,136,179,179,
+115,158,133, 38,235,177,230,136,176, 80,146,250,232, 36,249,229,192, 74, 18,220,215,143,236,249,102, 46,185,113,233, 19, 50,108,
+ 72, 48, 9, 9, 9, 33,249,249,249,100,192,128, 1,196,218,122, 42, 20,138, 61, 42,149, 42,242,204,153, 51,145, 33, 33, 33,145,
+123,246,236,137,188,124,249,114,164, 88, 44,222, 83, 21,156,168,105,182,252,254,220,254,135,212,136,104, 69,150,149,149,145, 51,
+103,206,144,144,144, 16,178,103,207, 30,114,249,242,101, 34, 22,139, 35, 27,123, 31, 89,218, 46, 13, 26, 52,104,113,114,114,114,
+233,146, 37, 75, 14,212,146,176,212, 82,205,132,167, 84,207,167,210,134,252, 3,154, 50,145, 72, 20,121,247,238, 93, 82, 84, 84,
+ 68,218, 57, 59,147, 21,108, 54,201,224,241, 72, 22,143, 71,182, 1,133,255, 2,155, 52,173,174,174,195,191,154, 90,141,150, 86,
+171, 37, 11, 22, 44,208, 11,133, 66, 53,143,199,179,246, 17, 60,207,245, 69,232,224,224,112,213,217,217, 89,233,236,236,252,132,
+217,171, 94,238,224,224,112,251, 95,126, 3,122,243,120,188, 84, 46,151,251,228, 35,120,252, 71,244,104,221,107,242, 34,231,128,
+ 17, 67,154, 88, 79, 30,143,199,251, 80, 40, 20,170, 23, 44, 88,160, 87,169, 84,214, 24, 45, 0, 24, 36, 22,139, 51,119,239,222,
+173,121,248,240,161,177,176,176,208,116,227,198, 13, 99, 68, 68,132,254,211, 79, 63, 45, 19,139,197,153,168, 59, 45,193,223,114,
+ 60,201,230, 86,252, 42,179,117,111,145,103,236,240,118, 98,195,206,121,161,164, 71,139, 26, 38,171,238, 76,238,181,107, 86,154,
+173, 59, 31,123,196, 6,123, 75, 77, 43, 23,189, 75,186,183, 20, 61,105,178,172,208,172,105,182,196, 98,113,217, 39,159,124, 98,
+ 77, 36,235, 73, 67,184,203,199,131,236,240,221, 83, 97,162, 26, 88,182,249,124, 77,190,244,241,120, 86,238,163,110,206,240, 28,
+232, 45,136,177, 34,146,101, 73, 61, 59,217,218,218, 62,176, 34,146,245, 88,243,203, 47,183,144, 9,227, 7,145, 71, 15, 14, 19,
+ 85,193, 73,114,251,218,122, 50,102, 68, 32,233,222, 61,136,236,216,177,131,196,197,197,145,174, 93,187,146, 70,212, 51,116,198,
+140, 25,145, 73, 73, 73,145,137,137,137,145,151, 47, 95,142, 28, 53,106, 84, 36,128,208,234, 61, 65, 85,102,203, 48,102,140,174,
+ 19,139,245,110, 3,154, 47,207,152, 49,131, 36, 37, 37,145,196,196, 68,114,249,242,101, 50,106,212, 40, 2,235, 30,223,211,168,
+118, 41, 48, 48,176, 71,112,112,240,162,206,157, 59, 15,121, 90,154,255, 65,163, 37, 25, 61,122, 52,109, 54,155,201,144, 33, 67,
+204,155,128,226,157, 20,165,220, 73, 81,202, 29, 64,222,191, 61,162,245, 87, 63,240, 51, 4,192,185,234, 5, 66,161, 80,169,213,
+106, 29,165, 82,233, 17,149, 74, 53, 7, 21,211, 34,155,164,249, 87,212,147,209,252, 87,104,186, 74,165,210, 45, 42,149,106,148,
+ 80, 40,204,211,106,181,206, 86,104,218, 8, 4,130,119,133, 66, 97,176, 90,173,246, 6, 0,137, 68, 18,175,211,233,126,211,104,
+ 52, 27, 0, 20,255,211,251, 78, 54,183,226,131,207,239, 2,130, 15, 34,211,202, 91,174, 60, 83,232, 57,111,128,109, 90,207,214,
+146,100,112,233, 47, 64,233,110, 82, 83, 82,117, 86,107,138,168, 32,152,185, 31,220, 76, 81,183,248,226,215, 50,207,249,193,210,
+180,158,173,164,105, 32,248, 2, 2,245, 53,107, 53,107,154, 45,137, 68,178,187,188,188,252, 77, 0,191, 89,187,239,228,160, 31,
+ 15,229,198,102, 48,178,219,129,212,243, 8, 31, 66,212, 96,177,163,145, 3, 37,245,233, 3, 3,115, 31,213,174,249,213, 87, 91,
+201,185, 95, 79, 66,167, 46, 68,118,110, 41, 38, 76,124, 29,157, 58, 5,194,193,193, 1, 43, 86,172, 64,155, 54,109,176,116,233,
+ 82,170, 17,245, 12,149, 74,165, 19,124,125,125, 91,221,191,127, 63, 81,173, 86,255, 8,224,108,205,239, 31, 95, 32, 88,204,225,
+116,212,152, 76,151, 30, 0, 17, 13,104,190, 44,149, 74,231,251,250,250, 6,220,191,127, 63, 70,173, 86,175, 3,176,159,105,235,
+158, 15, 77, 22,139,181,193,211,211,115, 76,114,114,242, 7, 0,246,225, 63,196,223,110,180, 24, 77, 70,243, 57,212,172,186, 79,
+200,179, 86,207, 63,204, 22, 61, 7, 20, 90,130, 80, 25,224,209, 27, 27, 48, 89, 13,107,138,168, 32,152, 56,239,128, 66,115, 16,
+228,128,176, 54, 52, 96,178,254, 94,147, 9, 80,248,180,158,246,235, 83, 16,170,238,243,197, 92,243,181,176,120,241, 98,114,250,
+244,105,136,197, 98,104, 52, 26, 12, 30, 60, 24,159,127,254, 57,197,180, 33,140,230,223,168,249,175,132,195, 28, 2, 6,134, 6,
+ 33,207,106,197,168,183, 19,245,228,160,223, 45,228,179, 23,128,133,150,128, 41, 21,229,166, 28,234,237, 84,125, 19, 53,111, 32,
+159,154, 11, 54,188,193, 55, 61,130, 74,159, 67,189,213,120,205,191,224, 23, 34,193,167,207,238,121,121, 30,169,105,170, 34, 34,
+ 34,152,131,194,192, 96, 57,211,240,228, 76,195,199,255, 51, 70,139,129,225, 57,135,122,241,129, 1, 64, 70,229,242,204,106, 50,
+ 48, 48, 48,252, 7, 13, 23, 40,212, 61,160,205,154,144, 96, 99, 6,218,157, 99, 52, 27,165,201, 6,160, 0, 96,131,138, 28, 36,
+ 85, 83,122, 27, 74,179, 49, 4,128,145, 57,158,140, 38,163,201,104, 50,154,140,230, 63,172,217,144,246,243,216, 37, 89,219, 44,
+195,157,127,199, 7,135, 48,154, 79,149,193,255,154,125, 39,232, 8,130,141,149, 75, 71,230,188, 51,154,140, 38,163,201,104,254,
+231, 53,255,149, 48, 93,135,207, 23,194,231,182,230,132,184, 2,168, 74,114, 25, 13, 45,229, 11, 33,230, 2, 0,202,112,155, 16,
+ 60, 4,208,174,114,125, 58, 69, 89, 61, 27,149,129,129,129,129,129,225,159, 34, 16,192,109, 0,174, 0,134, 1, 8, 71,101, 86,
+133,127,212,104,137,236,219,186,130,195,234, 64,209,196, 23, 0, 8,139,138,133,137,142,210, 20, 60,108,242,151,172,212,205,219,
+142,128,127,144,130,254, 69, 85, 86,124,147,147,161,181,243,150,143,113,118,144, 77,200, 41, 40,217, 29, 19,167, 58,106,205,182,
+ 10,133,167, 66,104,103, 59, 78,103, 48,182,227,243,120,105,134,226,210,157, 69, 69,137,101,141,168,134, 93,125, 43, 63,253,148,
+ 80, 39,178,111, 83, 60,177,129,101, 47,231, 81, 42,168,136, 42, 91, 74,123, 21, 39,147, 67,135, 94, 36,214,158, 27,138,133,254,
+ 18,153,172,179, 64, 40, 14, 18,203,108,219,210, 4, 40, 84,102,166,232,141,166,203,102,189, 58,146,208,248,159, 21,231,106, 18,
+128,149, 0,128, 1, 3,206,161, 29,228,216, 80, 85,113,188, 53,224, 30, 38, 93,184,128,170,228,178, 31, 2, 88,197,220,183, 12,
+ 12, 12, 12, 12,207,153,209, 26,134,138, 46,195,134, 7,195,123,250,247,190, 37, 20,138,188, 0,128, 38, 4, 52, 1,202, 75,139,
+ 35,115, 18, 35, 6, 3,128, 67,139,192, 51, 92,161,188, 51, 77, 42,214,155,105,192,100,208, 38,151,166,222,232,106, 73,141, 36,
+142,222,163, 7,132, 12, 28, 19, 22, 54,204,167,125,187,246,173, 1,224, 94,244,189, 71, 39, 78,132,199, 93, 56, 71, 29, 46,207,
+139,255,165, 73, 1, 20, 8, 63,239,210,165, 83,239,136,136,219, 75, 1,204,106,234, 17,180,183,151,206, 57,251,243,130,190, 3,
+199,172,149, 0,214, 25, 45,161,157,237,184,145,195, 95,232,244,222,219, 51, 88,111, 44, 88,225,117,235,202,255, 86, 75, 93, 3,
+138, 9,109, 60, 91,174, 28,255,123,125, 15, 78,174,233, 31,235, 50, 88, 63, 22,158,102,109,252,174,135,173,166,240,209,120, 66,
+155,199, 83, 20, 5, 54, 95,124,200,177, 85,239, 3, 54,253,231, 21, 1,176,120,198,152,220,213, 63,196,201,213,253,240,248,215,
+223, 21,138, 21,206, 28,176,121, 0, 40,100,165, 60,192,133,253, 43,109,223,249,236,155,192, 43, 81,169,166,243, 63,111,213, 82,
+ 60,238, 24,117,246,253,134,251,211, 83, 83,109,224,233, 89,241,247,215, 95, 47,134, 87,203,123,168, 24,107, 6,172, 71,201, 15,
+ 89,104, 7, 84, 24,173,148, 20,216, 50,247, 44, 3, 3, 3, 3,195,115, 68,120,165,185, 10,175,185,162, 78,163, 37, 20,138,188,
+174,255,239,132,221, 47,151,211, 1, 0, 33,129, 46,248,104,217,150,208, 61,155, 35,226, 0,160,199,128, 48,239,165, 31,190,141,
+171, 49,185, 32,132,160, 83, 27,123, 12, 25,249,162,101,198,195,217,175,235,184,113, 99, 95, 93,176, 96,254,136,132,132,132,148,
+125,251,246,253, 14, 0,125,250,246,109,179, 98,197,138,151,214,218,218, 9,126, 58,244,115,166, 86,249,224, 86, 99,246, 86,232,
+214,170,153, 79,219,150, 19,126,250,118, 11,171,255,224,177,175,164,160,124,165, 54, 43, 49,211,146,109, 29, 28, 28,230,114,185,
+ 92, 5, 80,241, 52,246, 42, 12, 6,226, 2, 0, 38, 51, 45,179,117,243, 41, 99,243,132,102,129,128,119,191, 76,165,218, 93,154,
+249, 96, 87,125,154, 58,163, 49,224,157,183,166,176,238, 36, 22,192, 43,160, 15,123,227,202,143, 65,155,141,182,239,126,184,108,
+ 92,196,141,159, 80,174,196, 69, 11,119,141, 91,179,160, 89,179,238,236,207, 87, 74, 7, 81, 20, 94,243,236,241,250,168,165,223,
+ 31,226,118,105, 35,135,206, 72,227, 84,100, 65,143,109, 27, 62, 95,115,101,219,176,227, 0,118, 0, 56, 15,160, 65, 83,103,103,
+111,247,227,220, 69, 27,164,229,250, 63,102,123, 87,154, 44,124,189,251, 32,238,166,211,240,245,241,229,184,204, 93, 45,221,177,
+108,218,247,234,138,231,108,213,102,119, 91, 1,232, 5,196,218, 97,250,103, 3,241,195,170,229,112,114, 42,135, 76,150, 6, 10,
+206, 0,218, 86,190,241, 33, 63, 31,233, 0, 62,204,205,133,100,233, 12, 12,190, 3, 44,236, 8,228, 2,184, 66, 89,246,212,120,
+ 6, 6, 6, 6, 6,134,127,138,108, 60, 57,248,125,103,131, 70, 11, 0,164, 34, 14,226,146,114, 0, 0, 54, 34, 96,206,244,201,
+ 40,200,207,243,214,155,104,188, 62,121, 34,110,199,102, 35, 46, 57, 15,132, 16,120,187, 91,252, 16,110,176, 65,119,121,125,234,
+235,253,206,156, 61,123,115,241,162,197, 63, 80, 20,174, 1,192,142,157, 95,247, 88,242,201,146, 55, 39, 78,158, 56,232,208,161,
+ 67, 49, 0, 26,101,180, 56,148,108,203,154, 85,203,249, 25,249, 90,237,220, 5, 31,208,243,231,205,221, 8, 96,172, 69, 78,134,
+203, 85,100,100,100, 72, 89,172, 39,159,165,249,197,242, 15, 46, 13, 26,179,246, 97, 74, 90,241,157, 51,199,142,117,245,247,247,
+ 71, 70,102, 78,175,213,155,182,119, 60,117, 70, 52,165,172, 84, 51, 70,157,255,160,214,135, 54, 11,184,220,152,207, 86,111,235,
+ 68,219,180, 97,125,244,230, 80, 4,180,118, 67,102,110, 49,250, 14, 30,193,137,188,117, 43, 20,176,216,104,213, 76, 30, 56, 78,
+ 79,231,118, 92,177,251,198,192, 81, 61,221,186,176, 88,108,168, 52, 70,228,149,232, 96,166,129, 62,126, 10,188,176,103, 19,167,
+176,220, 56,122,217,207,233,163,175,109, 14, 83,106, 75,178,102, 3, 56, 92,255,199, 16, 59,119, 39, 57,226,210,203,106, 53, 89,
+229, 90, 19, 0,128,199, 54,131, 2,177,175, 71,168, 23,128,239, 0, 95,224,215,217,175,194,217,121,159,179,179,243, 56, 39,103,
+151, 72,239, 87,167, 80,205,188,252,100, 42,141, 1,247, 99,238,149,249,119,142, 38,101,133,185,239,106,203,139, 14, 61, 0,162,
+125,129, 3,149, 26, 83,192, 24, 45, 6, 6, 6, 6,134,103,155, 58,103, 29,114, 0,224,196,137, 19, 36, 44, 44,236, 79, 25,128,
+205,102,130,184,228,138, 33, 56,108, 54, 27,195,122,183,193,198,213,159, 65,163, 55,225,110, 82, 9,126,185,154, 14,125,121, 49,
+ 8, 33,200, 15,112,170,237,131,159,232, 82, 90,187, 82, 20,200, 22,112,199, 95,185, 33,105, 97,103,107,107,251, 48,230,135,242,
+ 37,243,148,126, 28, 98,136, 92,246, 69,155, 36,158, 29,167,231,193,131, 7,252,135,135,133,241,165, 82,217,251,132,211,209,157,
+ 91, 78,230,151,148, 68,149,212,165, 89, 19,145,147,239,136, 17,195, 94, 24,224,226,226, 76,191,186,226, 70,236,150,217,129, 30,
+109,219,180,237, 21,103,212,140,208,228, 62, 60, 86,199,102,143, 53,105,154, 6,139,197,130, 82,169,132,217,108,134, 78,167,131,
+209,104, 68,122,122,138,146, 38,196,221, 12,154,229,234,234, 14, 14,135, 15,175, 22,158,216,182,113,165,120,207, 79,199,130, 22,
+ 46,254,252,168, 58, 31,221,241, 71,114,203,199,154,218,194,162, 67, 39, 79,159,117, 36,184,224,246,209,155, 67,217,185, 69, 42,
+ 92,184,149,128,219,247,211,173, 61,145, 53, 83, 56,180,200, 76, 77, 40, 93,187,118, 45,123,233,169,132,244, 1, 67,198,154, 61,
+ 91,119,104,161, 51, 19, 0, 20, 4, 60, 14,120, 28, 22, 60, 29,133, 56,242, 65, 59,220, 24, 25,229, 28, 26,232,184,129, 16,114,
+184,190,227,169,211, 25,205,189,125, 37,236,142,173, 20,136,122, 84,132,155,167,174, 97,238,162, 13,136, 72,210,161, 76,165, 6,
+101,214,129, 77,116,200, 79, 77,132,201,108, 38, 13,157,247, 10, 2,139, 0, 64, 32, 16,124,248,203,241,211,110, 58, 90,136,156,
+ 98, 29,148, 69, 58,180,233, 62, 70,146,154,153,135,239, 62,123,233, 67, 0,135,124,129, 50,203, 52,155, 12,163,201,104, 50,154,
+140, 38,163,249,140,104,214,229, 69,158, 19,234, 76,229,192,170,111,171, 71,233,133,136, 75,202, 65,103,223,102,104,221,194, 21,
+ 55,227,139,240,227,133,116,124,115, 38, 21, 23,238,230,129,230,200,144, 83, 10, 60, 76, 81,226, 97,106,126,131,249,179,217, 2,
+238,248,119,222, 41, 89,208,222,191,180,251,255, 78,205, 65, 51,199,135,254, 11, 23, 22,207, 97, 11,184,227,109,155,203,246,125,
+176,224,221, 9, 50,177,152,175,215,233,209,170,165,167,240,237,217,115,166, 80,182, 2,139,159,137, 36,107,230,103, 43, 16,137,
+118, 45,251,244,125,193,134, 95, 30,166,149,235, 81,126,248,154, 50,113,254, 7, 75, 10, 57, 92,225, 54, 89, 51, 63,139,199,254,
+ 24,141, 70,232,116, 58,232,245,122, 24, 12, 6,100,166, 63, 24,113,254,151,247, 6,183,108,110, 55, 88, 32, 20,130, 0, 40,213,
+152,144,148,173, 70,240,192, 65,236,206,129,129, 1, 82, 87,191,169,181,105,149,148,164,150,208,132, 45, 59,113,100, 47,251,192,
+175,119,240,195,137, 91, 56,250,219, 29,220,188,120,202, 68,104,227,227,231,127, 73, 93,219,120, 75, 93,219,167, 74,221, 58, 40,
+ 31, 47,205,218,213,155,158,153,205,102,145,224,129, 33,231,166,207,122,251,127,234,178,130,220, 93, 91, 62,203,204,203, 74,121,
+ 32,224, 81, 38,177,128, 13,149,214,132,239,207,103, 97,220,202,187,184,159,166, 2, 33,164,193, 7,120,211,192,188,241, 83,223,
+ 51, 27, 13, 6,248,120, 72,177,119,231, 42,140, 8,238,136, 1,237,109,209,181,181, 4, 98,142, 14, 49,177,113,216,191,247,123,
+ 19, 77,179,230, 55,112, 35,190, 80,185, 68, 2,128, 74,165,122,111,225,251,243,243,244, 38, 26, 6, 35, 13, 67,229,235,249,253,
+ 95,228,153,181,234,247, 42,183,139,172,182, 29,243,136, 7, 6, 6, 6, 6,134,231, 33,162, 85,181,184, 86, 95, 81,103,215,161,
+ 86,171, 73, 30, 59,126, 34, 92,157, 92,164, 35,251,191,198,139,124, 84,140,188,236, 84, 36,196, 71, 67,173, 53,130,103,219, 18,
+ 16,186,160,133,151, 39,162,226,142, 26, 54,175, 9, 87,209, 38, 93,114, 93,122, 35, 70,184,186, 39,196, 82,172, 53,171, 61,174,
+199,199, 21,117,222,187,232, 59,188,250,170,212, 97,205,106,143,235, 41,137, 18,150, 88, 72,122, 78,153,252, 10,197,162, 8, 22,
+ 46, 92,128,145, 97, 47,224,245, 41,147,168,221,187,191,239, 94,108,225, 94,210,224,126,249,225,199,159,241,149,197, 38,253,205,
+120,149, 78, 44, 17,137,174, 60, 84,149, 7,120,121,136,134,142,121, 45, 43,252,224,174, 13, 0, 38, 91,162, 85,101,176,140, 70,
+ 35, 12, 6, 3, 0,152, 1,128,197,170,120, 45, 40,211, 35,183, 88, 7,101,177, 14, 38, 51,141, 49,227, 39,139,110, 69,220,157,
+ 12,160,142,241, 90, 52,109, 52, 25,113,248,215,219,200,188,117,136,166, 88,236,146,106,131,225, 33,117,109,227,237,226,226,113,
+ 41,108,204, 36, 71,190,176,162, 27,182,172, 92,135,221,219, 87,215, 91, 79, 22, 69, 17,218,108, 42, 54, 25,141,229,173, 90,182,
+202,244,245,239, 40,188,252,191, 51, 35,174,156, 59,172, 50,181,154,100,243, 40, 37, 27,108,174, 0,108,158, 16, 58,131,101, 19,
+ 15,149, 9,215,183, 2,160,166,206, 92,176,241,221,247, 62, 98,207,219,252, 59,244, 90, 53,116,154,114,148,150, 20, 65,196, 49,
+ 34,230,234, 49, 19, 49, 27,223, 45,207,190,179,181,110, 37, 42, 11, 64, 86,245,146,194,194,194, 11, 87,127,191,116,252,198,213,
+223, 95,119,105,213,153,165, 55,210, 72,136,190, 65,103, 62,140, 56,174,211,149, 94, 0, 0, 10, 40, 0,112,134,185,111, 25, 24,
+ 24, 24, 24,158,195,136,214,180,234,101,117, 26,173,212,251,151,187, 2,128,119,151,208, 2,169,144, 99,199, 97, 81, 80,102, 60,
+194,238,181,115, 65,211, 4, 67,223, 92, 3,153,151, 11, 68, 60, 54,116,170, 2, 85,225,163,139,245,141,213, 1, 69, 25, 7,109,
+221,145,233, 53,243,173, 86,242,189,123, 85, 92, 0,216,187, 87,197,125,107, 70,115,249, 87, 59,146,189,186,245,238, 12, 98, 54,
+ 35,108,228, 88,140,127,121, 60, 82,114,212,248,249, 82, 26,202, 53,122,139,102,203,137, 28,124, 59, 58,216, 59,190,240,206,107,
+ 47, 72, 56,108,138,106,235,169, 96,167,231, 25, 77,108, 54,215,124,252, 86, 73,214,152, 49, 47, 59, 92, 56,121, 96,128,217,193,
+183,163, 38, 63,246,110, 67,122, 58,157,238,137,174, 67, 59,135,150, 39, 7,141, 93,155,145,157, 83, 22,158, 83,164,237, 86,110,
+ 52, 65, 89,172, 67,110,177, 14,197,229, 6,184,200,108, 97, 50,234,219,215,165, 71, 8,249, 97,212,216,137,147, 0,176, 40,150,
+233, 59, 85,118,108,124,197,154, 63, 76,214, 11, 35, 95,117,188, 20,249, 8, 9, 17,167,138, 8,109,170,200,226, 78,209, 25,245,
+ 31, 87, 16, 54, 5,154,199,161,140,108, 22,139, 54, 24, 84, 70, 39, 39,199, 11, 23, 47,156, 30,174, 53, 37,130,205, 19, 60,126,
+175, 70,111,182,248,138, 81, 38, 92,255, 18, 0, 54,109,222,184,174,231,160, 87,121, 23,111, 39, 67, 99, 4,122, 4,122,227,200,
+ 79, 95,235, 8, 49,190, 87,158,125,231, 75, 43, 46, 66,155,230,205,155,207,229,242,249, 3, 68, 98, 89,115, 71, 87, 15,150,193,
+100,134,193,104,134,196,190, 25, 75, 32,181, 27, 68,179,120,151, 77, 6,253, 5, 67,121,222, 38, 0,197,204,125,203,192,192,192,
+192,240,156, 69,181,128,106, 57,180,158, 48, 90, 39, 78,156, 32, 0, 80, 91,255,104,166,178, 16,246, 82, 14, 28,221,188, 48, 97,
+238, 58,252,176, 97, 30,204,102, 35, 8, 1, 76,102,203, 50, 19, 16,194,253,117,214, 91, 94,190, 45,188,216,142, 19, 94, 21,107,
+126,220,171, 22, 77,120, 85,172,105,215,222,190,100,214, 91, 94,201,101, 90,143, 94, 38,179, 25, 87, 98,114, 17,157, 92,130,232,
+148, 82, 72, 69,150,167,249, 98,243,121,111,173, 94,181,146,199, 97, 83, 84, 76,170, 74,149, 81, 96, 82,177,185, 92,131, 88,196,
+ 39,122,194,209,165,228,147,130,129,163,166,104,142,239,217, 52, 21,192,236, 58,163, 98,149, 51, 13,171, 34, 89, 85,175,132, 16,
+ 66, 1, 52, 77,153,205, 25,249, 90,168, 12, 70, 40,139,254, 48, 90,148,169,238,158, 83,169,107, 27,111,185, 76,122,154,205,102,
+ 11, 8, 1,140, 6,211, 75,112,109, 51, 88,149,157, 16, 95,221,100, 93,143,201,194,163, 59,231,148,102,131,122,162, 58, 55,238,
+188,165,251, 78, 81, 32,108, 54,104, 54,139,162, 41, 10, 52,151, 69,244, 32,132,174, 89, 35,181, 21, 70,171,202,108,241,185,236,
+ 69,103,247,111,112,122,125,152, 31,126,186, 84,225,249,180,101,121,165,229,153, 86,153, 44,216,219,219, 79,126,255,253,247, 63,
+ 25, 49,246, 85,148,104, 41, 40,139, 42,162,129,122, 35, 13,158,196, 1,131,102,125,219, 60, 59,175,180,121,194,205,227,189,242,
+239,236, 45, 49,106, 75, 54, 50,247, 44, 3, 3, 3,195,127,139,250,188,200,115, 20,213,250,115, 68,171,190, 29, 34, 4,120,152,
+154,143, 22,238,142,112,111,209, 26,241, 15,162,254, 88, 7,192,100,182,172, 59,234,216,177,236,140,117,235,228,244,188,121, 37,
+ 61, 86,175,246,184,246,214,140,230,138,118,237,237, 75,222,127, 63,173,199,250,245,138,107,191, 94,231,154, 73,101,190,174,170,
+220, 92,132, 88,147, 99,147, 21,212,209,191, 37,251,179,189, 15,211,206,223, 43,203,229,241,120, 70, 23, 91, 33, 37,147,242,217,
+108, 22,151,175, 51,178,116,222, 1,129,236,227, 44, 42,176, 62,149, 42,163, 85,179,235,176, 32,239,209,136,179, 63, 47,104,215,
+127,212, 26,187,204, 60, 13, 74,244,236,199, 93,135,108, 22,133,123, 15, 82, 1, 54, 47,186, 54, 77,185,204,238,204,190, 31,127,
+240, 88,191,122, 57, 12, 38, 51,102,205, 91,140, 41,147, 39,158,129,107,155,193, 30, 94, 62,145,191, 31,255, 78, 60,120,198, 54,
+164,198, 69,228,152,116,165,251,173, 49, 89,143,205, 22, 64,204,132,102, 21, 22,149, 74,117, 38, 8, 81,139,239,211, 25,232, 70,
+ 93, 57, 42,141, 9,199,111,228,224,196, 47,251,161,144, 73, 26,165,161, 80, 40,252,250,246,237, 7,138,195,135,222,168,131,222,
+ 68, 67, 95,109,140,150,193, 72,195, 72,184, 16,187,118, 64,225,253, 35,126,208,150, 48, 45, 14, 3, 3, 3,195,127,136,231,120,
+ 32,124,117,115, 85,119, 68,171, 62, 60,221,157,113, 35, 58, 25,237,125, 91, 66, 33,151,253,159,189,243, 14,143,162,106,219,248,
+ 61, 51,219, 75,122,178,105,132, 18, 74, 66,239, 16,122,135, 72, 21, 20, 41, 34, 40,210, 44, 40, 2,138,138, 74,135, 23,105,130,
+136,210, 68,122,239, 85, 8, 85,233, 53, 1, 18, 72, 37, 61,187,105,219,235,204,124,127,108, 2, 1, 82, 54,128,223,171,190,231,
+119, 93,123, 37,179,217,189,115,166,157,185,207,115,158,115, 14,238,199,167,129,161,133,160, 41,192,238,112,221, 12,241, 54,251,
+246, 37, 75, 60,144,146,164,160,127, 90,149, 84,227,195, 9, 53,146,150, 44,241,184,200,219,236,219, 1,140,224,121,192,105,182,
+156,134,139,173,132, 47,224, 57,123,136,191,183,156,185,150, 96,200,165,105,198,226,227, 33,229,124, 60, 36,180,143,155, 88, 40,
+ 18, 50,156,131,167,109, 85, 84, 53,204, 60,199,185,178,174,222, 83, 93,135, 44,203,130,162,104,182,200,136, 41, 82,115, 77, 40,
+ 52, 51,200, 46,176, 32, 95,103, 67,157, 96, 5, 78, 70,237, 50,178,118,211,150,210,180, 24,161,200,163, 86,141, 42,248,106,246,
+ 18,152, 44, 44, 30,164,235, 33,146, 72, 2,252, 3, 26,220, 26,241,193, 52,201,196,213,241, 24,221,213, 7,159,157,143, 79, 55,
+102, 75,167, 85,230,204,178, 44, 11,147,217, 42,202,214,228,123,105,117, 6,119,153, 84, 98,242,243,246,208,148,246, 89,115, 37,
+ 35, 90,197,200,165, 2,244,139, 8,128,217, 54, 12, 38,139, 3,127,158,218,243, 34, 50,161,254, 65, 85,160,183,150, 48, 87, 69,
+102,171,164,233, 18, 42,253, 0, 80,161,164,202, 33, 16, 8, 4,194, 63,136, 50, 71, 29,186,100,180,148,114, 41,120, 70,138,243,
+215,227, 17, 94,191, 49, 54, 28,184,130,218,141, 34,144,169,115,128, 7, 93,225,104,195, 98,166,124,105,186, 1,224, 70,255,254,
+242, 42, 3, 7, 6,247,224,121,225,239,171,126,209,166, 1, 64,104, 67,167, 12,199,241,224,121,128,231,156,134,203,245,144,142,
+ 32, 37, 41, 83, 91,189, 70,128, 2,119,211,108, 22,133, 68, 68,123, 41,196,140,159,135, 88, 36, 18, 8,192,242,148, 37, 51, 51,
+222, 66, 1,201,174,200, 61,219,117, 40, 87, 6, 30,233,246,250,247,234,228, 71,133,215,234,228, 25,155, 20,218,196,224,121,160,
+ 78,176, 2,209,151, 14,179,217,233, 15, 31,152,178, 99,127, 46, 77,139,227,192,216, 28, 28,110, 37, 20,162,192, 96, 71,129,222,
+134,118, 93,250,137,218,117,239,143,243,209, 26,112, 14, 59, 22,174, 57,172, 99,121,251, 16,224,158,189, 18, 59, 77, 95,190, 17,
+ 83, 69,157,111,144, 8, 5,130,130,186,181,171, 37,138, 69, 66,135, 86,171, 21, 63,253, 41, 6, 10,153, 24,121,122, 59, 0,216,
+ 43,123,245, 20, 26,236, 56,112, 41, 11, 7,247,108,133, 76, 38, 3,255, 2, 87,160, 72, 36,242, 20,138,164,176, 25,156,221,133,
+197, 47,219, 51, 47, 90, 32, 1,104,129, 39,185,103, 9, 4, 2,129,240, 15,162,228, 26,135,125, 74,154, 47,218,165,168, 9,199,
+195,215,199, 27, 82,133, 59,146,178,109,208, 81, 42,228, 27,121,176,172, 51,162, 85, 78,224,169,212,213,189, 15, 28,200, 76,219,
+191, 95,179,238,192,129,204, 18,137,222, 79, 34, 89,143,127,114,188,203,154, 20,207,158, 60,112,244, 76, 97,255,214,126, 94, 52,
+195,152, 68, 66,218, 34, 16, 49, 54,145,128,182,139, 4,180,213,223, 93,200,156, 57,184, 77,204, 83, 56, 83,145,166,217,108, 70,
+247,238,221,209,187,119,111, 12, 24, 48, 0,131, 7, 15, 70, 88, 88, 61, 21,205, 80, 86,158,226, 56, 63,177, 14,181,252, 40, 8,
+204,169, 56,181,237, 63,198,232, 63,246,221, 98, 45,230,126,120,218,114, 62,209,228,121, 46,175,208, 2,179,141, 69,190,222,134,
+124,131, 13, 14,191, 54,216,247,103, 6, 76, 86, 22, 41,215,119,153,212, 89,105,159, 88,114, 30, 38, 85,112, 42,190,120,122,147,
+ 79,123,255,189,145,106, 55, 41,253,176, 67,219,150,106, 95, 31,111, 7, 69, 61,137,188, 82, 20, 5,169,187, 10, 94,158,110, 72,
+186,113, 20, 39, 22,118, 51, 1,248,218,149,227, 89, 18,119,185, 0,253, 91, 7,160,223,160, 97,104, 20,209,203, 21, 99,253,156,
+166, 92, 46,151, 21, 71,175, 74, 78,235, 96, 45, 17,213, 98,139,206, 55, 45,144,200, 92, 61,239, 47, 9,209, 36,154, 68,147,104,
+ 18,205,191,143,230, 63,153,226, 53, 14,139,127,186, 54, 51,124,177, 1,170, 25,168, 64,237, 96, 5,204, 54, 21,204, 86, 22, 6,
+ 51, 11,173,209, 6,173,209,142,164, 44, 35,162, 15,188,124, 9,157, 81, 44,231,212,231,188,115,190, 77,176, 28,239,114,244, 68,
+108,179,206, 94,188,112,222, 91,219,154, 53,181, 78,236, 19, 24,114, 59,201,154, 65, 81,180,137,102, 4,118,111, 55,129,240,254,
+253,219,234,139,231,142,116,148, 58,216,119,140,229,232, 56, 28,142,194,224,224,224,162, 72,212, 19, 11, 89,175,150,108,192, 31,
+135,191, 8,237,212,127,161,223,210,185, 83,140, 52, 35,226, 40,129, 40,154,181,155,182,154,178, 99, 87,161, 28,251, 65,139,164,
+247, 46,223,188, 27,225,233, 29,130,135,233, 6, 24,204, 14,216, 28, 28,188,148, 34,164,221, 57,110, 75,186,127,109,135, 62,227,
+246,134, 23, 56,108, 91,226,238, 69, 87,137,140,236,245, 70, 68, 68, 27,230,219,111,191, 65,120,120, 56, 76, 38, 19,104,154, 70,
+ 72,245, 90, 72,138,187,137, 75,135,103,179,198,220,228,159, 1,204, 2,160,174,236, 63,209,104,173, 56,122, 45, 7,135,247,110,
+ 7, 35, 20,191,200,233,165,101, 50,153,180, 52,115, 85,210,116, 61,254,176, 80, 44, 45,106, 4,112,228,222, 37, 16, 8, 4,194,
+ 63,132,177,207,252, 92,237,146,209, 50,155,205, 73,237,187,247, 3,199,241, 96,121,128, 99,139, 34, 79,220,147,232, 19,107, 55,
+ 39,189,108,233, 56,142,189,242,227,234,117,189,155,181,234,196,212,175,170,132, 54, 55, 11,151,254, 56,237, 0,199, 95,116,229,
+251,185,185, 15,244, 50,255,218,111,188,245,230,192,157, 35,223, 27, 95,208,177, 75, 23,133, 74, 21, 96, 73, 75, 79, 51,174,223,
+180,217,126,252,200,254,142, 28, 28, 67,115,115, 31,234,203,211, 41, 44, 44,252,161,180,247, 37, 98,101, 59, 0,161,140,128,178,
+154,212, 15, 42,149, 17,174, 73, 79, 29, 52,111,246,140,228,225, 99, 38,137,107, 6,215, 66, 78, 33,131,164,180, 44,220, 63,183,
+223,146, 30,119,117,175, 54,237,198,104, 23,165, 50, 75,121, 47, 13,192,210, 75,151, 46, 54,136,140,140,236,213,181,107, 87,126,
+236,216,177,224,121,224,212,234, 9,124, 94,210,165, 93,112, 70,177, 18, 94,240,188,164,156,187,120,211,123,112,199, 22, 2, 31,
+183,209, 88,183,253,136, 29, 60,151, 82, 73, 25,255, 42, 85,171, 11,156,221,133,206, 41, 29,158,125, 89,237, 79,242,199, 68, 74,
+127,129, 17,209,254,101,236, 47,129, 64, 32, 16, 8,127, 55, 94, 60, 71, 43,245,158,115, 62,173,191, 26, 93, 86,206,136, 13, 27,
+ 54,206,217,184,105, 91, 59,179,213, 26,204, 67,148,202, 58,172,103,245, 44,190,117, 85,195,148,253,240,154,143, 79,157,134,235,
+215,252,248,245,250,117, 63,117, 2,199,214,165,128,100,158,194, 25,169,157, 29, 89,145,201, 42,215, 44,105,116,191,244,120, 99,
+145, 41, 55, 87,191,177,178,223, 53,229,198,102,209,140, 45,228,151,101,179,191,167,105,166, 39,203,114, 66,142,181, 63,100,109,
+230,255,152,212,177, 7,224,114,150, 27,242,202,249, 91, 12,128,152,168,168,168, 14, 81, 81, 81,173, 0,252, 0,231, 26,138,215,
+ 94,230,188, 88,114,117,221,166, 78,153,122,106, 50,168,106, 28,199,195,193,114, 41, 34,147,177, 91, 37,101, 66,106,214,172, 37,
+183,217,217,231, 18,224, 75, 38,194, 63, 54, 90, 30, 85,228, 0, 66,136,209, 34, 16, 8, 4,194, 63,132,177,120,126,210, 82,215,
+ 34, 90,255, 95,228,231, 39,232,144,143,137, 47,171,147,155,251, 64, 15,224,185,145,123,198,151,212,141, 59,240,254,158, 0, 0,
+ 32, 0, 73, 68, 65, 84,126,160,221,141, 7,218,221, 47,250,125, 67, 78,162, 26, 72, 28,249,146,197,112, 37,145,253,124,209,235,
+149,160,209,220, 51, 64,131,214, 47,123, 90,182,108,222,116,127,219,182,237, 66,158,102,132, 28,207,136, 28, 60, 37,116,112,148,
+208,110,231, 96,177,217,237, 54,135,195, 14,214, 97, 3,199,218,121,206,102,135,115,118,120, 2,129, 64, 32, 16,254,201,134,235,
+239, 99,180, 8,255,106, 18,226, 31,198, 69,144,195, 64, 32, 16, 8,132,127,185,201, 42,249, 19,128, 51,247,188,172,145, 3,149,
+ 89,204,247, 69, 70, 31,156, 36,154, 47,173, 41, 4, 32, 6,160, 4, 80, 81,151,102, 47, 20,173,215, 72,142, 39,209, 36,154, 68,
+147,104, 18,205,255,162,102, 69,218, 39, 65,248, 75, 13, 24,209, 36,154, 68,147,104, 18, 77,162, 73, 52,255,247, 52,255,201,140,
+ 45,229, 5,128,116, 29, 18, 8, 4, 2,225,127, 16, 31,159, 58, 74,224,113, 94,111,133,200,125,235,249, 3,128, 81,115, 47,155,
+ 28, 61, 66, 41,148, 92,231,240,169, 28, 45,250, 5, 5,133,180, 64, 60, 85,238,230,115, 79,225,225,147,254, 63,126,112,169,176,
+234,138,143,123,116,172,177, 47, 60, 84, 54,160, 50, 95,148,251,133,253, 26, 80,171,245, 35,133, 42,236, 99, 4, 54,147,189, 76,
+ 33, 20,170, 80, 63,101, 72,139, 63,220,130, 27,188,246, 23,236,163,164,126,253,250,109,234,215,175,223, 6,128,228, 85, 8,202,
+ 85, 97,195,170,212,142, 56,167,170,217,244,180,194,191,206,155,175,186,192,202,192,218, 62,202,144,230,187,149, 65,141,243,149,
+129,141,181,202, 42,205,207,186,249,214,171, 89,209,247, 66,250,207,171, 59,115,107,244,214,144,254,243,234,150,246,119,175,200,
+229,110,223,109,123, 48,215,167,223,127,148,164, 94,121, 49, 66,218, 13,243, 12,236, 52,217,167,178,223, 11, 14,139,136,169,222,
+160, 67, 78, 80,157,214,209,174,126,167, 74,120,155, 27,213,234,183,203,174, 18,214,230, 26, 57,242,174, 33,245, 11,109, 35,245,
+170,122, 88,226, 85,245,136,196, 59,180,203,203,234, 5, 6, 6,202,234,214,173, 27, 25, 17, 17, 49,174, 91,183,110,159, 54,109,
+218,116,108,181,106,213,122,254, 55, 27,250,114, 85,216,151, 22, 33,165,177, 8, 41,141, 92, 21,246,101,197,245,107,248, 28,138,
+102, 51, 40,154,205, 80,168,194,231,252, 93,206,149,196, 63,172,154, 92, 21,182,196, 45,160,254, 21,153,170, 78,191,202,126,223,
+203,203,171,167,159,159,223,235,197, 47, 47, 47,175,158,228, 14,120, 97, 74, 70,177, 94, 58,162,197, 8, 37,242, 11,195,223,251,
+176,225,130, 25,211,164,203,214,237,195,178,185, 83,238, 90, 12, 5,245,255,142,123,238, 27,218,234, 26, 67, 51, 85, 74,190,199,
+114,108,154, 38,241, 74,139, 87,161, 31, 94, 93, 54,250,235,207, 71,124, 54,236,173,238,213,186,247,253,132,138, 77, 52,237,119,
+221,162,161,201,142,221,123, 67,206,157, 57,189,124,221,186,213,179,212,142,240, 37, 66,137,224, 71,109,106, 76, 65,101,202,224,
+238, 87, 51, 84,160,240, 61,215,126,192,135, 1,215, 79,110,222,192, 90,185, 30, 70, 77,137,213,191, 95, 28,191, 90,181,106,181,
+100, 24,198,231,227,143, 63, 22, 1,192,210,165, 75,107,179, 44,155, 27, 31, 31,127, 21, 47, 48,249,169,211, 96,134,143,248,225,
+251,153, 27, 95,123,173, 55, 50, 52, 6, 44, 92,178,178,243,177, 67, 59, 6, 27,178, 31,236,122, 21,231,196,211,179,134, 59, 68,
+110,119, 62,249,124,150, 42,178,115, 75, 70,111,118,224,216,185,155, 29, 54,175,156,117, 5,168,215, 74,167,185, 87,230,156, 98,
+156,177,112,186,191,146,143,228,140,133, 0, 48,236,185,135,189,210,222,221, 79,198, 70, 6, 74, 4, 55,115,129, 10, 23,125,244,
+172,222,238,184, 80, 34,169, 70,211, 52,104, 10,160,105, 10, 12, 69, 57,215, 9,181,153, 82,210,239,159,239,245,119,184, 79,220,
+170,182,202, 2, 35,240,161,169, 39,229,163,232,162,159, 60,175,205,122,112,193,231, 21,252, 27,143,134,181, 61, 27,180,171,109,
+ 88,127, 54, 49, 79, 33,232,248,233, 97,138,167,127,122,116,126,201, 45,151, 12,128, 84,234,117,240,224, 65,191,200,200, 72, 15,
+ 85,131, 1,103, 93,249,142,152,209,215, 63,116,232,128, 40, 50,178, 87, 37,174,207,176, 30,160,233, 77, 20, 32,228, 56,126, 41,
+195,241, 59,244,185,113,241, 64,229, 86,159,146,169,194, 71,211,224, 93,174,103, 56, 80,215, 76, 57,177,235, 94,244,224, 10, 36,
+238,221,132, 34,209,167,161, 97,141,154,165, 39, 63,188,102,208,235,150, 56, 44,133,103, 43, 45,100,119, 76, 61,121,254,250,107,
+ 2,161,144,138,236,214,154,177, 0,167, 95,230,164,251,251,251,191,190, 98,197,138,154,109,218,180, 1, 0, 56, 28, 14,247,157,
+ 59,119, 6,204,158, 61, 91, 17, 23, 23,183,231, 5,101,131,253,252,252,170,138,197,226, 96, 0,176, 90,173,233,106,181,250, 17,
+128, 10, 27,254, 10,255,154,190,224, 49,235,252,185,115, 2, 0,232,208,161,227,156,170,237, 63,242, 98, 68, 74, 83,169,135,195,
+170, 83, 20,196,159,158,116,233,242, 69, 10, 0, 34, 90,183,153, 38,247,173,247,227,127, 51,178, 37, 85,133,183,166,129,207, 34,
+ 58,116, 31, 52,100,232, 8,186, 65,157,170,232,217,163,235, 23, 38,224, 96,165,174, 25,129, 64,118,229,202,149, 90, 52, 77, 51,
+ 14,135,195, 28, 17, 17,241,232,101,202, 21, 20,214,230, 79, 10,116,136,205, 97, 93,163, 78,184, 54, 7,207, 79, 58,205,120,132,
+ 52,251, 26,140, 96, 12,199,113,169,186, 71,215,218,254, 11, 35, 90,207, 31,231,202, 42,209, 2,241,167,195,222,253,160,225,164,
+201, 95, 73, 63, 89, 22,133,195, 43,167,105,254,174, 38, 11, 0, 24,154,169,114,252,196,113,149, 92,204, 0, 0,244,102, 7, 94,
+139,140,172,248,137, 80,189,213, 25,154,162,194,139, 23,180, 97, 29, 54,169, 64, 40, 54, 83, 78,131, 4, 10,128,111, 80,245, 40,
+127,199, 5,249,176,183,186, 87,219,180,237,247,180, 71,105,185,149,174,212, 40, 70,132,136,142, 61,209,189, 71, 47,143, 43,151,
+255,156,181,250,231, 85, 95, 58,108,246, 85,156,157, 91, 98,206,123,152, 81, 97,101, 30, 80,167,185, 88,233,123,108,208,184,217,
+ 62,102,218, 27,223,206,253,193,247,220,209, 45,103,211, 83,155,112, 41, 41,169,102,158,162,238,230,231,101,126,106,200,138,143,
+117,245,144, 41,149,202,154, 74,165,178, 73,227,198,141,165, 83,166, 76, 17,118,238,220,249,137,101, 31, 59, 86,116,230,204,153,
+192, 69,139, 22,245,190,125,251,182, 89,175,215,223,210,235,245, 9,168, 68,162,125, 64,128,223, 71,111, 12,236,135,174,131, 62,
+ 4,203, 81, 24,251,193, 36, 28, 63,186,103, 60,128, 87, 98,180,236,114,247,217, 99,198, 77,241,139,104,217,148,153,181, 37, 22,
+ 50,177, 0,189, 90,132, 83,239,126, 60,221,115,221,242, 89,107,161, 65,167,210, 34, 89,156,177,112,122, 67, 95,235,208,254,109,
+ 66,113, 96,171,117, 40,186,125, 14, 90,238, 49, 39,245,192, 87,247, 1,160,102,228,199,110, 18, 86,189, 34,200,147, 81, 73, 88,
+245,138,154,145, 31,159, 76, 56,182, 66, 87, 94, 89,132, 18, 73,181,173, 91,182,212,241,114, 19, 65, 64, 83, 96, 24, 10, 2,134,
+134,217,202, 98,240, 91, 67, 95,217,101, 46, 83,213,233, 77, 3,239, 58, 31,216,248,213,148,243,224, 72,101,206, 9,197,136,124,
+ 14, 29,216, 43, 80,121, 72,192, 48, 20, 24, 26, 96,104, 10,201,217, 38,140, 30,253,174,199,203, 26,246,215,218,169, 90, 78, 29,
+ 18,222, 43,162,161,119,227,237, 23, 41,143,136,215,134,248,104,204,242, 81,219,246,159, 30,202,119,152,116,153,231,185,239,211,
+ 46,252,112,162, 60, 17,139,197,146,221, 43,242, 53,119, 74,160,144,159,220,183,161,163,128,166, 96,103,121, 56, 88, 30,108,209,
+218,168, 84, 81, 11,134,166, 41,240, 28,143, 49, 99, 70,163, 87,228,107, 70,206,193,165,185, 94,201,209,155,142,157,252,195,207,
+ 98,231,176,104,197,186, 89,134, 66,245,172,196,251, 62,201,250, 66,205, 36, 83,206, 3,151,215,193,160,193,183, 72, 77,136, 30,
+183,229,208, 37, 52,172, 95, 15, 44,231, 44,103,120, 21, 5,182, 28,190,132,186,225,117,157,229,230,120,132,133, 40,209,178, 69,
+ 75, 0,120, 33,163, 37,144,184,125,219,169,207,136,153,125, 7,191, 7,149,159, 31,104,222,222,247,228,225, 45,125,127,253,233,
+251,169, 14,179,118, 81,165,196,120,246,241,115,129,231,184,151,142, 58, 5, 5, 5,249,181,108,249,100, 58, 70,135,195,129, 26,
+ 53,106, 32, 61, 61, 61,252, 69,218,105,129,129,129,125,190,251,238, 59, 85,239,222,189,133, 1, 1, 1, 0,128,172,172,172,224,
+ 99,199,142, 53,251,238,187,239,114, 50, 51, 51, 15,163,156, 25,125, 88, 59, 45,162, 5, 96,164, 82,185,115, 31, 65,209, 83, 62,
+122,167,177,127, 96,144,165,180,207,171,213, 89,226,207, 63, 60, 77, 9, 4,162,162,207,131,230,121,142, 42, 39, 74,212, 93, 40,
+ 20,150,218, 67, 97, 99,220, 35,120,161,199,251, 52, 67, 59, 47, 86,135, 93,157,255,232, 70,189, 74, 68,226, 26, 8,197,162, 85,
+111, 12,121,175,237,155,131, 6, 32,208,207, 3, 39, 47,220,198,248,143, 62,179, 59,108,246, 37, 47, 84,121, 48,140, 32, 39, 39,
+ 39,217,203,203, 43,224,229,159,183, 84,232,239,199,143,170, 78,158,138,154,182,120,217,242, 9, 54,171,195,206,241,252,227,117,
+140,101, 50,137,176, 71,223,183,220, 85,181, 34,164,203,191,123, 95,248, 47,140,104,173,126, 37, 70, 75, 44,115,123,235,155,207,
+ 63,150,206,222,124, 9,135, 87,142,215, 24,181, 26,191,199, 45, 5,119,207, 27, 6,109, 65,179, 23, 41,161,210, 47,172, 13,197,
+ 8,198, 81, 12,163,160,104, 74,204,177, 92,170,195,106,157, 99,202,125,240,210,147, 86,114, 28,143,221,127,230, 84,206, 0,241,
+168,189,105,251, 94,149,191,167, 4,102, 27,139, 33,195, 70, 96,227,198,141,110,126, 30, 98,152,173, 14,124,191,120,177, 78,159,
+124, 88,149,156,154,159,222,189,223,103, 39, 18,146,114,162, 31,101,154,119, 84,182,108, 22, 27, 11,173,209, 1,163,133, 70,157,
+ 6, 45,241,253,146,186,210, 71, 41,137,159,109,248,117,237,196,187,119,153,141, 28, 67,207, 52,103,222, 75, 45,245,166, 11,104,
+216,203,221,203,103,235,192,113,115, 61, 31,228, 8,192,195,134,120,119, 41,222, 26, 53,209,189,102,128, 12, 10, 41,227,153,152,
+146, 30, 56,101,234,212, 11, 9, 44,223, 74,171, 78, 72,172,168, 60,213,171, 87, 31,212,183,111, 95,249,228,201,147,133, 33, 33,
+ 33,248,117,203,206,106, 29,122, 13,238,151,145,153, 29,194,243, 60,252, 85,170,212, 49,239, 14, 62,120,228,200,145,148,212,212,
+ 84,225,194,133, 11, 91,239,221,187,183,126, 86, 86,150,203, 45, 83,150,231, 97,182,176, 96,139, 30,144,234, 66, 75,165,253,105,
+112,112,176, 36, 61, 61,221, 82, 34,202, 64, 61, 9, 20, 82,189,186,117,106, 45,248,229,104, 18,244,102, 22, 10,169, 16, 73,217,
+ 70,180,104,218,136, 90,195, 58,154,148, 38, 56,250,173, 62,211,253,149,124,100,255, 54,161, 80,121,201,177,254,199,185, 56,112,
+ 49, 49, 50, 91, 79, 97, 5,207,140, 11,148, 8,122, 40,184,204, 21,157, 91,212, 10,232,218,188, 26,174,182,168, 21,112,238,122,
+108,156,108,240,226,143,211,245,194,147,249,199, 38,234, 74,175,120,104,120,187,137,176,238,120, 10,228, 82, 1, 20, 82, 1, 20,
+ 18,231, 79,154,166, 94,174, 85, 27, 88, 47,132,225,216,209, 12, 35, 24, 61,244,173,193, 65,195,135, 14,230,193,208,216,185,251,
+224,128,205,155, 55,101,218,109,214,181, 44,205,172, 43,235,250,121,234,128,210,128,202, 67,140,169,107,163,225, 46, 19,194, 77,
+ 46,132,187, 92,136,174,141,253,192,208, 47, 92, 68,175,241, 3,106,246, 30, 63,176,122,151,240,170,202, 58,183,226, 11,239,142,
+158,115,109,217,153,130, 46,159,254,184,180,190,143,190,192, 42,248,118,202, 24, 65, 90, 70, 70,151,157, 7,207,118,101,173,239,
+197, 58,108,134,175,212,183,119,150, 26, 21, 78,139,189,216, 44, 56,226, 77,169, 77,111,191,115, 43, 54,173, 86,190, 69,130,152,
+100, 45, 20, 82, 1,148,197,199, 86, 42,128, 66, 42,132, 82, 42, 64, 70, 90, 18,242, 12,204,133,116, 31,186, 11,206, 94,116, 84,
+166,224,102, 27,139,155,137,122, 84, 15,111,138,192,192, 32, 88,123,191, 93,253,114,212,238,253, 87,206,238,155,111,204,186,255,
+149,171, 58, 91, 14, 93,194,180, 73,227,174, 83,192,141,162,135,116,179,111, 23,172,108, 62,107,218,135, 79,189, 55,101,230,242,
+230, 47, 30,201,114,155,222,117,224, 7, 51, 59,244, 24, 8, 93, 94, 54,254, 60,177, 3,189,250,190,129,183,223,251, 4,158,158,
+190,223, 47,153,243,249, 45,135, 69, 27,245, 92,157, 27, 80,183,125,163,134,245, 54, 7, 7, 5,133,112,156,115,149, 15,158, 7,
+244,186, 66,124,254,233, 24,112, 60,143, 38,205, 90,117,149,118,232,193,243, 69,171,129,104,114, 53,134,216,251,119,187,155,115,
+ 98, 47,187,124, 44,205,102,187, 90,173,198,205,155, 55, 17, 23, 23,135,152,152, 24,228,230,230,194,195,195, 67,111, 48, 24, 42,
+ 21,188,111,220,184,241,240,168,168, 40,169,151,151,215,227, 55,173, 86, 43,220,220,220, 48,124,248,112, 97,207,158, 61,131,251,
+244,233, 51, 50, 58, 58,122, 11, 0,109,169,229,201,123,152,225,230, 31,254,115,167,206,157, 38, 0,128,204, 61, 48,113,197,175,
+ 7, 99,202,109,208,122, 4, 85,107,219,182, 93, 45,240, 60, 40,240, 63, 24,115,227,178,202,137, 18, 41, 46, 93,186, 84,147, 97,
+ 24,193,147,103, 16,135,159,214,111,175,251,251,249, 59,131, 22,124,191, 72,234,174,144, 64, 93,104,197,251,111, 15,116,249, 25,
+ 44,243, 15,239,221,182,109,199,253,179,102,126, 35, 80, 42, 20, 56,113, 57, 1, 31,127, 58,213,156,153, 28,189,136,231,132, 43,
+141,234,184,156,151,124, 84,242,120, 5,212,169,162,132, 91,255, 94,210,241,239,244,151, 90,237, 44, 10, 12,118, 88,108, 44, 88,
+142, 71,161,193,142,187,143,116,240,117,175,252, 82,110, 60,207,183, 4,224, 7, 64, 77, 81,212,213,146,219,197, 13,186, 98,111,
+252,204,182,166,232,249,224, 3,192, 10,231, 72,253,199,151, 79,209,118, 89,239, 23,127,255, 46,128,122, 69,154, 44,128, 43, 20,
+ 69,229,151, 97,182,158,139,114, 9, 14, 29, 58,196,247,237,219,247,113,141,255,236,246,179, 72, 68,194, 32,133,135, 31,120,254,
+ 30, 74, 46, 96,172, 10, 8,206, 93,180,100,153,247, 71, 31,140, 75,209, 22,228, 85, 43,122,251,164, 43, 15, 11, 1,197, 44,233,
+212, 46,162,231,132, 15, 62, 64,120,205, 42, 34,150,101,249,232,184, 68,251,134,117,235, 71,157,187, 40, 94,166, 77,139,158, 94,
+ 34, 4, 89,169, 97,159, 44,199,166, 61, 27,193, 98, 57,246,217,214,237,115,154, 20, 5,120, 42,197,248,249,104, 18,120, 30,160,
+192,195, 67, 33,196,182, 51,105, 72,188,190, 71,219,183,137,214, 48,124,193,140,174, 93,122, 79,140,186, 27,111,222,145,147, 99,
+ 62, 14, 32,171, 60,205,210, 43,116, 14, 22, 27, 11,187,195,129, 93, 7, 15, 34,178,107,107,180,109,219, 26, 29, 59,180, 21, 92,
+187,126,251,189, 15, 38,140, 9,193,147,209, 29,143, 53,165,254,181, 91, 42, 61,124,119, 12,154,176,208,237, 78,154, 3, 2, 6,
+ 8, 13,144,193,219, 77, 4,171,131, 66,178,218, 86,116,231,120,226,227, 41, 51,189,167,125, 54,225,136, 86, 45,110, 8,220,179,
+149,183,239, 70,163, 81, 60, 98,196, 8,161,221,110,183, 13,127,255,147,158, 89, 89,234, 1, 63,253,240, 31,137, 74,229, 15,163,
+217,129,235, 49, 15,235,205,154, 53, 51,244,224,177, 51,251,102, 76, 29,191, 63, 50, 50,210, 99,251,246,237, 92, 69,199,243,169,
+ 22, 98,182,230,199,245,155,119,109, 92,186,104, 30, 98, 83,242,177,238,151,149,224, 89,199,207, 21, 28,170,146,154,252,136, 17,
+ 35,100,251,246,237,171,146,150,150,166, 53, 26,141,234,167,226, 17, 52, 37,200,206, 51,194,215, 77, 12,145,128,134,191,151, 20,
+ 42, 15, 9,132, 12, 64, 83, 20, 91,154,230,186, 29,135,231,112,198, 66, 28,216,106, 29,186,254,199,185,120,239,163,175, 17,173,
+ 17, 31,163,229, 30,115, 62, 28, 58,104,154,159,140,141, 12,242,164, 85, 93,155, 87,135, 66, 42,194,151, 19, 71,160,213,245,100,
+ 85,122, 1,247,181,218,196, 52,157,121,236,241, 98,221, 39,159, 14,142, 56, 35, 88,110,114, 33,142,109,254, 62,199, 80,168, 46,
+ 44,238,146,179, 90,204, 41, 46, 94,198, 39, 75,105,217, 78,107,218,168,193,220, 9, 99, 71,211,237,218,180,226,105, 90, 8,141,
+206, 74,241, 60,240,233,199,227,241,225,248, 49, 1,169, 25, 57,223,174, 92,249,243,244,168,223,249,217, 6,245,253, 25,229,105,
+210,148, 51, 10,164,148, 10,160,148, 57,141,139, 82, 42,128,217,202,130,162,192,120, 86,109, 86, 72, 57, 35,185, 25,121, 41,101,
+182,192,159,210,244,174,218,224,212,239,137,110,117,243,119,228, 95, 76,202,136,153,115,253,118,246, 21, 0,121, 33, 29, 61, 71,
+218, 28, 60,244,102, 7,146,178,141,112,216,120,234,189,215,170,161,198,155, 84,248,188,245, 55, 54, 30,189, 13,247, 18,149,254,
+ 83,154,233,151,118,153,125, 26, 14, 28,178,116,249, 47, 87, 23,205,253,154,209, 20, 90,193,241, 60,164, 98, 6, 50,177,160,232,
+197,192,100, 40,196,202, 85,107,178, 28,160, 6,225,236, 89, 71,101,174, 79,112,252,219, 3,123,119,220, 70, 1, 98,138, 22,165,
+ 5, 85,171, 94,173, 91,191, 81,210,110,253, 71,128,117, 88,167, 93, 63,207,159, 54,230,196,158,114, 69,179, 97,253,122,160,128,
+ 27,134,156,184,241, 0,160, 80,133,253, 92, 55,188,110,243,103,223,171, 93, 59,188,185, 43,231,253,113,164, 84,234,246,145,151,
+183,223,215,225, 13,154,170,178,243, 45,148,155, 79, 21, 36, 61,184,137,173,171,190,221,196,153,173, 51, 79, 29,222, 49,119,217,
+186,189,111,117,139, 28,136,245, 63,253,231,203,220,204,199, 70,235,100,137,104,213,219, 27,214,174, 14, 17,138, 37,176, 59, 56,
+216, 89,222,249,211,193, 34, 47, 47, 31,118, 7, 7,169,220, 13, 14,142,130,157,229, 96,119,112,176, 88, 29,138,241, 35,250,124,
+ 96, 6, 46,151, 86,206,224,186,157,142,139, 36,146,106, 60,156,107,215,242, 60,143,164, 44, 19, 29, 24, 24,184, 5, 0, 36, 18,
+ 9, 36, 18, 9, 56,142,195,245, 88,245, 71,190,225, 97, 19, 80,100,240, 88,155, 53,165, 32,249,143, 94,101,237,123, 64, 64, 64,
+191,103, 77,150,217,108,134, 94,175,199,249,139, 87, 61,214,110,220, 21,153,148,146, 86,147,227, 61, 44,110,170,154,189,116, 57,
+ 9,253,202, 58,158,186,236,216, 15,220, 35,198,208,147, 63, 28, 89,123,249,134, 67, 87, 30, 30,159, 83,110,158, 86,141,110, 95,
+ 88, 39,143,123,163,197,130, 31,214, 61,200,255,227,231, 73, 21,157, 35,129, 64, 32, 84,171,213,143,239,239, 21,107,182,182,184,
+ 17,155,254,250,178,165,203,164,215, 19,116,184,147,148,129,145,221,171, 58, 91, 56, 46,156,119,133,127, 77,223,208, 90,181,182,
+172,252, 97,129,224, 65,134, 25, 63,238,185,130,168,253, 63,159,207,202,185, 28,137,236, 76,211,139,212, 33,175,192,104,149,169,
+121,250,182, 6,122,179, 3, 22,171, 3,118,142,135,214,104, 71, 78,129, 21, 90,163, 13,122,147, 3, 35,123, 84, 45,245,123, 21,
+248, 17, 63,138,162, 14,241, 60,223,151,231,249,238, 0,196,197,219,206,103, 54,117,168,200,144, 61,181, 61,109,218,180,175,230,
+207,159, 31, 83,252,217,226,247,139, 63, 91,222,251, 37,190,239,243,229,151, 95, 54, 92,176, 96,193,188, 54,109,218,108,251,243,
+207, 63, 19, 1,228,187,218,125, 40, 40,185, 51,135, 14, 29,170,232, 64,215,180,217,109, 18,119,153, 16,161, 53,170,226,221,175,
+214,251,254,182, 96,116,142, 84, 44, 96,142, 30, 61,234,157,107, 85,130,166, 25,151,155, 40, 74,191, 58,109, 69, 34,241,225,197,
+139, 23, 99,104,191, 14,178, 71, 26,187,254,246, 35, 83,182,193, 10,135,202, 47, 76, 60,103,222, 2,229,130,133,223,127,120,232,
+ 0, 87,160,207,190,251,125,233, 93,124, 45,174, 49, 84,137, 28, 44,138, 2,207,177,105,249,201, 87, 91, 0,192,203,228, 98,233,
+205,118, 48, 69,185, 53, 20, 5, 24,205, 14, 48, 12,149, 83, 16,187,227,238,240,217,115,186,110,218,246,123, 6, 79,123,234, 12,
+134, 36, 57,156,107, 14, 86, 26,179,149,133,197,206, 34,230,214,117,116,140,168,143,182, 45,234,194,104,102, 97,180, 56, 80,163,
+ 86, 56, 0,248,150,122,226, 24, 58,145,103,237,102,158,103,221,250,182,244,131,202, 83,140, 64, 47, 9, 36, 98, 1,236, 14,192,
+100,229, 96,182,178, 72,206, 49, 65,103,146,161, 81,167,193,161, 62,129,215, 44, 89,201,178,125,121,143,174, 13, 42,215,156,178,
+ 44, 54,108,217, 85, 59, 35, 35,123,192,145,125,155, 37,106,173, 29,183,147, 13,200, 41,176, 0,140, 31,190,155,247,163,228,139,
+ 73, 99, 95,223,176,117,119, 74,183, 14,173, 83, 42,187,207, 70,117,236,166, 29, 59,119,253,220,183,239,235,178,152,203, 71,240,
+224,230,169,185,134,156, 74,229,103,209, 77,154, 52,113,140, 29, 59, 86, 55,111,222,188,144, 3, 7, 14,212, 80,171,213, 55, 1,
+216, 61, 61, 61,235,134,213,174,118,235,196,177,163,193,125, 94, 31, 44, 76,211,152,224, 33, 23,161,154, 74,142,139,231,143,219,
+197, 98, 97,169,249, 38, 69,221,131,195,208,237,115, 28,184,152, 24, 25,147, 43, 61, 51,102,244,200,148, 19,231, 98,115, 87,108,
+ 60,241,159, 96,165,253,166,148, 83,175,184,214,162, 86,192,180,143, 71, 96,254,242, 77, 56,123, 61, 54,199, 64, 7,206,205,180,
+ 56,126, 47, 59,148, 14, 8, 24, 10,110, 50, 33, 12, 90,117, 97,252,141, 99, 97,175, 40, 76, 61,242,196,190, 77,116,158,206,142,
+ 84,141,153,202,200,211,129,229,120,120,202, 69,112,112, 60, 10,242, 52,212,230, 77, 27,113,245,234, 69, 26, 12,253, 62,128, 25,
+229, 30, 80,202,217, 85,168,148, 10,157, 17, 33,153,243,167,157,229, 16, 94,187, 22, 86,175, 88,226,238,171,242, 71,251,142,174,
+231, 70,187,249, 84,107,178,237,215, 21, 56,243,231,141,206,103,151,253,216, 82, 25,228,183,156,162,216, 69,224, 97,182,216, 88,
+ 20, 22,228, 67,108, 77, 69,171, 96, 53,188,229, 44,146,181,129,136,206,122,160,172,168,194,207,141,222,123,147,226, 95,159,190,
+235, 96,212,252, 94, 61, 58, 35, 58, 89, 11,153, 88, 0,169,152,129, 84,204, 64, 72,177, 88,178,234,103,123,126,161,174,111,110,
+204,126,205, 11, 92,159, 39,139, 90,191, 78,115,199,234,253, 54, 45,159,254,219,152,207, 23,246,138, 28, 56,138,138,190,122,250,
+ 43, 35,112,202,181,134, 30,239,210,123, 28,231,250, 51, 78,234,230,251,195,196, 47,230, 76,236,217,119, 48, 24, 70, 0,187,221,
+142,221,219, 55,225,215, 31,191,187,111,213,231,142, 2,192, 89,115,152,177, 59, 54,173, 26,252,249,183, 75,168,134, 77, 90,181,
+ 62,157,249,252,114,180, 28, 67,253,242,206,232,113, 67,252,253,253,221,158, 68,180,120,132,133,215, 71,239,254,111,224,248,254,
+189,184, 27,115, 27, 28,239, 52, 76, 28,199,163, 32, 63, 55,203, 97,183,110, 40,179,199, 67, 42,173,182,254,215,141,117,104,154,
+122,188,128,252,164, 15,222,181,142,255,244,171,246,189,123,118,138, 17, 51,208, 38, 63,202,244,188,120,227, 94, 35, 78,168, 12,
+ 25, 61,101,137,200,108, 97, 81,104,180,227,200,186,178,189,142,212,171,106,155,234,205,123,143, 30,255,205,106,137,132,161,109,
+ 13,194, 66, 18, 59, 69, 52, 72,173, 26,228,171,155,181,224,199, 86, 23, 46,223,232,253,214,240,209,210,145,117,155, 83, 65, 62,
+ 50,183,119,135, 15,108,204, 58,108,239, 24,243, 82,203,156, 95, 80, 40,247, 42,168, 90,163,182,241, 73,196, 40,108, 15,197, 35,
+244, 41,231, 65, 33,209,148, 29, 55, 8, 0, 2,131,170,154,133, 18,119, 93, 37, 34, 48, 60, 0, 44, 95,179,181,197,173,184,140,
+ 49, 75,151, 46,147, 95, 79,208,225,102, 66, 33, 36, 34, 26, 54, 59, 7,202,197,160, 54,199, 51,227,190,254,114,154,123,190,129,
+197,153,219,106,196, 92, 59,205, 91,245,230,225,114,135,251, 32,168,220,222, 1, 80, 11, 64, 60, 69,241,191, 24,178, 3,246, 3,
+103, 29,149,189,238, 57,206,217, 94,118,247,171, 25,202, 10, 36,189,133, 98, 69, 27,138,226, 27, 80, 60,188, 0, 62, 61,175,232,
+153,234,170, 83, 51,100,199, 97,225,188,111,241,195,218,189,200,200, 53,195,131, 77,197,254,117,115, 48,121,254, 22,152, 44,101,
+103, 53, 84,228, 71, 74, 51, 70,207, 26,174,226,223,139, 63, 55,127,254,252,190,207,156,155,190,101,156,179,231, 62, 87,252,253,
+ 5, 11, 22,204, 43,241,119,163,171, 38,235,177,209, 42,222,169, 10,204, 86,152, 95, 96,181, 63,247,239,219,227,149,175,183, 65,
+ 42, 98, 80,181, 70,109,204, 88,177,223,239,181, 22,190,208,216, 60,176,117,245,162, 60,179, 81,183,221,165,202, 66, 21,222, 90,
+166, 84, 28,217,179,123, 47,106, 86, 85,137, 54,159,207, 75,186,145,104,122, 28,234,213,170, 83,196, 53,220,141,130, 65, 3, 7,
+202, 79, 69,157,254, 84, 15,148,106,180, 24,138,169,178,102,227,110,149,155, 76, 8,138, 2,116, 38, 7,198,188,243,198,203, 63,
+198,120,142, 25, 61,106, 36,168, 34,147,165,205,205,194, 87, 95,124, 96, 86,216, 31,220,125,148,252, 40,189,123,191,201,167,180,
+122,202, 60,100,196, 7, 87,239,198,205,207, 55, 26, 95,108,145, 31,139,149,133,197,198, 33, 33, 33, 30,147, 70,246,128,144,161,
+193, 48,156, 51, 89,218, 81,246,197,168,207,136,203, 67,128,232,205, 77,139, 63, 90, 19,228,175,242, 81, 42,100,188, 82, 46,161,
+ 26,212,173, 35,138,136,104, 43,174, 17,222, 88,116,254,158, 9,143,212, 38, 36,102, 20, 66,226,223, 84, 48,180,235,107,216,180,
+108, 74,231,188, 71,215,104, 60,159,164,248, 20,191,159,185,212,111,237,170,165,146,236, 2, 27,238, 63,210, 35, 43,223,140,204,
+124, 11,178,242,204, 80,202,132,232,216,127,172,228,240,254, 95,250,117,235,208,122,249,139,236,119, 98, 98,210,225,228,244,204,
+193,141,155,181,194,166,223,126,237,224,233, 89,195,189,160, 32, 73,235,234,217,153, 51,103,142,120,193,130, 5,130, 21, 43, 86,
+104, 35, 34, 34, 2,190,252,242,203, 94, 57, 57, 57, 87,170, 87,175, 30,126,124,207,134,168,166, 29, 7,180, 4,103,243,235,208,
+169,139, 72,194, 9,112,226,208, 33,219,142,237,155,115, 77, 38,221,248,114, 13,135,220, 99, 78,182,158,130, 95,112,112,140, 82,
+204,246, 16,208, 5,113,249,199, 38,110,204, 7,246,212,140,252,248,228,233,107,177,113, 45,174, 39,171,162,174, 63,204,201, 51,
+218,194, 18,142, 77, 46,183,226,101, 40, 10, 66,134,134,155, 76, 0,186,168, 86, 85, 6, 53,126, 8,138,242, 43,142,156, 82,160,
+138,126, 2, 20,133,140,252, 71, 55, 93,200,217,160,120,142, 7, 98,211, 12,208,155,157,161,249, 42,190,114,168,179,211,240,211,
+242, 13,184,113,237, 42,122,190,214, 31, 43,215,108,198,152,119, 6,155, 43,106,253,208,116, 81, 68,171, 68, 52, 75, 41, 19, 0,
+160, 80, 96,176, 99,247,133, 84,212, 10,165, 93,126, 48, 0,128,155, 82,142, 66,157, 9,180,200, 13,241,215,143,200,143,158,190,
+252,229,244,217, 75,167,230,103,222,126,244,240,206,121,132,251, 22, 34, 52,216,134,152, 44,119, 92,203,173,129,240,218, 53, 65,
+139,174,186,164,173,137,105,180,112, 63,189,187,111,139,166,245,219, 84, 83,121,194,100,101,139,162, 90, 12,126, 93,191, 17,201,
+ 73,105,163,115,239,238,191,241, 42, 28,173, 33, 39, 81, 45, 81,213,254,240,206,229, 83,137, 3,135,127,136,192,224,170, 77, 10,
+ 30,221,116, 57,109,193,149,247, 88, 23,141,150, 72,238,249,229,164,175,255, 51,177,103,159, 55,113,233,252, 41,220,140,137, 71,
+235,214, 45,241,218,235, 67,161,211,230,213,221,185,113, 89, 15,135, 81,119, 92, 32,113, 76,108,213,182, 43,197,177, 44, 30,220,
+143,142, 47, 77,203,148, 25,123,243, 98,102,172,251, 83,221, 83,190,117,155, 40, 61,188,111, 90,108, 44,210,211,211,240,199,159,
+103,154,153, 50, 99,111, 86,230,120, 73, 68, 12, 78,220,200,129,173,104, 13,211,142,157,122, 88, 69,180,165,195,220,165,235, 35,
+ 50, 51, 50,105,133,187, 47,231, 29, 92, 79, 20, 40,177, 89,110, 37, 20,138,108,118, 14, 53,131, 20,229,106,250, 5,213,158, 55,
+101,202,164,122,140, 72, 6,157,193, 98,205,204, 72, 15, 88,189,245,180,254,222,253, 59,193, 85, 84, 30,238,255, 89,246,139, 72,
+107,166,144, 83,104, 65,158, 78, 75, 13, 31,247,121,208,218, 31,231,191, 93,158,209, 42, 37, 93, 36,244,240,137,243,117,189,220,
+ 68,148,222,236,224,114,181, 54,118,248,235, 47, 55,232,178,200,100,141, 93,186,100,153,252, 70,130, 14,183, 18, 10, 33, 21, 49,
+ 16,139,104, 88,237, 28, 92,188,157,232, 0, 85,192,248,182, 45, 26,225,248, 77, 13, 24,134,134, 73,151,111, 20, 32, 55,174, 69,
+231,158,242,230,173, 34,208,165,115, 39, 60,140,139,173,122,232,192,238,110, 23,255, 56,155,229,176,133,125,100, 80,199,237,173,
+ 84, 96,193,104,100,236,226,128,119, 3,131,171,183, 27, 52,244, 93,143,106, 85,131, 41,149,175, 15, 28,188, 0, 99,223,121,195,
+229, 59,223,105,204,129, 5,179,191,132,197, 98,133,159,167, 24, 60, 15,172, 95, 62, 3, 86,171, 21, 65, 62, 18, 20, 26,202, 94,
+ 77,174, 34, 63, 82, 86, 20,170, 82,185, 39, 37,204, 88,121,239, 83, 20,117,104,218,180,105, 95, 1,224,167, 77,155,246, 85,241,
+246,252,249,243, 77, 0, 50, 42,232, 58, 92,253,148,209, 42,222,185,178,239,110, 81,184,175, 79,224,197, 19,199,143,121,236,187,
+197,225,210,222,107,232,211, 58, 16, 34, 1, 13,185, 71, 16,110, 37, 21,226,240,158, 85, 5,251,183,253,146,110,177, 88,190,175,
+184,175,185,118, 11,165, 92,113,252,183, 77,219, 57, 95, 31, 31,250,167, 19,234,132, 92,157,227,113,151, 86,220,229, 3,220,181,
+227,171, 3,121, 80,199,164, 82,105,109,171,213,234, 85,209,137, 93,127, 34,165, 40,137,151,122, 21,117, 43, 40,134, 97, 55,109,
+222, 4, 95,119, 49, 44,118, 14,211,166,126, 98, 26,217, 83, 89, 48,252,173,161, 93,187,244,158, 24, 37, 84,212, 57,213,182, 89,
+ 29,190,105,211,166, 5, 12,195,184,148, 74,161, 82,169,102,208, 52, 61, 76, 44, 22,187, 89,173, 86,157,149, 51,203, 13,102, 43,
+204, 54,192,104, 52, 67, 40,114,154, 69, 33, 67,193,100,182,194,104,178,150,127, 99,100, 69, 95, 0, 16,166, 45, 17, 83, 58,117,
+175,166,120,203,206,253,159,188,249,214,144,233,193, 77, 94, 87, 38,101, 22, 66, 68,217,208,178, 94, 32, 78, 31,219,203,167, 37,
+199, 77,170,200,100, 1, 64,142, 58, 47,196,207,207, 31, 55, 18,245, 72,207, 53, 33,171,200,100,101,230, 91,160, 51,233,208,184,
+ 90, 16, 10, 10, 11, 67, 94,248,248, 2,123,143, 31, 63, 62,184,247,128, 33,152, 56,117,102,251,117,171, 22,221, 86,136,133,239,
+ 25,178, 31,156,113,197,104, 69, 71, 71,231,125,241,197, 23,181,214,172, 89, 67,191,253,246,219,166, 70,141, 26, 73, 71,140, 24,
+209,126,227,198,141, 82,185, 92,106,186,117,254,192,244,247, 63,158, 54, 96,245, 15,115,154,228,231,231, 83, 14,187,253,168, 45,
+ 63,127,154,190, 2, 51,151,122,224,171,251,223, 37,216, 70,245,232,224,119,192, 91, 78, 55,144,240,214,161,168, 55, 99, 59,238,
+205,176, 37, 28, 91,161,147, 13, 94,252,113, 70, 1,247,181,153, 86,205,173,200,100, 1, 0,205, 80,176, 58, 88,184,201,132,160,
+105,186,216,196, 7,254,186,253,168,220,207, 67, 12, 33, 67, 67,192, 80,208, 26,237,208,104,109,248,240, 93, 87,103, 8,225, 57,
+ 7,203,195,100,117,192, 88,212, 58,212,105, 53,248,114,234,103,120,173,223, 64,188, 63,254, 51,228,155,128,107,137, 58,216,236,
+246, 10,111, 10,154,162, 97,180, 56,240, 94,207,106,200,211,219, 96, 48, 57, 96,117,112,144,139, 5, 16, 10,104, 40,164, 2,184,
+203,133, 0,207,139,138, 43, 19,161, 80,104,182,219,237,155,202,105,209,163, 70,136, 63, 76,118, 26,173,134, 44, 66,247, 54, 97,
+136,185,176, 91,112,246,210,157,208, 79,167,126,141, 79,198,244,195,174,251,181,224,173,170, 6,165, 66, 6, 59, 79, 3,224, 93,
+ 76,216,155,193,209,182,129,195,126, 94,179, 62,118,214,183,211,164, 5, 6, 10, 18, 17,131,168, 83, 39,113,241,242,181, 31, 52,
+119,247,111,194, 43, 68,200,211,254,238,238,238,144,138, 25, 88,109, 22,171,235,169, 11, 60,120,160,153, 66, 21,246,115, 81,139,
+191, 25,203,161,148,247, 42, 54, 90, 2,169,251,180,143,166,206,154,215,179,207,155, 56,113,104, 23,118,238,218,206,182,137, 28,
+205,108,254,117, 21,218,119,239,143,246, 61,135,224,232,222,141,159, 25, 56,170,254,216,137,211,103,119,236,218, 27, 39, 14,239,
+ 66,118, 86,218, 98, 87,203,203, 8,169,137, 93,123,244,131,217,202,162, 67,183,190, 56,118,112,239,199, 40, 26,100,225,250, 67,
+236,153,250, 25,180,227,179, 73, 19,133, 57, 5, 86,161, 90,107, 69,154,218,136,164,108, 35,246,111, 91,199,187, 94, 95, 88, 91,
+118,108, 92, 69, 56,118, 97, 84,106, 72,149, 64,139,208, 98,146,197,197, 39,212,125,255,221,145,194,208,218,117,233,156, 66, 11,
+212,133, 22,104, 10, 45,208,155, 29,168, 93,165, 14,109,119, 80,109, 42,123,158,125, 61,196,194,149, 7, 19,225,174, 16,162,109,
+221, 23, 31,104,203,113,220, 19,147,181,212,105,178,110, 39, 22, 66, 34, 98, 32, 17,209,144,136, 24, 56, 88,222,165,134,139, 76,
+ 21,214,251,195,143, 62, 8,178, 58,128,220, 66, 43, 4, 12, 5,149,175,151,162,101,147, 97, 88,191,232, 99, 0,192,152, 47,126,
+194,251,239,141, 64,189, 6,141, 80,144,159, 31, 48,236,205,222, 75, 1,236,117,181,172, 71, 78,156,169,122,226,220,141, 47, 62,
+156,242,157,242,173,126, 93,152,155, 9,133,200,204,179, 32, 62, 78, 87,169,200, 27, 0, 56, 88, 14, 60,120,108,216,126, 8, 50,
+177, 0,234, 66, 27,120,158,199,156, 21, 59,224, 38, 19, 34, 51,223,217,221, 95, 30,229,250,145,114, 34, 82,149,136, 54,246,133,
+ 51,151,203,207,213,136,214,252,249,243, 99,230,207,159, 95,106,132,172,132,201,122,177, 69,165, 69, 34, 69, 93,119, 31,223, 75,
+ 39,142, 29,113,219,123,139,197,233, 91,185,120,179, 67, 21,232,243, 30,225,251,169,111,229, 81,224,173, 52,195, 20, 88, 76,198,
+ 61, 38,147, 97, 46, 0, 91,185, 23, 77, 64, 88, 51,133, 84,121,114,229,234,223, 28,190, 42, 21, 54,157,207, 75,203, 55, 56,236,
+ 79,186,173,236,212,181,227,171, 67, 29,156, 61,210,156,253,240,106, 69, 45,113,142,135,104,254,170,253, 0,120,112, 28, 7,158,
+227, 32,148, 42, 21,190, 53, 35,178,139, 42, 58,169,128,166,204, 37,107, 0,158,115,164,105, 18,203, 15,131, 82, 0, 60,228, 66,
+108, 63,155, 14, 0,217,140,238,250,189,225,111, 57,187, 11,205, 86,169,182, 65,173, 90,124,203,150, 45, 11,100, 50,151,166,191,
+ 98,252,253,253,175, 76,159, 62,189,238,251,239,191, 47, 17,139,197,112, 56, 28,222,191,172, 94,205,173,158, 59, 6,131, 62, 94,
+ 9,145, 88, 2,147,217, 6,161, 80,128,252, 66, 61, 10,180, 70,232,140,246,202, 95, 65, 9, 9, 86, 53,176,112,223, 94,241,192,
+ 94,202,198,173,196,180, 8,205,195, 3,113,250,248, 62,254,210,177,245, 99, 76, 57,113,191,185,120, 33, 66,111,182, 35, 35,215,
+140,244, 92, 51,178,242,205,200,202,179, 32, 43,223, 12,138,162, 96,182, 58, 94,234,193,101,200,137,221,185,233,183,181,253, 45,
+ 54, 12,237,216,115, 32, 62,251,110,101,181, 77, 63, 47, 56,153,200,211,237, 92, 76,180,101, 99, 98, 98,146,223,125,247,221, 38,
+ 91,183,110,101, 26, 54,108,104,186,119,239,158,188,200, 68,218,148, 74,185,108,221,143,243,143,183,106,213,106, 91,122,220,253,
+168,162,254,244, 10, 43,246,106,157, 70, 73,100,182, 27, 99,171, 42,218,246,170, 25, 32, 71, 85,133,174, 87, 93,229,173,239,115,
+187,126, 50, 79, 29,245, 67, 78,166,197,241,187,218,196, 52, 77,215, 11, 93,202,193,179, 91,204, 41,131,222, 28, 10,134,162, 97,
+ 51, 27, 83,138, 47, 46,149,135, 24, 51, 54,223,135, 82, 42,132,155, 76, 0,165, 76,136,246,245,189, 81,137,250,140,183,179, 28,
+140, 22, 22, 38,139, 3,102,171, 3,190, 33, 94, 88,179,105, 39, 30,229,152,176,255,170, 6,177, 41, 58,212,169,162, 0,207, 87,
+ 92, 77,114,172,221,208,239,141,183,221, 24,154, 2, 67, 83,116,253,186, 97,200,211,219, 32, 18,208, 16, 73,101, 80, 72, 4,112,
+151, 9, 33, 18, 9,145,147,147, 3,139,197,130,170, 85,171, 74,203,183,130, 60,220,148, 50,212, 9, 13,130,205,238,192,145,115,
+119, 49,119,210, 32,244,232,216, 2,148, 80,137,251,150,102,112,243,118, 3, 71,211,176, 57, 56, 88,109, 44, 0,218, 92,150, 94,
+ 72, 72, 72, 87,133, 66, 45,234, 42,153, 0, 0, 32, 0, 73, 68, 65, 84,161, 48, 26,141,186, 71,143, 30,157,201,138,221,251,136,
+101, 6,140, 61,118, 34,106, 83,223,215,122,224,198,237, 24,236,218,123,224,188,198,167,112, 74,241,119, 26, 52,104, 16,225,235,
+235,171,204,205,205,213, 70, 71, 71, 95,121,209,118, 1, 79,211,159,182,105,223, 25,250,130, 28,100,167, 38,185,220,138,174, 87,
+205, 13,223,204, 95,217, 60, 60, 44,188, 57,203, 59,141, 87,253,170,110,152,252,221,242,230,181,234,132, 53, 47, 30, 16, 82,175,
+106,249,211,178, 9,228,110, 61,223,121,255,179,249,253,223, 28,133,168, 19, 7,176,100,238,212, 77, 10, 15,191,122,222, 94, 30,
+ 77, 27, 70,244,196,249,147, 7, 32,117, 11,128,151, 79, 64,251,183,223,251,168,251,155,111,143,195,197,243, 39,241,195,130,175,
+ 54,178, 22,221, 22, 87,202,170, 80,133,250, 53,105,214,106,184,155,183, 63, 10, 10,117,112,243, 82,161, 94,227,150,195,239,222,
+178,124, 97,200, 73, 84,191,176,233,224,121, 88,108, 60,242,245, 54,164,170, 77, 72,206,114, 26, 45,142,171, 68, 78, 16,203, 81,
+ 74,169, 64,224,109,127, 88,245,206,201, 40,190, 90,136, 63,181,112,246, 84,198, 6, 41,212, 5, 78,147,165,214, 90,161, 46,180,
+ 66,111,182,195, 91, 33, 0,199,114,149,110,117,231,235,109,112,147, 11,225, 33, 23,185, 28,101, 44,141, 85,191,110, 15,191, 21,
+151,241,250,146, 37,203,228, 55, 19, 75,152, 44,161, 51,154, 37, 17, 49, 96, 57, 14,112,225,142, 23, 10,132, 19, 7,244,238,142,
+ 84,141,201, 57,106,153,166, 80,167, 81, 43,248,202, 56,116, 27, 50, 13, 0,208,175,183, 51,181, 45, 49,211,128,131,151,212,192,
+211,137,221,229,215,197, 38, 19,179,122,243,225, 79,119,238,216,230, 97,102, 5,248,229,104, 50,140, 22, 7,164, 34, 6, 18, 17,
+ 3,153,136,121, 42, 31,187, 98,163,229,204,185,123,164,177,195,104, 54, 67,107,178,131, 7,112,229,161, 30, 38,171, 3,133, 6,
+ 59, 34,234,122,189, 92, 32,132,162, 14,243, 60,223,231, 89, 67,244,172, 89, 42, 17,145, 42, 77,227,106, 73,141,226,207,151,101,
+228, 74,230,108, 1,168,212, 8, 46,193,179,206,177,228,182, 72,225, 85,207,195,205,227,210,177,163,135,148,123,111,113, 56,115,
+219,105,178,236, 38, 13, 22,127, 49, 44, 77, 91,160,233, 2, 32,193,213,127, 38,247,173,215, 88, 42,150, 68,253,103,217, 47, 54,
+149,127, 48,183,231, 82, 65, 78,161,145,125,202, 77,176, 22, 11,205,115,188,200,156,253,208,165, 62, 4,154,166,108,223,125, 60,
+ 16, 28,207, 99,198,178,157,152, 55,101, 8,148,178,183,229, 20, 69,201, 13,102, 7, 38,205, 92,139,197,223,140,118,147, 75, 4,
+160, 40,103, 78,212, 59, 67, 7,186,118, 1,154, 29,136,191,188, 85,175, 75, 60,116,175,100,119, 97,235,246,175, 93,107,221,186,
+117,129,151,151, 23,100, 50,217,147, 72, 69, 25,248,251,251,127,243,221,119,223,133,143, 31, 63,254,241,100,159, 2,129, 0, 31,
+126,240, 1,205,178, 60,142, 30, 93, 15,191,234,205,112,224,247, 75,136,236,218, 18,122,163, 25,121, 5, 58,112, 96, 94,248, 66,
+212, 21,104,162,178,146,239,180,106,215,165, 31,206, 28,223,199, 95, 58,186,110, 76,101,230,232,241,242,246, 74,189,126, 39,190,
+ 30, 69,121, 59, 35, 90, 69, 38,203,106,231, 80,205, 95,142,212,228,120,120,122,120,164,186,170, 39,243, 11, 31, 64,209,252,120,
+ 10,252,122, 67,246,131,157, 0,120, 67,230,189, 97, 59,183,172,190, 29, 19,125,115,110,223,225, 19, 5, 61,223,252,128,249,121,
+254, 71, 95, 1,112,117,226, 61, 91,108,108,236,221,209,163, 71,183,189,120,241, 34, 11,192, 72, 81,148,157, 97, 24,185,213,106,
+ 21,117,233,210,165,240,254,253,251,103, 81,122,210,226, 83,180,127,119,167, 47, 37,209,189, 38,230,108,195,170,185,233,122,116,
+233,208, 6,109, 26,132, 32,181, 67, 27, 0,152,152,162, 87,134,155,107,173,221,110,119,200,142,252,252,235,193,121, 99,134,116,
+159,180, 73, 48, 99, 73,230,161, 25,229, 38,162,166,222, 59,219,171, 52, 27, 47, 96,104,184,201,132, 80,202, 4,112,147, 9,225,
+ 38, 21,194,238,224, 43,211,114,228,237, 14,206, 25,209,178, 58,160, 55, 57, 16,117, 51, 27, 89,133, 86, 20,232,108, 48,217, 88,
+240,224,157,173, 81, 23,106,115,245,195, 63, 60,139,159,164,158, 85,155, 21,174, 94,177,200,125,247,133,180,199, 35,250, 60,228,
+ 98,184,201,157,163,177,207,157, 59, 7, 31,159,138, 91,251, 28,199, 97,215,177, 43, 88,178, 33, 10,199,214,127, 14,169,136, 65,
+227, 1, 51, 49,234,245,214,224,120, 14,241,177, 49,217,117,234, 55,241,167,105, 25,104,138,130,197,206, 1,224,203, 60,158, 86,
+171,213,231,209,163, 71,218,218,181,107, 7, 4, 5, 5,189,201, 48, 12, 15,221, 77,203,190,109,121,198, 83,135,182,200, 13, 38,
+ 11, 43,119, 20,174,175,157,105,234,131,218,181, 65, 81, 20,239,238,238, 46,138,138,138,210, 55,106,212,200,239, 5,111, 37, 90,
+166, 10,251,225,253, 9,159,190, 89,171,102, 77,236,220,178, 30, 60, 79,237,118,245,203,155, 15, 94,196,236, 47,159, 30, 97, 56,
+249,187,229,205, 23,207,156,248,212,123, 19,190, 92, 82,238,168, 67,153, 68, 57,101,208,176,177,184,118,229, 79,124, 63,115,242,
+ 54,139, 62,111,148,221, 97, 31,156,151,153,184, 45,180,126,107,240, 54, 29, 78,236, 88,132, 33, 35,198, 72,122,246,125, 19, 23,
+207,159,196,188,175, 38,108, 54, 22,228,188, 11, 23,147,156, 57, 94, 56,190, 75,175,215,133, 38,139, 13,203, 23,126,139,113, 83,
+230, 34,162,107, 63, 97,244,205, 75,227, 1,204,114, 57, 29,194,198,162, 75, 35, 95,167,121,182,115, 56,144,200, 8, 74,187, 2,
+ 5, 12, 69, 55,173,233, 9,147,213, 1,109, 5,141, 74,129, 72,152, 85, 80,168,173,254,227,188, 79, 25,131,217, 1,117,161, 21,
+ 57,133, 22,104, 10,158, 24, 44, 77,161, 5,234, 66, 43,132, 2, 10,113, 9, 41,160,133,130, 74,231,231,229,235,237,104, 21,230,
+229,188, 71, 95,176,119,196, 46,112,111,125,236,236,173, 65, 75,150, 44,149,222, 74,210,225,118,162,182, 40,146,197, 64, 34,164,
+ 33, 46,250,157,229,156,185,145,229,225,238, 87, 51,116,228, 59,111,119,115, 87,202,144,241, 32, 7, 2,198, 57, 69,140,135, 42,
+ 4, 30, 18, 51, 62,154, 48, 22,190, 62,158,120,164,177,224,135,189,113,184,125,247, 33, 56, 83,229,118,123,249, 47,219, 34,223,
+255,112,178, 39, 45, 20, 99,227,241, 36,103, 57, 25, 22,247, 47, 29, 52,103,196,223, 49,232,181,185, 60,120,214,197, 28,100,138,
+119,176,206,203,109,222,140,105,216,182,225, 39, 28,191,158,243,248, 10,188,176,123, 49, 62,253,114, 14, 52, 90, 43, 74,187, 46,
+203,243, 35, 0,212, 37, 34, 81,207,109,151, 48, 71,165,109, 83, 69,219,214, 50, 52,172,207,152, 43,235, 51,239, 91,159,209, 43,
+109,238,191,213, 21,118, 29, 62,103,138, 60,253, 26,202,165,138, 63,143, 30, 61,168,216,119,155,127,108,178,108, 70, 13, 63,119,
+ 98,191, 52,109,129,186,103,165, 76,150, 95,157,134, 18,185,228,236,244, 57, 63, 88,252,131,171, 59,142,220,212,230,234,204,172,
+227,249, 28, 4, 5,171,240,240, 51, 11,196,146, 37, 66,147,245, 91,141,230,158,161,162,200, 19,199,243, 56,116, 57, 11, 60,239,
+108, 34,237, 56,151,142,162,150, 57, 88,206,217,173,242,251,205, 28, 8,138,242, 80, 92, 13,127,175,250,229, 39,109,159, 70,133,
+134,225,243,102, 60,238, 46,140,104,226,140,100,185,187,187,195,211,211, 19, 74,165, 18, 21,117, 29, 82, 20,245,206,251,239,191,
+255, 92,235, 63, 39, 39, 7,221,187,117,193,138,159,214,160, 73,183,145,248,253,143,227,176,217, 57, 52,174, 95, 19,213,131,188,
+144,154,173,123,161, 27, 93,225, 31,254, 97,171, 46,175,127,213,190,107, 63, 68, 29,219,195, 95, 58,246,235,216,202, 78,132,216,
+167,123,219,131,179,103,207, 8,157, 62,247, 71,137,155, 84,128,123,122, 43,104,138, 66, 53,127, 57,124, 20, 52,206,236,219,104,
+ 30,210,175,173,203,147,227,133,132, 4,111, 90,188, 98,181, 98,241,130,153, 93,174, 93,167,162,244, 25,113,121, 0, 96,204,142,
+ 93,120, 31,184, 91,229,207, 19, 71,154,116, 26, 8,255,160,154, 61, 18,179,239,187,108, 54, 0, 24, 19, 18, 18, 18,167, 79,159,
+ 30,190, 96,193, 2,158, 97, 24, 14,128,100,217,178,101,198, 7, 15, 30,220,132,115,104, 46, 42,122,216,116,235,209, 96,146, 82,
+204, 70,120,203,233, 6, 53, 3,228,104,211,192,217, 43, 58,164, 79,123,132, 84,173,138,132, 44, 99,211, 60, 35, 39,212, 91,153,
+154, 43,127,185,125,181,134, 47, 51,198, 97,178,222, 5,176,191,178,231,135,194,147, 4,249,226,104,150,155, 76, 8,206,121,173,
+ 84,202,104, 89,108, 44, 76, 22, 22, 38,171, 3, 6, 43, 11,163,149, 5,199, 59,239, 9,138,162, 96,115,112,112,169,217,252,204,
+181,239,238,237,139,154, 53, 40,184,203,157,101,115, 47,154,238,129, 2,224,227,227, 3,149, 74,229, 82, 84,212,106,115,222,226,
+ 86, 59,247,184, 91,223,106,115,128,231,121,196,197,197,126,158,156,152, 56,160,118,157,218, 29,235, 55,110,226, 45,151,208, 0,
+ 80,166,209, 50, 26,141,172,155,155,155,202,219,219,155, 78, 79, 79,127,108,158,107, 55,237,226,216,187,103, 55, 6, 13, 26,168,
+191,119,229,214,227, 33,238, 38,147,137,106,215,174,157,123, 72, 72, 8,109,177, 88,180,149, 61, 77, 10,191,176,215,189,124,188,
+231,190,243,238,184,176, 46,221, 35,113,250,212, 9,236,223,179,245, 55,163, 58,238,132,171, 34,225,225,117,159, 27,117, 88,171,
+ 78,216,115,163, 14,171,135,214, 41,215,104,213,111,220,178, 53, 79, 9,112,252,208, 14,222, 76,219, 38, 0,224, 88,179,110,199,
+246, 85,223,204, 26, 54,254,203, 90,189,251, 15,195, 59, 35, 70, 65, 32, 96,112,230,247,131, 88, 60,243,179,195,250,194,156,145,
+174,164, 9, 56, 67,111,245, 68,193,178,144, 79,170,214,106,136,235,151,206, 35, 62, 46, 58,230,214,213,139, 13,106, 55,138,128,
+ 95, 80,181, 79, 82,124,153, 5,184,119,207, 86,145,140,213,108, 78, 25, 53,114, 4, 74,142, 58,108,211, 44,220,135,122,246, 6,
+ 0, 96,212,229,216,214, 45,154,244,160,120,212, 33,103,179,166,148,165, 91,152,175,222,117,230,143,203, 83, 6,244,137,164, 53,
+ 90,171, 51,130, 85,104, 45,122, 89,160, 41,254, 93,107, 65,157, 32, 37, 98, 99,174,115,230, 66,205,238, 74,222,151,230, 81,131,
+123,221, 45,190,118, 57,142, 7, 5,152, 43,221, 45, 37,116, 31,187,240,251, 37,210, 91,137,122,220, 78,210, 58,187, 10,133,140,
+211, 96, 9,233,199,166,203, 57,154,189,130,232, 16,197,204,123,111,228, 80,104,180, 54,112, 28, 32, 96,232,162,151, 8,143,116,
+ 20, 82,117, 70,104,242,213, 72, 76, 78, 65, 65, 86, 60,104,154,134,111, 80,152,203, 51, 73,179,188, 56,208,104,229, 27,189,217,
+167,163, 96,207,159,153,144, 75, 4,176,232,178,113,116,251, 34,181, 69,175,157,107, 50,234,247,184, 50,159,227,147, 20, 4, 74,
+173,213,155,253, 37, 66, 6, 59, 55,252,136,193,163, 38, 60, 85,251,126,254,245,108,128,166,144,151,175, 3, 69, 81,234,202,213,
+ 75,212,213,242,182, 95, 48, 50,246,210, 26,165,152,173,231, 27, 10,101,183, 70,249,163, 39,142, 29, 84, 92, 72,150,224, 74,108,
+102,145,201, 82,115,115, 62,238,147,166, 43,204,235, 5, 32,174,114,237, 66,186,215,144,247,166,196,212, 12,171,111, 57, 29,173,
+ 79, 42, 48,216,203,204,115,104,243,230,244,152,107,135, 87,244, 46,180, 39,124,160, 8,172,207,114, 14,199, 66,147, 58,110,102,
+ 25, 93,135,226,153, 63,236,124,220,109,248,197,130,141,206,223, 89, 22, 44,207,129,231,128,143,190, 89, 5, 7,199,130, 99, 89,
+112, 44, 15, 59,203,203, 43, 42,174, 42,168,250,158,252,251, 59,234, 14,159,245,124,119,161,167,167, 39,124,124,124,224,227,227,
+ 3,119,119,247, 10,141,150, 80, 40, 84, 10, 4, 79, 31,234,148,148, 20, 36, 39, 39,195,221,221, 29, 60,103,135,213, 14, 52,140,
+232,137, 59,241,209, 56,121,225, 38,120,142,133, 66, 89,249, 85, 94, 20,254,225, 31,180,236, 60,224,199,174,253, 71,227,247, 61,
+191,240, 87,207, 29, 28,103,202,137, 91,235,114,132,158,101, 41,187,221,142, 62, 61, 59,167,220,136,121,120,236,235, 41,227, 35,
+219,246, 29, 39,105, 19, 30, 12,179,149, 69, 90,114, 60,206,236,251,213, 28, 22, 26,120,188, 91,135,214, 41,118,187, 29, 44,203,
+ 86,248, 32, 55, 91,109, 26, 70, 40, 83, 12, 29, 58, 92,120,245,202,149,221, 10,191, 58, 59, 89,138,190, 69,241, 92, 99,138,231,
+ 7, 53,110, 92, 15, 54, 59, 7,163, 81,155, 95,217,125,214,233,116,137,235,215,175, 15, 29, 57,114,164,188,126,253,250,194,248,
+248,120, 44, 94,188, 56, 87,167,211, 37,186,170,113,226, 92,236, 50, 1,149,255,160, 56,162,245,168,125, 27, 12,237,219, 30,219,
+ 14, 95,192,153,243, 23,145,162, 87,222,212, 59, 4,251, 82, 83, 50, 44, 13,188,181,187,251,183,169,206,236,220,144,191, 59,166,
+243,180,183,120, 94,114, 66,115,118,134,193,245,155, 27,208,153,236,112,151, 59,231,123, 42,142,108, 49, 20,229,178, 35,162,128,
+196,243, 23,175, 55,108, 81,167, 62,110, 36, 22, 34,167,192, 2,147,197, 1,142,227,193,129,135,143,155, 24, 82, 17,141, 71,201,
+137,224,120, 91, 82, 37, 31, 21,234, 78, 29, 59, 9, 0, 10, 20,197, 11,132, 2, 1,120, 56,231, 87,148,201,100,122,149, 74,229,
+ 82, 68,203,230,112, 96, 80,100,107, 68,180,108,140, 1,227,156,115,102,158,250,109, 26,188,148, 66,108,219,180, 22,169,231,150,
+109, 10,109, 51,254, 68,244,157,152, 55, 98,110,252, 57,252,181,230,178,166, 1,130, 12, 81, 89, 97, 82,131,193,176, 27,128, 88,
+ 36, 18, 69,118,236,216,209,123,247,238,221, 5,190,190,190,156, 88, 36, 82,247,239,215,151, 19,138, 68,121,197,159,253,227,143,
+ 63,132,227,198,141,115,203,207,207,127,148,157,157,125, 17,128,189,252,134, 96,120,119,208,216, 10,138,146, 42,101,242,148, 26,
+ 53,106, 6,181,140,104,237,241,250,160,193,144,136, 37,248,253,196, 49, 44, 95,186, 96,135, 62,243,222,123,149, 57,146,175,106,
+212, 97,218,163,164, 68,163,201,210,168, 97,139,206,212,249, 19,251, 38,218,224,187,148,145,216, 22,117, 31, 52,161, 86, 98,134,
+ 30,203,231,127, 14, 47, 15, 5,146,226,239,155, 30,220,187,179,202,110,214,126,238,178,201, 2, 32,207,101,223,104, 51, 34,210,
+203, 98, 99,113, 46,234,176,153,115,112,145, 23,207, 30,137,175, 18,214, 82,218,176,101, 55, 47,205,254,181,131,140,192,182,138,
+116,210,239, 63, 31,193,229,173, 5, 73,167,162, 78,122,248, 87,107,192, 80,160, 96,179,152,161, 78,184,234, 48,102,223,215,106,
+211,163, 93, 26,133,155,155,138,111,190,252,238, 63, 31,180,108,209, 66,193, 67,250, 84, 4,171,216, 96,105,180, 86,248,186,137,
+ 97,210,170,241,224,234, 49,179, 81,205,148, 59,223,153,195,106,144,107,114,178,197, 79,210, 25,226, 34,202,251,188, 38, 39, 91,
+236,176, 26,228, 21, 63,234, 24,184, 43,196,184,147,148,254, 56,241, 93, 34,116,230,102,137,133,204,227, 60,173,226,186,160, 2,
+ 58,139,164,158, 72,207, 53,131, 2, 15,142,117,192, 97,183, 66,167,213, 34, 61, 35, 11,217, 89,217,208,233, 10, 32, 87,122,161,
+ 97,211, 86,112, 83, 72,113,235,204, 14,240, 60,239,210,188,134,118, 74, 24,222, 50,162,131, 36, 58,217,153,139, 37, 21,242, 56,
+184,117, 65,174, 94,155,211, 65,159,249,224, 65,101,235, 98, 7,203,158,188,125,247, 65,131, 42,129, 53,168,155,241,133,216,180,
+102, 5,172, 69,145, 77,187,157, 69,244, 35, 3, 50,243,140,120,148,112,143,231, 88,246, 36,254, 71, 16,148, 29, 0,132,160,113,
+195,122,232,249,246,235,248,233,167, 85, 72, 72, 76,230,230, 78,236,253, 72,175, 43,120,173, 18, 38,171, 59,138,230,218, 48,102,
+199, 46, 52,121,181, 76, 59,112, 35,143, 54, 89,249,114, 19,124,164,126,213,208,225,189,197,199, 77,186, 60, 49,107, 49, 10, 14,
+110,122,111,107,105,154, 78, 7, 13,235,220,201, 67,160,148, 9, 64, 81, 20,138,187, 11, 87,206, 30, 11,185,196,217,183,108,178,
+ 56,240,246,164, 37,216,180,228, 51,240, 0,134, 13,190, 96, 44,171,156,112,174, 93,248, 81, 32,174, 84, 73, 73,206, 73,239,222,
+111,242, 41,179, 77, 98,233, 59,112,228,181, 22, 45, 90, 20,200,100, 50,200,100, 50,184,187,187,195,203,203, 11,158,158,158, 21,
+238,187,221,110,215, 91,173, 86, 31,177, 88, 12,142,227,144,148,148,132,164,164, 36, 20, 22, 22, 66,173, 86,195,160,215, 58,174,
+156,218, 41,104,216,166, 55,130,106, 54, 66,181, 58, 77, 32,100, 40, 8, 4, 52,206, 28, 88, 83, 86, 57, 75, 55, 89,157,250,175,
+236, 54,224,125,252,190,103, 53,127,245,220,193,241,166,156,184, 53,174,158,163,162,238,158, 91,131, 6, 13,106, 52,110,220, 56,
+209,119, 83,198, 29, 63,124,226, 76,220,206, 67,171,251,229,231, 23,132,240, 60, 15, 79, 15,143,212, 33,253,218, 30,236,210,174,
+101,202,169, 83,167,184,173, 91,183, 90, 40,138,186, 83,158,166,179,146,202,249,237,212,201,168, 25, 29, 58,117,198,218, 13, 91,
+ 59,197,220,189,215, 41, 62,254, 1, 66,170,213, 68,141,208, 58, 48, 82, 94,136, 58,123, 30,250,130,156,223, 92, 41,231, 51, 81,
+ 45, 42, 63, 63,255,207, 33, 67,134,244,188,112,225, 2, 61,100,200, 16,163, 70,163,249,163, 68, 20,139,175, 72,243,226,207, 3,
+213, 0,126,171,214,105,212,142,116, 91,193, 39, 0, 22, 84,173, 86, 21,103,206, 95,196,197, 11,151, 87,105,228, 85,103,190,247,
+246,187, 99,171,247,103,222,239,223,166, 58,163,242,146, 99,203,234,197,204,129,139,201, 75,146,115,217,181, 11,206,206,152,237,
+202, 57,122,252,224,208,217,208,174,158, 55,236, 44, 15,142,119, 86,184,110, 82, 97, 89, 21,239,115,154, 2,171,228,189,241,227,
+198,197, 55,108,220,244,211,183,223, 29, 47,106, 90, 51, 4, 87, 30, 22, 0, 20, 5,239, 0, 5, 50, 51, 51,113,110,215,106, 71,
+126,250,253, 85, 12,195,205,170,196,241, 68,126,202,205,218, 37, 54,199,106, 52, 26,156, 57,115, 6,197, 6,203,207,207,175, 44,
+163,245,148,102,110,118,198, 31,179,191,255,165,221,152,119, 6,162,111,231, 6, 56,123, 53, 30,214,162,249,154,138,135,146, 39,
+ 94,252, 89,252,201,144,154,214, 15, 6,133,105, 77,118,113,242, 55, 73,133,231,224, 92,131,149, 43,163,156,214,188,188,188, 3,
+177,177,177,237,155, 52,105, 82,253,200,145, 35,121, 49,151,143, 79, 44, 89,136,201,147, 39, 43,127,250,233, 39, 57,207,243,127,
+ 88,173,214, 4,151,246,157,198,150,235,215,174,249,216,236, 28,206, 95,190, 85,175, 91,187,166,224,120,224,234,213,171, 88,187,
+110,173,249,206,237,155,139, 12,217, 1,179,202, 49, 47,165, 30, 79,246,229, 70, 29, 62,214,204, 76, 79, 94,244,251,225, 93,155,
+ 90,118,234,135,225, 31,205,154,117,230,240,214, 25,205, 59,244,165,235,181,236,137,235, 23,163,112,242,200,177,255,216,244,121,
+ 51, 80,113,238, 72,169,229,148,200,228, 31,215,111,222, 9,143, 82,146,145,244, 32,250, 55,115,222,195,140,148,120,230,183,140,
+180,148,241,161, 13,218,225,194,241,109, 19,203, 49, 90,229, 94,243, 33,126,178,213, 71, 14, 29, 24,154,150,246,115,128,193,100,
+150,240, 60,111,150,136, 5, 89, 74, 90,183, 93,235,114, 57,239,217,212, 25,213, 7, 13,126,123,252,225,229,203,151, 10,253, 61,
+229,200,202, 55, 67,107,178, 65,103,180,129,166, 40,212, 14, 82,192,168,203,195,217, 93,223,219,173,250,252, 33, 64,188,173, 44,
+ 77,133, 42,124, 78,254,195,168,143, 38, 79, 56, 13,177, 71, 72, 80,141,174, 95,150, 27,173,211,165,223,236, 55,121,194,193,112,
+158,231,187, 41, 84,225, 58, 67, 78,236,244,178,246,157,162,156,247,247,240, 46, 33,176, 57,156,243,143, 57, 56,128,229,184,162,
+ 40, 31,192, 63,238,207,167, 42,216,119,138,219,126,248, 15,100,100, 23,192,100,181,195, 98,117,192,102,103, 65, 51, 12, 60,189,
+ 60, 81,167, 70, 51,120,120,186, 35, 59, 43, 3, 23, 79, 29, 64,220,237,179,127, 80, 60,102,154,212, 15, 78,185,114,142, 68, 50,
+207,240,192,160, 0, 58, 83,107,133, 76,204,224,230,217, 35, 54,187,213,178,200, 69,147,245,156,102, 65,110,222,146, 79,167, 76,
+ 29,246,235,250, 13, 1,141, 66,221,145,166, 49, 33, 77,109,134,206,108, 47, 50, 98, 28, 44,122, 13,110, 71,109,200, 98,205,186,
+ 37,248, 31,161, 76,163,229,176,153,117,187,143, 93,241,153, 54,227,123,230, 97,124,130,125,206, 39,125,210, 76,122,109,239, 74,
+ 71,178, 74,240,235,135,161,219,254,138,157,120,174,187,144,231,192,241, 60, 14, 94,206,122,220, 93,200, 21,101, 94,222,136, 47,
+127, 25,193,146,107, 23,118,238, 61,241,247,219,177,186,205, 38, 83,182,199,253,135,139,242, 1,128, 97,152,199,175,226,220, 44,
+179,217,108,173,160, 11,101,227,154, 53,107,190, 24, 63,126,188, 36, 53, 53, 21,241,241,241, 40, 40, 40,128, 84, 42,197,177, 99,
+199,236,224, 28,139,110, 95,216,155, 20,123,253,196,183,225, 45,122, 86,105,212,166, 55,228,114, 5, 4,188,235,201,152,114, 85,
+216,208, 22,157,250,255,216,237,245, 49, 56,185,119, 13,127,245,236,129, 9, 38,117,220,234,202, 30,203,130,130,130, 24, 0, 15,
+ 22, 45, 90,212,116,237,218,181,161, 83,166, 76, 73,216,248,227,140,229, 0,144,155,155, 11, 0,184,113,227, 6, 63, 97,194, 4,
+139,217,108, 78,204,207,207,191,142, 10, 6, 64, 0,128, 73, 45,159,183,118,229,130,134,169,233,153, 3,107, 54,108, 5,191,208,
+ 86, 8,168,221, 26,249, 58, 27,174, 60,204, 64,194,189, 83,184,119,126,215, 17,163,210, 49, 3,149,156,223,184, 73,147, 38, 33,
+ 52, 77,215,208,235,245, 1,245,235,215,111,162, 80, 40,110, 52,105,210,164,153, 64, 32, 72,187,118,237, 90,114,101,180, 82,206,
+110,176, 84,235, 52,234,135, 20,157, 91,151,132, 44, 99,179, 20,157,219, 13,163,196,227, 51,117,212, 15,150, 95,153,224, 37,188,
+ 77, 19,179,115,131,118,247,150,213,139,153,183,199, 78,102,163, 11,189, 62, 17,200,196,191, 87, 46, 92, 77,103,126, 48,114,192,
+147,233, 29,138, 34, 89, 69,191,187, 20,166, 47, 44,188, 93, 8,224,139,219,119,133, 63, 70,127, 50,110,118,227,150,237, 70,116,
+124,109, 8,237, 16, 41,113,124,239,207,124,226,237,168,157, 2,158,253,218,228,194,106, 0, 21,118, 7, 89,173,174,152,172,231,
+203,152,170,232,188,115,235,186, 81,187,247,238,153,255,122,255, 1, 62, 43,191,121, 11,223,255,178, 15, 10,153, 4, 60,199,225,
+173, 46, 33,111,126,251,126,221,126, 33,254,210,224,221,167,211,206,125,180, 52,250, 11,163,209, 22,231, 66, 36,134,215,104, 52,
+231,149, 74,165,186,125,251,246, 17, 18,137,132,210,104, 52, 2,149, 74,229,240,240,240,176,166,165,165, 25, 45, 22,203,110, 0,
+149,154,118,220,102,231,144,148,109,198,254, 61,187,113,235,242, 41,220,187, 23,171,187,119,247,222, 10, 74,192, 47, 53,100, 63,
+200, 3, 42,221,192, 7, 87,234,168, 67,190,210,163, 14, 89,139,110,203,198, 85,115,186, 26,205,150, 81, 77,218,246, 65,245,122,
+237,104,155,157,197,157,171,167,113,122,215,210,239,109,250,188,105, 47,115,142,131,170,132,214,225, 25, 49,254, 60,115, 24, 60,
+199,173, 2, 0,158,227, 86,221,184,112,100,124,235,222,239,195, 91, 85,189, 73,193,163, 27, 20, 94, 96,246,112,145,128, 54, 28,
+221,253,235,222,164,164, 36,220,191,127, 31, 15, 31, 62, 68, 94, 94, 30,182,108, 73,170,212,249, 49,230, 39,255, 30,119,151,238,
+245,198, 91,195, 15,190, 57,244, 29,105,104,157, 70,116,120, 21, 47,248, 40, 5,136,125,152,140,184,107,183,185,216, 43, 71,204,
+ 54,109,206,235,166,252,228, 50,141,159,220,183,158, 63,192, 78, 43, 94,187,176, 77,155,118,225, 83,231,206,143,240,241, 83,149,
+ 90,143,231,170,115,196,159,127,116, 32,252,226,165, 63, 93, 90,235,144, 99,217,220,177,163,134,112,140,115,161, 80, 60,142, 83,
+ 23, 29, 61,103, 99,202,249, 62,207, 57, 42,140,224,191, 59,176, 3, 28, 28, 7,131,201, 6,173,193,130, 66,157, 25,153, 57,185,
+184,117,251, 54,206, 30, 60,128,248,216, 91,137,118,171,245, 4, 77, 83,187, 76,217,113,103, 43,215,211, 36, 8,245,241,246, 70,
+ 98,158, 30, 82,177, 0,201,113,215, 44, 6,109,225,230, 23,189,142, 76,185, 15, 50,115, 24,170,231,144, 33, 67,143,117,237,213,
+223,163,101,219,238,114, 95,119, 79,136, 4, 60, 30, 36,101,224,250, 31,199, 12, 9,183,206,105,237, 86,125,228,171, 88,245,229,
+111, 78,197,163, 14,109, 22, 67,191, 97, 3, 58,237, 97, 24,129,152,227, 28, 22,155,213,242,198,203,152,172,191, 10,158,103,211,
+ 70, 13, 27,248, 84,219,192,193,241,178, 97,131,143,155, 74,182, 21,236, 44, 47, 31, 54,248, 15,163,179, 2, 41, 59,177, 47, 48,
+208,187, 79,241,218,133, 41, 41,185, 87,243,242, 44,167, 1,164,153,205,230, 23, 46, 99,118,118,246,236,185,115,231,246, 53, 26,
+141,117, 59,119,238, 44,113,119,119, 71,110,110, 46, 78,156, 56, 97, 63,116,232,208,221,156,156,156,111,129, 28,135, 9,205,126,
+187,109,222, 59, 50,246,218,137,111,235,182,232, 85,165, 81,219,222,174, 87,102, 18,217,152,174,253, 71, 83, 39,247,173,225,175,
+156,217,247,129, 73,253,224,151,151, 56,172, 54,179,217,124,217,108, 54, 71,127,253,245,215, 45,253,253,253,253,191,253,246, 91,
+169, 86,171, 21,174, 92,185,210,172,209,104,178,180, 90,237, 69,148,147, 79,243, 60, 55,236,133,233, 24,116,116,247,154, 46,252,
+238, 53, 61, 60,125,131,123,122,248, 85,169, 85,160, 78, 79, 44, 84,103,156, 0,112,178,104,162,200, 74,209,180,105,211,154, 20,
+ 69, 13, 1,208, 80,161, 80,212, 86, 42,149, 18,158,231,235, 82, 20, 21,195,113,220,237,250,245,235, 31,186,123,247,110,165, 38,
+147, 77, 57,187,193, 18, 18,222,110,107,158,145, 19, 89,105,209,214,148,179, 27, 44, 0,144,243,251, 84, 35,128,253,119, 59,127,
+ 49,232,192,197,228,229, 49,249, 30, 19,213,103,230, 31,168,108,153, 11,211,110,213,126, 85,215,191, 57,243,110, 26,128, 81,183,
+175, 97,241,157, 27, 23,191,163,120, 8, 89, 56,230,152,114, 30, 94,123, 21,250, 66,161,208, 28, 28, 28, 92,234,232, 66,137, 68,
+ 98,182, 88,202, 11,160,156,117,232, 51,177, 22,232,180, 97,207,142, 13,163,246, 29,216, 63,191, 99,183,215,125,164, 85,170,160,
+134,138,194,134,105,205, 39,158,186,161,190,210,127,234,185,159, 18, 50,204,183, 81,201,124, 24,189, 94, 31, 7, 32, 95,175,215,
+ 15,224,121, 62,149,162,168,144,252,252,252,155,118,187,253, 78,165, 13, 1,135,225,109,218,180,218, 66, 81,148,128,119,112, 11,
+ 47, 10,153,173,230,204,123,105,120,201,101, 73, 26,213,112,199,164,111,127,104, 94,171,118, 88,243,226,181, 14, 27, 84,119,195,
+184, 47, 22, 55,175, 30, 90,167,249,147,245, 15, 43, 76, 19,224,237,198,252,247,246,172, 91,120,238,198,165,211, 95,249, 6, 86,
+175,158,149,150,112, 47,245,225,205,217,172, 89,187,231,101,207,115,210,195,152,165,107, 23,125, 49, 37, 51, 61,113,173, 81,253,
+ 32, 26, 0,140,234, 7,209,247,174,227, 27, 77, 86,218,148,220,156,132, 69, 47,122, 44, 12, 6, 67,198,230,205,155, 61,219,181,
+107, 71,251,251,251, 67,173, 86,227,244,233,211, 28,199,113,233,149,214,202, 75, 60,109,200,163,188,127,251,229,199,133, 34,133,
+ 91,111,135,195, 17,196,243,128, 64, 32,200,180, 26,181,199,116,180, 98, 42,242,147,205,229, 63, 51, 56, 10, 0, 93,188,118, 33,
+199,113,212,194,229, 27,146,133, 82,183, 82, 39, 67,180,155,117,114,142,227, 92, 94,235,176,224,209,245, 90,175,234,254,166,120,
+126,102,147, 22, 17, 95,217,237, 54,115,209,253, 97, 6, 96,230,121,228,210, 52,117,150,225,236,199,181, 47,209,152,162, 40,184,
+243,148, 0,110, 50, 1, 40, 80,208, 23,230,241,149,201,201, 42,213, 16,231,196,197, 24,115, 58, 85, 59,106,221, 49, 50,234,247,
+ 35,131, 89,150,173, 81, 20, 51, 72,178,152, 12, 59,245,153, 94,191, 1,215, 28,248,247,115,184,216,108, 81,127,241, 63,114,169,
+ 27,229,239,164, 25, 30, 42, 27, 80, 37,216,127,100, 82,114,206,149,132, 84,227,111,120,122, 89,157,151, 41, 39,227,239,239,255,
+ 13, 69, 81, 35,196, 98,177,210,106,181, 26,120,158,223,152,157,157, 61, 27,207, 45,254,219, 76, 40, 83,153, 70,138,165,242,233,
+ 54,179,225, 79, 99, 78,220,240,138,246, 93,238, 23,214, 83,170, 80,124, 97, 54, 25, 54, 26,179,227, 54,188,226,227,233, 33,145,
+ 72,154, 41,149, 74,161, 70,163,185, 12,160,240,239,116,222,155, 52,105, 82,149,166,233, 26, 28,199,249, 3,240,128,115, 84,136,
+ 70, 32, 16,164, 23, 69,180,248,202,106,182,127,119,167,111,183, 30, 13, 38,157, 56, 23,187,172,168, 91,241, 49,193,111, 46,145,
+142,232,221,101,242,111,123,246,151, 54,234,240, 31,119,205,255,255,105,118, 18, 40, 3, 53,163,104,177,199,156,110,225,102,163,
+ 38, 35,125,194,249, 59,234,203, 0,116, 47, 83, 78,145, 72,244,182,205,102,147,137, 68, 34,147,205,102,219,252,119,217,119,153,
+ 42,124, 52, 13,222,229,149, 41, 56, 80,215,158, 25,180,242,111,185,150,152, 70,141, 26,117, 16,137, 68, 85, 89,150,149, 91,173,
+ 86,163,201,100, 74, 74, 78, 78,254, 19,101, 47,124,254,151,150, 83,161,170,179, 84, 36,146,124, 2, 0, 54,155,229, 7, 67,206,
+131, 73,229,125,177,156,207,255,163,207,145,111,141, 22, 15, 4,140,208, 15, 69, 19,115,115, 14,135, 58, 59,241,106,157,255, 98,
+ 57, 9, 47,120,114,137, 38,209, 36,154, 68,243, 89,104,114, 60,137,230,127, 83, 83, 26, 88, 47, 68, 26, 88,207,229, 73,151,203,
+248, 60, 57,158,132, 98,198,150,242, 2,224,194,132,165, 4, 2,129,240, 23,192,145, 67, 64,248,111, 98,206,188,151,250, 87,126,
+158,240, 63, 71,153, 57,209, 84, 57,174,180, 50, 33,193, 23,113,182, 39,137, 38,209, 36,154, 68,147,104, 18, 77,162,249, 63,167,
+ 89,145,246, 63,177, 75,114,236, 51,219,135, 1,252,191, 36,252,147,176, 42,209, 36,154, 68,147,104, 18, 77,162, 73, 52,255,215,
+120,108,188,104,114, 44, 8, 4, 2,129, 64, 32, 16,254, 26, 72,142, 22,129, 64, 32, 16, 8, 4,194,203, 81, 90,215, 33, 49, 90,
+ 4, 2,129, 64, 32, 16, 8,175,128, 50,147,225, 73,215, 33,129, 64, 32, 16, 8, 4,194,203, 81, 28,209, 10,196, 51,211, 59, 16,
+163, 69, 32, 16, 8, 4, 2,129,240,106,200, 68,105,209,173, 67,135, 14,241,165,253, 78, 32, 16, 8, 4, 2,129,240,255,193, 63,
+220,139,148,140,100,141, 45,218, 6, 80, 34,162, 69, 12, 22,129, 64, 32, 16, 8,132,191,139,217,250,135, 81, 28,201, 42,126,101,
+ 62,103,180,250,246,237, 75, 17,179, 69, 32, 16, 8, 4, 2,225,191,197,191,209,139,208,207,238, 32, 57,205, 4, 2,129, 64, 32,
+ 16,254,155,102,235,223,180, 63,100,122, 7, 2,129, 64, 32, 16, 8,132,151, 35, 16, 64,159, 18,219,255,111, 75,240, 16, 8, 4,
+ 2,129, 64, 32,252,219, 25, 91,214, 54,137,104, 17, 8, 4, 2,129, 64, 32,188,122,179, 69, 32, 16, 8, 4, 2,129, 64,248, 39,
+ 67, 86, 54, 39,154, 68,147,104, 18, 77,162, 73, 52,137,230,191,157,226,121,180,128,178,230,209, 34, 16, 8, 4, 2,129, 64, 32,
+188, 16,125,224,156, 63,107,108,209,207, 62,196,104, 17, 8, 4, 2,129, 64, 32,188, 90,158, 91,126,135, 24, 45, 2,129, 64, 32,
+ 16, 8,132, 87,107,176, 86, 19,163, 69, 32, 16, 8, 4, 2,129,240, 23, 67,140, 22,129, 64, 32, 16, 8, 4,194, 95, 4,133,178,
+ 71, 14,156,172,132,206,139,140, 62, 56, 73, 52,137, 38,209, 36,154, 68,147,104, 18,205,255, 57,205,138,180, 79,226,159, 71,241,
+204,240,135,241, 36, 17,126,245,255,199, 63, 38, 67, 95,137, 38,209, 36,154, 68,147,104, 18, 77,162,249,111,103,236, 51, 63, 31,
+ 67,186, 14, 9, 4, 2,129, 64, 32, 16, 94,173,217, 34, 75,240, 16, 8, 4, 2,129, 64, 32,188, 34,202,236, 38, 36, 17, 45, 2,
+129, 64, 32, 16, 8,132,151,163,204, 69,165,137,209, 34, 16, 8, 4, 2,129, 64,248,107, 12, 23, 49, 90, 4, 2,129, 64, 32, 16,
+ 8,175,208,100,141, 45,245,175,135, 14, 29,226,201, 49, 34, 16, 8, 4, 2,129,240,223,226, 95,235, 69,138,119,140,152, 45, 2,
+129, 64, 32, 16, 8,196,139, 84,154, 64, 60, 25,109, 56,182,104, 27, 0, 25,117, 72, 32, 16, 8, 4, 2,129,240,178,244,193,211,
+ 35, 15,199, 22,111, 19,163, 69, 32, 16, 8, 4, 2,129,240,242,140, 45,247,175,164,219,144, 64, 32, 16, 8, 4,194,127,147,127,
+163, 23,161,200,105, 37, 16, 8, 4, 2,129, 64,120, 41, 74,139,102,173, 38,135,133, 64, 32, 16, 8, 4, 2,225,175, 53, 92, 4,
+ 2,129, 64, 32, 16, 8,132,191,194,100,253,213, 19,150,146,149,205,137, 38,209, 36,154, 68,147,104, 18, 77,162,249,191, 98,178,
+ 74, 78,241, 0,128,140, 58, 36, 16, 8, 4, 2,129, 64,120, 89,200,162,210, 4, 2,129, 64, 32, 16, 8,127, 17,100, 81,105, 2,
+129, 64, 32, 16, 8,132,255,103,195, 69,140, 22,129, 64, 32, 16, 8, 4,194, 43, 52, 89, 79,153, 45,146,163, 69, 32, 16, 8, 4,
+ 2,129,240,114,148,153,163, 69,161,236,145, 3, 39, 43,241, 15, 94,100,244,193, 73,162, 73, 52,137, 38,209, 36,154, 68,147,104,
+254,207,105,254, 31,123,231, 29,214,212,217,254,241,111, 22, 25, 36,144,176,195, 86, 25,226, 2, 69,235, 22,247,170,184,169, 91,
+235,174,213,106,245,181,110, 5, 90,181,142,186,107, 91,251,186,234,168,187, 86,113, 83, 7,110, 37, 40,130, 34, 32,136,128,236,
+145, 9, 36, 33,201,243,251,131, 81,106,153,218,190,191,142,231,115, 93,185, 32,201,201, 55,207, 57,231, 57, 39,223,115,159,231,
+185,239,186,180,195,241,247,103, 6,254, 71, 9, 75,233,212, 87,170, 73, 53,169, 38,213,164,154, 84,147,106,254,219,160,233, 29,
+ 40, 20, 10,133, 66,161, 80,254,104, 99,245, 38,212,104, 81, 40, 20, 10,133, 66,161,188, 27, 52,143, 22,133, 66,161, 80, 40, 20,
+202,159,132, 35,202,162, 90, 21,127,253,169,209,162, 80, 40, 20, 10,133, 66,249, 99, 24,132,178,168, 86,197, 95,106,180, 40, 20,
+ 10,133, 66,161, 80,254, 64,170,205,163,197, 0,128,176,176, 48, 82,254,188, 71, 96, 96,224, 13,186,173, 40, 20, 10,133, 66,161,
+252, 47,249,167,122,145,202,136, 86, 96, 96, 32, 3,192,117,186,171, 41, 20, 10,133, 66,161,252,127,240, 79,244, 34,204, 55,156,
+100, 15,186,155, 41, 20, 10,133, 66,161,252,127,240, 79,244, 34,236, 55, 92, 36,133, 66,161, 80, 40, 20,202,255, 11,127, 99, 47,
+226,136,178,129,240,231,202,255, 2,229, 41, 31,104, 30, 45, 10,133, 66,161, 80, 40,148,119,163, 98,182,225,239, 74,239,208, 40,
+ 22,133, 66,161, 80, 40, 20,202,187, 81, 93,102,248,239,233,102,161, 80, 40, 20, 10,133, 66,249, 19,161, 17, 45, 10,133, 66,161,
+ 80, 40,148,119,167,106, 84,235,127, 22,205,162,149,205,169, 38,213,164,154, 84,147,106, 82, 77,170,249,111, 50, 89,191,121, 78,
+ 51,195, 83, 40, 20, 10,133, 66,161,252, 73,208, 89,135, 20, 10,133, 66,161, 80, 40,239, 70,197,140,195,170,207,169,209,162, 80,
+ 40, 20, 10,133, 66,249, 3,205,214,239,160,183, 14, 41, 20, 10,133, 66,161, 80,222,141, 25, 53,189, 65,141, 22,133, 66,161, 80,
+ 40, 20,202,159,100,184, 24,168,121,230, 64,120, 3,132,223,102,246, 65, 56,213,164,154, 84,147,106, 82, 77,170, 73, 53,255,117,
+154,117,105,135,227,239,199,255, 91,194, 82, 58,245,149,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 90,232,173, 67, 10,133,
+ 66,161, 80, 40,148,191,128,209,178, 99,179,217,203, 4, 2,193, 55, 2,129, 96, 23,155,205,254, 10,128, 85, 67,191, 80, 40, 20,
+206,149, 74,165,113, 82,169, 52,221,205,205,237,188,133,133,249,167, 30, 60, 4, 0,224,252, 65,235,227, 3,224, 83,129, 64,240,
+140,207,231,167, 0, 56, 8,224, 83, 0,182,239, 34,252,133, 19, 70,198,204, 27,122,250, 11, 39,140,124,227,173, 65, 14, 14, 14,
+ 55, 1,244,251,163,118,202, 24,115,244, 9, 18, 34, 53, 72,136,212, 49,230,111,127,213, 96, 97, 97, 49,193,209,209,241,174,141,
+141,205,107, 71, 71,199,219,124, 62, 63,168,129, 18,246, 14, 14, 14, 27, 93, 93, 93,227,157,156,156,182,162,172, 58,249, 95,150,
+110, 60,116,235,200, 67,110, 39, 46, 84, 93,184,248,166, 19, 23,125,251, 2,230,111, 41,215, 21,192, 9, 75, 75,203, 71,108, 54,
+ 59, 12,192,136,242,254, 53,130,205,102,135, 89, 90, 90, 62, 2,112,162,124,185,183,233,167, 27, 1,188, 6,176,182,252,249, 39,
+174,174,174, 42, 63, 63,191, 20, 63, 63,191,125, 94, 94, 94, 19,235, 43, 14,106,110, 21, 0, 0, 32, 0, 73, 68, 65, 84,102,110,
+110,222,215,213,213,245,164,155,155, 91, 74,167, 78,157, 10,156,157,157,159,187,184,184,236,231,241,120, 61,232, 41,142, 66,161,
+ 80,254,250, 12, 6,240, 37,128, 29,209,209,209, 50, 66,136,140, 16, 34,139,142,142,150, 1,248, 6,192, 58,212, 28, 66,252,205,
+235, 54, 54, 54,161,171, 87,175, 46,201,204,204, 36,185,185,185, 36, 62, 62,158,108, 89,177,216,212,223,154, 77, 60,236,172,138,
+ 28, 29, 29, 95,184,187,184, 28,105, 41, 98, 46, 6,224, 89, 31,205, 42, 88, 9, 4,130,251, 43, 86,172, 80,223,188,121, 83,173,
+211,233,212, 38,147, 73,157,145,145,161, 14, 15, 15, 87,119,233,210, 69, 13, 96, 62, 0, 86, 3, 52, 43,249,220, 9, 55,200,158,
+149,228,115, 39,220,168,250,122,179,102,205,158,154, 76, 38, 50,114,228, 72, 45, 0,231,134,104,190,137, 51,192,111,105, 9, 73,
+144, 8,217,134,253, 95, 16,178,115, 33, 9, 18, 34,245,109, 52,237,237,237,127,158, 59,119,174,242,245,235,215, 68,171,213,146,
+212,212, 84, 50,115,230, 76,133,189,189,253,161,122,174,187,141,175,175,111,246,221,187,119, 77,114,185,156, 92,191,126,221,212,
+170, 85,171,236,122,154,173, 62,111,180,229,123, 39, 39,167,243, 13,121,216,219,219,239,110,232, 62,234,192, 67,170, 94,118,141,
+144,135,151,201,153,145,157,200,150,118, 46,100,132, 53, 87,222,149,139, 79,186, 87,159,202,164, 38,205, 15,186,119,239,174,121,
+242,228,137, 49, 63, 63,159, 60,125,250,212, 52,125,250,244, 18, 0,177,211,167, 79, 47,121,250,244,169, 41, 63, 63,159, 60,121,
+242,196,216,189,123,119, 13,128,105, 13,104, 39, 19,192,222,144,144, 16, 66, 8, 33,171, 87,175, 38,126,126,126,164, 87,175, 94,
+ 68,173, 86, 19, 66, 72, 10, 33,100,159,193, 96,248,176, 62,154, 98,177,120,194,220,185,115,213, 69, 69, 69,164, 2,147,201, 68,
+228,114, 57,217,177, 99,135, 70, 42,149,158,175,225, 34,131,222,242,160,154, 84,147,106,254,213, 52,255,206, 56,162,108,156, 86,
+197,163,222,129,137,177,139, 23, 47,174, 48, 85, 23,186,118,237,250,224,195, 15, 63,148,125,248,225,135,178,174, 93,187, 94, 7,
+112, 41, 50, 50, 82,182,104,209, 34, 25,128,177,117,236, 8,171,206,157, 59,203,179,178,178,136,183,183, 55,105,212,168, 17,201,
+202,202, 34,132, 16,242,240,131,182,228,151,230, 32,105, 17, 23,200,229,159, 78,144,233,142,108,210,205, 81, 92,234, 40,149,230,
+219,218,218,174,193,111,107, 50, 86,183,115,135, 55,111,222, 92, 21, 27, 27,171, 78, 72, 72, 80,135,134,134,170,123,245,234,165,
+246,245,245, 85,143, 24, 49, 66,189,125,251,118,181, 94,175, 87,239,222,189, 91,109,105,105, 25, 91,141,217,122,107,163,197,102,
+179,183, 69, 71, 71,147, 23, 47, 94,144,242, 40, 69, 77,154, 98,137, 68, 50,192,202,202,106,190, 68, 34, 25, 0, 64, 12, 0,222,
+128,168,181, 24,110,159,180,246,104, 22, 54,182,143,231,142, 62,239,181, 13,178, 96,202, 75,191, 94, 72,200, 72,183,183, 50, 90,
+ 98,177,120,194,167,159,126,170,210,106,181,164,168,168,136,168,213,106, 82, 84, 84, 68, 84, 42, 21, 25, 59,118,172,146,207,231,
+ 15,175, 75,211,214,214,246,139,136,136, 8, 67, 86, 86, 22,137,136,136, 32,231,207,159, 39, 59,119,238, 52,217,219,219,111,110,
+232, 1, 40,149, 74,175, 92,190,124, 89, 22, 21, 21, 37,187,127,255,190,172,180,180, 84,166,215,235,101,122,189, 94, 22, 22, 22,
+ 38, 59,117,234,148,236,232,209,163, 50,157, 78, 39,211,233,116, 50,173, 86, 43,107,210,164,201,197,134,238,163,246, 60,164,233,
+110,158, 33,100,243,108,162, 88, 63,139,200, 23,188, 79,114,102, 6,144,111,222,115, 33, 1, 2,156,197,239,107,123, 86,171,201,
+225,112,110,164,164,164,152,150, 46, 93,170,107,209,162,133, 98,202,148, 41, 37, 90,173,150, 16, 66,136, 86,171, 37, 83,166, 76,
+ 41,105,209,162,133, 98,233,210,165,186,151, 47, 95,154,216,108,118,120, 3,218,185,174,194,100,221,184,113,131, 84, 69,173, 86,
+147, 94,189,122,165,248,249,249,237,107,220,184,241,184,186, 52, 69, 34,209,208, 37, 75,150,168, 73, 53,148,150,150, 18,149, 74,
+ 69, 94,190,124,105,106,212,168, 81, 6, 0, 27,122, 50,167,154, 84,147,106, 82,163,245,167, 49,163,142,231,213,111,196, 69,139,
+ 22,201, 8, 33,178,229,203,151,203,202, 35, 91,102, 0, 68,229, 15, 54,128, 49, 75,150, 44,145, 17, 66,100,139, 23, 47,174, 88,
+166,166, 29, 49,248,248,241,227,250,173, 91,183, 18, 7, 7, 7, 34,149, 74,201,182,109,219,136,201,100, 34, 89, 97,135,200, 47,
+205, 65,158, 45,155, 68, 8, 33, 36,126,205, 28,242, 75,115,144,164,111, 63, 39,227,199,143, 47, 50, 55, 55, 31, 91,203,206,181,
+110,219,182,173,170,184,184, 88,189,127,255,126,181,185,185,249, 67, 0, 45, 80,118, 43,146, 81,222,214,137, 45, 90,180, 80,198,
+196,196,168,127,252,241, 71, 53,128,208,122,118, 24, 79, 0, 61,133, 66,225,136, 37,206,156, 4,178,103, 37, 89,226,128, 39, 0,
+ 90, 1,176, 43, 95,198,105,241,226,197,132, 16, 66, 92, 93, 93, 35,106,208, 20,251,250,250, 46, 78, 72, 72, 8, 46, 45, 45, 13,
+142,138,138, 10,110,218,180,233,210, 33, 77, 28, 59,157, 30,219,215, 95,241,249, 44,127,178,105,129,239, 87, 3,219,247, 57, 50,
+186,199,216,201,141,109,111, 78,177,231, 23,141, 18,179, 84,111,220, 58,172, 87,199,118,118,118,190,159,154,154, 90,105,174, 84,
+ 42, 21,121,253,250, 53, 73, 78, 78, 38, 55,111,222, 36,142,142,142,191,212,165, 41,149, 74,159,166,166,166,146,111,183,108, 33,
+ 35, 91, 53, 35, 1, 18, 11,210,221,202,130,180, 19,241, 53,205,129,118, 13, 53, 90,143, 30, 61,146, 1,144, 1,144,229,231,231,
+203,242,243,243,101,133,133,133,149,175, 1,144, 41, 20, 10,153, 66,161,144,233,116, 58,153,135,135, 71,131,141, 86, 23, 62,186,
+116,224,163,160, 19, 15,197,131,157,109, 51,102, 53,177, 53,222, 27,219,137, 20,206,238, 69,182,250, 59,147,174, 92,124, 82, 79,
+205,193, 92, 46,247, 58,128,133,229,166,124,210,128, 1, 3,138, 8, 33,100,192,128, 1, 69, 0, 38,149,191,254,105,185,201, 26,
+ 80,207,118, 50,189,188,188, 52, 21,145, 44, 0,119,188,188,188, 52,126,126,126,196,207,207,143,184,186,186,170,202,181,235,117,
+ 66,243,244,244,140, 47, 46, 46,174, 52,128,114,185,156,100,100,100,144,164,164, 36, 18, 27, 27, 75, 30, 62,124, 72, 82, 82, 82,
+200,177, 99,199,140, 18,137,228, 28, 61,153, 83, 77,170, 73, 53,169,209,250, 83,141,214,155,143,223, 18, 22, 22, 70,222,120,105,
+125,100,100,164,108,201,146, 37,178, 58,156,217,140,229,203,151, 87, 68,189,190,172,229,199,127,119,124,124, 60,153, 52,105, 18,
+241,241,241, 33, 62, 62, 62,228,195, 15, 63, 36, 10,133,130,168, 19, 99,200, 47,205, 65, 30,142,106, 71, 8, 33, 68,245, 44,138,
+252,210, 28, 68, 54,190, 51,121,252,248, 49,113,113,113,185, 92,203,247,159,189,125,251,118,238,161, 67,135,178, 80, 54, 30,139,
+ 3,160, 35,128,109, 2,129, 96, 47,202,110, 23, 54, 2, 96,229,237,237, 93, 80, 84, 84,164, 30, 57,114,164, 26,128, 91, 45,154,
+221,125,124,124, 94,236,222,189,155,228,228,228,144,130,130, 2,178,161, 75, 83, 66,246,172, 36,171,219, 53, 50,125,251,237,183,
+218,133, 11, 23,106,172,173,173,195, 0, 56,141, 28, 57,210, 64, 8, 33, 1, 1, 1,217,213,137, 73, 36,146, 1, 9, 9, 9,193,
+ 37, 37, 37,193,114,185, 60,184,160,160, 32,248,204,233,211,193,253, 91, 53,157,164,248,124,150,255,233,177,125,253, 7, 58, 91,
+141,216,220,239,189,143, 94, 47,157, 54,114,121,231, 22,207, 74,214,205,187,246, 65, 19,135,141,111,179,183,237,236,236, 50,181,
+ 90, 45, 1,240,187,199,139, 23, 47,136,141,141, 77,106, 93, 26,214,214,214,203, 63, 29, 51,218, 56,188,145, 51,121,177,117, 5,
+ 41,189,242, 35, 41, 61,191,159, 36,174, 95, 64,134, 72,109,149, 29,205,152, 75,234,219, 30,169, 84,122,229,254,253,251,191, 49,
+ 90,133,133,133,213, 26, 45,165, 82, 41,211,233,116, 50, 47, 47,175,139,239,218,235, 59,114,225,209, 93,192,122, 24, 53,169, 27,
+201,157,213,139, 12, 16,115, 82,222, 65,110, 12,128,235, 0,198, 55,240,115, 76, 0,235, 42, 12,213,250,245,235, 9, 33,132,120,
+121,121,105,240,110,147, 81,196,205,154, 53, 75,158, 54,109,154,161,121,243,230, 57, 93,186,116,145, 63,120,240,128,220,184,113,
+131,156, 63,127,158,156, 56,113,130,196,196,196,144,215,175, 95,147,248,248,120, 50,104,208, 32, 57,128,238,244, 92, 72,161, 80,
+254,202, 84,227, 69,254,246, 48, 43, 86, 44, 48, 48,144, 81,101, 5,197, 0,248,237,218,181,203, 93,183,110,221, 38,148,229,130,
+ 96,248,178,240, 65, 47, 1,251,113, 47, 1,251,177, 47, 11, 31,148, 71,140,190, 95,179,102,205, 23,126,126,126,153, 0, 4, 0,
+164,213,125, 17, 33,164,155,141,141, 13, 82, 83, 83, 33, 22,139, 33, 22,139,145,154,154, 10, 66, 8, 12, 4, 40, 37,128, 86,175,
+ 71,113,113, 49, 74, 76, 4,197, 38, 64,169, 86, 67, 42,149, 66,175,215,123,212,208,254,214,163, 70,141,242,240,245,245,205, 93,
+180,104, 81, 6,202,198,202,236,157, 58,117,234,149, 59,119,238,248,170,213,234,130,216,216,216,146, 86,173, 90, 13, 0, 32, 77,
+ 72, 72,152,176, 99,199, 14, 76,154, 52, 9,181,252,232,180, 26, 52,104,208,249,152,152, 24,143,241,227,199,227,250,245,235,216,
+176, 97, 3,242,242,242, 8, 0,104,181, 90, 98, 52, 26,245,157, 59,119,214,111,221,186,181,125, 64, 64,192,253, 38, 77,154,176,
+ 0, 32, 57, 57, 57,177, 58, 65, 6,131,209,212,221,221, 29, 90,173, 22,185,185,185,136,137,137,129,133, 88,140,232,140, 60,135,
+ 30,155,191,205, 95,118,250, 10,103, 76,123, 95,235,249,125,187,104,215, 94,190,238,221,194,201,193, 65,167, 47,149,198,103,102,
+103,188,205, 78, 53, 51, 51, 75,205,203,203,131, 78,167, 67,113,113, 49,148, 74, 37,242,243,243,145,151,151,135,140,140, 12,152,
+153,153,189,168, 75,195,178,160, 32, 34,249,246, 13,198,177,239,214,195,195, 80, 0,246,201,109, 96,255,252, 13, 60,117,185,216,
+181, 98,166,133,206,198, 46,196,210,194,162, 80, 34,145,124, 15,192,171, 46, 61,127,127,127,228,231,231, 35, 63, 63, 31, 54, 54,
+ 54,176,178,178,130,149,149, 21,228,114, 57, 20, 10, 5,148, 74, 37,188,189,189,209,186,117,107, 28, 56,112,224, 15,233,220,247,
+116, 72, 50,192, 56,235,202,243, 12,152, 9,133,104, 98, 37,114,127, 79, 4,235, 90, 62,210,139,195,225, 28,183,182,182,190, 12,
+ 96, 54, 0, 33,128,217,214,214,214,151, 57, 28,206, 48, 0,171, 1, 28,106, 96, 51,214,134,132,132, 44, 78, 72, 72, 48,127,252,
+248, 49, 22, 45, 90,132,208,208, 80, 36, 38, 38,126, 13,192, 84,190,204,199, 54, 54, 54, 97, 76, 38,243,191, 0,222, 7, 48,192,
+209,209,177,119, 29,186,195, 22, 46, 92, 88,210,182,109,219,248,103,207,158, 13,187,125,251,118,187, 5, 11, 22, 40, 94,189,122,
+133,248,248,120, 56, 58, 58,194,213,213, 21,106,181, 26,133,133,133, 24, 54,108,152,216,210,210,114, 44, 61,141, 83, 40,148,191,
+178,201,122,195,139,252,221, 34, 90,213, 62,175,246,138,218,220,220, 60, 68, 38,147,117,242,243,243, 99, 3, 56, 6, 0,190, 44,
+ 4, 13,235,220,102,239,233,239,215,251,157,218,186,194,175,191,159,247, 94, 95, 22, 42,102,177,133,181,107,215,206, 74, 38,147,
+117,230,241,120,159,212,208, 8, 2, 0, 86, 86, 86, 16,139,197,144, 72, 36,176,178,178,130,201,100,130,186,168, 4, 26, 35,160,
+ 42,209, 65,161, 80, 64, 85,254, 92,173,213, 67,163,209, 84,126,182, 26,122, 76,155, 54, 45,119,199,142, 29, 57,153,153,153,235,
+ 1,180,154, 52,105,210,208,237,219,183,227,234,213,171, 37,239,251,120,218,172,233,214,230,139, 22,153,137,193, 62, 28, 76, 7,
+ 16, 17, 17, 17,129,206,157, 59,131,193, 96,140,174, 78, 80, 32, 16,124,115,228,200, 17, 65,108,108, 44, 60, 61, 61, 99, 71,143,
+ 30,253,193,250,245,235, 61,132,234,130, 91, 0, 96,200,207,138,157, 51,103,206,202, 53,107,214,228,230,230,230,234,139,138,138,
+236,135, 12, 25,130,212,212, 84,188,126,253,250, 78, 13, 38, 51, 62, 42, 42,138, 40, 20, 10, 36, 37, 37, 33, 42, 42, 74,176,114,
+229,202,246, 70, 38,115,104, 58, 44, 38, 79,234,210,174,253,248,142,109,112,232,238, 99,179,155,207,147, 37,237, 26, 57, 91, 61,
+ 74,203,108, 92,202,192,139,183,217,219, 42,149,106,219, 23, 95,124,161, 86,171,213, 72, 79, 79,199,147, 39, 79,240,236,217, 51,
+164,164,164, 96,195,134, 13,234,130,130,130,237,117,105, 56,241,217,255,217,184, 96, 42,131,253,244, 14,240,248, 6, 80,164, 2,
+138,213,208,198,201,176, 47, 46, 11, 59, 79,254,196,125,149,154, 42, 57,122,244,232, 52, 55, 55, 55, 25, 0,239,218,244, 8, 41,
+219,133, 76, 38,243, 77, 19, 10, 38,147,169, 2,144, 37, 20, 10,211, 44, 44, 44,210,152, 76,102, 22, 33, 68,243,135, 92, 73, 24,
+160, 7,139, 5,112, 5, 96,114,106, 45,237,249,193,232,209,163,143,164,165,165,245, 79, 74, 74,234,180,125,251,246, 47,248,124,
+126,244,246,237,219,191, 72, 74, 74,234,148,150,150,214,127,244,232,209, 71, 0, 76,108,200,247,123,121,121,205, 9, 14, 14,198,
+134, 13, 27,208,186,117,107,120,123,123, 23,133,132,132,108, 3,176, 2,192, 39, 94, 94, 94,183,230,204,153, 51, 37, 39, 39, 71,
+154,158,158,222,250,235,175,191,158,185,109,219,182,247, 50, 50, 50,248,117, 72,119,237,215,175, 31, 46, 92,184, 0, 0,153, 0,
+146,242,243,243, 13, 25, 25, 25,104,214,172, 25,218,183,111, 15,181, 90, 13,181, 90, 13,185, 92, 14,119,119,119,152, 76,166, 78,
+244, 84, 78,161, 80, 40,255, 83,195, 85,189,209,226,243,249, 86,254,254,254,104,210,164,137, 21,202,103,107,217,112,217, 75,231,
+ 79, 27, 99, 46,146, 93, 4, 35,234, 23,140,238,214,210,220,134,203, 94, 90,254, 17,182,187,187, 59,207,223,223, 31, 66,161,208,
+185,134, 47,191,158,149,149, 5,127,127,127, 72, 36, 18,136,197, 98,248,251,251, 67,175,215, 67,161, 82, 65, 99, 4,138, 74, 77,
+ 80, 40, 20, 40,200,205, 70,145, 17, 48, 88,216, 32, 37, 37, 5, 44, 22, 43,185, 6, 77, 71, 79, 79,207,220,232,232,232, 92, 0,
+ 17, 0, 62, 10, 13, 13,197,146, 37, 75,176,106,213,170, 35,230,153, 47,251, 29,185,240,179,205,225,144,143,237,188,185,140, 49,
+ 0,244,105,105,105,144, 72, 36, 16, 10,133,213, 26,131,128,128,128,182, 66,161, 16,251,247,239, 39,233,233,233, 93, 80, 54,133,
+ 63,153,193, 40, 51,123, 2, 38, 20, 0,182,201,100,178, 14, 43, 87,174,124,222,167, 79, 31, 78,199,142, 29,177,122,245,106, 0,
+ 8,171, 78, 83, 46,151,223,155, 56,113,162,238,218,181,107,136,139,139, 19,158, 62,125, 58,104,245,234,213, 45, 95,189,122,197,
+ 59,123,254,226,192,131,105,202,160,245,151,111,242,215, 92,186,126,207,214, 82,216,162,177,173, 53,162, 94,189, 54, 51,178,240,
+160,174, 61,218,129,195,154,214,131,207,142,234,198, 99,102,246,224,179,101,239,113, 88, 83, 85, 42,213,209, 51,103,206, 92, 90,
+176, 96,129, 58, 39, 39, 7, 22, 22, 22,200,207,207,199,218,181,107,213, 81, 81, 81, 39,117, 58,221,217,186,116,141, 38,210,214,
+181,145, 27,240, 34,186,242, 53,189,137,224,129,206, 12,129, 31,205,131, 79,179,102,208,233,116,104,213,170, 21, 35, 52, 52, 84,
+ 40, 22,139, 63,171,211,244, 48,127,215,221, 12, 12, 6, 35,139, 16,242, 90,173, 86,167, 11, 4,130, 87,102,102,102,175, 10, 10,
+ 10,210, 9, 33,217,127,132,207, 34, 76,252,167,115, 43, 47,128, 39,192,171,124,117,198, 67, 53, 10,170, 91,208,194,194, 98,234,
+206,157, 59,249,123,246,236, 41,157, 51,103,142,118,230,204,153,156,226,226, 98,251,153, 51,103,114,230,204,153,163,221,179,103,
+ 79,233,206,157, 59,249, 34,145,104,196,219, 52,164,180,180, 20,209,209,209,235, 19, 19, 19,133, 40, 75, 55, 50, 47, 36, 36,100,
+ 82, 66, 66, 2,127,199,142, 29, 56,113,226, 4, 78,156, 56,129,161, 67,135, 98,238,220,185, 8, 14, 14,174, 77,206,220,207,207,
+207,223,198,198, 6, 55,110,220,200, 0,240, 10, 64, 91,145, 72,100, 49,116,232, 80,244,239,223, 31, 37, 37, 37,208,235,245,149,
+ 70,139,197, 98, 65, 34,145,216,208,115, 32,133, 66,161,252,233, 38,235, 55,102,139, 13, 0, 21,161,186,192,192, 64, 70,109, 63,
+140,198,194, 28,200, 53, 69, 72, 81, 20, 33,181,208,244,155,247, 76, 38, 83,173,223,158,145,145,113,246,238,221,187, 83,253,253,
+253,217, 25, 25,101,119,196,252,253,253, 81, 84, 84,132,140,199,247,161, 49, 1, 66, 79, 95,104, 52, 26, 20, 62,123, 4,145, 95,
+ 39,216, 12, 26,143,205, 59,118,104,243,243,243,191,171, 78,147,203,229,114, 92, 92, 92,114,147,147,147, 13, 0, 10,196, 98,113,
+ 63, 55, 55, 55, 92,191,126, 29, 0, 14, 17, 96, 35,162,174, 1, 55, 78,129,148,133, 84, 68,238,238,238,200,201,201,129, 90,173,
+190, 94,157,230,221,187,119, 19, 74, 75, 75, 91, 13, 25, 50,132,241,195, 15, 63, 28, 83, 42,149,171, 0, 60,209,154,192,122,156,
+150, 13,141, 17,124, 0,125,173,172,172, 62, 13, 14, 14,238, 61,103,206, 28,156, 57,115, 6,151, 47, 95,214,163,108, 44,216,221,
+106,100, 21, 73, 73, 73,187, 22, 46, 92,216,145,201,100,126,116,229,202, 21,131,183,183,183, 82,175,215, 27,155,250,248, 48, 87,
+133,126,110, 54,251,163, 25,146,252, 34, 60,237,223,212,177, 51,131, 1, 60,125,157,243, 42, 81,141,252,218,182,105, 0,151, 21,
+ 54,172,139, 95,192,212,209,131, 69, 66,207, 22,208,196,220,151,238, 58,126,126,179, 32, 42, 33,240, 70, 78,206,208, 51,103,206,
+ 4, 93,191,126,125,182, 78,167,107,194,227,241, 94,200,229,242,173,106,181,186, 78,147,197, 98,177, 6,105, 29, 93,172,228, 5,
+ 5,224,151, 71,162,148,165, 38,228,105, 13,136,147,120, 99,172,139,107,229,109,208,172,172, 44, 72,165, 82,134,209,104, 28, 92,
+155,230,229,203,151, 17, 24, 24, 88, 97, 60,193, 96, 48,192, 96, 48,242,124,124,124,178,121, 60, 94,190,153,153,153,114,227,198,
+141, 37, 37, 37, 37, 96,179,217,124,163,209,200,122,151,222,222,222, 28,246, 60,194,248,102,230,144,158,125, 90,183,104, 70, 34,
+ 30, 62,102, 20, 22,149,236,171, 37, 10,248,181,151,151, 23,187,160,160,224, 44,128,184,210,210,210,195,199,142, 29,227, 79,152,
+ 48,161,228,248,241,227,227, 0,120,108,218,180, 41, 72,173, 86, 55,168,164, 66, 98, 98,226,215,107,214,172, 89,188,124,249,114,
+ 28, 56,112, 96, 78, 98, 98,226,146,242, 72,215,208,224,224, 96,108,220,184, 17, 7, 14, 28, 48,197,197,197,157, 55,153, 76,137,
+ 11, 22, 44,240,115,112,112,200,203,204,204, 76,172, 69,182,221,128, 1, 3,180,183,110,221,226,170, 84,170,155, 0, 62,157, 53,
+107,214,180, 14, 29, 58, 40, 71,143, 30, 45, 42, 40, 40,144,155,155,155,115,119,239,222,109,197,102,179,161,209,104,192, 96, 48,
+160, 82,169,116,244, 60, 72,161, 80,254,170,212,228, 69,254, 38,212,248,219,192,174,110, 5,139,138,138,178, 83, 83, 83,155,189,
+126,253,218, 0,192, 0, 0,249, 58,195,151,107,118,159,218, 51,162,163,151, 48,179,180, 20,167, 31,198, 22,229,235, 12, 21,131,
+223, 13,175, 95,191, 86,189,122,245,202,162,184,184, 88, 93,195,119,221,249,230,155,111,138,175, 93,187,102,145,148,148, 4,163,
+209,136,182,109,219, 34, 62, 62, 30,133,113,209, 16, 54,107, 11, 97,247, 64,196,202, 30, 34,234,114, 56, 94,170,117,134,231, 43,
+214, 40,212, 26, 77,176, 94,175, 63, 93,157, 32,135,195, 41, 0, 64, 8, 33, 70, 0, 80, 42,149, 79,212,106,117, 55, 7, 7, 7,
+ 60,125,250, 84,168, 49, 98,110,208,210,205,219, 9, 33, 70,179,178,217, 92,243, 71,143, 30,141,200,200, 72, 0,136,172, 78, 83,
+169, 84,206,153, 62,125,250,181,253,251,247,179,147,146,146,250,239,217,179,167,255,243,231,207, 9,163, 32,213,120,171,136, 3,
+143, 73,115,223,251,214,221,231,114, 96, 96, 32, 28, 29, 29,177,123,247,110,108,221,186,181,244,227,143, 63, 78,216,186,117,235,
+123, 57, 57, 57,135,107, 88,127,133, 92, 46,191,104, 99, 99, 51,187,101,203,150, 42,141, 70,131,252,252,124,100,100,100,192,218,
+198,134,105, 0,179,179,157, 68,114,248,108,150, 74,200,190,120, 15,247,211, 51,107,141,102,117,228,176, 38,142, 8,104, 19,240,
+201,242,165, 34,220, 58, 13,198,244, 96,144, 61, 95, 96,222,135, 65, 22, 37,218,195,221, 53,143, 83, 38,200,148,202,131, 74,165,
+242, 68, 3, 59,203,128,206,157, 59, 31, 89,179,102,141, 96,217,134, 53,216,212,204, 25,134,252,124,228,106,141,200,211, 26,160,
+ 44,140,195,211,167,177,176,177,177,197,203,151, 47, 81, 82, 82,130,103,207,158, 17, 22,139,117,182,174,136, 78, 5, 85,110, 23,
+202,121, 60, 94, 62,135,195,201,102,179,217, 5, 73, 73, 73,154,146,146, 18, 48,153, 76,161,209,104, 20,212,163,173, 46,182,182,
+182, 11, 80,150, 76,244,140, 42, 47,111,155, 63, 7, 18,176,209,195,221,214,102,224,138,153, 19,108,221,156,236,229, 73, 9, 47,
+ 74,191,187,116, 59,175, 68, 91,243,100, 13, 0, 97, 5, 5, 5,149, 17,201,227,199,143,207, 59,126,252,248, 52, 0,123, 81, 86,
+119, 43, 92, 46,151,127,251, 22, 7,223,138,147, 39, 79, 46, 94,190,124, 57, 4, 2, 65,101,242, 84,129, 64,192, 7,128, 31,127,
+252, 17, 79,159, 62,237,128,242,241, 90, 38,147,233, 72,102,102,102, 93,154, 30,190,190,190, 73,167, 78,157,226, 2,112,154, 53,
+107, 86,167,237,219,183,227,195, 15, 63,204,141,141,141,237, 8, 32, 25,128,199, 71, 31,125,244,224,192,129, 3, 86, 38,147, 9,
+133,133,133,208,233,116,201,244, 84, 78,161, 80,168,217,250, 83,240, 7, 16,133,178,252, 89,131, 0,156, 67,217,176,142, 26,113,
+ 45,119,103,151, 0, 12,169,248,125,172, 97, 48, 60, 80, 54, 35,235, 34,128,255, 2,112,168, 73,212,198,198,230,179, 73,147, 38,
+149,166,167,167,147,172,172, 44,114,226,196, 9, 50,127,234, 36, 99, 95, 79, 39,147,167,147,131,198,206,206, 46,222,209,214,122,
+ 95, 27,115,204, 7,224, 82,143, 21,155,244,252,249,243, 25,147, 38, 77,154, 90,254,189, 83,143, 28, 57,162,190,114,229,138,154,
+197, 98,133,161, 44,181, 67,133,161,156, 56,120,240, 96,181, 86,171, 85,251,248,248, 20,160,108,224,126, 77, 4,245,232,209,163,
+240,194,133, 11,196,104, 52,254, 46, 71, 81,110,110, 46,185,124,249, 50,233,210,165,139, 28,192,132,222,189,123, 95,191,125,251,
+246,245,174, 93,187,158,172,171,193,182,182,182, 75, 31, 63,126, 28,153,146,146, 34, 59,119,238,156,236,240,225,195,178,143, 62,
+250,232,137,159,159, 95,113, 66, 66,130,201, 96, 48,144,199,143, 30, 17,159,166, 77, 53, 0,220,107,210,233, 37, 96, 63, 80,238,
+254,130,148,172,254,144,148, 12,115, 37, 0,136,106,243,103, 36,123, 78, 31, 18, 63,123, 32,233,201,103,221,125,155,158, 98,109,
+109,125, 41, 50, 50,146,168, 84, 42, 18, 19, 19, 67, 38, 6,246, 39,119,167,245, 33, 23,251,123,145, 3,221, 27,147,205,253,252,
+ 72,255,238,221,200, 55,223,124, 67, 78,157, 58, 69,150, 46, 93,106,178,181,181, 85,161,150, 49, 90, 82,169,244,202,177, 99,199,
+100, 0,100, 44, 22, 75,166, 84, 42,101, 42,149,234,108, 90, 90,218, 78, 31, 31,159,197, 45, 91,182, 28,215,172, 89,179, 94, 61,
+ 27,187, 47,238,109,193,139,239, 99,201,127,209, 84,100,190, 25,191,207,123, 85,137, 24,112,247,244,240, 80,221,184,113,195,164,
+213,106,201,205,155, 55, 77,205,155,122,151,108, 26, 53,224,228,203,221,235, 78,150, 92,248,225, 82,209,207,223,223, 62, 62, 57,
+ 48,186,135, 57,243,135, 78,194,202,116, 28,111,203, 24, 0,167,241,235,172,195, 73, 0,126, 70,237,179, 16,153, 0,246,174, 94,
+189,186,234, 76, 67, 0, 96,250,249,249,201, 8, 33, 50, 63, 63, 63, 89, 67, 27, 98,110,110,190,224,204,153, 51, 33,110,110,110,
+ 27, 70,143, 30,189, 91, 46,151,159, 27, 55,110, 92, 52,202, 38,131, 48, 80, 86, 29, 97,176,139,139, 75,110, 84, 84, 20,185,126,
+253, 58, 25, 57,114,164,202,204,204,108, 60, 61,141, 83, 40, 20,202,159,194,140, 26,254,214,202,154,232,232,232,138, 28, 90,179,
+106, 19, 95,178,100,137, 44, 50, 50, 82,134,178, 44,241,181,194,102,179,127,250,248,227,143,137,131,131,131,218,222,222,254, 39,
+ 14,139, 53,205, 85, 0,127,188,221, 84,247,110, 7, 15, 30, 28,250,245,215, 95, 15, 2,208, 1, 0,199,217,217, 57, 35, 43, 43,
+ 75,125,251,246,109,117,151, 46, 93,212,182,182,182, 57,190,190,190,234, 77,155, 54,169, 75, 75, 75,213, 11, 22, 44, 80,227,247,
+249,190,170,131, 15, 96, 54,151,203,253,169,121,243,230,209, 43,134,244, 42,221, 48,119, 26,153,228,101,167, 6,240, 53,128,143,
+ 1, 72, 0,112,130,130,130,126,121,246,236,217, 37, 95, 95,223, 93,245,208,117,106,217,178,229,213, 35, 71,142, 68,158, 58,117,
+ 74,246,217,103,159, 69,218,216,216,164, 39, 36, 36,152, 74, 74, 74, 72, 97, 97, 33,145,203,229,228,220,185,115, 70,107,107,235,
+ 29, 53,174, 56,143,149, 73, 46, 31,170, 54,133, 67,218,242,241,164, 11,151,249,250,109,122,138, 80, 40, 44,200,207,207, 39, 89,
+ 89, 89, 36, 41, 41,137,156, 60,121,146, 12,232,220,158, 28,253,104, 4, 57, 52,117, 40,217, 56,160, 61,233, 96,193,215, 72, 45,
+ 68,145, 22, 22, 22, 57,245,153,117, 40,149, 74,175,104,181,218,202,244, 13, 46, 46, 46, 50, 31, 31,159, 83,190,190,190,155,207,
+156, 57, 51,111,203,150, 45, 67,123, 54,118, 95,188,182,127,231,226,162,240,227, 68,117,236,107,178,164,173,119, 73,185,153,175,
+ 22,103, 27,235,131, 55,174, 95, 55, 85,152, 95,131,193, 64, 78,255,244, 19, 25, 53,176,111,180,226,226,143,255,189, 25, 60,231,
+200,130,182,222,167,187,240, 49,166, 54,195, 86,121, 41, 34,130, 77,128, 37,115,231,251,110,214,153,221,196,204,175, 59, 90,252,
+166,188,212, 40,111,111,239, 36, 66, 72,102,179,102,205,146, 0, 28,106,214,172, 89,213,231,147,107,144,173, 76, 78, 26, 18, 18,
+ 66,202,143, 15, 38,128, 85,107,214,172,145, 17, 66,100, 94, 94, 94,183, 0,160,181, 16,182,221,197,204,255, 14,241,112,200,239,
+ 46,102,254,183,181,176,250,146, 81,238,102,104,218,205,206,252,230, 80, 47, 71, 85, 15,103,113,196,161,125,123, 54,188,255,254,
+251,187, 1,236, 0,240,133,141,141,205,205, 49, 99,198, 60, 61,112,224,192,211, 77,155, 54,233, 19, 18, 18,200,148, 41, 83, 52,
+ 60, 30,239, 11,122, 30,164, 80, 40,148, 63,141,138,204,240,142, 13, 49, 90,131, 23, 47, 94, 44, 35,132, 84,228,210,154, 80,205,
+ 50, 67,150, 47, 95, 46, 35,132, 84,100,135,127, 51,129, 89,117, 9,205, 66,118,238,220, 73,120, 60,222,127,223,114,101,170,106,
+ 74,135, 13, 27,214, 81,169, 84,190,231,224,224,240, 94,121,228,202,213,214,214, 54,233,240,225,195,234,226,226, 98, 53, 33, 68,
+109, 48, 24,212,145,145,145,234, 30, 61,122,168,171, 92,245,215,213,206,223,176, 76,138, 91, 15, 87, 76, 37,203,164,184,245,198,
+ 91,227,247,238,221,123, 33, 57, 57,249,172,165,165,229,162,122,106,186,218,217,217,173,178,182,182,190,100,107,107,187,204,218,
+218, 58, 83,175,215,147,194,194, 66, 18, 31, 31, 79,174, 95,191, 78,238,222,189, 75,172,173,173,211,107,106,103,111, 1,251, 94,
+225,134,217,196,180,119, 13,209,109, 95, 74, 0, 16,249,150, 37, 36,239,155, 80,242,112,122,127,210,131,207,186,243, 22,219, 19,
+ 18,137,228,251,159,126,250,201,148,152,152, 72,194,194,194,200,185,115,231,200,220,185,115, 73, 83, 39, 71,109, 71, 46, 51,187,
+ 27,143,125,233,109, 18,150,106,181, 90,153, 82,169,148,169,213,106, 89,243,230,205,101,237,219,183, 63,213,177, 99,199,205,199,
+143, 31,159,183,118,237,218,161,189, 45,120,241, 69,225,199, 9,249,108, 32, 33,179,187,146, 23,211,122,144, 94, 2,246,227, 26,
+ 53, 29, 28,210, 43,178,181,107, 52, 26, 18, 17, 17, 65,174, 94,189, 74,164,182,182,202, 0, 1,107, 70, 23, 30,186,119,177,132,
+164,190,237,236, 41,102,238,187,247,205,151,198,226, 11, 7,200,143,147, 6, 26,122, 72,152, 59,171, 44,119,148, 16,146, 57,114,
+228,200,151,132,144,204,147, 39, 79,166, 17, 66, 50, 71,140, 24,241,146, 16,146, 9,224, 72,117,154,111, 36, 39,221, 91,110,178,
+102,135,132,132,200, 8, 33,178,144,144, 16, 25, 80,150, 68,181,187,152,185,255,254,174,141, 38,237,185,253,228,248,148, 65,198,
+238, 98,230,254,106,219, 41, 97,159,141,218,187,133,232, 46, 29, 34, 63,205, 29,103,236, 42,181,188,225,237,237,189,113,222,188,
+121,167,238,222,189,251,196,104, 52, 62, 77, 74, 74,122,186, 99,199,142,167,157, 58,117,186,101, 99, 99, 19,205,229,114, 63,174,
+107, 31,253, 65, 80, 77,170, 73, 53,169, 38,229,205, 0, 83, 45,239,157, 93,191,126,189,144, 16,178, 32, 40, 40, 8,235,214,173,
+ 27,213,178,101,203, 49,206,206,206,118, 0,144,145,145, 81, 20, 19, 19,163, 12, 10, 10,194,170, 85,171,176, 97,195,134,205, 40,
+ 27,203,242,191, 36,235,244,233,211, 46,115,230,204,201, 89,187,118,173,105,202,148, 41,205, 0,196,228,229,229, 53, 29, 55,110,
+220,108, 54,155, 29,228,238,238,238,155,153,153,153, 91, 92, 92,124, 8,192, 46,212,113,207,180, 38,120, 76, 24,219, 53,114,196,
+ 37, 38,140, 85, 94, 30,184,106,213,170,209, 35, 70,140,208,111,217,178,197,160, 84, 42,207,212, 83, 46, 45, 55, 55,247,243,138,
+ 39,214,214,214,210,199,143, 31,127,108,111,111,207, 76, 74, 74,130, 86,171, 69, 98, 98,162, 9,101,183,166,170, 69,109, 32,219,
+190, 61,121,197,103,193,248, 64,203,162,184, 71, 48, 99,177, 80,202,225, 34,235,222, 37,236,141,136, 83,106,244,216,254, 54,235,
+ 41,151,203,191,154, 59,119,238,184, 69,139, 22,241,221,221,221, 25,119,238,220,193,177, 99,199,180, 57, 57, 57, 3, 0,220,248,
+ 53,245, 83,195, 48,153, 76,224,114,185, 0,128, 37, 75,150,128,201,100,114,114,114,114,184, 12, 6,131,199, 96, 48,204, 25, 12,
+ 6,171, 52,249, 41, 76,202, 66,100, 23,202,145,150, 45,175, 85,207,104, 50, 29,187,127,255,254,252, 54,109,218, 48, 31, 62,124,
+136,220,220, 92, 36, 38, 38, 18, 35, 33, 71, 34,138,141,101,131, 18,181,245,111,159,185,181,205,176,214, 86, 60, 38,119,223, 42,
+ 4,232,152,172,239, 76, 24,137,178, 92, 90, 0,176,151,193, 96,152, 1,200,111,222,188,121,207,103,207,158, 9,154, 55,111, 94,
+ 28, 23, 23,119,129,193, 96, 56, 3,216, 95,157,166, 64, 32,200, 3,144,119,242,228, 73, 0,152,142,178,141,215, 54, 56, 56, 56,
+ 51, 34, 34, 2, 33, 33, 33,217, 0,118, 2,128,200,202,102,136,175,216,140,193,253, 33, 4,157,180, 96,110, 55,145,106,163,174,
+ 34,123,135, 94, 45,133, 76,112,246,172,196,123, 82, 31, 38,215,160,111, 21, 26, 26, 26,161, 86,171,181, 71,143, 30,213, 77,158,
+ 60,153,149,144,144,240, 0,192, 77, 0, 39, 81, 62,198,146, 66,161, 80, 40,127, 42,111, 70,176,234, 28,163,245,166,107, 93, 7,
+224,219,231,207,159, 87, 22,149,126,254,252,185, 12,192,119, 40,203, 6, 63,184, 1,142,119, 69,121, 68,107,215, 91,174,204,155,
+154,124,127,127,127,193,179,103,207,204, 80,125, 17, 71,198, 91,104,254,142,234,106, 29,122,123,123,111, 45, 45, 45, 61,245,221,
+119,223, 29,103,177, 88,227,222,193,237,187,123,121,121, 21, 30, 62,124,216, 20, 22, 22, 70, 86,172, 88, 97,116,116,116, 44,196,
+239,199,104,253, 70, 51,128,203, 58,177,176,153,179, 50,114, 66, 87,242, 98,222, 16,114,115,124, 15, 50,195, 89,164, 12,224,179,
+142,189,227, 85,137,151, 88, 44,222, 43, 16, 8,148,150,150,150, 87, 0,116,126,151,125,100, 99, 99,115, 64, 42,149, 94,169,250,
+112,112,112, 56,101,103,103,247,181,173,173,237, 10,137, 68, 50,211,131,207,221, 50,175,169, 83, 73,244,176,230, 36,188,139, 29,
+ 25,111,203,125,243,214,225,155,237,116,244,240,240,200, 63,120,240,160,233,236,217,179,100,233,210,165,166, 70,141, 26, 41, 81,
+203,184,182, 90, 35, 90, 18,214,177, 19, 35, 58,154,178, 7, 57,147,117,205, 44, 76, 61,173, 88, 53,205, 80, 28, 95,110,128, 39,
+213,165,233,233,233,249, 29, 33,100,223,234,213,171,247,225,215, 90,160,125, 67, 67, 67,131, 9, 33,193,161,161,161,193, 0,250,
+ 3, 64,128,152,121,240,208,208,118,198,140,247,157,200,151,205, 68,198, 0, 49,243, 96,181,145, 76,107,246,233,159,167, 13, 50,
+101, 78,235, 66, 86,121, 9,141, 29,173,121,191,112,185,220,121, 40,139, 56,183, 7,192,165, 87,205, 84,147,106, 82, 77, 26,209,
+250,203, 25,175,122, 33,181,182,182,222,219,164, 73,147,227,238,238,238,199, 69, 34,209,102,148, 13,154,111,232,142,240, 88,179,
+102,141, 82, 44, 22,183,254, 3,119,174, 61, 0,103,252,190,112,238, 31,214, 97, 62,119,196,156,132, 69,163, 30,127,238,136, 57,
+ 85, 94,110,223,172, 89,179, 47, 81,150,205,251, 93, 59,161,187,181,181,245, 14,107,107,235,244,242,177, 89,238,245,209,108,199,
+ 98,141,235,201,103,221,233,204,101,102,245,228,179,111,191,199, 98,141,253,155, 30,128,181, 77,182,168, 73,211,197,214,214,118,
+139,181,181,117,134,173,173,237,142, 6,154,172,223,104,182, 22,192,177,151,132,117,186,179, 5, 67,211, 75,204, 58,217,206,188,
+230, 73, 29, 13, 88,119,255,144,144,144, 15, 9, 33, 31, 58, 57, 57, 5, 85, 49,254,190,171, 86,173, 10, 36,132, 4, 86,100,128,
+111,111, 14,251, 30, 18,214,225, 46,150, 12,121, 15, 9,235,112,123,115,216,215,212,206,158, 18,214,177, 46,150, 12,121,128, 37,
+243,176, 27, 15,141,232,201,156,106, 82, 77,170, 73,141,214, 63,195,104,209, 14, 67, 53,169, 38,213,164,154, 84,147,106, 82, 77,
+106,180,170, 55, 86, 85, 31,149,119,216,216,116,219, 80, 40, 20, 10,133, 66,161,188, 19, 53, 38, 44,101,212,226, 74, 27, 50,176,
+253,109,156,109, 56,213,164,154, 84,147,106, 82, 77,170, 73, 53,255,117,154,117,105,255,175, 39,214,253,173,161, 97, 85,170, 73,
+ 53,169, 38,213,164,154, 84,147,106,254,107, 97,210, 77, 64,161, 80, 40, 20, 10,133,242, 78,248,151,255,125, 51,113,105,245, 99,
+180,216,237, 87,103, 27, 12, 6,123, 0, 96,179,217, 57,165, 15, 86, 56,214,166,206, 1,122, 27,202,202,239,128, 13, 76, 55, 0,
+ 87,170,209,188, 98, 48, 24,172,202, 53, 11, 75, 31,172,232, 95,171,102,251,213,151,170, 46,111,120,176,162,239,155,203, 16,128,
+197,105,191, 58,227,141,182, 58,213,119,171, 48,240,155,156, 88,127, 90, 59,255, 46,154,255,102, 56, 29, 86,103,151,150,150,245,
+ 35, 14,135,157,163,191, 95,123, 63, 50,235,176, 58,163,234,242,165,247, 87, 56,212,166,105, 46,224,229,123, 58,219,109,174, 77,
+ 51, 41, 35,111,129,166,168,196,166, 54,205,134, 30,155,174,142,142,189,141,229,199, 38, 11,152,158,158,153,121,229, 47,214,151,
+218, 1, 88, 1,192,178,202,107,209, 0, 62,165,189,146, 66,161,252,205,140, 86, 20,202,234, 28,126, 95,110,182,190,175,209,104,
+ 25, 12, 6,123,217, 79,193,208,104,129,222, 19, 87,219,123, 12,219,245,187, 66,201,134,146, 66,174, 60,246,168, 47,171, 84,105,
+101,199,214, 91,102,100,100, 48, 0,128,193, 96,252, 23,128, 91, 53,154, 86,178,159,130, 81,164, 3, 2,198,132, 90,185, 1,150,
+185,102,102,255, 17, 8,133, 61,139,139,139, 91, 2,128, 64, 32,136, 45,214,104,174,217,233,245,155,222, 92,190,166, 53,171,218,
+214, 94, 19, 86,219, 55, 27,182,107,174,209,100,226,190,126,248, 93, 64, 73, 94, 2,155, 99,208,238, 92, 6, 92, 8,174,198, 84,
+213,160,247,235,247,126,176,212,134, 3,244,226,242,249,173, 37, 86, 86,221, 76,132, 52, 55,153, 76, 12,163,193,240, 84,169, 80,
+220, 52, 25, 12,143, 13, 58,141,141,236,204,151,166,218,218,249,230,186,124, 0,176,127, 2,130,132, 34, 81, 79, 22,135,211, 25,
+ 0,140,165,165,119, 52,106,245,181,225,192,137,250,172,123,125,183,207,219, 46,255,111,163,180,212, 96,159,124, 41, 24,218, 82,
+192,127,228,151,246,126,227,126, 56, 12, 0,186,156,199, 14,234,132, 51, 29, 0, 64,232, 25,120,159, 39,245,207, 6, 0,246,171,
+ 76,251,248,176,229,208,150, 2,205, 3, 67,237,235,210,156,188,234,152,205,162, 25, 35,120, 0,112,249,228,215, 77,175,158,250,
+118, 32, 0,244, 26, 49,235, 66,191,145,115,226, 1, 96,195,247,167,108,142,124, 57,170, 86,205,250, 29,155, 10, 51, 69, 79,238,
+ 8,153, 0, 0, 32, 0, 73, 68, 65, 84, 66,152,151, 78,153, 41,113, 21,178,165, 9, 9, 9, 76, 0,112,114,114,170,215,177,233,
+ 2,136, 51,129,217, 76, 22,171,155,167,151,151, 63, 0,146,244,226, 69,148,209, 96,184,229, 8,236,252,131,251,210, 92, 66,126,
+155,156,149,193, 96,208, 14, 73,161, 80,254,110,156, 43, 55, 87,231,126,119, 49, 91,211, 39, 52, 90,224, 70, 34,208,189,163, 31,
+102,140,123, 95, 84,245,189, 19,187, 66,221, 18, 30,254,220,108,207, 15,155,152,126,126,126, 72, 78, 78,174, 87, 43,138,116,192,
+245, 4, 0,242,103, 22,133, 66,225,139, 45, 27, 55, 90,246,237,219,151,237,228,228, 4, 6,131,129,172,172,172,142,225,225,225,
+237,230,207,159,255, 17,228,207, 10,139,116, 80, 93, 79,168, 91,183,162,173, 45,155, 54,194,138, 57,163,196, 0,176,108,226,206,
+118, 15,159,103, 91,191,120,241,162,247,226,197,139,243, 89,215,174,125,107, 11,236,203, 6,210,234,211,206, 3,103,239,243,197,
+153, 63,122,140,159, 51,231,164,151,151,151,200,221,221,157, 97, 97, 97, 1, 22,139,133,194,194, 66,183,152,152,152,129, 15, 30,
+ 60,208,132,223,248, 47, 55,242,193,144,164, 28,126,135,146,122,173,123,113, 6,255,178,133, 69,236,132,225,195, 93, 70,141, 26,
+197,247,244,244, 4, 0,188,120,241,194,251,196,137, 19, 99, 78,158, 60,185, 10,197, 25,134, 34, 29, 74,234, 90,247, 74, 77, 0,
+124,160,179,196,222,126, 60,139,195,105,105, 48, 24,156,203,163, 13,175,141,165,165,177,242,156,156, 67,111, 46, 79,249, 61,218,
+ 82,224, 89, 38,208,167,155, 63, 38,140,232, 35, 4,128,197,163,215,116,124,245, 50,209, 76,167,211,161,169, 79,243, 46, 95,124,
+185,249, 18,152, 76, 28, 60, 21, 94,185,124,125, 52,163,159, 37, 35,248,139, 45,200,120,114,162,163, 81,145,216, 83,165, 84,176,
+ 0,192, 82, 44, 30,113,226,232,143,215,156,124,131,238, 37,230,233,235,165, 89,219,177,121,241,232, 14,199,244,152,107, 45,190,
+185,188,151,227,230,230,134, 39, 79,158, 52,236,216, 84, 60,183, 48, 57, 58, 62,221,244,217,103,210,128,128, 0,136, 68, 34,176,
+217,108, 24, 12,134, 62,183,110,221,234, 19, 28, 28, 60, 11,138,231,154,250, 30,155,245, 96, 19,131,193,232, 57,121,198, 92,199,
+247,135, 6, 97,196,128, 46,180, 35, 82, 40,148,191, 27, 21,209,171,170, 51, 15,191,175,213,104,177,217,236,156,190,147,214,218,
+119,235,208, 10, 15, 31,199, 43, 82, 82, 51,213, 21,239, 21,196,158,104, 58,180,139,115,139,136,136, 27,208,106,181,184,115,231,
+ 14, 30, 63,126,140,151, 47, 95, 98,230,204,153,218,242, 91,135,213,105, 22, 6,140, 9,181,130, 34, 65,228,205,125,222, 56, 60,
+ 46,142, 85, 82, 82,130,136,136, 8, 20, 22, 22,130,203,229,194,197,197, 5,253,250,245, 99,199,197,197, 89,247,238, 59, 64, 28,
+ 48, 96,108, 50,196,222,106, 54,155, 93, 88, 83, 29, 17, 54,155,157,211,123,226,106,251, 22,222,141,240, 34, 37, 67,177,226,203,
+ 61,106,147,137,176,147, 94,190,210,223,184,113, 3,254,254,254,184,114,229,138, 77, 65, 65,193,202,157, 59,119,174,224,172,255,
+102, 91,169, 46,127, 33,106,214, 43, 12, 24, 19,106,101,147,115,220,253,234,197,211,102,177,177,177,102,223,125,247, 29,242,243,
+243,193,229,114, 33,145, 72, 32,149, 74,209,180,105, 83,198,178,101,203, 68,129,129,177,248,100,122,144,187,222, 99,218,243,154,
+218, 89,185,238,234, 87,230,182,202,203,158,167,206,157, 99,118,237,218,245, 55,151,237, 77,154, 52, 65,255,254,253,249,227,199,
+143,247, 28, 53,102,156, 41, 96,208,228, 23, 16,185, 23,213,169,169, 73, 19,216, 20,221,117,234, 51,102,204,153,208,208, 80,137,
+ 84, 42,133, 80, 40, 4, 0, 40, 20, 10,151,148,148,148,142,171, 86,173, 26,121, 63,250, 40, 59, 32, 48, 45, 3, 66,215,226,218,
+182,231,191, 21, 14,135,157, 83, 17, 69,178, 16, 10, 10,211,210,179, 53, 0,160,211,233,160,211,233,160,213,106,241,241,172,153,
+172,233, 35,219,123,185,119,155,251,232,229,235,236,130,230,225,247,172, 43, 62, 91, 90,135, 38,187,232,165, 92,158,250,203,244,
+224,207, 62,147, 58, 56,252,122, 71,240,224,129, 3,172,130,130,130, 62,193,193,193, 45,136,121, 15,121,243,192, 80, 73,109,154,
+181, 29,155,242,248,115,141,191,152,211,191,245,174, 47,195, 96, 52, 26,113,247,238, 93, 68, 68, 68, 96,243,230,205,228,194,133,
+ 11, 10, 75,161,112, 58,106, 61, 54,159, 91,116,117,204,242, 88,191,254, 36,131,199,227,225,231,159,127, 70, 92, 92, 28,152, 76,
+ 38,252,252,252, 48, 97,194, 4,244,233,211, 71, 58, 99,198, 76, 18, 48, 96,116, 18,196, 62,170,119,236, 75, 76, 0,115,151, 6,
+175,119,156, 56,109, 54, 54,124,177,140, 26, 45, 10,133,242,119,142,102,213,152,226, 1, 97, 97, 97,164,252,209, 29, 0, 8,192,
+108, 50,108,215,145,227,145,166,115, 77,134,237, 58, 66, 0, 38, 1,152,150, 64,163, 54,109,218,148,202,229,114,242,224,193, 3,
+242,241,199, 31,107,182,109,219,118,237,220,185,115, 39, 12,122,253,110, 39, 71,199,175, 72, 13, 3,236, 9,192,116, 7,196,230,
+230,230,185,169,169,169,228,252,249,243, 36, 36, 36,132, 28, 58,116,136, 92,184,112,129,132,135,135,147, 11, 23, 46,144, 35, 71,
+142,144,232,232,104, 18, 31, 31, 79,132, 66, 97,174, 59, 32,174, 69,147, 69, 0, 86,211, 97,223, 45, 60,249,176, 52,212,103,216,
+174,249, 4, 96, 89, 1,205,218,180,105, 99, 60,113,226, 4, 57,120,240, 32,249,225,135, 31, 72,116,116, 52,201,203,203, 35,108,
+158, 48,183,226,115, 53,181,147, 0, 76,103,103,231, 92,185, 92, 78, 92, 93, 93, 9,151,203, 37, 14, 14, 14,164,105,211,166,164,
+ 99,199,142,100,224,192,129,100,220,184,113,100,229,202,149, 68, 46,151, 19, 62,159,159, 93,241,185,154, 52,253, 1,129, 80, 40,
+ 76,149,201,100,164, 38,138,139,139, 73, 94, 94, 30,185,116,233, 18, 17, 10,133,169,254,128,160, 54, 77, 1,208,214,215,215, 55,
+ 55, 47, 47,143,232,245,122,146,154,154, 74, 98, 98, 98, 72, 92, 92, 28, 73, 77, 77, 37,197,197,197,149,218,241,241,241,196,195,
+195, 35, 87, 0,180, 37,116, 18, 68,141,125,233,205,135,155,131,195, 64,169, 84, 90,124,242,228, 73,242,250,245,107,178,127,255,
+126,194, 4,214,188,185, 92,109,154, 92,160, 95,215,174, 93,141,119,239,222, 37,143, 30, 61, 34, 75,150, 44, 33,253,251,247, 39,
+ 3, 6, 12, 32,193,193,193, 36, 61, 61,157,164,167,167,147,129, 3, 7, 26,185, 64,191,186,250,103,117,199,166, 24,112, 11, 12,
+ 12, 44,214,235,245, 36, 41, 41,137,180,108,217, 50,157, 5,140, 23, 2, 45,186, 3,188,186,250,167, 51, 96,229,232,232,152,121,
+247,238, 93,114,234,212, 41,226,238,238,158,203, 2, 38, 91, 2, 77, 44,129, 38, 44, 96,114,147, 38, 77,114,239,222,189, 75,242,
+243,243,137,155,155, 91,166, 51, 96,245, 14,125,137, 9, 96,239,210,224,245,228,121,186,134, 44, 13, 94, 79, 0,164, 18, 66, 8,
+170, 25,227, 73,161, 80,254,249,188,233, 69,254, 41, 84,158, 36, 3, 3, 3, 25, 0,174,215,182,112, 49,139,181,118,195,134, 13,
+236,146,146, 18,236,217,179, 71,245,193,200,145,199,187,119,235,150,212,216,221, 93,206, 96, 50,235,172, 54,156,203,227,205,219,
+176, 97,131, 68,167,211, 33, 50, 50, 18,237,218,181,131, 84, 42,133, 72, 36,130, 72, 36,130,189,189, 61,124,124,124,144,147,147,
+ 3, 11, 11, 11, 44, 90,180, 72,156,203,227,205,171, 75,215,100, 34,108, 0, 48,154, 76, 92, 51, 96,134,199,123,239, 69,174, 90,
+181,138,105, 99, 99, 3,107,107,107,136, 68, 34,196,197,197, 65,167,211,193, 92, 96, 94,175, 36,173, 76, 38,147, 41, 18,137,112,
+245,234, 85,204,157, 59, 23,157, 59,119,134, 68, 34,129,133,133, 5, 90,182,108,137,126,253,250, 97,250,244,233, 72, 74, 74, 2,
+163, 30,131, 74,158,178,217,179,167, 79,159,110,239,239,239, 95,237,251, 37, 37, 37,144,203,229,200,205,205,133,139,139, 11,130,
+130,130,236,159,178,217,179,107,210,179, 1,164, 46,222,222,103, 30, 60,120, 96, 43, 20, 10,113,240,224, 65,156, 62,125, 26, 23,
+ 47, 94,196,249,243,231, 17, 22, 22,134,159,127,254, 25,185,185,185, 0, 0,111,111,111, 28, 59,118,204, 86,100,111, 31,102, 3,
+ 72,233, 33, 93, 63, 94,101,103, 95,110,153,149,101, 59,126,220,184,155,106,181, 26,227,199,143,199,218,117,235,150,113,128,249,
+245,249,188, 15, 32,182,118,116,220,183,126,253,122,102, 86, 86, 22,134, 15, 31,158,183,105,221,186,169, 81,151, 46,121,202, 46,
+ 94,244, 92, 27, 26, 58,181,123,247,238,121,233,233,233, 56,112,224, 0,211,193,205,109,159, 15, 32,110,104, 59, 85,192,220,173,
+ 91,183,242, 75, 74, 74,208,183,111,223, 36, 83,108,172,143, 1,248, 81, 13,196, 93, 7,244,117,125, 62, 19,152,189,104,209, 34,
+ 41,143,199,195,127,254,243,159,188,162, 87,175, 90, 25,128, 31, 20, 64,138, 2, 72, 49, 0, 63,168,146,147, 91, 77,156, 56, 49,
+143,199,227, 97,203,150, 45,210,204, 95,139,110,215,151,118, 0,206, 0,184, 1, 32, 99,242,140,185,147,253,219,119,194,129,221,
+ 59,241,101,232,226,125, 0, 62, 96, 48, 24,135, 0, 44,164, 61,143, 66,249,119, 82, 31, 47,242, 23,165,198,146, 59,236,170, 78,
+ 18, 64,143,218, 84,172,108,108,218,181,106,213, 10, 17, 17, 17,240,245,245,125, 32,145, 72, 12,102, 60, 30, 56, 28, 14,136,169,
+ 78,159, 5,129, 80,216,187, 79,159, 62,236,123,247,238,193,195,195, 3, 2,129, 0, 28, 14,231, 55, 15, 51, 51, 51, 56, 58, 58,
+ 66,169, 84,162,119,239,222,156,237,219,183,247,134, 86,251, 69,157, 63,136, 9, 49,162,220,123,235,199,253,119,255,190, 38, 1,
+ 1, 1, 80, 40,148, 48,153, 76, 48, 55, 55,135, 78,167, 3,155,205, 46,187, 5, 84, 74,148,245,217, 98, 70,163,209,200, 98,177,
+224,225,225,129,181,107,215,162,164,164, 4,102,102,102, 0, 0,165, 82, 9,185, 92,142,152,152, 24,164,164,164,160,252, 42,188,
+ 86, 44,196,226,247, 71,141, 26, 85,109,193, 95,173, 86, 11,133, 66, 1,133, 66, 1,185, 92,142,146,146, 18,116,234,212,137,123,
+ 46, 44,236,125,228,231,111,170,246, 51,124,254,200, 3, 7, 14,216,115,185, 92, 20, 23, 23, 67,165, 82, 33, 45, 45, 13,175, 94,
+189, 42,201,201,201, 49, 88, 88, 88, 48,221,221,221,153, 60, 30,143, 55,108,216, 48,134, 82,169, 4,131,193, 64, 96, 96,160,205,
+225,131, 7, 71, 65,167,219, 76, 15,233,250,113, 25,208,182,213,233, 6,119,104,223,254,234,131,135, 15,253,231,205,155,135,232,
+232,232,245,230, 71,143,222, 40, 2, 30,215,246,217, 36, 96,246, 87, 85, 12, 12,121,245,202, 87, 15,228, 86, 89, 36,197, 61, 57,
+249,226,196,137, 19,159, 68, 71, 71,219,110,217,178, 69,250,193,240,225,179, 1,172,105, 72, 27, 45,196,226,247, 28, 29, 29,113,
+225,194, 5,164,190,124,185,216, 0, 20, 55,232,138,139,197,234, 26, 16, 16,128,159,127,254, 25,233,175, 94, 45, 54,252,182,141,
+101, 23, 74, 64, 46, 59, 41,105,241,190,125,251,246, 78,153, 50, 5, 44, 54,187, 43, 12, 13,186,113,248,187,129,239, 83,102,206,
+195,190,239,183,239, 3, 48, 13,128, 9,192, 3,218,227, 40,148,127,119, 84,171, 46, 47,242, 55, 50, 91,223, 55, 56,162,101,111,
+111,239, 44, 18,137,144,145,145,129,230,205,154,229,240,120, 60,112, 57, 28,240,185,220,122,181,160,168,168,200,215,201,201, 9,
+ 10,133, 2,182,182,182, 48, 51, 51,171,124,112,185,220,202,255, 45, 44, 44,192,100, 50,225,230,230,134,162,162, 34,223, 58,117,
+179, 99,236,143,110,159,245,241,221, 27, 23,154, 12, 31, 62, 2, 86, 86,214,112,117,117,129,189,189, 61, 4, 2, 1, 92, 93, 93,
+225,233,233, 73, 54,109,218, 4,115,123,191,122,157,200,171,154, 39, 54,155, 13,163,209,136,236,236,108, 60,127,254, 28,209,209,
+209,184,123,247, 46, 30, 61,122, 4,149, 74,133,122,248, 44, 20, 21, 23,183,102,179,217,213,154, 44,185, 92, 14,185, 92, 94,105,
+180,114,115,115,145,146,146, 2,181, 70,211,166, 22,211, 59,162, 85,171, 86, 44, 0, 16, 8, 4,104,211,166, 13,118,237,218,101,
+ 56,123,250,244,232, 22,119,239, 90,187, 94,186, 36,249,239,119,223,141, 14, 10, 10, 50,222,187,119, 15, 74,165, 18,207,158, 61,
+131,157,157, 29,155,203,231,143,162,135,115,195,144, 1, 26, 91,149,106, 64,231,206,157,147, 21, 10, 5, 54,110,220,200,228, 88,
+ 88,124, 31, 90,195, 45,190, 74, 88,172, 46, 1, 1, 1, 56,115,230, 12, 50, 94,189, 90,242,170, 26, 3,243, 10,200, 77, 77, 74,
+ 90,178,111,223, 62,244,235,215, 15, 12, 54,187,193, 3,149, 58,118,236,216,202,100, 50,225,201,147, 39,144, 0,247, 27,250,121,
+ 79, 47, 47,255,138,200,175, 16,184, 89,211,114, 66,224,102, 84, 84, 20, 4, 2, 1,154,183,104,209,182,129, 95,179,137,193, 96,
+100, 78,153, 57, 15,167, 46,222, 6, 0,236,251,126,123,118, 21,147, 69,161, 80,104, 68,235,239, 26,209,170, 48, 86, 85, 31,248,
+141,209,170,167,249, 0, 0,112, 56, 28,112,121, 60,112,185,220, 50,131,196,227,213, 91,131,193, 96,128,207,231, 87, 26,171,170,
+ 6,171,234,255,230,230,230,245, 50, 48, 0, 80,152,120,177,219,180,169, 83,184, 60, 30, 15, 58,157, 22,132, 16,240,120,124, 72,
+ 36, 18,120,120,120, 64,169, 84,162,115,151,238,218, 52,185, 89,152, 77,243, 97,209,111,179,245, 12, 6, 3, 52, 26, 13, 10, 11,
+ 11, 81, 80, 80, 0,165, 82,137,226,226,226,122, 79, 69, 55,153, 76,172,180,180, 52,252,248,227,143,200,207,207, 7, 80, 54,208,
+186,194, 92, 85,252, 77, 78, 78,198,193,131, 7,241,242,229,203, 6,237,159,110,221,186, 33, 44, 44,140,213,163,119,239,221, 87,
+220,221, 51,174,184,187,103,244,232,221,123,247,153, 51,103, 88,206,206,206, 72, 73, 73, 65,100,100, 36, 10, 11, 11, 65, 8,161,
+243,231,223,130, 23, 64, 97, 81, 65,193,148,101,203,150, 17,145, 72,132,141, 95,125,213,122, 13, 48,182,190, 6, 70, 92,139,129,
+ 17,191,155,129, 1, 33, 4, 38,147, 9, 70,163,241,173,214,141,193, 96, 48, 56, 28, 78, 67, 83, 43, 52,100,225,202,129,239,139,
+ 86,174,197,249,159, 79, 84,188,158, 64, 77, 22,133, 66,249, 7, 80,227, 64,120,118, 21, 7, 89,249,183, 38,178,179,179, 95,107,
+ 52,154, 38,238,238,238, 72, 79, 79,183,119,115,115,123,197,229,112, 96,198,229,130,193,172,219, 19,152,155,155, 63,201,200,200,
+232,226,236,236, 12,131,193, 80,105,170,222,188,117, 88, 17,165,121,244,232, 17,204,205,205,159,160,164,214,204, 9, 48,234, 10,
+ 27,181,109,219,182, 50, 50, 36,145, 72, 32,145,136,193,227,241,177,124,249,114,211,150, 77,155,118,186,245, 10, 85,124, 56,127,
+ 25, 89,182,102,247, 31,186,101,235,251,195,100,110,110,254,196,213,213,181,147, 88, 44,198,169, 83,167,144,146,146,130,194,194,
+ 66, 20, 21, 21, 65,171,213,162,168,168, 8, 58,157, 14,124, 62, 31, 45, 90,180,128,165,165, 37,194,195,195,159, 64,171,173,222,
+ 92,230,231,159,122,242,228, 73,167,246,237,219, 87, 70, 84,122,246,236,201,232,217,179,167,109,101, 20,173,168, 8,121,121,121,
+120,240,224, 1,194,195,195,193, 96, 48,144,144,144, 96,212, 22, 23, 31,161,199,196,219, 81, 2,220, 97,237,219,183,247,163,143,
+ 62,154,218,165, 75, 23, 24,129,129, 0, 14,254, 63, 26, 24, 0,192,221,187,119, 99,140, 70, 99,151,166, 77,155, 66, 14,116, 0,
+240,115,131, 76,100, 98, 98,148,193, 96,232,221,186,117,107,156, 58,126,188, 27,128,148,234,150,211, 0,221,252,253,253, 81, 92,
+ 92,140,103, 79,159,202, 26, 96,178,118, 47, 13, 94, 63,121,226,180,217, 56,176,123, 39,246,125,191, 61,109,239,174,109,174,168,
+199,248, 49, 10,133,242,175,138,102,213,233, 69,254,162,204,168,201,124,177, 27,162,162, 40, 44,148, 69, 69, 69, 53,105,219,182,
+ 45,118,239,222,221,190,115,167, 78,175,205,184, 92, 3,215,204, 12,204,122,252,144, 20,107, 52,191,252,242,203, 47, 29,134, 13,
+ 27,198,190,119,239, 30,164, 82,105,165,209,170,248,203,102,179, 65, 8,129,185,185, 57,126,250,233, 39,125,177, 70,243, 75,157,
+209, 34,163,201,200, 44, 55,122,132, 16,200,229,114,152,153,153, 97,243,230, 45,216,177,105,211, 56, 35,112,194, 91,104,247, 25,
+ 0,254,255,219, 15,116, 81,209,213,243,231,207,183, 91,181,106, 21,199,197,197, 5,114,185, 28,133,133,133,200,207,207,135, 82,
+169,132, 82,169, 68, 97, 97, 33,228,114, 57,248,124, 62,162,163,163, 75, 75,138,138,174,214,164,199, 43, 41, 57, 57,105,210,164,
+ 69, 81, 81, 81,142,108, 54, 27,165,165,165, 48,153, 76, 48,153, 76,208,235,245, 72, 76, 76, 68,108,108, 44,226,226,226, 80, 80,
+ 80, 0, 14,135, 3, 22,139,133, 71,143, 30, 21, 10, 75, 75,143,235,232, 49,253,214,112,128, 83,183,110,221,154, 58, 97,194, 4,
+ 56,185,184,116, 71,122,122,189, 12,204,233, 90, 12,140,226,237, 12,204,175, 6, 72,165,122,152,156,156,220,165, 71,143, 30,112,
+116,113, 89,223, 34, 61,253,202,211, 6,140,211, 50, 26, 12, 55,111,221,186,213,123,226,196,137,216,189,123,247,122,187,228,228,
+139,185,111,220,230,180, 3,236, 26,123,122,174,159, 60,121, 50, 46, 95,190, 12,163,193,112,179, 22,201,170, 25,223, 27, 77,158,
+ 49,215,245,141,129,239,187, 24, 12,198, 28, 0, 27,105,143,162, 80, 40,255,228,136, 86,131,110, 29, 10,140,198,165, 11, 23, 46,
+ 44,101, 50,153, 24, 49, 98,132,197,207,103,206, 4, 61,122,252,216, 35, 39, 39, 71, 98, 52, 26,235,212,178,211,106,183, 45, 92,
+184, 80,174,211,233,224,227,227,131,130,130, 2, 24,141, 70,176,217,108,176,217,108, 48, 24, 12, 48,153, 76,136, 68, 34, 68, 69,
+ 69, 97,239,222,189, 74, 59,173,118, 91,157, 63, 18, 70,227,147,131, 7, 15,130,197, 98, 17, 62,159, 15, 6,131, 1, 54,155,141,
+ 45, 91,182,228,236, 0, 78, 1, 0,139,201,212, 1, 0,147,201,168,239,232,221, 58,239, 91,114,185, 92,152,202, 38, 1,212,185,
+172,149, 86,187,117,195,134, 13,170,103,207,158, 65,163,209, 84, 70,223,212,106,117,229,224,122,185, 92, 14, 6,131, 1,141, 70,
+131, 51,103,206,168,172,180,218,173, 53,233,229, 3, 89,233, 9, 9, 67,218,183,111,159,159,156,156, 12,133, 66,129, 39, 79,158,
+ 32, 60, 60, 28,199,142, 29,195,229,203,151,145,152,152, 8,131,193, 0,103,103,103, 16, 66,112,250,244,105,133, 65,165, 26,152,
+ 15,100,209, 99,162,102, 26, 73,165,189, 29,236,237, 83,237,108,109,211, 27, 73,165,189,223,124, 95, 12,196,199,199,199,195, 96,
+ 48,192,195,195,195,186,182,113, 90,196, 96,184,117,235,214, 45, 76,156, 56, 17,174, 77,154,172,115, 7,236,222, 92,198, 29,176,
+115,247,244, 92, 87, 97, 96,136,193,112,171,161,109,182, 0,182,127,246,217,103,197,102,102,102, 56,122,244,168, 71,169,151, 87,
+ 28, 27, 24, 43, 2,154,245, 0,204,234,250,188, 35,176,115,229,202,149, 89, 12, 6, 3,135, 14, 29,178, 21,123,122,198,176,129,
+ 73, 98,160,145, 24,104,196, 6, 38,137, 61, 61, 99,142, 30, 61,106,107, 48, 24, 48,127,254,252, 44, 71, 96,103, 45,146,115, 9,
+ 33,131, 9, 33, 1,132, 16,215,189,187,182,225,252,207, 39, 42, 76,214, 52,148, 13,122,159, 0, 32,134,246, 56, 10,133,242, 79,
+166,218, 48, 20,187,253,234,108,128,216,119,239,232,135,135,143,159, 43,108,173, 44, 47, 85,188, 87, 16,123,162,105, 47, 95, 75,
+191,111,190,249, 6, 28, 14, 7,105,105,105,120,250,244, 41, 44, 45, 45, 49,110,220, 56,109,177, 74, 53,164, 74,173,195, 62, 0,
+194,203, 53,203,234,169, 41, 18, 68,158,236,232, 38, 23,207,135,177,196, 98, 49,212,106, 53,152, 76, 38,248,124, 62,204,205,205,
+ 33, 16, 8, 16, 25, 25,137, 65,131,135, 26,115,205, 3,126, 77, 88,250,107, 61,181, 74,205,138, 92, 67, 29, 0,243, 40,224, 63,
+246, 78, 78, 11, 87,172, 88, 33,232,223,191, 63,204,204,204,224,210,200, 59,203, 99,192,198,237, 76, 38,195,144,158,175, 92,238,
+217,200, 73,252, 52, 33, 5, 0, 35,167,244,193, 10,167, 42,181, 14,127,215, 78, 55,221, 13,143,159,126,216,100,217,166, 77,217,
+120,116,185, 92,142,236,236,108,228,228,228, 64, 46,151, 67,163,209, 0, 0,194,194,194,112, 62, 34, 78, 89,236, 18,148, 84, 83,
+ 59,127, 93,247,231, 22, 78,250,251,141, 15, 31,252,129,101,103,103,135,236,236,108,228,230,230, 66, 46,151,163,184,184, 24, 70,
+163, 17, 5, 5, 5,216,179,239, 7, 99,190, 40,224,101,101, 66,200,218, 52, 53,105, 2,107,245,109,103,255, 22,238,100,234,212,
+169, 22,150,150,150, 48,153, 76, 40, 44, 44, 68,106,106, 42,146,147,147, 17, 17, 17,161,201,145,235,160,177,237,155, 94,153,176,
+180, 26,205, 63,144,191,157,102,213,188, 85, 78,142,142, 25,175, 94,189,178, 55, 26,141,112,118,118, 54,200, 11, 10,214,113,129,
+203, 22, 64, 38, 0,146, 7,172,216,186,125,251,148,161, 67,135,226,189,247,222, 75,203,202,206,110, 92, 93, 95, 34, 0,203, 7,
+ 16, 23,185,184,196, 62,120,240, 64,154,154,154,138,137, 19, 39,230,189,122,241, 98, 73,197,120, 45, 5,208,205,221,211,115,221,
+209,163, 71,109,155, 52,105, 2, 95, 95,223, 44,126,106,106,203,231,128,162,134,254, 89,227,177, 41,143, 63,215,120,214,240, 86,
+239,125,252,241,199, 48, 24, 12,136,136,136,192,253,251,247,241,234,213, 43,220,190,125, 91,110, 41, 20,142,174, 82,235,176,218,
+254, 57,208, 91,227,113,232,208, 65,134,153,153, 25,246,237,219,135,168,168, 40, 0,128,191,191, 63, 38, 79,158, 12,131,193,128,
+241,227, 39,144,115,207, 5, 73,181,245, 79, 0,173, 0,124,133, 50,147,247, 30, 33,132,207, 96, 48, 50, 0,184,162, 97, 99,178,
+104,255,164,154, 84,243,223,163,249,143,164,206, 90,135,171,191,133,248,183,101, 62,166,103,156,216, 21,202,238,218, 45,160, 89,
+104, 72, 48,179,125,251,246,112,117,117,133,191,191, 63, 82, 83, 83,121, 18,137,164,174,122,106,234,128, 1, 99,147,253,252,252,
+ 36, 75,150, 44, 17,247,235,215,143,227,234,234, 10, 66, 8,162,162,162,112,234,212, 41,253,238,221,187,149, 69, 14,131,229,178,
+107, 63,170,235, 83, 79,237, 62, 80, 4,224,115,151,140,140,239,103,207,154, 21,220,166,109,219,169, 33, 33, 33, 76,145,185,128,
+179,118,249, 52, 62, 0,172,254,250,152,120,104,208, 56,108,245, 2,186,143,173,190,142, 92,213,118,166,166, 79,127,245,254,240,
+222, 94,255,153, 51,197, 56,106,212, 40,161,165,165, 37, 92, 93, 93, 97,101,101,133,164,164, 36,164,167,167,147,179,103,207,170,
+239, 62,138,231,156,190,252,240, 21, 95,236, 88,159,186,132,170,128,254, 31,188,124,255,253,247,173, 38, 77,154,100,209,174, 93,
+ 59, 14,143,199, 3,143,199, 67,118,118, 54, 18, 19, 19,245,103,207,158, 85, 23,217, 15, 44,148, 93, 59,170,170,103,173,195,226,
+128, 49,161,137, 55,175,132,204,143,125,242,100,130, 9,104,173,215,235,157,141, 70, 35,131,201,100,102,154, 76,166, 39,122,149,
+106,175,214, 63,100, 11,173,117, 88, 63,140, 70,163,153,209,104,132, 92, 46,199,149, 43, 87,216, 47, 94,188, 88,241,248,241,227,
+ 21, 25, 25, 25, 40, 45, 45,197,200,145, 35,225,239,239,143,107,215,174, 33, 55, 59,251,108,109, 90,207, 1, 5, 47, 61,125,242,
+244,233,211, 47, 28, 60,120,144,249,248,241, 99,219,125,251,246,237,169,206,192, 76,152, 48,193,148,157,154, 58, 89, 11, 40,106,
+233,159,181, 29,155,121, 23,143,238,120, 60,108, 68, 80,139,144, 85, 43, 56,157, 59,119,134,173,173, 45,186,117,235, 6,189, 94,
+ 47,105,222,188,121, 93,199,166, 42, 96,192,232,164,214,173, 91, 11,183,108,217, 34,157, 50,101, 10,230,204,153, 3, 0, 40, 46,
+ 46,198,229,203,151, 49,127,254,252,172, 84,118, 7, 77, 93,253,179, 60, 82, 85, 97,192,110, 0, 8, 0,144, 4, 58,240,157, 66,
+161,252, 51,169, 40, 42,237,136,178,194,210,231, 80,118,113, 94,119,173,195,155,247, 99, 80,181,204, 71, 25,142, 79, 13,110,147,
+ 94,204, 92,184,206,151, 85,170,180,226, 48, 74, 44, 19,226,227, 25,117,213, 60,172,172,167, 38,246, 86,219, 36, 31,105,191,118,
+245,234,121, 91,183,110,237, 93,145,194,193,220,220,252, 73,177, 70,243,139,157, 86,187,173, 72,236,253, 75, 67,107,243,165, 3,
+217, 0,102, 89,201,100,219, 3,135,142,220,192,183,246,224, 44, 91,179,187,132,197,100,234, 18, 51,114,177,213, 11, 16,214, 99,
+130,100,145, 14,136,149, 59, 26,178,109,130,158,175,252,236,179,255,172,254,252,243,246, 34,145,168,187,222, 96,240, 54,153, 76,
+128,201,148, 80,164,209,220, 32,122,253, 3,173,255,170, 77,124,177, 35,169,119, 93, 66, 73,115,149,245,203, 19,237,247,239,221,
+ 59,247,248,241,227,191, 91,119, 27,173,118,123,145,164,121,120,125,214,189,234, 50, 37,192, 29,228,228,220,169, 45,116, 73,107,
+ 29,214,243,234,195,100,154, 97,101,101,117,160,119,239,222,252, 62,125,250, 96,208,160, 65,232,220,185, 51, 76, 38, 19, 8, 33,
+ 80,169, 84, 56,118,236, 24, 54,108,216,144,208, 24,248,188, 46, 61, 45,240, 11,239,252,249,129,173, 91,183,222, 87,155,129, 41,
+ 55, 89,117,142, 73,172,253,216,228, 37, 24,196, 67, 82,198,204, 94,235,165, 83,102, 74,108,204, 13,210,216,152, 39,204,250, 31,
+155, 62, 42, 99,212,177, 14, 35,135, 15,159,205, 98,179,187,149,207,128, 36,207,158, 62,149, 85, 20,149,134,255,228, 43, 13,236,
+ 75, 21,185,235,232,192,119, 10,133,242, 79, 55, 90,131, 80, 54, 94,171,178, 36, 79,141,181, 14, 43,162, 62,108, 54, 59, 39,233,
+244,204,113,181,169,115,128,222,229,145, 44,212, 89,235,176,252,255, 20, 64, 5,173,246,139,223, 36, 35,173, 50,187,144,243,198,
+242, 13, 73,139, 88, 8, 60,135, 65, 27,136,156,167,192,153, 89,101,122,237, 87, 47,174,186, 78, 53,254,200,254,230,123,205, 10,
+ 74,128,155, 80,171,111, 66,173,174,118,208, 46,135,109, 86, 80, 87, 59,223, 92,247, 84, 64,249,174,235,254,166,102,157,230,225,
+ 29,182,231,191,141,215,121,121,167, 1,136, 92,194,194, 28, 46,134,133,141,250,207,130, 5, 35, 29,157,156, 60,109,109,109,173,
+ 44, 44, 44,152,247,238,221, 75, 54,148,148,108,111, 3,236, 47,143,166,214,137, 22,248,197, 39, 53,181,229, 7,195,135,207,102,
+176,217, 93,171, 26, 24, 98, 48,220,246, 0,118,214, 22,201,122,219, 99,211,149,231,216,187, 60,146, 5, 22, 48,189, 62,125, 35,
+189,172, 29,107, 96, 48,172, 65,116,116, 53,125,190,193,125,105, 53,131,193, 80,129, 14,124,167, 80, 40,255, 92, 42,234, 29,158,
+251, 95,127,113, 31,170, 73, 53,255, 65,154, 44,148,205,162,163,219,147,106, 82, 77,170, 73, 53, 41,245,130, 77, 55, 1,133, 82,
+111,140,248,245, 54, 24,133, 66,161, 80, 40, 21, 84,140,205,170,202,247, 64,217,208,157,154, 92,105, 67,102, 19,188,141,179, 13,
+167,154, 84,147,106, 82, 77,170, 73, 53,169,230,191, 78,179, 46,237,191,227,108,198,138, 49, 89,149, 99,179,254, 87,208,176, 42,
+213,164,154, 84,147,106, 82, 77,170, 73, 53,255,233, 56,150,155,172,170, 15, 0, 13, 76, 88, 74,161, 80, 40,255, 84, 66, 66,192,
+ 36, 4, 12, 66, 66,152,132, 28,103, 17, 18,196, 34, 4,239, 84, 10, 36, 40,168,250,100,182,159,140,179,178,160, 91,156, 66,249,
+ 71,145,137, 26,138, 74,211, 49, 90,255,191,184, 73,165,210, 93, 0, 24, 89, 89, 89, 51, 0,164,210, 77,242,215,195,218,218,186,
+183,193, 96,128, 82,169,252,229,159,184,126, 45, 60, 49,156, 48,209,188,242, 5,130,212,103,137, 56, 80,221,178,205,189, 48, 17,
+140, 95,115,113, 49, 76,120,246,244, 5,126,106,192,215, 49, 7,246,113,221, 9, 0, 23,194,211,102,227,207,201,171,213,212,206,
+206,238, 18,155,205,102, 27,141,198, 89, 57, 57, 57, 97, 53, 27,161, 32, 22, 0,112,200,181,165,242, 44,251, 37,159,126,196,224,
+ 20,105,247,202,181,197, 26, 5,139,195,122,201,227, 72,111,205,156,194,188, 80,168,238,244,180,186,207,159, 56,113,162,198, 42,
+222, 45,189, 48,144,105,108, 49,216,191, 85,114,210, 87,219,218,111,237,238, 97,203, 73, 78,123, 36, 90,255,157, 98, 23, 87,226,
+ 62,120,226, 40, 70, 24,219,156, 49, 97,239,222,124, 53, 61,202,234,207, 90,192, 90, 15,248,114,120, 60, 87,163,193,224,192, 0,
+ 8,139,205,206, 46,213,106,211,204,128,232,165,128,252,159,174,105,198,227,185, 24, 13, 6, 7, 0,248, 43,182,147,242, 91,106,
+ 52, 90, 34,145, 40,146,201,100,186, 84, 45,134, 91, 81, 79,176,226,181,170,239, 49, 24, 12, 24,141,198,244,194,194,194,118, 13,
+248,126, 75, 0,163, 0, 84, 76, 81, 63, 12,224, 24,222,126,192,177,165,153,153,217, 66,161, 80,216,171,184,184,184, 37, 0, 8,
+ 4,130, 88,141, 70,115, 85,175,215,127,245,150,186,108, 0, 31,136, 68,162,158, 76, 38,179, 39, 33,132, 65, 8,185,166, 86,171,
+175, 2, 56, 14,224,109, 50, 37, 8,236,237,237,215, 88, 91, 91,143, 93,186,116,105,190,141,141,141,207,252,249,243, 31, 22, 20,
+ 20,252,152,151,151,183, 28, 13,168, 81,247, 39,227, 41,149, 74, 15,115, 56, 28, 86, 90, 90, 90, 79, 0,112,117,117,189,166,211,
+233,140, 57, 57, 57,227, 0,188,104,160,158, 16, 64, 71,145, 72,212, 78, 36, 18, 5, 24,141,198,230,229,245, 25,159,169,213,234,
+ 8,189, 94, 31, 9,224, 30, 0,205, 95,232, 24,177, 96,179,217, 7,203,251,186, 55, 0,213, 63,237, 36, 64,152,104,254, 52, 54,
+206,167,210,120,181,108, 86,243,194, 12,184, 85,179,108,189,141, 86,175,238,142,131,135, 12,233,203, 4, 0, 93,233,133,193, 87,
+111,100,254,252, 7,175, 78,211, 17, 35, 70,220, 57,120,240,160,149, 86,171,197,140, 25, 51, 14,135,135,135,239, 84, 42,149, 75,
+107, 61,113,136,172,230,111,220,114,217,156,193, 96, 2,128,189,201,100,180,127,253,250,133,247,211,152, 59, 3, 98, 99,239,174,
+ 45,142,187,122,207,196,224,204,212,163, 91, 92,125, 26,209,220, 3,129,131, 71, 14, 31,244,249,231, 33, 24, 59,122,108,163,216,
+216, 18,129,179,101, 18,183,160, 88,232,101, 99,103, 63,228,243,213, 39, 24,183,110,158, 30,114,112, 95,232,213, 41, 83,108,122,
+ 81,179, 85, 47, 24,171,217,236,142, 98, 47,175,128,209,167, 79, 67,228,234,202,102,243,120, 76, 0, 48,104,181,174,234,180, 52,
+199,163, 67,134,116, 8,137,143,191, 30, 2,220,167,154,255, 47,154,148,134, 24, 45, 38,147,233,242,250,245,107,123,161, 80, 88,
+118, 50, 38, 4, 70,163, 17, 70,163,177,178,120, 49, 33,164,242,175,193, 96, 64,179,102,205,234,117, 69, 11,160, 23,128, 15,123,
+244,232, 17,244,213, 87, 95,113,124,125,125, 43, 74,134,116, 91,182,108,217,215, 81, 81, 81, 39, 1,236, 71, 89,242,198,250, 94,
+241,246, 23, 10,133,135, 54,110,220,104,217,183,111, 95,182,147,147, 19, 24, 12, 6,178,178,178, 58,134,135,135,183,155, 63,127,
+254, 44,141, 70, 51, 30,192,165, 6,108,159, 86, 22, 22, 22, 39,134, 15, 31,238,210,189,123,119,126,139, 22, 45, 96, 52, 26,241,
+232,209,163, 41,145,145,145, 99, 78,158, 60, 25,172, 82,169,130, 80,255,122,109, 12,145, 72, 52,201,210,210,114,205,170, 85,171,
+172,199,143, 31,207,141,137,137, 41,244,240,240, 96,220,186,117,203,238,216,177, 99,179,214,173, 91,247,129, 82,169, 92,174, 86,
+171,127, 64, 61,106, 40, 90, 88, 88, 68, 50,153, 76,151,250, 24, 97, 0, 13, 49,195,109, 26, 55,110,124,236,230,205,155,141, 83,
+ 82, 82,140,195,134, 13, 59, 0, 0, 87,175, 94,245, 45, 45, 45,101,244,235,215,239, 66,122,122,250, 40, 0,143,234,185,238,126,
+214,214,214, 63,143, 29, 59,214,218,211,211,211,188,113,227,198, 12,161, 80, 8, 22,139, 5,133, 66,225, 20, 19, 19,211,231,254,
+253,251,197,225,225,225, 5, 90,173,118, 8,128,232, 6,236,167,206,246,246,246, 19, 56, 28, 78, 43,131,193,224, 12, 0,108, 54,
+251,117,105,105,105, 76, 78, 78,206, 65, 0,119,222,246, 0,113,112,112,216,177,102,205, 26,219,156,156, 28,178,110,221,186, 29,
+ 42,149,106,210, 63,245,100,112,248,199,227,136,124,120, 31, 40, 43,155,195,168,166,255, 49, 0,152,125,250,233, 2,180,123,175,
+ 3,198,141,253,160, 78,205,247,123,187,108,228,112,205,108, 74, 74, 74,238, 40,138,180,199,133,230,252, 81, 99,199, 4, 38, 0,
+192,133,139,215, 71,181,111,111,117, 77,108,206,251,128,207,231,119, 46,213,233,243,207,255,146,254, 89, 67, 76,149,179,179,243,
+ 37, 43, 43, 43,243,130,130,130,172,220,220,220,111, 7, 15, 30,188,122,255,254,253, 86,201,201,201, 72, 75, 75,195,188,121,243,
+ 68,233,233,233,179,163,163,163,239,234,116,186, 26, 35, 91, 42, 85,193,182,101, 75,134,174, 18,139,109, 89, 66,115, 75, 88,136,
+173,225,225,217, 26, 29, 59, 15,198,192, 65, 83,145,152, 16,213,113,255,190,207,163, 94,191, 14,255, 82,100,221,100,181, 92,222,
+184,198,243, 82,139,166,232, 62,100,120,153,201, 90,181, 42, 4,241,113,113,170,148,151,204, 79,206,157,102,155, 15,236,221,140,
+103,208,101,165,220,186,121,186,113,215,110,195, 0,160,221,193,125,161, 87, 63, 25,103,213,123,199,225, 66, 21,253, 73,170,249,
+220,249, 57,135, 51,169,255,150, 45,246,254,179,102,153,169, 95,190,212, 39,125,247, 93, 81,118, 68,132,145,205,227, 17,215, 1,
+ 3, 24,118, 61,123,242,103, 61,123,102,118,123,221,186, 0, 78,104,168,199,114,189,254, 16,213,252,159,106,254,219,169, 24, 4,
+ 95,117,246,225,247,181, 26, 45, 6,131, 1,161, 80,136,163, 71,143,130,195,225,128,205,102,131,195,225,212,248,191,155,155, 91,
+125, 26, 50, 66, 42,149,126,189,115,231, 78,135,254,253,251,131,207,231, 87,190,193, 98,177,208,183,111, 95,244,233,211,135,147,
+145,145, 49,230,232,209,163, 99,214,174, 93,155, 45,151,203,231,160,188, 48,116, 45,244,244,241,241, 57,117,249,242,101, 65, 73,
+ 73, 9, 34, 34, 34, 80, 88, 88, 8, 46,151, 11, 23, 23, 23,244,235,215,143, 29, 23, 23,103,221,183,111,223, 83,241,241,241,129,
+ 0,174,213,163,173,237,236,237,237,111, 28, 63,126,156,223,186,117,107, 70, 98, 98, 34,252,253,253, 1, 0, 10,133, 2,195,134,
+ 13,227,143, 31, 63,222,115,204,152, 49,247,114,114,114,186, 3,136,172, 67,175,173, 84, 42,253, 97,248,240,225, 78,107,215,174,
+181,180,176,176, 64, 74, 74, 74,166, 84, 42,245,174,216,222, 99,198,140,225, 14, 30, 60,216,113,195,134, 13,219, 78,156, 56,241,
+ 89, 78, 78,206, 36, 0,178, 90, 93,107,185, 33, 54, 55, 55, 71,118,118, 54, 14, 31, 62,140,217,179,103,131,197, 98, 33, 39, 39,
+ 7,199,142, 29,195, 39,159,124, 82, 97,104,234,101,134,205,205,205,251,120,121,121,237,185,122,245,170,139, 68, 34,129,147,147,
+ 19,115,229,202,149,173, 60, 60, 60, 4,141, 26, 53, 98,101,102,102,226,212,169, 83, 30, 19, 38, 76,248, 57, 53, 53,117,138, 86,
+171,173,243,150,154,131,131,195,222,115,231,206,185,197,198,198,226,187,239,190, 67, 65, 65, 1,184, 92, 46, 36, 18, 9,164, 82,
+ 41,188,189,189, 25, 75,150, 44, 49, 31, 60,120,176,249,156, 57,115,246,234,116,186, 54,245,216, 71,173,237,237,237,119,245,236,
+217,211, 35, 52, 52, 84, 34,149, 74, 81,113, 97,160, 80, 40, 92, 82, 82, 82, 58,174, 90,181, 42, 40, 50, 50, 50, 57, 39, 39,103,
+ 38,128,199, 13, 60,112,218,180,104,209, 34,112,216,176, 97,172,204,204, 76, 28, 60,120, 48, 80,165, 82,181,105,128,185,252, 91,
+ 17,249,240, 62,102,124, 60, 79,237,228,234,106,118,249,210,158, 17, 39,126,106,250, 80, 34, 40, 43, 72, 45, 47,134, 62,104,120,
+252,123,253,250, 79, 53,123,127,208, 48,245,247,223,108, 19,213,199,104,113,184,102, 54,135, 15,109, 78,189,121, 43,178,213,149,
+240,251, 3, 70, 12, 25, 66,204,204, 36, 30, 0,240,217,252, 79, 57,167,206,156,217,215,183, 79,135,140,110, 93,219,165,142, 27,
+191,192,173, 1,205,109,218,180,105,211,235, 81, 81, 81, 14, 60, 30, 15, 5, 5, 5, 54,223,127,255,253,230,174, 93,187, 50,147,
+146,146, 16, 23, 23,135,151, 47, 95, 66,161, 80,160,111,223,190, 34,153, 76,246, 45,128, 26,141,150,158,217,107,141, 83,163,210,
+237, 54, 2, 97, 99,189, 81,105, 79, 74, 51, 91, 92, 57,119,197,239,200,193, 98,127, 7,199,102,222, 31, 78, 14,198,231,171, 79,
+114,126, 60,188,126,213,255,177,119,221, 97, 81, 92,237,247,204,246, 70,135,165, 10, 22,164, 23, 27,106,108,177, 87, 48, 26, 91,
+138, 70, 19, 53,150,152, 88, 99, 52, 26, 53,166,104,140,198, 22,141, 45,137, 5, 19, 99, 55, 88, 81, 17,236, 5, 81,233, 40,210,
+100, 23,118,105,187,203,246, 50,243,251,154, 58,214, 45, 0, 0, 32, 0, 73, 68, 65, 84, 67,150, 15, 9,176,139,229,251, 37,249,
+246, 60,207, 62, 59, 59, 59,115,246,222,185,119,239,156,121,239,123,223,247,194,249,223, 1, 90,235,198, 51, 2, 80,232,254,249,
+146,197,144, 43,180, 24,255,206, 84, 76,120,103,170, 43, 5,157, 23,101,210, 8,116,234, 74, 39,123, 86, 70,220,150, 93, 63,188,
+ 9,160, 69, 29,177,117,193, 38,182, 26,199, 74, 6,163,107,204,143, 63, 10, 35,166, 76,225,220,251,242, 75,101, 89, 82,146, 58,
+ 96,216,176,202,142,211,167,107, 1, 64,145,151,199,202, 94,190,156, 47,124,253,117, 94,183, 5, 11,156, 77, 58,157,231,202,149,
+ 43,187, 44,123,154,188,188, 89,156,126,227,198,153,150,253,250,107,231,164,121,243,250, 16, 6, 3,125, 72,183,110, 41,171,247,
+237, 43,126, 17,206,151, 89, 78, 81, 98,162,182,194,223, 31, 29, 71,142, 44,247,115,119,215,190,204,186,191, 72, 57,109,168,133,
+217, 87,235,195,186, 79,168,136,139,139,235, 13,224, 18,128, 47, 99, 98, 98, 86, 0,128,163,163, 99,105, 85, 85,149,251,145, 35,
+ 71, 44,138, 44, 38,147, 9, 47, 47, 47, 4, 6, 6, 74, 36, 18,137, 71, 19, 5, 40, 34, 73,178, 5, 69, 81,181,214,151,198,160,
+213,106,145,147,147,131,118,237,218, 61,193,211, 68,180,141, 26,117,248,124,126,110,102,102,166, 91,122,122, 58,238,220,185, 3,
+127,127,127, 56, 59, 59,131,201,100,194, 96, 48, 64, 46,151, 35, 56, 56, 24, 28, 14, 7,157, 58,117, 42, 83, 42,149,254, 22,166,
+128, 56, 2,129, 32, 39, 49, 49,209,183, 99,199,142,184,117,235, 22,124,125,125,225,233,233, 9, 0,200,203,203,195,149, 43, 87,
+ 48,108,216, 48,220,189,123, 23,163, 71,143, 46, 82, 42,149,129, 0,180,141, 17,186,184,184,136, 47, 94,188,248, 36, 50, 50, 82,
+163, 84, 42,105,165,165,165,204,164,164, 36,163, 66,161,176,147,201,100,204,170,170, 42,166, 92, 46,103, 40,149, 74, 38,141, 70,
+ 99,169,213,106,230,133, 11, 23,232,122,189,190,201, 0,153,230,118, 58,113,226, 4, 34, 35, 35,113,228,200, 17,204,159, 63, 31,
+ 87,175, 94,133,175,175, 47, 14, 30, 60,136, 5, 11, 22, 32, 43, 43, 11,110,110,110, 8, 11, 11,179,212, 70,104,219,182,237,195,
+ 7, 15, 30,180,101,177, 88,230,188,142,230,124,121,144, 74,165,120,244,232, 17,138,139,139, 17, 16, 16,128,119,222,121,231, 81,
+113,113,113,128,165,158,231,227,227, 35, 77, 75, 75,115,107,215,174, 29, 74, 75, 75,225,228,228, 4, 71, 71, 71, 56, 57, 57,213,
+110,251,251,251, 99,222,188,121,240,244,244,148,104, 52, 26, 15, 75, 34, 40, 50, 50,242,236,133, 11, 23,220, 28, 28, 28, 80, 82,
+ 82, 2,185, 92, 14, 6,131, 1, 62,159, 15, 55, 55,183, 90, 33,159,147,147,131,232,232,232,178,220,220,220,193,205, 16, 73, 52,
+ 15, 15,143,204,251,247,239, 7, 82, 20,133,194,194, 66,100,101,101, 97,230,204,153, 57, 26,141, 38, 4,255,162,156,125,117,252,
+174, 88, 19,223,255,144,245,230,136,238,186,140,180, 56,130, 67,102,161, 67,132,131, 12, 0, 82, 82,229,142, 90, 90, 48, 66,195,
+ 99,168,163,199,175,177,247,236,222,193, 4, 9, 15, 16,200,202,200,193, 87,141,113, 15,234,235, 53,101,206,156, 15, 34,250,244,
+236, 77, 83, 40,149,238, 63,253,180,190, 83,110,110,134, 59, 0,248,251,135, 74,102,204,152,155,108, 47, 16, 72, 46, 93, 73, 36,
+ 55,108,248, 37,245, 92,130,120,151, 21, 69,246, 15, 12, 12,188,126,226,196, 9, 55,119,119,119, 56, 58, 58, 66,169, 84, 66,175,
+215, 35, 61, 61, 93,115,224,192, 1,131,131,131,131,125, 73, 73, 9,170,170,170, 64, 16, 4, 78,156, 56, 81, 8,160,101,125, 34,
+179,143, 22, 0,204, 28, 26,202, 12,235, 23,232,204,226, 24,121, 60,102,182, 23, 8, 19,135,160,236, 60, 78,159, 77,105,119, 58,
+254,214,187,111,142,154, 47,236,213,251, 77, 44, 91, 58,198, 32, 18, 21,118,212,163, 87,102, 67, 62, 90, 33, 1,232, 55,114,244,
+155, 99, 87,174, 92,129, 21,203,190, 68,220,137, 99, 50, 59, 1, 77,235,224,196,116,124,253,181, 30,154,121, 31,141, 40,170,174,
+ 22,249,174, 92,115,224,157,232, 17,243, 90,244,236, 53, 18, 87, 46, 31,195,190, 95,191,188, 67,240, 40,219, 52, 98, 61,172, 0,
+156,157,252,253,167,125,146,147,195,186,183, 98, 69,181, 81, 36,170,140,154, 59,183,172,161, 99,159,196,199, 11,216,222,222, 14,
+206,111,188,225,178,177,101, 75,202, 32,145,108,111,200,199,168, 33,206,243,118,118, 78,191,159, 62,221,159, 98, 50,123, 47,252,
+236, 51, 94, 76, 76, 12,228,114, 57, 14, 31, 62,140,237,219,182,105,189,188,188, 30,120,167,166,222,141,144,203,151, 90,203, 25,
+ 53,119,110,153,201,100, 34,198, 46, 88, 48, 48, 45, 47,175, 95,137, 68,210, 10, 0,188, 92, 92,138,162,252,253,239,252, 18, 23,
+151,181,185,117,107,210,218,114,238, 60,115,198,227, 80,126,254, 20, 23, 23, 23, 94,169, 68,194,224,176,217,229,175,133,133, 29,
+220,186,100,201, 37,227,253,251, 44,110,139, 22, 14,142, 49, 49,205,174,123,212,220,185,101, 21, 10, 5,227,147,175,191,238, 81,
+ 80, 90,218,170, 90,171, 13,168, 82, 40, 60, 77, 6, 3,205,129,207, 47,111, 19, 28, 44, 81, 39, 37,137,219,168, 84,179,119, 1,
+146, 87,213,214, 13,105,145,127, 16,234,199,209,250, 75,174,195, 75, 49, 49, 49,127, 89, 93, 67, 81,148, 85,214, 44, 38,147,249,
+204, 52, 85, 19, 96, 17, 4,129,228,228,100,184,186,186,194,211,211, 19, 28,206,179,201, 7,165, 82, 41,174, 94,189,138,140,140,
+ 12,180,111,223,222, 60,141,209,184, 34,226,112,230,172, 89,179,198, 73,167,211,225,206,157, 59,136,138,138, 2,135,195, 1,139,
+197,122, 70, 4, 74, 36, 18,132,135,135, 99,225,194,133,142,223,126,251,237, 28,173, 86,219,232, 19, 41,131,193,152, 53,117,234,
+ 84,119,179, 5,171,168,168, 8,157, 58,117,170,253, 94, 40, 20, 34, 37, 37, 5, 81, 81, 81,104,209,162, 5,198,140, 25,227,190,
+111,223,190, 89, 70,163,113,109, 99,156,108, 54,155, 22, 25, 25,217, 25, 0, 4, 2, 1,104, 52, 90,182,131,131,131,208,195,195,
+ 67,224,224,224,240,151, 58,254,250,235,175, 85, 52, 26,205, 96, 81, 13,208,104, 40, 41, 41, 65, 68, 68, 4,100,178,167, 25, 92,
+148, 74, 37, 2, 2, 2, 32,151,203,107, 69,171,183,183, 55,212,234,166, 93,191,218,181,107,183, 34, 36, 36,100,144, 64, 32,224,
+ 48,153, 76,220,187,119, 15, 29, 59,118,196,129, 3, 7,224,231,231, 7, 62,159,143,156,156, 28, 68, 70, 70, 34, 49, 49, 17, 66,
+161, 16,225,225,225, 28,119,119,247,203, 21, 21, 21, 9, 5, 5, 5, 43,154, 40, 39,205,206,206, 14,137,137,137,248,229,151, 95,
+144,151,151, 7,145, 72, 4,123,123,123,116,232,208, 1, 97, 97, 97,232,222,189, 59,114,114,114, 64, 88,238, 76,158,129,129,129,
+113,183,110,221,114,163, 40, 10,251,246,237, 67,117,117, 53,116, 58, 29,104, 52, 26,184, 92, 46,156,157,157,209,175, 95, 63, 8,
+133, 66, 4, 6, 6,226,143, 63,254,112, 27, 58,116,232, 41,137, 68,210, 1, 64,137,165,235,234,236,236, 60,123,249,242,229,190,
+238,238,238,200,207,207,135, 76, 38,131,135,135, 7,250,244,233,227,115,254,252,249,217, 6,131, 97,253,191,229, 70, 86,199,241,
+157, 56,119,246,231, 81,129,109, 42, 35,219, 7,243,125,143,196,121,248, 30,136,147,132, 3, 64, 68,168, 71,218,168, 24,126,209,
+189,180,184,162,115,103,143,221,201,200,198, 17, 88, 49,181, 45, 83,105, 15,198,159,191, 57,164, 99,251, 78,228,154,239, 22, 68,
+127, 52,115, 10,199,221, 99, 50, 74, 11,143,225,252,197,100,191, 5,243,167, 10,215,174,219,121, 58,254,252, 77,154, 76,165, 93,
+106,157, 41,203,111,243,238,173,221,221, 20,101,135,240, 48,147, 13,158,125, 4,252,253,131, 32,151,203,193,229,114,185,239,188,
+243,142,105,241,226,197, 42, 7, 7, 7, 62, 65, 16, 72, 72, 72,144, 0, 24,108,137, 87,227,238, 76,153,244, 6, 35,197,166,147,
+ 20, 97,175, 38, 76, 21,236,212,244,199, 24, 52,160,111,105,207,174, 17,223, 46, 94,185,238,243,192,160,142,194, 15,166,124,201,
+252,122,197,187,219, 64,160, 87, 67, 60,153, 15,113,145, 56,120,148, 7, 32,122,229, 87, 43,144,155,155,227,252,225,164,170, 47,
+ 25, 28,158,119, 72,203, 30,246,219,126, 73, 24, 18, 16,208,186,213,188, 89, 99, 78,254,240,227, 15,209,117, 45, 91,187,127, 93,
+126, 28, 64,127,107,174,237,255, 16,218, 77,136,139, 67,117, 97,161,161,226,242,101, 77,255, 31,127, 44,243, 29, 60,120,189, 78,
+175,119, 51, 15, 21, 52,130, 0, 97,118,157, 32, 73,130,177,112, 33,141, 98, 48, 96,112,118,158,132,202,202, 32, 75,156,243,197,
+226, 81,239, 78,153, 18,125,252,204, 25,180,110,221,186,246,126,230,228,228,132, 5, 11, 22, 96,238,220,185,156,148,148,148, 46,
+135, 14, 29,234,178,246,251,239, 61, 0,140,178,166,156,231,110,220,112,158,190,114,229,146,246, 81, 81,126,123,247,239,231,180,
+109,219, 22, 0,240,232,209,163,192,239, 86,175,110, 25, 17, 25, 89,250,237,156, 57,187,211, 22, 47, 14, 7,112,185, 41,206,146,
+164, 36,221,161,252,252, 41, 23, 19, 18,156, 34, 34, 34, 0, 0, 89, 89, 89,238, 27, 55,110,156, 26, 62,102,204,248,149, 51,102,
+ 44,141,209,104,170, 28,164, 82, 78,204,230,205,140,223,199,142,181,200,105, 46, 39, 0,244,249,224,131, 57,189,250,246, 13, 27,
+ 53,101,138,139,159,159, 31, 97,103,103, 7,189, 94, 15,145, 72,228,156,150,150,214, 54, 78,161,144, 31,189,113, 99, 31, 76,166,
+129,175,176,173, 27,212, 34,255, 48, 75,214, 95, 53, 69,205,123,159,184,184, 56, 10, 64,159,152,152,152, 68,243, 13,220,100, 50,
+ 89, 37,178, 24, 12, 6, 8,130,176, 86,108,129,162, 40,148,149,149,161,172,172,172,118,234, 72, 34,145,224,226,197,139,200,201,
+201, 1,147,201, 4,139,197,130, 94,111, 57, 7,173, 64, 32, 24, 48, 96,192, 0,198,141, 27, 55,224,239,239, 15, 30,143, 87, 91,
+ 46,243,139,197, 98,193,203,203, 11,114,185, 28,253,251,247,103,110,218,180,105, 64, 83, 66,203,209,209,113,216,184,113,227,216,
+230,207,213,213,213,160,211,233,181,162,165,186,186, 26, 21, 21, 21,168,170,170,130, 70,163, 65,183,110,221,216,113,113,113,195,
+202,203,203,215, 90, 83,127,149, 74, 85, 45,145, 72,156,122,245,234,229,188,123,247,238,172,110,221,186, 5, 63,211,211, 46, 93,
+210,104, 52, 26, 38,141, 70,179, 42,143, 94,108,108,108,237,181, 47, 46, 46,198,182,109,219,106,191,203,201,201,193,166, 77,155,
+ 64, 81, 20, 40,138,106,178,141, 66, 66, 66,134,238,219,183, 47,106,239,222,189,149,116, 58, 29, 89, 89, 89,216,191,127, 63, 40,
+138,130, 80, 40,132, 74,165, 66,105,105, 41, 18, 18, 18, 96, 52, 26, 97,103,103, 7, 31, 31, 31,238,172, 89,179,122,126,249,229,
+151,204,166,132,150,201,100, 50,209,233,116,180,108,217, 18,203,150, 45,131, 70,163, 1,139,245, 84, 95,202,229,114, 84, 85, 85,
+225,238,221,187,200,207,207, 7, 69, 81, 77,222,100,184, 92,238,152,189,123,247,186,179,217,108,168,213,106, 40, 20, 10, 20, 21,
+ 21,161,160,160, 64, 35,145, 72,140,246,246,246,180,150, 45, 91,210, 56, 28, 14,103,228,200,145,132, 89,112,198,196,196,184,238,
+219,183,239, 45,157, 78,103, 73, 36, 9, 61, 61, 61, 63,159, 58,117, 42,183,110,159, 45, 41, 41,193,168, 81,163,248,215,174, 93,
+ 91, 44,151,203,247, 3,144,254,203,110,104,212,161,163, 65,183,239,156,207,138, 60, 18,231,225, 91,240,196,212, 99,193,167,235,
+ 24, 0,176, 99,251,170, 30, 71,226,138,175,134,180, 46, 45, 58,116, 52,232,182,179,115,134, 37, 33, 64,235,215,219,107,184,128,
+207, 29, 55,234,141, 55,168,159,126, 90,223,233,163,153, 83, 56, 45,131, 22, 60,181,112, 50,221,209,223,248, 21,161, 82, 63,226,
+254,244,211,250, 78,163,222, 24,125, 55, 47, 47,127,123,191,222,156, 63, 46, 38,138,255,108,202, 98,232,238,202,245,225,115,148,
+240,241, 15, 67,112,168, 0, 41,247,178,112,248,224,117,132,134,191, 6,173, 86, 11,163,209, 40, 24, 62,124,184,234,192,129, 3,
+154,236,236,108,133, 90,173,238, 13, 32,219, 82,229,159, 60, 73, 39,131, 61, 95,211,179,120, 28,163, 66,198, 82, 45, 90,122,104,
+108,167,174,131,162,156,189,124,152, 66, 1,249,231,208,129, 93,246,255,178,107,217,220,165,203,247,163,115,151, 65,221, 50,178,
+ 46,135, 1,120,208,160,120,205, 69, 28,237,240, 81, 99,238,195,135,209, 5,249,249, 79,130, 60, 60,117,143,170, 40,195,236, 69,
+ 59, 7,246,234, 61,166, 93,219,208,215,217, 25,233,137,196,178,133,111,253,182,114,205, 15,239,152,197,214,133,248,223,122, 79,
+154,116,157,189,123,119,227,214,241,255, 53,176, 56,156, 22,118, 45, 91, 50,242,118,239, 86,251, 15, 31, 94, 9, 0, 58,189,222,
+ 45, 47, 63,223,145,207,231,131,162, 40, 24, 12,134,103,124,136,205,126,195, 17,193,193, 30,214,112,230,125,241, 69,187,133, 11,
+ 23,162,164,164, 4, 70,163, 17, 76, 38,179,254,152, 13,165, 82,137, 73,147, 38, 97,243,247,223,191,102, 13,167,201,100, 34,166,
+175, 92,185,228,179, 37, 75,218, 78,155, 54,141, 86,119,236,117,113,113,193,161,195,135,217, 91,182,108,105,241,249,230,205,147,
+222,229,112,114,161,213, 54,201, 89, 22, 16, 0,151,210, 82,158, 89,100, 1, 64,112,112, 48,182,109,219,198,153, 60,121, 50,123,
+248,240,225,235, 82,218,183,223,184,190,103,207,135,174, 65, 65, 14,108, 14,167,133, 37, 78,243,245, 4, 0,133, 70, 19,177,126,
+227, 70,231,155, 55,111,162,180,180, 20, 37, 37, 79,159, 71, 9,130, 64,231,206,157,137, 9, 19, 38, 56,182,241,245,237, 2,147,
+233, 85, 54,247, 95,180,200, 63, 8, 31, 54,176,239, 63, 62, 90, 53, 21, 34,106, 42, 72,212,185, 57, 62, 35, 88, 44, 9,173,231,
+ 65, 85, 85, 21,170,170,170,176,107,215, 46,176, 88,172,218,155, 47, 0,232,116, 58,107, 68, 75,164,183,183, 55,100, 50, 25,130,
+130,130,158,177,100,177, 88, 44, 48, 24, 12,176, 88, 44,112, 56, 28,104,181, 90,248,249,249, 65,165, 82, 69, 54,197,169, 86,171,
+ 59,184,184,184,212,222, 96,181, 53,157, 85,171,213,214,150, 87,167,211,161,178,178, 18,213,213,213, 80, 40, 20, 80, 42,149, 29,
+173,169, 47, 73,146, 72, 77, 77,125, 20, 28, 28,220,129, 78,167,195,206,206, 78,160, 84, 42,107,125,139, 42, 42, 42,176,103,207,
+ 30,229,123,239,189,231,118,226,196, 9,139, 66,139, 32, 8,124,252,241,199,224,112, 56, 80,169, 84,248,233,167,159,240,201, 39,
+159,128,197, 98, 65,161, 80, 96,219,182,109,152, 55,111, 30, 24, 12, 6,116, 58, 29, 54,110,220,216, 40, 87,122,122,122,222,141,
+ 27, 55, 58,118,234,212,201,249,232,209,163,210,129, 3, 7, 10, 7, 15, 30, 12, 30,143, 7,181, 90, 13,131,193,128,215, 94,123,
+ 13, 33, 33, 33,144, 72, 36, 56,125,250,116, 89, 96, 96,160,219,205,155, 55,201,146,146,146, 2, 11,226,154,170, 99, 49,132,201,
+100, 66,105,105, 41,170,170,170, 32,149, 74, 33, 18,137,240,228,201, 19, 48, 24, 12, 88,208, 89,112,117,117, 29, 29, 17, 17, 65,
+ 7, 0, 30,143,135, 14, 29, 58, 96,201,146, 37, 70,181, 90, 61, 14,192,233,154,195,134,238,220,185,243,232,149, 43, 87, 24,222,
+222,222,200,204,204,132, 80, 40,100,112,185, 92,139, 66,203,211,211,243,215, 63,255,252,211,197, 44,174,205,215, 89,165,122,218,
+ 28,163, 70,141,114,217,187,119,239,175, 70,163,113,216,191,237,166,230,196, 3,171, 67,132,131,236, 64,156, 36,124,193,167,235,
+ 24, 33, 17, 79, 31, 94, 63,156, 6,198,218,239,231,135,143, 31,225,112,210,137, 39,103, 89,226, 25, 58,192,119,203, 27,111, 12,
+164,189,243,118, 76, 14,139,229,228,191,125,199,151,238,238, 30,147,235,200, 48, 7,184,186, 57,192,191, 37,155, 56,116, 50,195,
+125,209,226,175,180,177,123,127,200,253,237,247,184, 33,108,102,252,160,211,231,139,102, 52,198,157,253,168,234,132, 74,203, 13,
+149,151,223, 39, 92, 60,122,160, 67,251, 96,184, 11, 43,177,243,215, 3,104,221,166, 51,180, 90, 45, 28, 28, 28,248, 38,147, 73,
+ 79,167,211, 99,173, 17, 89, 0,112,225, 66, 21, 25, 30, 94,165,163, 43, 72,227, 71,159,172,125,115,224,208, 55,194,250,245, 27,
+ 64,158,139, 63,167,239,209, 81, 47, 30, 58,184, 67,233,153,248, 45, 57, 98,209,227,192,240,200,158, 72, 79, 75, 24, 66, 81, 72,
+ 37,136,134,173, 79,105, 15,113, 70, 67,166, 39, 28, 56,240, 33,169, 38,239,242,190,254,230,193,208,232,232,137, 17,175,247,122,
+157,140, 63,127, 81,199, 70, 89,134, 67,207,238,197, 31, 77, 25,122,244,231,216,141,131,206,156,254, 53, 64, 38, 47,136,179,137,
+172,122, 15,105, 70,163, 7,131,195,161, 73, 19, 18,140,145,147, 39,107,205,255, 71, 62,159,143,227,199,143,131,205,102,215,190,
+ 88, 44, 86,237,182,135,135, 7,136,154,101,164,214,112, 2,128, 88, 44, 70, 73, 73, 9, 28, 29, 29, 33, 20, 10, 81, 82, 82,130,
+107,215,174, 33, 59, 59, 27, 76, 38, 19, 67,134, 12, 1,173, 17,223,230,250,156, 99, 23, 44, 24, 24, 26, 25,233, 87, 95,100, 1,
+128, 94,175, 71, 69, 69, 5, 70,140, 24, 65, 59,125,250,180,231,153,194,194, 55, 0,196, 54,197,217, 49, 58,186,188,244,208,161,
+ 6,127,187, 83,167, 78,196,213,171, 87, 57, 67, 6, 15,158, 59,255,155,111,182,108,222,187,183,200,100, 52,122, 54,167,238, 52,
+ 26,141, 70, 16, 4,124,125,125, 81, 81, 81,129,234,234,167, 51,216,118,118,118,112,118,118,134,193, 96, 0, 73, 81,204, 87,217,
+214,141,105,145,127, 8,118,212, 17, 92, 59,254, 98,209,170,169, 20, 0,244,169,123, 99, 33, 73,210, 42,145,197,100, 50, 45,250,
+ 92, 89, 99,229,170, 15,107,132,150,185,172, 92, 46,183,246,143, 86, 87, 96,153,203, 73,163,209, 64,167,211, 45,222,196,107,196,
+ 16, 93,161, 80,224,240,225,195,232,221,187,119,237,180,148, 76, 38, 67, 85, 85, 21,100, 50, 25, 52, 26, 13,242,242,242,112,225,
+194, 5, 4, 4, 4, 0, 86, 6,127,205,205,205,189,211,186,117,235, 40,243, 77,188,111,223,190, 45,118,239,222, 45, 26, 54,108,
+152, 55, 69, 81, 88,186,116,105,217,107,175,189,230, 86,247, 38,111, 9,116, 58, 29,215,174, 93, 67, 64, 64, 0, 40,138, 2,139,
+197, 66, 86, 86, 22,220,221,221, 65,146, 36, 24, 12, 6,164, 82, 41,236,237,155,142,145,152,154,154,250,254, 7, 31,124, 32,114,
+116,116,108, 87, 94, 94, 46,230,112, 56,189,146,146,146,124,245,122, 61, 28, 28, 28,224,224,224,128, 83,167, 78,193,201,201, 9,
+115,230,204, 41, 84,171,213,215, 4, 2,129,135, 90,173,190, 95, 82, 82,178,180, 57,237,109, 52, 26,161, 84, 42, 81, 89, 89,137,
+138,138, 10,200,229,114,104, 52, 26,139,101,108, 8,189,122,245, 66, 92, 92, 28,125,213,170, 85, 63,231,230,230, 2, 0,252,253,
+253, 49,103,206, 28,186,143,143, 15,242,242,242,112,231,206, 29,232,245,122, 80, 20,213,228,159,151,193, 96,244,125,239,189,247,
+122,250,249,249, 17,122,189, 30, 36, 73, 66,171,213,194,188, 93, 88, 88,136,208,208, 80, 90,203,150, 45,187,229,230,230,246,133,
+117, 11, 43,108, 0, 80, 90,120, 12, 62, 76,119,128,230, 0, 74,125, 12,229,101,207, 23,197, 69, 34,145,124,179,240,139,171,147,
+ 55,175,209,123, 60, 17, 3,193, 17, 35, 17, 24,214, 31,239, 79, 48, 98,213,247,135,225,215, 50, 24, 5, 5, 5,232,219,183, 47,
+ 75, 36, 18,125, 80, 93, 93,189,192, 90,238,248,248, 27,166,115,167, 78,143, 25,251,214,196,168, 1, 3,134, 25,207,158, 61,133,
+212,251,103,211, 62,120,107,180,132, 34,171, 9, 23, 39,222,221,172,204,219,129,237, 58,244,129,206,104,234, 5,172, 88, 3,172,
+160, 26,255,191, 67,119,242,164, 23,237,228,177, 95, 39,188, 51,126, 82,251,254,253, 7, 25,206,198,255,137, 59,215,227,239,173,
+ 91, 51, 53,113,213,198, 63,250, 14, 28, 50, 58, 92,232,113,237, 84, 68,144,118,138,175,171,227,163,157,187, 43,108,157,165,161,
+255, 38,151, 75,162,102, 92,164, 17, 4, 40,138,122, 70,100,213, 23, 90, 52, 26,205,162, 1,160, 46,103,221,123,145,249,129,122,
+251,246,237,224,112, 56, 96,179,217, 96, 50,153, 22,221, 47,234,114,166,229,229,245,219, 19, 27,203,105, 72,100,149,151,151,163,
+188,188, 28,213,213,213,120,251,237,183, 89, 95,222,190,221, 9, 53,174, 31,141,113,250,121,121,105, 5, 60, 94,105,122,122,186,
+119, 88, 88,216, 51,229,149,203,229,224,241,120,136,221,191,159, 21, 19, 29, 61,179,255,169, 83,235, 96, 33,254, 85, 67,117, 39,
+ 8, 2,238,238,238,112,118,118, 6, 65, 16, 48, 26,141, 40, 41, 41, 65, 90, 90, 26,110,223,190, 13, 58, 65, 24, 95,101, 27, 55,
+164, 69,254,129, 86,173, 29, 13, 78, 29, 54, 54, 39,218, 28,161, 69,167,211,159,219,170,213, 24,172,153, 58,228,243,249, 15, 68,
+ 34, 81, 15, 31, 31, 31, 24,141,198, 90,161, 85,127,234,208,108,253, 72, 73, 73, 1,159,207,127,160,209,104,154,228,164, 40,170,
+ 91,151, 46, 93,112,228,200, 17, 36, 36, 36,224,241,227,199, 80,169, 84,208,106,181, 80,171,213, 72, 75, 75, 3, 73,146,136,136,
+136,128, 64, 32, 0,159,207,127,160,213, 54,253, 32,170, 84, 42,197, 76, 38, 51,152,199,227,213,238,243,242,242, 66,121,121, 57,
+105, 48, 24,176,103,207, 30,185,167,167,167,128,199,227, 89, 45, 92, 9,130,128, 68, 34, 65,139, 22, 45,106,125,180, 20, 10, 5,
+220,221,221,205,194, 2, 90,173, 22,246,246,246, 22,167, 14, 1,104, 30, 62,124, 56,191,206,231,206, 99,199,142,253,237,192,129,
+ 3,109,206,159, 63,143,155, 55,111, 66, 40, 20,226,219,111,191,125,156,159,159,255, 14,128,219, 18,201,203,245,139,180,166, 15,
+149,151,151, 31,126,240,224, 65,183, 46, 93,186,212,142, 18,125,251,246, 37,250,246,237,235, 86,215,212, 47,149, 74,113,235,214,
+ 45,156, 63,127, 30, 4, 65, 32, 39, 39,199,164, 86,171,127,107,106,150,194,199,199,103,247,146, 37, 75,236,140, 70, 99,109,223,
+230,241,120,224,114,185, 96,177, 88,160,211,233,200,207,207,199,136, 17, 35, 28,127,252,241,199, 95,181, 90,109, 91, 0,122,252,
+ 75, 80,165,134, 62, 37, 85,238, 24, 17,234,145,182, 99,251,170, 30, 31, 78,131,121,234,208, 24, 17,234,158,150,146, 90,234, 24,
+229,110,185,190,167,207, 23,125,164, 51,156, 30,126,250,204,165,113,159,206,157,195,244,247, 15,149,156,191,152,236,215,223,248,
+ 21,225,234,230,128,242, 50, 57,242, 11, 75,145, 91,160,163,252,253, 67, 37,119,110, 61,224,124,191,126, 67,160, 82,165, 49, 79,
+ 29, 54,217, 79, 47, 95,123, 60,114,221, 38, 78,226,196, 15, 58,179,121, 60,111, 84,148, 61,128,159,159, 16, 35, 98,218,225,151,
+189,215,224,232,232, 2, 15, 15, 15,208,104, 52,129,181,117, 47, 43, 43, 35, 14,255,126,121,242,123,147,166,190, 54,120, 80,180,
+241,204,217,147,140,132,115, 39,174,253,186,227,243,163, 20, 93,201, 39, 40, 5,175, 85,107,207,251,143, 30,166,188,211,111,192,
+219,224,177,236, 3,128,144, 6, 59,108,237, 2, 3, 10,133, 71, 14,172,224,190, 55,233,195,238,131, 7,191, 97, 60,123,246, 24,
+206,158,218,123, 99,249,242, 86,167, 30, 23,239,103, 93,191,253,132, 59,114,204,140,202,184,211, 25,186,209,195, 91,103,123, 11,
+ 58,168,129,199, 54, 85, 85,247, 65,146,193, 40, 53,106,181,190, 45, 6, 15,166,171, 10, 10,152,118, 30, 30, 70, 0, 48, 24, 12,
+ 22,133, 22, 26,153,130,174,207,105,109, 89, 84, 42, 21,200, 70, 98, 39,214,231, 44,145, 72, 90,213, 60,132,215,194, 96, 48,212,
+138,172,242,242,114, 84, 85, 85, 65, 32, 16, 64,170,213,122, 88,195, 57,168,107,215, 61, 95,174, 88,177,224,208,225,195,172,186,
+ 34,203,252, 98, 50,153,248,110,205, 26,214, 39,159,126, 58, 99, 38,131, 49, 27, 70,163,213,215,211,252,208, 78,167,211,193, 96,
+ 48, 80, 80, 80,128,194,194, 66, 20, 20, 20,160,160,160, 0, 60, 30, 15,212, 43, 94, 4,244, 15,246,207, 50,139,172,186,239,181,
+ 86,174, 38,195, 59, 52,199, 25,222, 90, 97, 96,106,198,252,174, 53, 66, 75,169, 84,158,191,112,225, 66,215,145, 35, 71, 50,110,
+220,184, 1, 79, 79,207, 90,161,101,126, 55, 79, 71,241,249,124, 28, 61,122, 84,175, 84, 42,207, 91,248, 51, 93, 56,117,234, 84,
+212,178,101,203,152,239,191,255, 62,210,211,211, 49,109,218, 52, 84, 85, 85, 65, 46,151,163,188,188, 28, 42,149, 10, 93,187,118,
+ 5,151,203,197,253,251,247, 13, 42,149,234,130, 5,139, 29, 37,145, 72,170,133, 66,161, 87,253,239,198,140, 25,227,177,117,235,
+ 86, 85,102,102,166,161, 71,143, 30, 14,214, 10, 14, 51,126,255,253,247, 90, 75, 93,118,118, 54,182,110,221, 90,235,147,149,156,
+156,140,181,107,215,214,198, 62,107, 38,110,151,149,149, 25, 13, 6, 3, 2, 2, 2,224,227,227, 3,141, 70,131, 13, 27, 54, 24,
+ 1,220,254,255,234,205, 26,141,230,208,196,137, 19, 63,187,123,247,174, 23,131,193,120,106,210,174,169,159, 94,175,199,195,135,
+ 15,145,150,150,134,204,204, 76, 84, 84, 84,212, 62, 8,164,164,164, 84, 26, 12,134, 63, 26,227, 21, 10,133, 75,127,249,229, 23,
+ 79, 62,159,255, 76,127, 54, 91, 67,205, 86, 82,169, 84, 10, 39, 39, 39,244,239,223,223,253,194,133, 11, 75,181, 90,237,178,127,
+201, 61,141, 24,243,102,118,231, 79, 62, 26,137, 81, 49,252,162, 35,113,197, 87,215,126, 63,191,198, 25,222, 61,109, 84,140, 79,
+209,189, 44, 39,140,121,243, 88,103, 0, 79,208,180,195, 54,121, 49, 81,124,188, 75, 23,231,132, 35, 39, 78,252,186,120,225,220,
+228, 5,243,167, 10, 85,234, 71, 92,255,150,108, 2, 0,114, 11,116,212,253,116, 82,179,118,221,220,228, 85,107,126,164,149,150,
+ 87, 77,187,117,171,241,240, 6,117,197, 11,141, 6,174,127, 72,111, 81, 96, 80,207,214, 55,174,197,194,142,175, 70,112, 72,103,
+ 12, 30,212, 13, 9,151, 82, 80, 34,213, 64, 44, 22, 67,171,213, 54, 25, 46, 33,243,254,209, 9, 20, 65,249, 17, 20, 81, 72,208,
+ 40,238,132,137, 83,122, 69, 71,191, 65,197,197,157, 48, 30, 59, 26,123,229,143,125,155, 14,209, 88, 76,134, 90,231,168, 35, 8,
+141, 12,180,212,244,106,229,211, 7, 26, 38,135,213,184,249,181, 38,176,107, 88,120,136,231,132,137,211, 28,135, 13, 29, 65,157,
+ 58,117,140,252,227,192,158,132, 63,118, 69,198,146, 52, 57, 75, 92,164,226,200,228, 6, 25, 69,176,157,170,229,164,170, 52,183,
+173,198, 59,122,140, 30, 56,100, 83, 87,117,239, 3, 90,237,147,234,162, 34, 47,151,222,189, 57, 15, 87,172,224,123,116,237,170,
+ 33,106,124,136,155, 18, 90,116, 58, 29,160,209, 72,107, 56,173, 45,139, 90,173, 6, 9, 24,158,135,211,104, 52, 62, 35,178,204,
+ 66,203,252,127,177,134,115,199,242,229, 55,252, 6, 15,174,184,116,233,146, 71,159, 62,125, 8,133, 66, 1,133, 66,241,140,216,
+242,246,246, 38,194, 34, 34,248,191, 39, 36,248, 91,123, 61,173,169, 59,141, 70,123,229, 66,235, 31,142, 70, 19, 73, 55,153,130,
+199,108,209,178, 70,104, 89,105,209, 50, 24, 12, 6,184,187,187,163,172,172,172,209, 27, 63,141, 70, 3,143,199, 51,207, 17, 55,
+185,242, 78,171,213,110, 88,176, 96,193,172,161, 67,135,186, 5, 7, 7, 67, 42,149,194,195,195, 3, 92, 46,183,214,119,204,204,
+151,156,156,140, 95,126,249, 69,174,213,106, 55, 88,224, 92,191,102,205,154,143, 70,141, 26,229,226,233,233, 9,103,103,103,220,
+191,127, 31,206,206,206,144,203,229,200,202,202,130,189,189,125,173,223,206,137, 19, 39, 20, 90,173,118,189, 5,241, 70, 37, 37,
+ 37,233,237,237,237,239, 75,165, 82,122, 69, 69, 5,163,178,178,146, 33,151,203,153, 50,153,140,121,230,204, 25, 55, 71, 71, 71,
+213,197,139, 23,165,126,126,126,244,199,143, 31,211, 13, 6,131, 69,245, 74, 16, 4,102,207,158, 13, 22,139, 5,173, 86,139, 13,
+ 27, 54, 96,193,130, 5,181, 62, 89,107,214,172,193,146, 37, 75,106,133,243,206,157, 59,155,213,115, 40,138,130, 94,175,135,193,
+ 96,128,193, 96,176, 74,252,190, 8,172, 20,236, 37, 57, 57, 57, 49, 93,186,116, 57,119,240,224, 65,215,154,152,100, 40, 45, 45,
+ 69,105,105, 41,164, 82, 41,170,171,171, 97, 52, 26,225,227,227,131,210,210, 82, 28, 59,118, 76,166, 80, 40, 6,163,137, 21,135,
+116, 58,125, 98,175, 94,189, 24,245,203, 96,126,202, 51,139,119, 14,135, 3,145, 72,132,190,125,251,178, 47, 93,186, 52, 17,192,
+ 63, 90,104,213, 13,239, 48,104,240,100, 86,104,120,119,221,189,180,184,162,144,214,165, 69,227, 71, 56,156, 4,128,148,212, 82,
+199,123, 89, 78, 8, 13,143,161, 6, 13,118,142, 42, 45,217, 17, 9, 64,223, 84,186, 30, 0,112,228,115,198, 14, 28,208, 85,100,
+ 47, 16,208,214,174,219,121,250,167,159,214,119, 58,116,242, 63,225, 29,214,174,123, 26,222, 97,224,128,174,100,102, 70,230, 88,
+ 0,187,172, 21, 47, 49, 49,195,239,254,178,251, 23,100,166, 93,244,254,108,118, 59,118, 69,169, 1, 60, 59, 95, 68,117,240,192,
+142,221, 15,112,239,222,189, 18,157, 78,215,183,201,254, 77, 80,126,105,233,169, 65,145,225, 97,158, 19, 38,126,232, 16, 19, 51,
+ 2,113,113,199,177,111,207,174,164,209,111,143,250,185,184, 82, 78,119,103,242, 89,124,138,100,211, 89,142, 12, 22,135, 39,209,
+233,158,174,129, 96, 50,185, 14,192,216, 38,111, 60,211, 63, 28,239,216,111,192, 8,156, 60,117, 28,251,246,236, 72,252, 34,124,
+204,174,214, 29, 67,137,174,157,190,159,209,186, 77,235,150,202,234, 82, 57,141, 96,235, 53, 26,210,254,251, 61,249, 63,228, 46,
+153,152, 11, 96, 29,108,171, 14,235,226,254,190, 97,195,186,124,242,232, 17, 75,216,179, 39, 79,148,144,192,175,201, 68,210,164,
+208, 98, 48, 24,160, 26,159,234,122,134,147,216,187,151, 6,160,201, 69, 88, 44, 22, 11, 42,149, 10,134,198, 45,216,207,112,122,
+157, 61, 91,244,232,209,163, 64, 23, 23,151,103, 68, 86, 69, 69, 69,237,182, 70,163,129, 74,165, 2,143,199, 75, 83, 55, 60, 35,
+242, 12,103,105, 82,146,102,245,236,217,203,222,121,251,237, 77,231, 47, 92,224,186,186,186, 66, 38,147, 61, 35,180,116, 58, 29,
+250,245,239,207, 90,115,247,238, 4,200,229,203,173,185,158, 30,125,251, 90,244, 7,166,211,233, 32, 95,241,212,225,191, 0, 31,
+ 54, 36,188,104,150,166,112,172, 93,117,216,200, 13,178,126,118,239, 37, 81, 81, 81,154,236,236,108,248,249,249,213,138,149,186,
+191,233,224,224, 0, 39, 39, 39, 36, 39, 39,227,155,111,190, 81, 3, 88, 98,129, 83,161, 82,169,222, 26, 56,112,160,154,193, 96,
+ 32, 36, 36,164, 54,126, 22, 73,146, 96,179,217, 16, 8, 4,184,123,247, 46,134, 15, 31,174, 82,169, 84,111,225,175, 49,180,234,
+115,202, 84, 42,213,187,131, 6, 13, 82,165,167,167,163, 87,175, 94,184,119,239, 30,170,171,171, 81, 93, 93,141,188,188, 60,132,
+133,133, 65,165, 82, 97,235,214,173,106,149, 74,245, 46, 0, 89, 83,156, 10,133, 98,248,130, 5, 11,232,191,253,246, 91,107, 31,
+ 31,159,240,206,157, 59, 7,247,239,223,191,237,155,111,190,217,114,216,176, 97, 94,129,129,129,154,193,131, 7, 11,135, 14, 29,
+ 42, 84,169, 84,204,171, 87,175,138, 13, 6,195, 80, 11,229,172, 21, 39,217,217,217,181, 83,133, 12, 6, 3,101,101,101,181,145,
+251,205,131, 82, 35, 66,120,128, 37,177,109, 22, 88,102,193,101,133,159, 91, 67,156, 22, 79, 98,179,217,102,139, 39,101, 5,103,
+ 74, 70, 70,198,192,222,189,123,167, 76,158, 60, 89, 81, 82, 82, 2,123,123,123,248,251,251, 35, 40, 40, 8,110,110,110,208,235,
+245, 56,122,244,168,242,216,177, 99, 15,100, 50, 89, 95,252, 53,134,214,128,122,215, 49,175,161, 65,214,108,205, 50, 11, 45, 46,
+151, 11, 31, 31, 31,243,181,205,107,206,245,124, 78,188, 90,206, 26, 1,211,191,223,224, 54,195,162, 71, 58, 30, 61,126,141,189,
+105,203,177, 7, 81, 3,176,211,181,149,252,132,107, 43,249,137,168, 1,216,185,105,203,177, 7, 71,143, 95, 99, 15,139, 30,233,
+216,191,223,224, 54,233,105,153,193,117,243, 30, 54, 84, 78, 46,151,219,189, 87,207,168,202, 75, 87, 18,201, 85,107,126,164,245,
+235, 59,250,238,174,159,143, 30,221,245,243,209,163,253,250,142,190,187,106,205,143,180, 75, 87, 18,201, 94, 61,163, 42,185, 92,
+110,119,107,234, 62,253,195,241,142,209,195, 70, 32, 46,238,168,241,208,239, 91,215, 28, 56,156,211,123,202,172,164,210,236,236,
+123,148,228,201, 89, 48,105, 5,200,200,200,144,213,136,172,108,107, 56,167, 77, 29, 95, 87,100, 93,118,245,236,181, 51, 35, 3,
+166,248,248, 63, 13, 23, 46,220, 85, 95, 78,145,200,238,164,151, 85,136,164, 21,143,229,242,114, 29, 73,154, 96, 50,153,232, 95,
+126, 89,235,176,219, 96, 27,245,232,209, 7, 23,207,239,199,158,221,219,101, 36, 9,205,216, 67,135, 76, 99,199,174,160, 90,182,
+106,213, 50,246,247,253, 68,204, 27, 35, 29, 41,128, 28, 62,106,132,211,111, 7,126, 35,218, 4,180,105,229,239, 95, 27,210,230,
+159,215,151, 94, 1,231, 10,160, 82, 94, 80,144,152,252,227,143, 90,143,183,222,114, 97,123,120, 56,192,100, 34,204,227,123, 99,
+ 47, 6,131, 81,223, 2,211, 40,167,143,155, 91,241,137, 19, 39, 16, 20, 20, 4, 31, 31, 31,212,245,145, 53, 7,228,118,117,117,
+197,225,195,135, 65, 61, 27,156,186, 81,206,142,173, 91, 39,127,183,122,181,142, 36, 73, 84, 86, 86,254,197,154, 85, 89, 89, 9,
+146, 36,113,234,228, 73,157,252,105, 38, 16,171,234,222,151, 78,175,126,231,245,215, 87, 69, 71, 71,235, 31, 61,122, 4,146, 36,
+ 81,215,178, 37,145, 72, 96,103,103, 7,141, 86,235, 11,128,111, 13,167,228,204, 25, 1, 44,140,235, 13, 88,180, 94, 69,187,255,
+211, 69, 86,221,132,210, 31, 90,101,209, 50, 26,141,240,245,245,125, 38,165, 11,141, 70,123,230,213,204, 21,135,123,211,211,211,
+207, 14, 30, 60,120,217,107,175,189, 54,125,217,178,101,244,224,224, 96,200,100, 50, 56, 59, 59,195,221,221, 29, 89, 89, 89, 56,
+113,226,132,169,172,172,108, 27,128,149,176,110, 9,125, 66, 78, 78, 78, 76,187,118,237, 14, 44, 90,180,200,113,208,160, 65, 76,
+ 95, 95, 95, 80, 20,133,187,119,239,226,200,145, 35,250, 93,187,118,201,107, 68,150,181,206,203,231, 68, 34,209,232,161, 67,135,
+198, 78,156, 56,209,222,100, 50, 49,243,242,242,160,213,106, 97, 48, 24, 80, 88, 88,168,143,139,139,171, 86,169, 84,227, 1,156,
+179,130, 47,185,170,170, 42, 44, 62, 62,126,226,213,171, 87,191,153, 60,121,178,107,255,254,253, 89, 70,163, 17, 87,174, 92,145,
+118,236,216,209, 93, 34,145,232, 15, 31, 62, 92,174,209,104,150,152, 76, 38,171, 82,240, 16, 4, 1,185, 92, 14, 55, 55, 55,104,
+181, 90,144, 36, 9,157, 78, 7, 59, 59,187,218,180, 73, 20, 69,161, 57,206,245,245,250, 0, 93,175,215,227,237,183,223, 6, 73,
+146,216,176, 97, 3,140, 70, 99,179,201, 28, 29, 29,239,164,164,164,196,116,232,208,161, 86,188,152,251, 16,135,195,129,155,155,
+ 27, 92, 93, 93, 17, 23, 23, 7, 38,147,121,199,146,191, 91, 13,238,149,149,149,117,140,143,143,239,254,224,193,131,247, 0,116,
+208,235,245, 62, 38,147,137,160,209,104, 98,138,162,238,203,229,242,159, 97,101, 10, 30,137, 68,242,205,164, 73,147, 58,238,223,
+191,223,142,193,248,207, 95,131,193, 96,128,195,225,192, 28, 28,147,162, 40,232,116, 58, 44, 93,186, 84,174, 84, 42,191,249,183,
+140, 18, 81,157,187, 98,199,214,141,118, 23, 46,158,149,102,228,224, 72, 3, 33, 28,158,148,150,236,136, 20, 21, 21,217, 69,117,
+238,106, 21,167, 65,167, 47,127,119,252, 60,191,154, 20, 60, 75,243,242,242,183,199,238,253, 33, 23, 0,190, 95,191, 33,176,180,
+188,106, 90,102, 70,230,216,237,219,127,239,110,208,233,203,173,225,252,143,120,137,149,129,130, 6,192,205,187, 15, 74, 91, 15,
+127,235,204,146,128, 54, 14,111, 72,202,213,197,213,213,170,143, 1,228, 90, 91,247,158, 61,122,227,226,185,223,176,111, 79,172,
+156, 34,233, 26, 55, 55, 55, 10, 0, 50, 50,220,168,140,140, 42,234, 63,126,197, 78, 74, 38,117,111,229,188,143,251,207,147,201,
+ 43,214,111,216,218,244, 84, 74,187,246,175,161, 93,251,215, 48,235,227,207, 29,195,194, 67,252, 0,224,208, 33,152,194, 3,210,
+255, 92,246,197,138, 55, 86,174, 92, 1,185, 66, 11,115,186,158,172,212,244,147,185,185,208,217,238, 89,207, 98,153,209,120, 19,
+243,230, 5,170, 42, 42,132, 61, 63,251,204,141,241,233,167,180,166,156,225,235,254,127,173,225,188,125,255,254,201,105, 83,166,
+ 20, 47, 95,182,108,240,182,237,219,121,145,145,145, 40, 41, 41, 65, 72, 72, 8,124,124,169, 74,126, 90, 0, 0, 32, 0, 73, 68,
+ 65, 84,124, 16, 31, 31,143,195,127,252,161,172, 82, 40,150, 0,248,201, 26,206,189,167, 78,101, 5,135,135,151,109,223,190,221,
+ 59, 58, 58,154, 80, 42,149,144,201,100,144,201,100,208,106,181,168, 9, 8, 77,101,231,228,100, 24, 12,134,109,214,214,221, 36,
+149,114, 87,118,237,250,132, 69,146,223,141, 30, 53,106,193,202,175,190,226,180,105,211,134,208,106,181,181, 86, 45,189, 94, 15,
+ 59, 59, 59,189, 78,167,115, 5,160,178,134,147,179,107,151, 81, 42,149, 66, 40, 20,214,134,107,170, 27,151, 80,161, 80,128,162,
+ 40, 91, 48,221,231, 64,163, 10,201,217,217,249, 14,131,193,104, 81,215,186,213, 80,238,188,186,251, 12, 6,195,147,178,178,178,
+168,122,138,183, 49,127, 40,127, 0,223,246,235,215,111,244,252,249,243,137, 75,151, 46,225,216,177, 99, 84,110,110,238,161, 26,
+ 43, 86,110, 19, 79, 58,141,113,218,115, 56,156, 57, 2,129, 96,128, 57,132, 3,159,207,127,160, 84, 42,207,215, 76, 23, 42,158,
+131,211,129,195,225,204, 22, 8, 4, 3,107,210,175,192,222,222, 62, 69,169, 84,198,107,181,218,141,104, 60, 81,117, 83,156, 60,
+ 71, 71,199,111,220,220,220,222,253,244,211, 79, 93,147,146,146,196, 23, 47, 94,100, 85, 85, 85,237,215,233,116, 77, 37,149,254,
+ 11,167,139,139,203, 29, 58,157,222,226, 21,181, 17,218,181,107, 23, 55,124,248,240,232,241,227,199,195, 96, 48,224,167,159,126,
+ 66,124,124,252,201,135, 15, 31,198, 88,120, 26,173,207,233,214,162, 69,139, 75,211,167, 79,111,249,246,219,111,243,157,157,157,
+193, 96, 48,160, 84, 42,241,240,225, 67,220,189,123,151, 58,126,252,120,117,114,114,242, 19,149, 74,213, 7, 64, 89, 51,174,231,
+139, 60, 53, 63,195,201, 96, 48,122,251,250,250,254,190,124,249,114,251,129, 3, 7,242, 92, 93, 93, 65,167,211, 97, 48, 24, 32,
+ 22,139,145,154,154,138,179,103,207, 42, 15, 29, 58,164, 44, 47, 47,127, 27, 64,226,255, 71, 57, 95, 38,103,104, 32,190,168,151,
+ 40,186,209,104,239, 22,142,181, 88,206,126,189,189, 70,140, 29, 61,116, 8, 0, 28, 60,124,250,140, 21, 73,165, 27, 45,167,165,
+178, 90,195, 25, 18, 64, 91,158,150,158,250, 76, 64,203,240,176,136,236,208,200, 81, 95, 91, 67, 84, 39, 50,252, 51,117,175, 51,
+ 29, 91,215,166,251,204, 52,107,168, 63, 98, 70,140,125, 51,250,243, 37,139,241,237, 55,171,112,252,224,209,147, 25,185,207,164,
+ 9,250,199,245,165, 87,204, 73,124,205, 96,188,198,247,242,122,125, 3, 73, 46,190,151,154,106, 87,247,129,205,108,121,174,251,
+ 80,233,237,237, 45, 17,139,197, 30,214,112,198,108,222,172, 87, 9, 4,156,197,223,125,215,187, 90,163,233,189,114,229, 74,198,
+237,219,183,177,245,199, 31,141,154, 39, 79, 98,165,192,236, 70,102, 67, 26,229,108, 57,123, 54,119,225,214,173,239,251, 7, 4,
+184,191,247,222,123, 76, 38,147, 9,165, 82,137,162,162, 34,156, 59,123, 86,151,158,145,145, 46,151,203,223, 0, 32,178,150, 51,
+102,243,102,189,147,191, 63,248, 66, 33,117, 33, 33,193,113,218,156, 57,211, 91,181,110,237, 56,120,200, 16,166,131,131, 3, 42,
+ 43, 43,145,151,151,135,163, 71,143, 74,170,171,171,189, 1,152,172,225,140,189,122,181,221,169,196,196, 49, 95,127,253, 53, 59,
+ 34, 34, 2,142,142,142, 80, 40, 20, 72, 77, 77, 69, 98, 98,162,118,219,182,109, 50,153, 76, 54,221,100, 50,157,120,133,237,254,
+111,176,106,153,177,195,162,208,250, 47,254, 1,163, 0,124, 81,179,253, 21, 44,231, 12,252, 55, 13, 62,126, 46, 46, 46, 59, 52,
+ 26, 13,165, 86,171,167, 1, 40,252, 27,150,147, 17, 21, 21,181, 85, 34,145,116,167, 40, 10,142,142,142,215,210,210,210,102,162,
+145,149, 55, 22, 56,233, 0,186,219,217,217,117,181,183,183,239,173,213,106, 67,107,166,223, 50,148, 74,101,162, 94,175,191, 89,
+ 99,125, 50,253, 63,215,157, 14, 96,160,183,183,247, 20,146, 36, 3, 8,130,112, 50,153, 76, 48, 24, 12, 85, 36, 73, 62,148,201,
+100,187, 0,196,255, 13,202,249, 82, 56,195,218,226, 77,138,134,208,198, 4,193, 51, 66,171,158,128, 32, 72,100,164, 63,194,209,
+102,148,147, 54,116,128,239, 22,224,233,202, 68, 88,118,174,253,143,208,178, 66,188, 52, 91,100,182,165, 79,162, 8,234, 25, 78,
+130, 34, 10, 67,218,189,185,239, 69,132,150,181, 8, 11, 66,111, 80,232, 78, 82,184,153,249, 16, 23,255,197, 99,221, 75,227,252,
+ 22,112,249,209,217,249, 26,141,193,240, 4, 64,171,177,190,144, 36, 65,152, 40,130, 48,214,157,222,170,247, 96,217, 36,167, 30,
+136,100,114, 56,190, 38,163,209,163, 4,176, 59,101, 50,117,210, 80, 84,117, 11,224,139, 20, 32,235,121,202,169, 7, 34,233, 28,
+142,223, 41,138, 26, 33, 21, 8,218, 73,212,106, 33, 0,202, 78, 32,200,144, 43,149,123, 52, 26,205, 22,252,117,230,194, 34, 39,
+139,195,105, 97, 50, 26, 61, 0,128,198, 96, 72, 14,104,181,190, 79, 28, 28,222,211,104,181, 45,237,236,236, 12, 58,157, 78,174,
+209,104,198, 27,141,198, 11,205,169,251, 67,163, 49,236, 42,141,214, 75, 47, 16,184,234, 9, 66,160, 51, 26,245, 58,189,190, 72,
+163,209, 60, 0,240, 3,128, 71,175,184,221,109,120,206, 63,139,141,211,198,105,227,180,113,218, 56,109,156, 54,206, 87,207,201,
+ 7,224, 87,243,176,248, 79,172,251,191, 9,214,249,104,217, 96,131, 13, 54,216, 96,131, 13,255, 24,168,208,128, 79,150, 13,255,
+191, 32,154, 80,165,205, 49, 9, 62,143,178, 61,111,227,180,113,218, 56,109,156, 54, 78, 27,167,141,243,127,142,211, 18,247, 63,
+113, 74,178,209, 92,135,175, 26, 54,243,175,141,211,198,105,227,180,113,218, 56,109,156, 54,206,255, 89,208,108,151,160, 81,120,
+212,188, 94,246,177, 54,252,187,251,194,127, 3, 62, 53,175,230, 28,239,101,107, 70, 27,108,176,193,134,255, 13,161,101,237, 77,
+235, 69,110,110, 47,122, 99, 92, 69, 16, 16, 17, 4, 68, 0, 86,189,196, 99, 45,193,219,205,205,237,147,176,176,176, 88, 15, 15,
+143, 89, 0,220,155,121,126, 32,159,207,223, 40, 16, 8, 46, 9, 4,130, 75,124, 62,127, 35,128,192,151,212,110, 4,128,105, 28,
+ 14, 39,193,203,203,171,152,205,102, 39, 0,152,142,231, 95,185, 26,140,167,113,210,190, 2,208,174, 57, 39,186,135,143,248, 67,
+ 24, 62,226,190, 48,124, 68,170,107,196,240, 64, 97,248,136, 84, 97,248,136,251,238,225, 35,254,120, 5,253,245,101,182,239,203,
+ 42, 79, 33, 65,160,208,202,242,252, 64, 0, 69, 4,129, 39,127,147,242,219, 96,131, 13, 54,216,208,168, 10,240,246, 30,237,229,
+229,117,222,203,203, 43,222,219,219,123,180, 21,167, 12,104,224, 38, 97, 34, 8,152, 44, 12,250, 77, 29,103,201, 92, 89,247,220,
+181, 86, 86,173, 46,167, 7, 65,192, 68,213,128, 32, 64,186,187,187,111,242,242,242, 90, 85,255,229,238,238,190,137, 32, 64,214,
+ 57,214, 84, 71,224, 53,215,172,234, 49, 97,194,132,131,149,149,149,113, 58,157, 46, 46, 39, 39, 39,174, 79,159, 62, 7,234, 89,
+ 34, 26,229,228,114,185,239,116,233,218, 61, 57,241,202,205,156,236,135,249,162,244,172,199,249,127,158,185,112, 59, 34,178,221,
+ 45, 46,151,251, 78, 51,218,136, 0, 48,141,193, 96, 36,216,217,217, 61, 97, 48, 24, 9, 0,102,208,233,244, 19,171, 87,175,206,
+ 79, 75, 75, 43,189,122,245,106, 85, 98, 98, 98,241,228,201,147, 31, 18, 4,241,103, 3,130,125,128, 21, 22,152,101, 5, 5, 5,
+103,196, 98,241, 89, 30,143,247,141, 21,199,215,114, 10,195, 71,220,151,200,244,148, 68,166,167,132,225, 35,168, 58,219,247,155,
+121,205, 45,181,209, 95,250, 2,135,195,241,179, 32,232, 95,165,137,254, 47,229, 1,224, 89,243, 93, 20,128,205, 53, 47,243,114,
+118, 79, 46,135,243,178,250,231,203,184,158, 54, 78, 27,167,141,211,198,249,111, 69,199,154,119, 47, 60,245,215,170,189,119, 55,
+119,213,225, 71, 57, 57, 57,118, 0, 16, 20, 20, 52, 19,192,225,230, 8, 9,130,192, 66,146,164,104, 0, 64,163, 17,159,245,237,
+219,175, 35,143,199,123, 38, 10,178, 90,173,102, 39, 36, 92,236, 79,146, 20, 81,115,220, 66,138,194, 70, 0,165,214,254,134, 78,
+167,165, 49,153,108,208,104,196,188,136,136,200, 86,101,101,101, 73, 52, 26, 45,182,184,184,184,178,217,102, 28,130,192,206,157,
+ 59,131,188,188,188,254, 18,173, 89, 44, 22,179, 71,140,120,163, 89,124,147, 0,142,150,195,233,202, 34, 8, 47,147,209,232, 4,
+ 0, 12, 6,163,242, 54,155, 29,245,237,215, 95,243, 9,130, 32,203,203,203,161, 86,171, 49,119,238, 92, 94,122,122,250,200,178,
+178,178, 45, 22,104,131,218,181,239, 56,247,236,217, 51,161,242,138, 74,205,206,245,219,147,213, 12,150,170,117, 88, 8,107,235,
+142, 61,206, 31,190, 63,254,227,204,204,180, 20, 52,156,142,164, 46,104, 0,142,206,153, 51, 39, 60, 38, 38,134,173, 80, 40,184,
+106,181,186, 85,108,108,236,210,168,168, 40,187, 14, 29, 58,176,127,255,253,119, 66, 38,147,129,162, 40,126, 72, 72, 8, 53,110,
+220, 56,205,129, 3, 7,102, 1,216,212,132,240, 93,248,244, 90,210, 54, 4, 7, 7, 47, 7,128,156,156, 28, 86,157,107,204, 12,
+ 13, 13, 21, 0, 64, 86, 86,214,151, 20, 69,206, 1, 0,138,194, 26, 0,139, 27, 48,173,229,132,247, 28, 11, 16, 8, 72,187,114,
+144, 27,222,107,172, 6, 20, 30, 18, 64, 78,205, 3,193, 74,160, 78, 92,168,103,145, 33, 18,137,158, 43, 55, 97,116,116, 12, 65,
+ 16,196,161,228,228,228,195, 18,137,164, 53, 73,154,166, 54, 85,206,198,218, 74, 40, 20,158, 53,153, 76,218,138,138,138,218, 64,
+153,194,118,111,118,119,181, 23,244,151, 86, 42,146,202,211,143, 39, 90,217, 55, 9, 87, 87,215, 73,101,101,101,171, 0, 76,201,
+200,200,232, 8, 0,161,161,161, 44, 0,119, 28, 28, 28,122,232,117, 58,194, 54,254,217, 96,131, 13, 54,252, 87,132,214, 93, 0,
+209,248, 79, 10,158, 29,207, 35,180,216, 0,144,148,148, 4, 0,156,231, 40, 8, 81, 87,192,204,158, 61, 27, 94, 94, 94,245,197,
+ 11, 46, 93, 74,120,145,202, 62,243, 27, 95,125,245,149, 93, 85, 85,213,128,159,127,254,249,117,138,162,214,138, 68,162, 27, 22,
+206, 47,165, 40,172,161,209,136,207, 8,130, 0,135,195,205,158, 62,125,250,221,154,239, 90,253,249,231,159,252,225,195,135,171,
+ 0,228, 3, 0,135,195,245,161,211,105, 65, 20, 69,153,111,184,141, 10,194, 49,128,191,145,205,238, 55,109,243,102, 99,167,225,
+195, 25, 2,161,144, 0,128,252,204, 76,215, 53,223,127,223,163, 50, 55,151,173,118,117, 45, 47, 87, 42,213,217,217,217,224,112,
+ 56, 4,157, 78,239,100,169,194, 2,129,224,147,175,191,253, 78, 32,175,168, 82,107,228, 10, 29,221,104,208,218,243,248,166,210,
+ 18, 73,185, 29, 79,160,250,236,139, 21,236,143,166, 78,252, 68,169, 84,206,180, 64, 53,107,222,188,121,161, 93,186,116,241,249,
+227,143, 63, 8,153, 76, 6, 6,131, 97,215,161, 67, 7, 68, 69, 69,153, 46, 94,188, 72,180,110,221, 26, 17, 17, 17,184,114,229,
+ 10,174, 93,187, 70,116,236,216,145,127,228,200,145, 9, 6,131, 97,147, 37,113, 77,167,211,230,134,132,132,116, 16, 8, 4,186,
+160,160, 32, 76,157, 58, 21, 20, 69, 97,192,128, 1, 17,118,118,118,135,149, 74, 37, 59, 43, 43,243,117, 75, 34, 91,146,118,124,
+156,217,178, 5, 32, 18, 20, 30, 74,211,142,215,157,126, 12,205,202,202,122,173,178,178, 18, 79,219,133,170, 77, 96,254,250,235,
+175, 55,167, 47,149, 82, 20,214, 12, 31, 30,243, 25, 64, 16, 3, 6, 12,168,154, 53,107, 22, 45, 51, 51,243,221, 55,223, 28, 25,
+145,147,243, 16,205,124, 24, 8, 26, 52,104,208,149, 83,167, 78,185, 6, 5, 5, 73, 43, 42, 42,106,191,240,116,117, 26,156,120,
+100,195, 39,223,108,140, 13,217, 75, 17, 85,210,140, 99, 15, 44,244, 77, 98,210,164,247, 75,237,236,236, 70, 29, 58,116, 40, 75,
+ 44, 22, 51, 88,172, 90,237, 74,119,119,119, 23, 6, 5, 5,205,112,113,113,145,208,105, 52,119, 10, 20,101,169,127,218, 96,131,
+ 13, 54,216,240,220, 56, 89, 35,174, 78,214,255,130, 1, 0,113,113,113,181,145,105, 99, 98, 98, 26,125, 2,166, 40,170,244,222,
+189,123,190, 42,149, 10, 20, 69, 89, 51, 96,215, 93,162, 89, 74, 16,180,173, 52, 26, 49,147, 32, 8, 68, 68, 68, 62,222,176, 97,
+ 67, 67, 57,189,116, 17, 17,145,143,233,116, 90, 27,138,162, 64, 16,180,159, 40,138, 44,109,132,179,193, 27, 17,155,205, 89, 8,
+ 0,158,158, 94,185,167, 79,159,214,141, 25, 51, 6,223,127,255, 61,107,209,162, 69, 11, 24, 12,198,172,194,194,194,146, 38,202,
+ 9, 0,139,133, 66,119,254,206,157, 59,131,166, 79,159,126, 87, 44, 22, 47, 6, 0, 47, 47,175, 85, 0,194, 0,228,215,217,135,
+109,219, 14, 20, 79,157, 58, 53, 91, 34,145, 44,110,140,115, 20,208,214, 55, 36,164,223,202,164, 36,138,166,213, 18,101,151, 47,
+203,165,165,165,134, 71, 82, 41,127,247,157, 59, 49, 75, 87,173, 98,250,250,249,225,210,137, 19,110,101, 42,149, 84,166,213,106,
+ 74, 75, 75, 41,163,209,120,205,138,186,135,187, 11,221,249,219,127,248,233,182, 61,147, 78,186,183,240, 33,152, 46, 46, 12, 26,
+223,129, 77,103,208,180,109, 90, 5,178, 1,132, 91,106, 35, 22,139, 53, 97,208,160, 65,252, 3, 7, 14, 16, 17, 17, 17,112,114,
+114,194,229,203,151,145,146,146,130,202,202, 74,154,193, 96, 64,231,206,157,241,221,119,223,193,207,207, 15, 85, 85, 85, 40, 44,
+ 44,116, 99,179,217, 66,131,193,208,216,245,124,166, 63, 45, 92,184, 16, 94, 94, 94, 48, 26,141,168,168,168,128,209,104,132,157,
+157, 29, 0,224,201,147, 39, 56,113,226,184, 53,125,201, 34, 40,138, 66,183,110,221, 20, 4, 65,100,212,183,104, 53,135,211,199,
+199,231,119,169,180,108,104,191,126,253, 80, 89, 89,105, 88,177, 98, 5,218,181,107,135,160,160, 32,139,229,244,246,246,158,102,
+ 52, 26,151, 1,128, 94,175,223,205,229,114, 63,216,183,111,159,107,221, 20, 33,102, 75, 86,169,164,188,242,218,237,180,172,121,
+211,198,244, 73,186,145, 90,164,103,142, 40,148,221, 63, 46,107,160,156,139, 89, 44,246,207, 45, 91,182,252, 97,246,236,217, 94,
+ 46, 46, 46,208,106,181, 75, 75, 74, 74, 48, 99,198, 12, 0,192,176, 97,195,218, 49,153,204,211,147, 39, 79, 70,235,214,173,139,
+ 43, 42, 42, 10,147,147,147,167,170, 84,170,212,231,189,158, 86,194,198,105,227,180,113,218, 56,159, 27,214,106,145,191, 41,196,
+120, 54,156,195,142,103,132, 86, 76, 76, 12, 17, 23, 23, 71, 89, 81,177,242, 22, 45, 90,248,242,120, 60, 0, 40,111,110, 41, 72,
+146,156,229,234,234, 42, 89,188,120,113,207,160,160, 32,221,172, 89,179, 82,243,243,243,151,212, 61,166, 85,171, 86,223,252,248,
+227,143,200,206,206,206, 95,181,106,213,149,242,242,242,230,230, 49, 91, 68, 81,216, 80, 99, 29, 43, 59,113,226, 68,187,164,164,
+164,153,235,215,175, 23,126,244,209, 71,172, 79, 62,249,100, 60,128,239, 45,145,208,233,116, 85, 67,211,133, 13,193,203,203, 75,
+ 71,167,211, 27, 13, 18, 23, 3,240,184,108,118,223,149, 73, 73,148, 46, 63, 95,245,203,186,117,246,219,111,221, 90,110,160, 40,
+ 15,119,119,119,244,234,209,163,154, 75,167,151, 73, 74, 74, 72,247,182,109,233,121,167, 79,187,169,217,108,209,129, 3, 7,100,
+229,229,229,199, 44,154,240, 8, 66, 78, 82,148,206,174,133,159, 97,204,200,129, 17,183,111,166,100,218,187,187,209, 58,118,136,
+104,151,153,157,159, 12,146,212, 19, 4, 33,183,196,227,232,232, 24, 84, 94, 94, 14,185, 92, 14,161, 80,136, 13, 27, 54,192,211,
+211, 19, 42,149, 10,105,105,105, 84,139, 22, 45,136,164,164, 36,180,104,209, 2, 82,169, 20, 58,157, 14, 10,133, 66,162,213,106,
+ 27,203,205, 88, 74,163,209,127,165,209,136,247, 9,130, 64,155, 54,254, 5, 91,182,108,209,145, 36,137,208,208, 80,188,249,230,
+155, 56,114,228, 8,210,210,210,204,150, 39, 93,203,150,173, 10,104, 52,162,101,141, 86,122,110, 11,140, 57,181,143, 72, 36, 26,
+245,156,127, 26,154,183,183,247,248,128,128,128,153,239,188,243,142,129,205,102, 67,169, 84,154,175,133, 97,232,208, 97, 85,195,
+135,199, 56,158, 60,121,178,209,114,234,245,250,101,197,197,197, 94,106,181, 26, 67,134, 12,249,100,237,218,181, 2, 54,155, 13,
+ 0, 48,153, 76,207, 88,178,190, 94,191,247,236,156,101, 91, 18,206,254,254,157,247,215,139, 62,232, 51,126,214, 55, 9, 0,206,
+ 52, 84, 48,157, 78,151, 43,147,201,166,204,155, 55, 47,118,219,182,109,206, 75,150, 44, 1, 73,146,160, 40, 10, 70,163,177, 54,
+145, 56, 73,146, 56,122,244, 40, 30, 61,122,244, 77, 61,145,101,131, 13, 54,216,240,183, 67, 51,180,200,223, 17, 94,120, 58,109,
+136,250, 98,235,191, 30, 25,158, 78,167,111, 63,119,238, 92,135,215, 95,127,157,209,191,127,255,136, 51,103,206, 68, 20, 23, 23,
+167,214, 88, 15, 34,250,247,239, 31,225,238,238,142,141, 27, 55,170,232,116,250,246,231,252,153,218,155, 94, 73, 73,201, 93, 0,
+107,143, 28, 57,178,102,218,180,105,240,244,244, 12, 19,139,197,255,213, 58, 59,112, 56, 29, 39,111,216, 96,100, 26, 12,180,205,
+107,215, 58,172, 75, 72, 88,243,199,193,131,140,110,221,186, 17, 20, 69,225,193,253,251,188,239, 54,109,226,191, 61,114,100,126,
+ 86,110,174,241,248,217,179,134,210,226,226,138, 98,169,116, 25,128, 10, 75,252, 6,131,225,122, 78, 78,142,119,175,222,221,124,
+ 18,111,165,166,140, 25, 57,172, 31,147, 65, 35, 30,230, 63,185,227,229,233,230,120, 41,225,188,218, 96, 48, 92,183,196,163, 84,
+ 42,243,140, 70,163, 11, 69, 81,194, 75,151, 46, 65, 40, 20,162,178,178, 18, 6,131, 1, 58,157, 78,167, 82,169,184,229,229,229,
+208,104, 52,208,106,181,112,112,112,192,131, 7, 15, 74,141, 70,227,197,198, 56, 77, 38,211,100, 14,135,243, 21,147,201,100,179,
+ 88, 44,209,157, 59,119, 32,151,203, 91, 57, 57, 57,125,111, 52, 26, 33, 18,137,144,148,148,244,169,131,131, 67, 62, 0,112,185,
+ 92,176,217, 28, 87,173, 86,107, 4, 80,252,188,215,156,162,168,231,110, 47, 79, 79, 79, 63, 30,143,183,242,179,207, 22,134,182,
+111,223, 1, 82,169, 20, 36, 73, 66, 32, 16, 64,165, 82,193,193,193, 1,221,187,119,207, 91,185,114,165,152,162,240, 97, 19, 98,
+144, 94,211, 62,152, 54,109,154,192,193,193, 1, 69, 69, 69, 8, 9, 9,169, 21, 90, 98,105,249,131,171,183, 83, 51,231, 77, 31,
+219,123,255,137,132,140,179,151,238,100,140, 28,210,163, 61, 65, 80,173,154, 42,163, 68, 34,145, 50, 24,140, 89,211,166, 77,251,
+ 42, 40, 40,168, 13, 69, 81, 8, 12, 12,196,160, 65,131,112,250,244,105,100,103,103, 67,169, 84,154,110,220,184,241,155, 88, 44,
+254,211, 54,132,219, 96,131, 13, 54,188, 82,252,197, 55,235, 25,139,214,127, 19, 18,137, 68,154,153,153,121, 38, 57, 57, 57,102,
+220,184,113,184,116,233,210, 36, 0,243, 0,128,195,225, 76, 26, 55,110, 28,146,147,147,145,153,153,121, 70, 34,145, 72, 95,198,
+111,178,217,108,141, 78,247,212, 56,197,229,114,185,205, 60,189, 85,205,148, 33, 0,180,106, 98, 95,227,166, 17, 6,195, 43,114,
+200, 16, 70,101, 74,138,124,231,205,155, 95,197,198,198, 50,122,246,236, 73, 24,244,122,152, 72, 18,254,254,254, 68,255, 1, 3,
+ 4,191,198,198,186,152,148,202,164,175, 63,251,236,242,142,201,147,171,115,106,252,192, 44, 65,171,213,110,154, 57, 99,202,128,
+132, 75,151,125,194, 66,218,186,156, 57,151,112,215,213,213,145, 31, 20, 16, 32, 40,175,172, 48, 45, 89,244, 41, 67,171,213,110,
+182,196,163, 86,171,143,158, 63,127,126,164,175,175,175, 48, 53, 53, 21, 58,157, 14, 38,147, 9,253,251,247, 7, 69, 81, 28, 0,
+ 36,131,193, 64,102,102, 38,244,122,189, 36, 39, 39, 71,244,240,225, 67, 14,128,213, 22,202, 87,160,213,106,145,145,241,116,214,
+174, 69,139, 22, 3,163,163,163, 97, 52, 26, 49,100,200, 16, 28, 63,126,124, 96, 70, 70,198,186,186,154,239, 69,219,188,198, 66,
+ 22,234,237,237,125,164,102,151, 85, 78,240, 62, 62, 62, 17,254,254,254,219, 86,175, 94,205,106,209,162, 5, 40,138,130,179,179,
+ 19, 84, 42, 21,202,202,202, 17, 22, 22, 6, 95, 95, 95,172, 94,189, 26, 0,126,107,202,226, 70,146, 36,196, 98, 49,242,242,242,
+144,155,155, 11, 95, 95, 95, 16, 4, 1,133, 66, 1,163,241,105, 78,110,190, 66,126,242,199, 95,255,236,123,112,219,178,240,174,
+145,129,126, 55,239,166, 75, 38,140, 26,200, 15,108,237, 23, 36, 77, 93, 65, 3, 86, 52,154,116, 89, 36, 18, 61, 20,137, 68,227,
+ 36, 18, 9,171,170,170, 42,106,224,192,129, 27, 7, 12, 24,128,187,119,239,226,242,229,203,111,115, 56, 28,137, 94,175, 55,122,
+122,122,126, 72, 16,132,131, 94,175,223, 95, 94, 94, 46,182,141,135, 54,216, 96,131, 13, 47, 29,102, 31, 45,212,121,111,158, 69,
+ 43, 52, 52, 84,144,159,159,255, 94,171, 86,173,216, 0,192,227,241,194,252,253,253, 23,228,230,230, 42,154, 91, 26,149, 74,245,
+ 71,108,108,236,160, 31,126,248,129, 53,108,216,176,182, 71,142, 28,233, 2, 0,195,134, 13,107,107,111,111,143,216,216, 88,189,
+ 74,165,122,105, 49,145, 12, 6,195,235,157, 59,119, 70, 69, 69, 5,242,243,243,155, 53,133,242,231,159,127,242,241,212, 47,171,
+201,125, 77,193,168,211, 57, 59,249,248,208,138, 19, 18,244, 21,114,185,215,235,189,123, 19, 6,189, 30, 52, 26, 13,229,229,229,
+ 40, 44, 44,132,163,147, 19,145,153,147, 99,183,107,225,194, 63, 91,181,111,207, 54,233,116,174,205, 40,166,178, 76, 82,250,254,
+199,179, 62, 58,186,127,255,111,194, 42,185,252, 17,143,199,215,114, 56, 44,207,217, 31,127,108,170,168,168,152, 8,160,218, 10,
+158,213,251,247,239, 31, 50,100,200,144,251,126,126,126,238, 82,169,212,179,170,170,202, 84, 81, 81, 65,199, 83, 95, 43, 2, 0,
+ 18, 18, 18, 32,151,203,141, 38,147, 41, 9, 79, 99, 97,233,172, 45,104,203,150, 45, 29,163,162,162,250, 8,133, 66,200,100, 50,
+184,186,186,162, 67,135, 14,125,232,116,250,207, 5, 5, 5,178,151,217,235,227,227,227,237, 41,138,122,141,162, 40, 12, 25, 50,
+196,170,115, 76, 38,211, 7,209,209,209, 44,130, 32,160, 86,171,192,229,242, 32, 16,216,193,222,222, 1, 65, 65,193, 16,137, 68,
+ 24, 60,120,176,238,209,163, 71, 91,197, 98,241, 31, 22,184, 32, 18,137, 32,149, 74, 81, 88, 88,136,178,178, 50, 0, 64, 89, 89,
+ 89,173,115,254,203,128, 76, 38, 27,209,189,123,247,249, 51,102,204,128,209,104,196,136, 17, 35, 80, 84, 84,180, 46, 47, 47,239,
+128,183,183,247,248, 15, 62,248, 64,232,234,234,138,249,243,231,243, 0,124,105, 27, 15,109,176,193, 6, 27, 94, 58,234,251,104,
+253,213,162,213,212,156,168,167,167,103, 47,130, 32,150,170,213,106,182,121, 74,134, 32, 8,182, 80, 40, 60,174, 86,171, 87,137,
+197,226,102, 57,197, 85, 85, 85,201, 31, 63,126,124,252,250,245,235, 99, 71,141, 26,133,248,248,248,137, 0, 48,106,212, 40, 92,
+191,126, 29,143, 31, 63, 62, 94, 85, 85, 37,127, 25, 53,247,241,241, 25,218,187,119,239, 81,157, 59,119, 70, 92, 92, 28, 76, 38,
+211,181,230,156, 95,119,133, 33, 26, 88,117,104,222,103, 21, 25,157, 14,130, 32,106,173, 25,101, 82, 41,178,179,178, 80, 81, 89,
+ 9,173, 70, 3,165, 74,101, 10,106,221, 90, 45,211,233,152, 4,208,220,185,175,130,228,219, 55, 10, 85, 74,165,187,171,179,139,
+154,207,231,160, 74, 46, 99,221,185,125,163, 26,192, 35, 43, 57,116, 20, 69,245, 62,125,250,244, 50, 58,157, 62,206,206,206, 14,
+ 51,103,206,164,247,233,211, 7, 44, 22, 11, 90,173, 22, 85, 85, 85,136,141,141,149,154, 76,166, 54, 53,231,216,241,249,252, 61,
+116, 58,253,137, 66,161, 88,106,241, 7,116,186, 97, 49, 49, 49, 12,157, 78,135,175,191,254, 26,203,151, 47,199,144, 33, 67, 24,
+183,111,223, 30, 6, 96,255,203,234,241, 36, 73, 98,224,192,129,117,157,225, 51,172, 57,143,201,100, 70, 4, 4, 4, 64, 42,149,
+ 66, 42,149, 66, 40, 20,194,219,219, 27,158,158,158, 88,183,110, 29,181,113,227,198, 51,122,189,126,107, 89, 89, 89,169, 53,101,
+200,205,205,173,181, 12,106, 52, 26, 40,149, 74, 20, 21, 21,213, 78, 29,170, 5, 14, 67,102,189, 63,188,189, 82,173, 86,221,124,
+144, 83,184,244,147,241,221,148,106,181, 42, 39,175, 48, 27,216, 68, 90,209,191, 63,156, 56,113,226,135, 99,199,142, 69,117,117,
+ 53,174, 95,191,142, 30, 61,122, 96,205,154, 53, 94, 73, 73, 73,243, 58,119,238, 12, 38,147,137, 75,151, 46,193,104, 52, 22,217,
+198, 66, 27,108,176,225,239,140,127,168,127, 86,147,104,210,162,229,235,235,235,100, 50,153, 62,141,142,142, 30, 56,114,228, 72,
+ 12, 30, 60,248,153,239,247,239,223,111,127,248,240,225, 85,155, 54,109, 26,162,215,235, 87, 55,103,170,143, 36,201,163,251,247,
+239, 31,214,173, 91, 55,126,223,190,125,253, 1,128,195,225,232,246,239,223,175, 34, 73,242,232,115,212,197, 28,136,177, 20, 0,
+188,189,189,219, 49, 24,140, 81, 67,135, 14,109,247,254,251,239, 35, 45, 45, 13,177,177,177, 15,131,130,130,174,148,150, 54,203,
+191, 58,223,194,170,195, 85,150,172, 91,116, 54,187,188,170,164,196,201,206,207,143,233,108,111, 47,142,139,139,243, 29, 48, 96,
+ 0, 81, 84, 84,132,202,202, 74,104, 52, 26,220,190,125,155,100, 0, 5, 12,103,103,162,224,250,117,130,206,102,151,227,217,149,
+124, 22,225,235,229, 28,248,197,162,233,173, 52, 90, 77,184, 76, 38, 51, 50,152, 76,102, 11, 79,167,162,172, 71,205,154,137,211,
+242,249,252, 40, 0, 12,146, 36, 85, 46, 46, 46,252,115,231,206,129,205,102,131, 32, 8, 68, 70, 70,130,203,229,178, 40,138, 42,
+ 4, 0,123,123,123,246,246,237,219, 29,199,143, 31,127,217, 18,113,199,142, 29,153, 28, 14,231,141,160,160, 32, 92,191,126, 29,
+169,169,169, 5,215,175, 95,111,217,177, 99, 71,248,249,249,189,225,229,229,117,240,238,221,187,134,151,209,177,159,174, 88,109,
+190, 51,188,201,100, 34, 9,130, 0,141, 70, 3, 73,146,144, 74,165,104,211,166, 13,182,108,217,130, 13, 27, 54,124, 45, 22,139,
+ 79, 52,131,203, 36,151,203, 33, 16, 8,144,154,154,170,141,142,142,230,208,104, 52, 60,124,248,176, 86,104,185,187,185,132,245,
+232, 28, 17,242,245,250,189,103, 5, 28, 14,103,112,159,168,208,244,156,130, 39, 20, 69, 88,156, 54, 14, 13, 13,101,181,105,211,
+102,226,216,177, 99,145,155,155,139, 85,171, 86,149,137,197,226,132,179,103,207,142,158, 49, 99, 6,189, 71,143, 30, 40, 47, 47,
+199,175,191,254,106,188,115,231,206, 47, 37, 37, 37,123,109,195,184, 13, 54,216, 96,195,223, 68,104,249,250,250,142,101,177, 88,
+243,223,122,235, 45,122,112,112, 48, 74, 75, 75,225,224,224, 96, 32, 8,130, 9, 0, 78, 78, 78, 6, 30,143,135,233,211,167,163,
+125,251,246,189, 22, 46, 92,216,131,193, 96,108, 17,137, 68,123,172,249, 97,137, 68,162,162,209,104,135,102,206,156,185, 58, 37,
+229,110, 27, 0,184,117,235,214, 99,145, 72,180, 72, 34,145,168,154, 89, 15,115, 80, 76,130,195,225,222, 12, 12, 12,204,139,138,
+138,114, 24, 57,114, 36,132, 66, 33,146,147,147,241,221,119,223,229,232,116,186,101,137,137,137,198,255,246, 69, 54,106,181, 37,
+119,142, 29,179,239,243,238,187, 14,179,163,163,215,126, 52,115,230, 15, 95,124,241, 5, 35, 56, 56,152, 80,169, 84,184,121,243,
+ 38,117,248,240, 97,195,175, 95,125,181, 1, 2, 1,243,250,225,195,108,157, 78, 87,208, 76,203, 93,239,158,175,247, 10, 94,251,
+195, 38,104,212,213,184,121,237, 36, 42, 43,165,216,190,227, 72,176,143, 15,213,187,184,184, 56,209, 90, 46,130, 32,130,226,227,
+227,221, 41,138, 2,155,205,198,202,149, 43,225,237,237, 13, 7, 7, 7, 40, 20, 10,204,155, 55,207,113,206,156, 57,142, 0,144,
+150,150, 86, 27,158,193, 18, 68, 34, 81,247,233,211,167,219, 27,141, 70,156, 57,115, 70, 71, 16,196,210,243,231,207,255, 28, 25,
+ 25,201,238,213,171,151,253,222,189,123,123, 0,184,244,178,132,214,115,158,247,240,220,185,115,157,199,141, 27, 71, 49,153, 76,
+162,170,170, 10, 78, 78, 78,216,178,101,139, 82, 44, 22,159,108, 38,215,202, 69,139, 22, 45,171,217,222,189,116,233,210, 41,171,
+ 87,175, 22,150,148,148,212, 90, 53, 37,101, 21, 23,187, 71,127,108, 42,175,146,233,126, 89,191,112, 12,143,203, 97, 47, 93,253,
+203, 37, 3, 29, 55, 44,246, 43,163,145,205,231,243,217, 20, 69,225,208,161, 67, 40, 40, 40,248,160,188,188,188,196,100, 50, 29,
+249,244,211, 79, 23, 4, 7, 7,183,206,202,202, 42, 80, 40, 20,107, 36, 18, 73,158,109,184,179,193, 6, 27,108,120,101, 48, 59,
+193,155, 87, 31,158,196,211,233,196,198,133,150,201,100,154,126,246,236, 89, 58, 73,146,216,177, 99, 7,238,220,185, 67,241,249,
+252,165,124, 62,255, 71, 30,143,103, 82,171,213,211,166, 78,157, 58,126,249,242,229,180, 94,189,122,225,250,245,235,180, 54,109,
+218, 76, 4, 80, 87,104, 13, 64, 19,177, 54,100, 50,217,237,210,210,146, 54,117, 2, 84,182,225,112,184,183, 45, 84,166, 62,103,
+253,160,152, 93, 87,174, 92,169,244,242,242,210,165,166,166, 98,219,182,109,228,157, 59,119, 18,216,108,246,118,177, 88,172,181,
+146,243,101,160,150,147,109, 52, 38,239, 91,176, 32,180,211,136, 17,228,148,249,243,171, 89, 60,222, 39,107, 55,109, 90, 88,165,
+ 80,120,131, 32, 40, 87, 71,199,130, 29, 43, 87,174, 26,242,198, 27,213,105,137,137,220,148,248,120,166,208, 96,184,215,156,114,
+ 22, 23, 23, 39, 94,186,116, 25,187,119,254, 0,189, 94, 11,113,241, 83,157, 86, 86, 46,131, 5,145,245, 23, 78,163,209, 40, 27,
+ 61,122, 52, 11, 0,111,194,132, 9,108,137, 68,130,182,109,219, 2, 0,228,114, 57, 78,158, 60,137,144,144, 16, 0,192,131, 7,
+ 15,106,183, 45,149, 83, 32, 16,188,209,163, 71, 15, 20, 20, 20, 32, 45, 45,237,130, 88, 44, 46, 7,112,161,168,168,104, 88,231,
+206,157,113,244,232,209,225, 77, 8,173,102,181,145,149, 66,235, 47,156, 60, 30,111,209,145, 35, 71, 62,184,118,237,218,184, 5,
+ 11, 22, 48,251,247,239, 15, 0, 80, 40, 20, 42, 0,166,230,112,170,213,234,237, 0,106, 87,206,230,231,231,239,155, 63,127,126,
+210,220,185,115,133,230,242, 73,211, 79, 92,151, 2,215,195,251,124,240, 69,247,206,225,193,223,108,140, 61, 91, 88, 84, 26, 43,
+203, 56, 46,179,166,238, 20, 69,193, 96, 48,128, 36, 73,184,184,184, 40,203,203,203, 33,145, 72,242, 36, 18,201,204, 71,143, 30,
+ 53,171,238, 47,179,207,219, 56,109,156, 54, 78, 27,231,255, 40,172,143, 12, 79, 81,148,145, 36, 73, 92,186,116, 9, 71,142, 28,
+ 49,233,245,250, 15,197, 98,113,221,104,213,155,146,147,147,227, 71,143, 30,189, 39, 43, 43,139,158,158,158, 14,138,162, 76,205,
+ 41,141, 70,163, 49, 16,196, 95,247,189,104, 45,119,239,222,141,146,146, 18,125, 81, 81,209,121,163,209,120,244, 5, 87, 47,190,
+240,170,195,221,128,246, 29,157,238,252,242,158, 61, 7, 46,139,143,231, 76,249,252,115,237,164,247,223,255,212,164,211, 25,232,
+ 44, 22,201, 22, 8,104, 38, 14,135,153,150,152,200,221, 56, 99,134,139, 90,171, 61, 19,219, 12, 7,115,179, 69,171, 79,159, 94,
+152, 52,101, 46,212,117, 44, 90,215,111,103, 67,171, 71,179, 44, 90, 90,173, 54, 92, 44, 22,131,203,229, 22, 2,240,124,239,189,
+247, 64,146, 36,212,106, 53, 20, 10, 5, 68, 34,145,236,253,247,223, 55,213,136, 39,198,168, 81,163, 28,172,225,245,247,247,247,
+102, 50,153, 56,115,230, 12,152, 76,230, 73, 0, 96, 50,153, 39,227,227,227,135,189,253,246,219,240,241,241,241,207,205,205, 37,
+ 96,193, 63,205, 61,124,196, 31, 20, 16, 8, 2, 1, 79, 77,112, 8, 16,134,143,184, 79, 0, 57, 53, 81,227, 51, 58,118,236, 8,
+ 88,233,151, 85, 23, 53,139, 59, 54, 24, 12,134,131, 11, 23, 46,156,217,181,107,215, 65,203,151, 47, 39, 80, 19,170,225, 5,145,
+ 93, 92, 92,252,250,226,197,139,207, 82, 20,245,140,232,151,148, 85, 92,236, 22, 51,139,170,170,146,165, 72, 51, 78, 60,104,150,
+197,212,104,124,161,112, 22, 54,216, 96,131, 13, 54,188, 52,171,214, 95,208,168,208, 34, 8, 98, 71,239,222,189, 63, 4, 64, 39,
+ 8, 98,155, 72, 36,250,203,224, 47, 22,139,179,189,189,189,191,111,221,186,245, 52, 0, 20, 65, 16, 59,154, 89,168, 82,138,194,
+119, 52, 26,177,240,169,184,123,174, 0,149,230,180, 36, 11, 1, 16, 52, 26,125,207,221,187,119, 63, 47, 44, 44,148, 90,105,129,
+104, 18, 47, 99,213, 33, 0,252, 6,228,189, 85, 80,112,118,126, 68,196,128, 33, 51,102,160,221,144, 33, 14,222, 45, 91,154,212,
+122, 61,249,224,202, 21,226,218,161, 67,172,148,248,120,166, 90,171, 61,115, 20, 40,108,110, 57,139,139,139, 19, 47, 38, 36,158,
+ 27, 51,106,216, 32,255,214,222, 79, 69, 67,158, 8,101, 21,178,115,205, 17, 89,245, 68,239,136, 45, 91,182,156, 96,177, 88,140,
+186,169,108,244,122,125,133, 86,171, 13, 7,128,202,202, 74,239, 29, 59,118,252, 78,163,209, 10, 44,241,165,167,167, 31, 95,182,
+108,217,168,252,252,252,115, 69, 69, 69,249, 0, 80, 88, 88,152,111, 48, 24,246,136,197,226, 81, 5, 5, 5,135, 97,197, 34, 0,
+ 10, 8, 76,187,114, 48, 18, 0,194,123,142, 69,218,149,131, 92, 0,145,225, 61,199, 2, 0,158, 55,151, 97, 93,212,132, 65, 88,
+122,253,250,245,253,131, 6, 13,154,138, 23,136,233, 85, 95,108,233,245,250,150,245,119,154, 45, 91,205, 33,210,233,116, 6,181,
+ 90,109, 52,153, 76, 12,189, 94, 79,233,116, 58,131,109,156,179,193, 6, 27,254,173,160, 40,170, 51, 0,161,121,216,172,121, 23,
+214,219,214,161, 38, 93,160,121,168,172,249, 44, 37, 8,226,118, 29,142,218,253, 86,156, 11, 0,101, 0,238, 19, 4,209,152, 17,
+100, 71, 99,159, 27, 21, 90, 34,145,232, 48,172, 72, 26,109,237,113, 77, 96,113, 77,158, 56,224,249,243,176,213,114,152, 76,166,
+210,194,194,194, 23,110, 80, 26,141,150, 55,124,248,240,102, 29,111,233,152, 3, 64,193,199, 90,237,222,184,205,155, 59,156,217,
+182,205,199,100, 52,186, 18, 0, 69,103,179,203,117, 58, 93,190,208, 96,184,215, 92, 75,214, 51,214,152,199,197,131,115, 31, 23,
+ 35, 32, 32,128,122,248,240,225, 83, 91,207,139,225,158, 82,169,244,181,212, 5, 84, 42, 85, 47, 43,197,224,111,197,197,197,191,
+ 53, 32,216,127, 23,139,197,191, 91, 91,168,218,164,210, 0,141, 36,200, 49,225, 61,199, 30, 2, 64,154,147, 74,191, 76,148,148,
+148,100,161, 38,206,219,223, 13, 5, 5, 5, 90,130, 32,246,125,247,221,119, 19, 82, 82, 82, 14,136, 68, 34,173,109, 40,182,193,
+ 6, 27,254,205, 34,139, 32,136,184,154,207, 49, 53, 70,161,184,250,219,230, 99,204,199,213, 61,198,204, 81,127,127, 83,231, 2,
+192,162, 69,139, 62, 95,181,106, 21, 31,128,181,201,152,159, 59,169,244,171, 66,233,223,132,163,174, 40,216,249, 42, 42,186, 25,
+208,193,104,188, 1, 99, 29,159,124,195,203, 53, 68, 60,124,248,144,248, 55,255,225,204, 73,165,235, 32,226,127,117,240,201,207,
+207,223,226,231,231,183, 93, 36, 18, 25, 97,131, 13, 54,216,240,239,133,176, 33, 97,212,136, 40,139,105,234,251,103, 30,220, 27,
+ 56,174,161,207, 4, 65,196,173, 90,181, 42,166, 25,229,173,181,104,209,108,109,103,131, 13,255,108,252,127,172,164,181,193, 6,
+ 27,108,248, 55,160,190, 21,203, 44,190,234,127, 94,180,104,209,231,104,122,198,201, 11, 79,173, 88, 94, 53,159,107,253,181, 8,
+ 60, 93, 57,208, 16,154,179,154, 96,192,115,212,239,188,141,211,198,105,227,180,113,218, 56,109,156, 54,206,255, 57, 78, 75,220,
+231, 27, 16, 68,209,141, 77,245, 53, 53,141, 88,127,219,210,185,150,142, 37, 8,162,177, 48, 63,230,169,194,250,239,175, 28, 3,
+108,156, 54, 78, 27,167,141,211,198,105,227,180,113,218, 56, 95, 4, 20, 69,117,166, 40, 42, 26, 79, 23, 76, 81, 20, 69, 69, 83,
+ 20, 53,100,209,162, 69,139,205,251, 22, 45, 90,180,152,162,168,254,230,227,106,142,169, 61,199,188,175,254,123,253,125, 77, 29,
+219, 68, 17, 63,172,183, 93,251,249,239,226,163,101,131, 13, 54,216, 96,131, 13, 54,216,208, 32,204, 43, 6,235, 88,155,164, 0,
+ 30,172, 90,181,170,178,142,239,148, 20,192, 61, 0,237,107,142,147,214,136,180,186,190, 85,186,154,207,186, 6,142,209, 89,115,
+108, 35,216,209,200,182, 77,104, 53,134,246,158,180,175,252, 90,184, 71,213, 52, 0,168,154, 36,192,100, 77,188, 34,202, 28,184,
+136, 36, 81, 60,222,237, 0, 0, 32, 0, 73, 68, 65, 84, 65, 81, 20, 68,146,170,228, 7, 18,124,241,188,191, 23,228, 13, 23,119,
+ 46,119, 3, 73, 81, 61,107,118, 37,202,202,181,115,211,228,168,178,150, 35,196, 3,161, 92, 26, 62, 37, 41,180, 3, 0, 26,129,
+251, 26, 18,223,103,150, 54, 63,158, 84, 67,253, 60, 92,136, 15,217, 60,254, 91,142, 78,206, 1,149,149,101, 57,122,141,246, 96,
+186, 20,219,209,252,188,140,240,119,198,107, 36,133,207, 1,208,152, 52,172,203,169,176,122, 37,135, 13, 54,216, 96,195,139, 90,
+ 71, 94, 40, 46, 30, 65, 16,166, 6, 56,137, 23,228,180, 5,195,179, 66,108, 53,176,251, 86, 3,251,110,255,157,202,221, 44,161,
+ 21, 38,196, 12, 16, 88, 1,128, 2,133, 47,211,165,248,169, 89,231,123, 97, 0,151, 78,223, 5,128,174,209,155,230, 83, 36,146,
+ 26,188,152, 52,188,206,101,209,215, 1, 32, 53, 38,211,228,116,177,245,254, 98,225, 62, 24,194, 32,105,251, 72,138, 98,154, 72,
+106, 15, 40,196,217,177,112,245, 70, 49, 52,205, 41,171, 95, 11,247,168, 99,183,196,131, 18,126,154,141,174,237,218,130, 50, 25,
+ 1,210, 0,126,175, 79,113, 97,253,123,232, 26,234, 7,138, 52, 0,164, 17,118, 67,215, 98,104,132, 35,245, 64,242,124,121,176,
+131,188,225,210,210,205, 61,117,231,206, 93,158,222,254, 97, 4,105,212, 35,235,214,185,241,115, 22, 46,235, 23, 14, 89,132, 53,
+ 98,171,157, 23,166,248,181, 10,254,116,238,138, 31,232, 94,222,190, 2,210,160, 53,150,228,101,116,220,180,102,217, 97, 22,173,
+ 96,221,125, 49,118, 89,219,151,195,132,152,198,224,176,199,242,184,130, 0,149, 74,241,208,164, 55, 28,164, 49, 25, 67,190, 95,
+187,161, 67,159,129,195,236, 76,138, 18,154,129, 68,216, 31, 7,126,111,185,121,203,214, 97,169, 98,211, 27, 0,200,230,212,153,
+164,176, 48,123,239,135,195,152, 12, 58, 17,250,193, 78, 58, 96,124, 46,161, 21,234,142,119, 8, 10, 22,195, 75, 80, 4, 46,103,
+ 72,240,219,243,252, 70,136, 59,126, 38, 40, 4,129,192, 33,130,194,239,233, 82, 72,108, 67,158, 13, 54,252,187, 64,163,209, 18,
+ 72,146,236,251,146,133,193,107, 20, 69,221,176, 93,221,255,109, 52,207,162, 69,224,235,180, 71, 69,206, 48,233, 17, 30,228,255,
+ 21,208, 60,161,197,165,211,247,220,206, 41,245,132, 81,143,157,223,204, 60,160, 51, 0, 70,131, 30, 38,163, 1, 38,163, 1, 70,
+163, 30, 38,131, 1,148, 65,139,101,191, 36, 0, 58, 5,162, 34, 2,247, 0, 38, 47,107,127,131, 73,209,246, 37, 95, 57,231, 66,
+232,100,248,237,167, 85, 31, 23, 73,171, 63, 62,127, 95, 84, 22,230,174, 94,156, 46,193,175,205, 17, 4, 9,219,102, 35,246,232,
+201, 39, 27,127, 86,102,146, 20, 5, 23, 7, 94,240,248,152, 52,223,189,199, 19,138, 54,236,209,100, 2,128,163,128, 29, 60,241,
+126,142,223,139, 52,130, 59,151,187, 97,251,214,205,158, 94,174, 60,194,120,109, 53,140, 38, 19,124, 91, 70,211, 23,207, 26,239,
+245,245,250, 93,235, 33,215, 78,106,234,252, 96,119,132,181,106, 29, 58,127,207,201,107,126, 74,185, 68,119,110,255,231,143,160,
+133,193,211, 39,148,249,213,170, 31,232, 75, 62,155, 61, 79,103,122,114, 51, 75,130,116, 75, 99, 77,168, 59,142,175, 90,189,182,
+ 93,191,161, 49,118,100,181,148,174, 81, 86, 7,237,252,101,215,138,144,118, 93,248,189, 34, 90,176, 36, 7,167, 19,106, 69, 5,
+244, 52, 46,167, 95,248, 0, 7,245,132,183, 13, 59,119,199,206, 74,151, 96, 83,115,234,108,162,254,211,247, 72,242,249,163,174,
+ 19, 20,122,165,220, 72,152,102, 18,221, 6,101, 50, 0, 38,125,237, 59, 76, 6, 80,228,211,247,174,211,127, 1,240,124, 66,139,
+ 70, 97,208,249, 43,183,189, 74, 75,196,157,215,175,253,118, 49,117,251,246,105,152,176, 47,163, 2,137,205, 21,152, 0,130,218,
+184,210,207, 26, 76,208, 22, 85,153,130,204, 59,251, 5,113,186,123,217, 17,253, 11,101, 68,210,229, 71,234, 68,219,208,100,131,
+ 13,255, 47, 22, 19, 35, 69, 81,140,151,204, 57,140,162,168, 83, 47, 72,243, 41,128, 41, 53,219,187, 0,124,255, 18,138,214, 2,
+128,103,205,118, 9,128, 39,182, 30,240, 66,168,239,252,254,220,113,180,184,160, 72,224,208, 72, 0,224, 53,183, 20, 20,192, 5,
+ 65, 7, 12, 74,140, 24, 58, 16,110,238,158,128, 65, 5,232, 85,248, 63,246,206, 59, 60,138,170,109,227,247,204,108, 75, 54,189,
+108,122, 33,180,132, 64, 32, 32, 16, 58, 65, 65, 4,194, 71, 17,164, 9, 8, 47, 69, 68, 17, 65, 84, 80, 64, 68,138,138,128,210,
+ 65,165, 73, 71, 74, 64, 74,148, 94,162,212,132, 36, 4,146,144,222,123,178,217, 54,229,124,127,164,152, 64,202,110, 64,125,225,
+157,223,117,205, 53, 91,239,157,153, 51, 59,115,207,115,158,231, 12, 88, 13,192,170, 1, 86,131,220,140, 36,192,160, 6,226,127,
+ 5, 71,136,194,228,213,213, 21, 1,177, 7,240, 74, 7, 47,168,108,204, 48,107, 72,107,199, 45,167, 98,183,109, 59,115,191,111,
+ 84, 54, 70, 25,181,172,132, 32,168,109, 11,172,221,166,142, 57,126, 43,167, 63, 0, 12, 12,116, 56, 21,212,218,219,115,205, 14,
+109,204,201,136,130,215, 0,224,181, 54,214,191,118,246,115,245, 18,208,248,168,175, 64, 72, 79,183, 38, 45, 40,254,246,102, 8,
+197,169, 40, 46,214, 32,245,209, 78,216,185,191, 68,243, 2,122, 55,244,125,115, 6, 31,191,183, 96,165,180,172, 56, 75, 47, 24,
+114,120, 21, 83,192, 72,228, 2,133,180, 11,186, 82,161,144,159, 61,117, 60, 55,231,179, 47, 63, 6, 48,174, 62,157,214, 78,152,
+185,106,213,154,182,221, 59,182,114,202, 60, 52,139, 42, 45,200, 2,199, 40, 21, 67,186,118,135,109,203,214, 66,214,249, 85,148,
+188, 89, 95,216, 58, 52, 67,218,213,159,145,120,253, 48,213,163,195,112,197, 79,123,100,111, 2,134, 90,141, 86, 11, 71,244,232,
+223,171,243,190,102, 94,110,174,132, 8, 16, 4, 2, 34,240, 40,213,178,248,100,127, 60,120,158,199,235,253,123,188, 98, 33,167,
+136, 32, 8, 32, 68, 64, 74,102, 94,217,239,225, 49,175,196, 23, 32,220,152, 72, 85, 96,151, 62, 61,238,222,188,222,138,141, 61,
+142,142,227,150,199, 80,192,229,106,251, 92,143, 91,167,127,106, 5,252,216,120, 47, 71,129, 79, 60,181, 2, 94,189,166, 50,155,
+247,156, 82, 21,229,164, 77, 56,180,115,195,136,141,155, 55,239,142,201,198,116, 83, 76,214,251,189,228,151, 87,255, 94,236,208,
+181,153, 69, 78, 74,181, 56,101, 83, 59,186,255,166,147, 81,239, 93, 91, 18,212,106,193, 9, 82,120, 49, 78, 27, 33, 30,183, 68,
+ 68,254, 89, 8, 33,207,220,108, 37, 37, 37,165, 63,141,217,114,119,119,239,149,150,150,246, 85,101,182, 10, 69, 81, 95, 53,105,
+210,100,225, 95, 23,170, 53,174,245,138,120,158, 31,151,150,150,118,177, 62,205, 65,131, 6,185,157, 56,113,194,167,154,166, 15,
+ 0,159,218, 62,107,107,107,203,119,235,214, 45,241,196,137, 19,233,226, 30,210, 40,195,101,178,209,138, 73, 62, 48,171,131, 46,
+163, 20, 0, 98,140,248,124,141, 46, 63, 45,203,175,216,190,120,252,138, 54, 77,236, 81,162,214,227,204,141, 68,240, 60, 11,158,
+227, 42, 34, 91, 28,120,142, 69,255, 64, 71,116,211, 78,199,119,161,247,193,241,194,242,250, 52, 31,199, 64,132, 49,237,251,190,
+177, 95, 16,136, 92, 33,165,139,124, 61, 29,156,230,188, 30, 72,207, 26,210, 6, 26, 3,247,198,207,231,227,126,143,206,198, 86,
+163, 52,133, 39,135, 39, 34,181,189,198,115, 13,174,123, 61,209,168,160,190,193, 61,173,137,174, 8,108,110, 60, 74,202, 88,196,
+231,177,200,212, 22, 66, 65,101, 24,165, 41, 16,180,243,112,119, 85, 94,217,247,209, 35, 7,166, 88,226,196,112, 50, 57,205,129,
+ 23, 8, 67, 10,163,116,246,173,250, 73, 43,243,182,234, 91, 78,115,165,213,248, 94,175, 14,178, 73,254,121, 42,101,238,219, 31,
+ 78, 29, 60,241,232,226,118,100,223, 8, 69, 94,122, 34,101,173, 45,132,179, 67,115, 12, 24, 55, 10, 95,143,234,132,146,226, 18,
+ 48, 25,113, 54,114,169,194, 22, 48,212,170, 73,120,140, 91,181,242, 75, 87, 9, 67,151,111,207,202,137,103,161,209,233, 0,158,
+131,153, 68, 0, 69, 42,223, 99,193,179, 6,101,187,225, 31,205, 0,248,240,134,214, 61, 58, 27,123, 90,171,208, 19, 2,219,138,
+176, 26, 80,192,229,168,156,191,204,143,191, 19,198,188,212,255,173,158,132,194,165,198,180, 81,128, 3, 66, 58,250, 88, 90, 88,
+ 20,199, 32,245,224,187,136,131, 25,113,238,254, 31,140,153, 52, 83,185,101,203,150,193, 0,121, 27, 53,115,212,170, 52, 91, 57,
+ 51,211, 88, 30, 11, 1, 64,195,146,237, 86,114,106,210,170,189,215, 28,192,252,117,135,135,202, 72, 86, 92,158, 80, 96, 56,247,
+233,253, 46,115, 66,131,219,222, 14, 78,161, 40, 69,242,133,135,186, 34, 83,246, 37, 19, 17, 53, 69,205,191, 93,211,218,218,186,
+105,147, 38, 77, 22,178, 44,219, 75, 38,147, 57, 27, 12, 6, 8,130,144, 41,151,203, 47, 37, 38, 38, 46, 41, 46, 46, 78,248,111,
+ 91,247,187,119,239,154, 98,182, 26,212,148, 74,165,184,127,255,254, 67, 19,204, 86,216, 99,223,223,117,249,242,101,236,223,191,
+ 31, 0, 16, 27, 27,139,150, 45, 91, 90,212,246,197, 71,143, 30, 89, 4, 7, 7,239, 2,224, 89,159,102, 68, 68, 68,211,227,199,
+143,227,224,193,131, 0,128,251,247,239,195,215,215,183,214,133,185,124,249, 50, 51,118,236,216,166, 0,210,255,129, 54,122, 17,
+ 76, 86,245,249, 95, 70, 43, 52, 52,148,132,132,132, 80,143, 63,174,133,120, 47, 59,121, 7,104,121, 0,136, 55,117, 9,162,179,
+176,114,237,206,211,175,253,118,112,125, 47, 51, 25,141, 69, 91,231,164,228,228,151,116,145, 80,229,221, 47, 28, 1,109,103, 41,
+191,182,124, 66,160, 87, 65,169, 22,199,254, 72,187, 24,149,109, 90,136, 52, 42, 3,103, 1,193,182,252, 25, 15,173, 38,219,119,
+194,215,103,247,238,253,248,181,118,179,135,180,195,209,171,137,179, 1,174,193, 81,223,137, 32,128, 8, 92, 85,242,123,197,165,
+ 3, 32,212,188,129,175, 0, 82,254,154, 96, 90, 68,171, 55, 32, 41,112,194, 0, 43,165,124,221,180,105, 83,172,217,156, 7,200,
+215,203,144, 82,160, 69,166, 70,138, 82,137, 19,210, 98, 34,120,154,194,217, 6, 67, 46, 20,138, 9,167,181,181,147, 91,210, 1,
+253,102,184, 23,159,154, 95, 32,167, 56,198,122,216, 82,219,220,223,190, 77,228,212, 57,106,138, 66,131,195,207,219,216,216,182,
+212,230, 37, 50, 69, 5,185,176,117,105,131,215,222, 8,193,231,131, 90,163,164, 88,141,156,252,107,164,133,171, 53,149,116,105,
+ 55, 22, 12,240, 71, 94, 86, 6,116, 44, 64,169,117,249, 90,189,182,180,206,237, 72, 99,243,251,115,231,141,241,118, 85, 89, 84,
+ 22, 21, 16,129, 71,160,127, 51,244,235, 21,132,179,151,175,224,207,136, 88, 8, 21, 69, 5, 68, 16,144,154, 93,144,165, 53,240,
+219, 77,218,160, 60, 7,194,106,107, 53, 98,104, 68,151, 97,128, 19,148, 60,240, 89,167,166, 86,147, 63, 14,241,182,178, 80, 80,
+208,178, 60,180,122, 22, 37, 87,214,193,161, 73, 91, 40,205,204,168, 14,208, 72,110,161,246,109,171,101,177, 48, 33,163,208, 21,
+165,153, 24,219,175,205,123, 59,150,191, 99, 65,153,149,239,154, 44, 95, 51,146,117,101,113,167,211, 99,191, 56,114,110,255,129,
+209,110, 95,127, 56, 62,184,255, 7,219,207, 1, 56, 37, 30,183, 68,158, 71, 70,140, 24, 97,150,149,149,117,222,211,211,179,117,
+191,126,253,148, 61,123,246,132, 90,173,198,153, 51,103,160, 86,171,189, 61, 61, 61,189,207,156, 57, 51, 60, 57, 57, 57,202,195,
+195, 35,248,224,193,131, 70,231,208, 86, 24, 32,166,234, 16, 12,112, 20, 69,161,226, 53,170,226,181, 70,223,231, 86, 46,151, 35,
+ 41, 41,233,153, 71,182,210,210,210, 30, 54, 38,178, 85, 90, 90, 42,115,119,119,135, 74,165, 2,207,243, 80,171,213, 56,114,228,
+ 8,138,138,138, 32, 8, 2,204,205,205,177,116,213, 86,196,220, 58,143,240,240,112, 20, 21, 21,201, 26,210, 76, 77, 77,165, 2,
+ 3, 3,161,211,233,192,113, 28,180, 90, 45,194,194,194,170,158, 75, 36, 18,204,251, 98, 53, 98,111,156,199,237,219,183,145,154,
+154,250,143,220,109,196, 4, 47,242,223, 72,157, 99,102,253,227, 85,135, 60,207,125,178,101,199,222,107,159, 76, 31,133,153,163,
+251,122, 46, 89,127,184,111,116, 46,118, 0,128,191, 35, 38,188,217,167,133,151,173, 82,138,207,127,190, 1, 16,242,201,211,254,
+222,189,124,196,182,118, 22,102,255, 18,158,116,126,254,168, 14,104,230,106,221,178, 64,158, 47,143,143, 55,226,158,130, 2, 7,
+ 59, 75,133,223,192, 64,135, 83, 16, 4,216, 90, 41, 90,129,231, 96,107,169,240,123,173,141,245,175, 0, 96,173,148,182,170, 45,
+242, 85, 23, 29, 61,165, 83,149, 10,201, 84, 11, 43, 91,175,137,131,251,153, 15, 28, 60,220,220, 82,202, 33, 47,252, 12,138,165,
+ 30, 96,237,189,161, 99,243,145,154, 16,199,255,118, 61, 58, 45,183, 68, 55,167,193,197, 36,184,152,150,112, 95,213,180, 93, 63,
+187,220,208, 5,217, 77,223,250,217,135,134, 64,151,236, 30,150,101,225,212,217,252,143,248,132, 82,129,212, 26,209,169, 65,113,
+ 81, 81, 34,203,195, 85,195, 75,172,226,206,253,132,143, 7,180, 69, 65,126, 54,180, 6, 14, 69, 26,206,224, 98,107,166,208, 37,
+ 68, 66,103,224,160,103, 5, 72,109,221,113,230, 90, 68,174,192,178,191,214,165, 25,159,135,219,241, 71,110, 91, 86,127,173,153,
+ 35, 2, 63,178, 54,191, 13, 86,131,164,212,116,236, 56,113,173, 67,124, 30,110, 63, 77, 59, 19,129, 43,239,126,174, 22,201,162,
+ 8,122, 54, 38, 9,190,149, 19, 58,203,204,100,223,127, 53,123,108,235,174,190,246, 10, 33,245, 26, 40,193, 0, 11, 94, 2,141,
+156,135,141,103, 51, 8,250, 18, 82,166,213, 22,222, 3,234,107,124, 6, 0,136, 65,141,175,199,183,177,160,236,154,129,143, 63,
+ 5, 73,251,169, 96, 43,162,253,113,121, 66,132,225,220,167, 49,221,230, 30,239,253,197,217, 62,209,233, 39, 22, 69,187,143, 88,
+ 23, 8,108,111, 34,158,174, 69,158, 71,252,252,252, 92,210,210,210,238,205,157, 59,215,126,216,176, 97,248,229,151, 95, 80, 92,
+ 92,140,237,219,183, 99,205,154, 53, 88,188,120, 49, 88,150,197,150, 45, 91,148,135, 14, 29,234,188, 97,195,134, 84, 47, 47,175,
+ 54,201,201,201,153, 13, 24, 44, 10,128, 2,128,180,226,220, 69, 1, 16, 78,158, 60,137,129, 3, 7,226,228,201,147, 66,197,107,
+ 60,202, 47,126, 26,117,239, 79,185, 92, 14,185, 92,142,162,162,162,103, 98,182,164, 82, 41, 44, 45, 45, 33,151,203, 81, 82, 82,
+ 98,178,217,226, 56,142, 73, 77, 77, 69, 81, 81, 17,250, 13, 30,140,213,203,151,163, 79,159, 62,232,215,175, 31, 8, 33, 8, 11,
+ 11, 67,223,238, 1, 24,245,127,193,136,142,142, 6,199,113, 70, 45,111,102,102, 38,178,178,178,240,218,224,193,216,186, 97, 3,
+130,130,130,224,231,231, 7,142,227,112,254,252,121,140,232,223, 29,102, 67,251, 34, 54, 54, 86,220,169,141,143,102, 61,147, 28,
+173,167,230, 94, 14,174, 11, 71, 47,132,142,238,223, 57,100,112,143,214,216,186,239,183, 47,161, 42,222, 11, 0, 14, 58,197,210,
+241,125,154, 33, 42,185, 0,191,221, 78, 15,141,206,197, 51,169,214, 16,120, 56, 58, 88, 43, 1, 70, 14,141, 65,224,172,227, 27,
+ 78, 96, 22, 8,129,178,215, 71,120,115,112,148,103, 80,107, 79,207,202,170, 67,203,129,223, 98, 66,196, 67,175, 78,126, 46, 94,
+224, 89,128,103, 97, 61,234,103,224, 11,139, 6,151,163,187,143,252,236,251,179,102,117, 27, 48,244, 13,115,185,210, 6,124,113,
+ 10,216,204, 8,228, 61,184, 8,181,178, 37, 50,147,226,177,255,116,120,209,131,212,188, 98,154,198,153,172, 34,221,135,241, 5,
+ 40,109, 72, 87,203, 98,249,194, 5,115, 6,237,223,187,207, 74,209,172, 7, 21,183,110, 96,145, 92,194, 41, 84, 62, 47,209,101,
+102,142,100,217,246,125,214,106, 61, 86, 52,164, 83,166, 46, 62, 28,118,230,212,168, 22, 77,123, 88, 61,250,243, 4, 52, 90, 29,
+116, 44,208,166,115, 48,120,158,200, 41,154, 18,172, 25,134,202,206, 43, 0,197,242, 89,151,238, 60,202,184,124, 39,158,209, 89,
+ 97, 69,189,163,139, 60,238,238, 41,230,189,193,193,237, 1, 86,131,255,235,213, 22,171,119,255,246, 46,192,191,245,116,141, 92,
+ 30,209, 34, 64,143,214, 42,108, 34, 4, 61,110, 28, 89,211,170,227,208,247, 97, 74, 68,171,141, 35, 6,248, 55,117,251,105,245,
+210,143,236, 29, 60, 90, 50,148,192,130,184,180, 3,138, 83, 9,149,122, 13, 54,238, 65,224,221,186, 99,203,119,223,148, 10, 2,
+217,139,122,134,182,224, 5, 64, 72,190, 0, 62,230, 23,196,199,199,195,209,251, 6, 64,209, 32, 77, 30,193,192,149,127, 77,103,
+ 32, 39,214,110, 63,222,231,195,151,151,183, 25,220, 74,226,117,237, 78, 92,246, 27,147,220,148, 93,188, 24,223,168, 12, 11, 58,
+ 87,173, 22,196,227,151,200,243,132, 86,171, 61,188,114,229, 74,251,144,144,144,202,136, 12,174, 93,187,134,109,219,182,193,194,
+162,230,113,114,224,192,129, 32,132,216, 47, 90,180,232, 48,128,174,117,105,118,235,214,109,240,237,219,183,211,219,183,111, 31,
+ 95, 97,182,100, 0,232,200,200, 72, 58, 37, 37,133,178,179,179, 35,110,110,110,108,122,122,186, 0,128,159, 52,105, 18,115,224,
+192,129, 22,106,181,250, 66, 99,141,150, 92, 46,127, 38, 57, 91, 82,169, 20, 20, 69, 65, 46,151, 67, 38,147,129, 16, 98,146,217,
+226,121, 94,114,242,228, 73,220,184,113, 3,139,219,183,199,108,119,119,216,219,219,227,252,249,243, 32,132,192,194,194, 2,249,
+249,249,216,187,119, 47, 94,126,249,101,112, 28, 39, 51, 70,247,224,193,131,184,121,243, 38,190,232,216, 17,179,109,108, 96,105,
+105,137,176,176,242,222, 64,133, 66,129,164,164, 36,132,133,133, 33, 56, 56, 88,220,169,159, 18,163,119,158,222,128, 36,159,130,
+139, 65,175, 1,225, 8, 64,193,205,223, 31,178,232,232,154,201, 57,198, 64,211, 88,240,221,142,208, 65,223,190, 63,152,154, 58,
+164,131,219,146,159,206,189, 13, 0,147, 95,247,117, 87, 42, 36, 88,123, 52,138,208, 52, 22, 60,139, 21,244,247,135,140,202,195,
+219,253,130,252,144, 94,168, 71, 92,122,225,239,209,128, 81,119,113,254,237,219, 55,177,243,216,249,148, 53, 59,181, 49,132, 16,
+216, 90, 42,252, 38,220,141,243,250,233,228,205,228, 85,251,181, 49, 68, 32,176, 85, 74, 91,189, 21,221,189,193,170,195,142,158,
+210,169, 31,204,153,211,125,200, 91,115,205,184,152, 3,208,199,157,134, 96,208,160,216, 32, 67, 33,227,130,212,228,100, 44,219,
+ 18,154, 82,172,214,143,186,151, 99,154,193,124,144,135, 82, 9, 85, 60,108,217,231,243,207, 46, 95,186,200, 82, 19,127,190,148,
+161, 56, 13,211,164,183,100,233,226,111,169, 18,157,254,141,248, 2,148, 52,164,163,179,194,138,149,171,190, 27, 52,101,220,240,
+ 24,223,150,189, 29,248,244, 4, 7,109,113,113,246,207,167,110,186, 84, 92, 41, 82, 0, 16,151,154,135,156, 34, 53,199,115,236,
+ 5, 43, 41,150, 68, 25, 19, 29,172,160,169, 19, 84, 33, 61,218,140, 85, 89,201,160, 41, 45,132,147,149, 20,253,131,154,143,101,
+255,136,253, 40, 33,219, 20,187,246,184,209, 98, 65, 88, 13,174,175,120,185, 21,225,217, 86,224, 89, 24,238,238, 50, 61, 50, 70,
+ 97,246,204, 94,150,214,118,250, 71, 52,212, 22,128,185, 35, 40,107,111,192,198,135,146,250,191,129,244,248,123,220,187, 99,199,
+229, 37, 36,166,254,224,104, 94,127,183, 54, 43, 16, 8,137,231, 81,154, 21,135,200,116, 3,218,100,151,247,182, 91,103,221, 2,
+ 47,142,152, 35,242,130,146,148,148, 52,254,147, 79, 62,185, 28, 20, 20,228,236,232,232,136,182,109,219,226,216,177, 99,152, 59,
+119,110,213,103,218,183,111, 15, 66, 8,242,243,243,177,114,229,202,204,244,244,244,241,245, 94,160,223,187, 23,179,115,231,206,
+ 94,173, 91,183, 54,200,100,178, 66, 0,138,194,194, 66,179,252,252,124, 74,171,213, 66, 16, 4,193,198,198,134, 79, 79, 79,103,
+ 71,141, 26,165,187,122,245,106,115,181, 90,157,244, 52, 17, 45, 79, 79,207,200,188,188,188, 34,138,162,158,122,232,135, 74,147,
+229,232,232,168, 42, 45, 45, 21, 0, 20, 52,102,232, 7,142,227,208,177, 99, 71,156,190,120, 11, 39,127,187,138,226,244,251,120,
+123,202,120,180,109,219, 22,167, 79,159,110,116,155, 5, 6, 6,226, 84,216,101, 92,190,113, 7, 73,177,119,241,238,219, 83,208,
+166, 77, 27,156, 58, 37,102, 47,152,192, 9,212,204,205, 58,241,184,209, 10, 14, 13, 13,173, 60,244, 63, 97, 95, 91, 57, 34, 80,
+106, 43,223,181,104, 64,115,127,105,191, 69,160,164,230, 56,208,242, 84,247, 5,203,214,197, 48, 78, 73,227, 34,179, 27,174, 14,
+171,241,167,201,198, 61, 18, 30,179,231, 78,116,171,177,255, 23,228,137,173,199,148,159, 1,192, 27, 61,155,226,143, 7, 57, 8,
+143,205,222, 19,149,131,123, 79,187,214, 1, 78, 80,242,185,216,179,242,189, 33,193,222, 30, 46,216,246,203,101, 80, 20, 14, 27,
+117,194, 37,132, 4,181,246,198,154,157,143, 87, 24,186,120,173,218,175,141, 57,115,175,100, 0, 0,244,107,165,252,181, 83,115,
+ 59, 47, 82, 61,113,171, 22,204,229,146,105, 3,134,191,105,198,197, 30, 3, 18,195, 64,113, 58,104, 12, 2, 50,114, 75, 80,102,
+227,137,243,215,238,104,138,180,250,247,163,114, 26, 23,197,139,206, 69,188,236,207, 59,201,165,106,141,171, 82,213, 92,203,208,
+130, 80,170, 35,248, 35, 42,177, 56, 42, 19,247,141,209,136,143,135,190,139, 59,215,115,211,142,253, 11,165, 50,249, 27, 12, 5,
+202,201,214, 66,181,233,219, 47, 96,101,101, 9, 65, 95, 10,168,115, 48,236,157,101, 57,145,233,108, 83, 0,104,233, 0,203,158,
+ 77,165, 59, 36, 52,149,122, 46,206,240,105, 67,191, 65,177,152, 62,174,127,123,169,160, 87,227,189,149,251,176,249,163, 33,120,
+243, 21,127,233,137, 43,177,211, 1, 44,105,108, 91, 19,158, 3, 97, 53,232, 58,255, 98, 12, 5, 92, 38, 64,143, 27,251,151,182,
+ 2,110, 25,173,209, 1,144,242, 18,202,191,157,151,133, 76, 72,189, 2, 33,245, 10, 97, 60,187,131,242,234, 69, 81, 46, 29,201,
+247, 95, 45, 86,111,221,186,237,140, 64,227,115, 35,134,202, 0, 47, 0,185,177,151,161,215,235,193,242,128, 86,171,133, 90,173,
+134, 69,220,169,170, 28, 45,153,148,122,109,214,196,193,129,164, 52,189,236,120, 12,151,188,109, 74,171,174,164, 52,189,236,122,
+ 50, 31,155,171,214,137,209, 44,145,231,145,248,244,244,244,215, 6, 14, 28,248,219,233,211,167,237, 3, 2, 2, 0, 0, 55,110,
+220, 40,191,232,236,216, 17,190,190,190,200,202,202,194,232,209,163,115, 51, 50, 50, 94, 67, 3, 57,191, 37, 37, 37, 9, 7, 15,
+ 30,116, 86,171,213,237, 63,253,244,211,108,111,111,239, 98,173, 86, 75, 21, 22, 22, 10, 28,199,193,206,206, 78,222,190,125,123,
+116,235,214,173,244,218,181,107, 77, 82, 82, 82, 74, 0, 36, 54,102,225,135, 12, 25,130,139, 23,203,139,246,158,197,184, 90, 50,
+153, 12, 1, 1, 1,238,241,241,241,105, 21,231, 22,147,143,241,213, 79, 47,119,238,220,193,133, 91,169,144,232, 53,144,231,164,
+227,250, 47, 7, 49,120,218, 12,112, 92,227,239, 45,127,231,206, 29, 28, 9,187, 14, 11,133, 4,247,239,223,195,193,131, 7,241,
+246,219,111, 63,149,102, 35,169,215,139,252,151,147,129, 58,242,180, 36, 0, 16, 18, 18,114,161, 50, 90, 81,157,102,205, 32, 87,
+148, 98, 81,191, 14,238,243,222,232,209,156, 97,139,211, 33,240, 2, 24, 41,224,228,104,141, 93,187,246, 52,221,179,111,223,181,
+ 13,235, 55,124, 39,112,220,130,200,108,148,153,176, 80,139,190,221,119,249,141, 93,115,130, 37,111, 15,104,101, 15, 0, 50, 9,
+141,181,199,238,113, 0, 22, 61,205,218,118,113,135, 89, 41,139,169, 78, 14, 54,159,125,242,159, 65,246,193, 29,125,113, 33, 60,
+ 18,223, 29,188,118, 81,158,141,157, 70,239,220, 2,139,199,253, 83,109, 85,135, 16, 26,206,187,228,121,226, 34,179,176,131, 33,
+241, 28, 96,208, 66,171, 51, 32, 37,143, 71, 74,190, 22, 18,165, 12, 55, 98, 83, 53, 14,153, 8,125,138,213,166, 44,148,102,110,
+ 11,191, 92,229,161,213,148,114,197, 5,185,156, 76,126, 93,170, 52, 87,100,152,146,170,112, 61, 13,218, 94, 62,210,151, 0,129,
+145,155,145,178,249, 31, 76,180, 72,139, 58,141, 22,116, 58, 40, 66, 96,238, 63, 8, 86,230,140,172, 71, 19,105, 50, 0, 88, 88,
+ 40,229, 43, 63,159,107,243,254, 71,159, 55,152, 3,230, 15,200,124,155,185,188, 31,224,109,135,139, 55, 99,112, 49, 34,233,222,
+197, 27,247,219,244,105,235, 6, 95, 15,219, 89,242,130,194, 21,209, 48, 61, 66, 90,222, 48, 28,192,106,171,170, 14,253,157, 48,
+166,211, 27,159,214, 85,109, 88, 43, 62,128, 16,203, 19, 80, 12, 3, 80,116,121, 5,100,202, 21, 72,108,155,145, 61,251,143,148,
+109,219,182,243,139,232, 92,227,139, 51, 88, 30,124,113,113, 49, 44, 44, 44,112, 42,150,211,189,217, 95,166,160,105, 26, 41,177,
+183,254, 74,134,183,167, 91,203,250, 44,109,117,101,113,167,211, 86,114, 74,225, 54,232,115,127, 46, 98,103,106, 99, 79, 18, 34,
+ 34,255, 13, 20, 21, 21,221,141,142,142,238,223,174, 93,187,237,239,189,247,158,213,184,113,227,220,166, 76,153, 66, 3, 64, 86,
+ 86,150,176,102,205,154,244,239,191,255,190, 40, 55, 55,247, 45,150,101,141, 25,202,132,100,100,100, 92,253,225,135, 31,114, 46,
+ 93,186,212,166,115,231,206,138,151, 94,122, 73,176,179,179,147, 40, 20, 10, 94,175,215,107, 99, 99, 99,249,248,248,120,215,194,
+194,194,135, 0,226,208,136, 59, 86, 84, 68,175,150, 48, 12,179,144, 16, 18,240, 44,114,180,148, 74,165, 27,128,135, 20, 69,181,
+ 48,181,219,240,137, 19,182, 68,130,130,130, 2,148,101,222,131, 89,234, 3,180,179,160,209,218,206, 18,214,214,214, 79,101,138,
+138,138,138, 0,117, 26, 46, 95,190, 3,112, 28,108,108,108, 96, 99, 99,243,143, 27,173,186,188,200,115,194,212, 90, 94,171, 63,
+ 71,171,181, 10,111,155,235,177,102,218,160,230, 50, 31, 47, 15,232, 82,111,224, 78, 74, 41, 22,116,233, 28,197, 40,172,180,211,
+198, 15,233, 56,124, 68, 19, 4,119,235, 68,249,184,218,204, 90,241,237,198,119, 90, 35,119,110, 84, 54,214, 26,179, 68, 81, 57,
+ 72, 16,144,189,237,220,221,212,233, 30, 74, 13, 4,129,224, 92, 68, 6, 34, 18, 11,182,197,228, 32,193,148,181,107,237,138,190,
+ 18,208,251, 8, 33,102, 54, 22, 22, 37,173,125, 61, 28,251,118, 13,164, 95,235,221, 17, 50, 6,184,252,199, 29,204,254,246,240,
+117, 65, 32,131,110, 25,217,109, 88, 94, 97, 88,211, 64,149, 87, 24,178, 53, 42, 12, 9, 33,164,188,234,176,254,224, 3,195, 80,
+153,101, 73,127,186, 72, 29, 90, 66, 19,119, 14,137, 5, 2,146,178, 75, 80, 44,113,129, 46, 45, 13, 32, 66,242,133,250, 19,171,
+235,197,209,209,209,169,105,107,223,230,235,118, 28,132,161,172, 8, 9,231,183,163,180, 32, 3, 75, 55, 29,107,238,238,238,208,
+ 59, 45, 45,237,130, 9, 7, 27,223,223, 66,247, 56,129, 0,140, 84,129, 19, 27,246, 35,215,193, 28,142, 74, 25, 4, 77, 14,166,
+189, 63,206,102, 64,191,113, 54, 0,144,116,255, 54,188,149, 26,163,116, 13, 14, 24,254, 70, 31, 63, 91,176, 26,236, 56,117, 91,
+ 75, 3,175,237, 60,115, 47,174, 79, 43, 91,179, 55,122,120,219, 45, 73, 47,124, 29,121,141, 27, 84,180, 50,162, 85, 21,225,107,
+ 68,181,225, 65,128,111, 37, 32,110,223,213,108,139, 17,253, 94, 82,202, 36, 20, 69, 74,211, 64,204, 29,177,113,199,129, 82, 57,
+107,218,157,216, 5, 96, 73,208,242,132,133,229,251, 9,182, 15, 88,126,227, 63,103, 63,235,162,202,204,204,132,161,162,239, 48,
+ 33, 95,248,125,124,191,214,124,106,145,160, 63,179, 98,216, 8,202, 92, 37,255,240,235,157,231, 9, 32,142, 38, 45,242, 92,163,
+209,104,110,106, 52,154,182, 31,126,248,225,152,249,243,231,247,178,176,176,104, 10, 0,106,181, 58,129,101,217,139, 21,255, 79,
+ 83,170, 3, 9,128,135,113,113,113, 9,113,113,113,206,187,119,239,182, 5, 96, 86,241,158, 22, 64, 33,128, 44, 60, 69,197, 97,
+165,169,162, 40,106,225,179,218, 14,149,166,138,162,168, 22,141,249, 62, 77,211, 60, 69, 81,160, 40, 10, 10,133, 2,151, 46, 93,
+194,200, 65,253, 16,125,162, 16, 1,182,150,232,252,214, 52,236, 59,123, 22, 12,195,128,162, 40, 48, 12, 99,210,121, 68, 34,145,
+224,242,229,203,120,115,244, 8, 40, 36,128,141,141, 13, 62,252,240, 67, 28, 61,122, 20, 18,137,120,151, 62, 19,216, 82,205,112,
+ 25, 57,142, 22,133, 37,103,183, 47,147,129,103,113,124,251, 55, 8,141, 44,213,223,207,193, 2,191, 28,172, 57,136, 18, 33,231,
+219,157,211,207, 94,142,252,122,210,168, 16,229,203,125,250,225,229,224, 62,146, 54,157,122,127, 6,212, 48, 90,125, 81,207, 88,
+ 27,188,128, 47,182,156,138,153,182,239,124, 44, 5, 67, 9, 70,189,218,137,240, 2,190,104, 96,101,158,208,180, 49,183,220,119,
+249,218, 53, 59, 24, 74,145,120,251,119,179, 38, 77,155, 3,188, 1, 15, 31, 62,192,247, 59,126, 17,206,255,113,127,151,158,195,
+123,241, 5, 80, 27,171, 89,126,166,228, 96, 99, 33,247,123,173,141,245,175, 2, 8,108,149,178, 86, 68,224, 97,171,148,182,234,
+215, 74,249, 43, 33,132, 88,153, 75, 91, 17,158,109, 80, 83,163,231, 54,239,248,113,219,170,201,147, 39, 91,228,166,102, 34,189,
+ 56, 18,165,114,119,176, 74, 79,196,221,190,168, 41,211,113,198,156,196,235,220,158,185,185,185,217, 55,195,243,177,111,211,114,
+176,122, 29,178, 83,203,189,106,122,110, 49,172, 29,221,175,165,165,165, 25,173,105,224,132,162,225,227,166,202,204,173, 96,254,
+230,240, 16,121, 92,158, 14, 29,220,172,202, 15, 26,165, 57,136, 14,187,140,224,138, 28,211,248, 20, 26,222,129,110, 70, 45,167,
+149,153,236,189, 1, 47,185, 35, 33, 57, 3,151,238,165,237, 72,200, 71, 58, 31,147,177, 35, 46,189,112,250,144, 46, 94, 88,125,
+ 52,234, 93,128,221, 99,202,186,251, 59, 97, 12, 33,232, 81,158, 12,175, 1, 1,122,248, 59, 97,140,145,149,134, 79,104, 74,100,
+ 24,187,234,215,164, 79, 15,252,153, 59,100,222,216,158,214,221,186, 13,148,131,211,163, 68,163, 99,163, 11, 81,108,138,102,177,
+ 70,216, 12, 96,115,229, 27, 55, 83,133, 93, 61, 23, 93,187,184,103,138,167,170,210,171, 95,140,211, 93, 3,112,109, 82,144,249,
+103,178, 62, 75,253,174, 45, 9, 58, 29,145, 33,236,190, 24, 87, 53,134, 86,131,255,163, 70, 34,106,138,154,255,132, 38, 15, 96,
+ 23,203,178,187, 10, 11, 11,159,165,102, 58,158, 28,215,233,169,214,189,122, 55, 33, 33, 68, 82, 17,205,106, 40, 25,190, 94,205,
+234,221,132,132,144,147, 21,209,172,134,162, 90, 53, 52, 5, 65, 72,239,216,177,163,253,224,193,131,193,243, 60, 30, 60,120,128,
+164,148, 20,244,157,254, 46,108,109,109,113,241,238, 93,220,191,127, 31, 11, 23, 46, 4,203,178, 56,114,228, 72,106, 67,154, 18,
+137,196,208,188,121,115,217,208,161, 67,193,113, 28,226,227,227,145,150,150,134,217,179,103,195,198,198, 6, 55,111,222,172,210,
+204,205,205,133, 68, 34, 49,212, 18,221,250, 59,246,165,231,157, 39, 76, 86,253, 70, 11,224,193,179, 40, 58,187, 8,107, 47,193,
+ 96, 96,209, 42, 42, 7,143,162,254,138, 72,109,100,194,239, 30,191, 27, 25,147,112,243,202,203,114,100, 71,192,212, 43,137, 7,
+121,200,176, 50, 43, 41,129,161,196, 26,241,191,226, 81, 86, 73,233,131, 60,100,152,124,197, 32,240, 20, 12,101, 64,198, 13, 92,
+189,120, 1,231,175,223,193,159, 17, 49,252,213,155,177,251,104, 1, 95, 68,231,225, 65, 35,174, 66, 96, 57,104, 53, 38, 70, 60,
+244,234,228,235,236, 5,158, 3, 17, 88,216,140,218,131,183,162,186,121,117,106,102,235, 85, 30,201, 98, 97,247,159,223,129, 85,
+102,245,234,221, 72, 97,183,200,143,158,126,189,164, 48,175,203, 43,189,187, 90,216,248, 15, 64,238,195, 88, 60,184,115, 89,115,
+ 51, 50,238,234,141, 20,118,203,211,180,174,187,187,123,175, 87,122,251, 97,212,180, 79, 96, 40, 43, 66,252,249, 31, 81,154,159,
+137, 75,215, 44, 17, 83, 92,220, 21,128,209, 17,173,107,201, 92, 27, 36, 23,160,123, 19,105,178, 21,116, 46,227, 67, 6, 67, 65,
+105, 33,232,138, 65,149,229, 34, 46, 77, 95,244,250,166, 20, 30, 0,148, 10, 74, 98, 65,138,172,141,138, 60,122, 59,180, 84, 50,
+ 44,118,158,189, 7, 65, 40,191,125,147, 32, 96,227,206,223,227,166,127,241,102, 7,180,246,178, 11,188,157,150, 77,193,132,144,
+ 63, 69,208,243,207,125,159,183,210,254,246, 25, 32, 24,112,121,150,125,171,158,107,243,123,162,145,183,219,137, 76, 71, 26,128,
+233,144,148,109,158,181,246,212,103, 29,207, 70,245,152,243,159, 33,214, 32,207,164, 66, 55, 54, 42,147,239, 21,180, 34,233,180,
+ 64,106,246,231,150, 71,182,252, 73,122, 49,185,125, 49, 78, 39,142, 10, 47, 34, 34, 2, 0, 40, 45, 45,157,246,214, 91,111,109,
+150, 74,165, 42, 0,148, 32, 8, 16, 4, 65,242,245,215, 95, 75,121,158,167,105,154,230, 25,134,225, 78,158, 60,201,242, 60,159,
+163,213,106,167, 53,164,201,113, 92,220,140, 25, 51,154, 55, 84,161,184,119,239,222, 74,147, 21, 39,182,132, 81, 38,171,250,188,
+ 42,202, 37,169, 39, 72,251,121,247, 55, 23, 45, 2, 64,129, 96,113, 84, 14, 30, 61,254,145,136,124,164,183,102, 12,179,219,116,
+234,189,168,242, 59,166, 46,153,150,231, 71,116,106,235,187, 23, 0,116,132,127,179, 49,107, 87,172,211,188,209,190, 83,215,125,
+ 2, 33, 18,142,144,109,180,128, 67, 90, 14,209,198, 84,218,213, 69,122,118,225,205, 1, 1, 54, 4, 40,239, 50,172,234, 46,172,
+ 24,198,129, 16, 66,170,186, 11,191, 49, 67,110,145,174,193,113,160,174, 60,210,247,211,115,127, 78, 61,115,229,246, 52,158, 39,
+ 46, 12, 67,101,106,244,220,230,167, 53, 89, 0,144,150,150,118, 33,236,108,218,153,187,129,206,175, 58, 42, 43,162, 92,101, 64,
+110, 25,206,164,229,148, 94,104,140,102,129,154, 29, 50,127,205,209, 99,114, 41, 35, 1, 33,229, 3,138, 18, 2,173,129,207,191,
+150,204,181, 1,128,182,246,112,251,240, 8,183,151, 97,168,164,134,244,194,239,103,172, 30,181, 34,108,238,189,196,130,109,137,
+133,136, 4,128,196, 66, 68,238,191,252,232,179,184,204,146,185,145, 73, 5,223,192,196,188, 10, 66,225, 82,167, 81,139,158,120,
+237,105,183,103, 76, 6,238, 0, 24, 6,164,246, 27, 53,231,251, 57, 20,133,103,117,251,137, 88,141,129,120, 63,254, 98,101,100,
+ 75, 60, 86,137,136,252,119, 80, 25,213,162,105,122,201, 51,212, 60, 73, 81,212, 64, 0, 15, 77,248, 90,120,105,105,105,219,103,
+188,122,121, 28,199,229, 25,243,193,127, 33, 33,254,121,101,203,191,245,195,125, 69,205,127, 94,179, 69,139, 22,196, 4,195, 34,
+110, 79, 81, 83,212, 20, 53,255,167, 52, 9, 33,204,211, 76,117,104, 82, 79, 51,137,109,244,220, 51,181,174,231, 98,166,219, 11,
+200,195,135, 15, 41,113, 43,136,136,136,136,212, 14, 69, 81,252,223,160, 41,142,142, 39, 82,105,176,106, 68,183,104,113,155,136,
+136,136,136,136,136,136,136, 60, 19,147, 85,125, 94,110,194, 81,119,248,207,148,106,130,198,132, 16,195, 68, 77, 81, 83,212, 20,
+ 53, 69, 77, 81, 83,212,252,159,211,108, 72, 91,172,102,252,155, 13,152,168, 41,106,138,154,162,166,168, 41,106,138,154,255,123,
+154,207, 51,117,230,104,137, 93,135, 34, 34, 34, 34, 34, 34, 34, 34,127, 19, 98, 50,188,136,136,136,136,136,136,136,200,211,209,
+224, 77,165, 69, 68, 68, 68, 68, 68, 68, 68, 68, 26, 71,253, 55,149, 22, 17, 17, 17, 17, 17, 17, 17, 17,105, 52,166,223, 84, 90,
+ 68, 68, 68, 68, 68, 68, 68, 68,196, 40,182,136,155, 64, 68, 68, 68, 68, 68, 68, 68,228,159,161,102,213, 97,104,104, 40,169, 62,
+ 23, 17, 17, 17, 17, 17, 17, 17,249, 39,121, 81,189,136,216,117, 40, 34, 34, 34, 34, 34, 34, 34,242,116, 76, 21,141,150,136,136,
+136,136,136,136,136,200,223, 67,157, 57, 90,149, 3,150, 6, 87,132,234,130,197,109, 37, 34, 34, 34, 34, 34, 34,242, 47,240, 98,
+123, 17, 49, 63, 75, 68, 68, 68, 68, 68, 68, 68,244, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,255, 77,136,247, 58, 20, 17, 17, 17,
+ 17, 17, 17, 17,249,135, 13,215,223,110,180,196, 59,155,139,154,162,166,168, 41,106,138,154,162,166,168,249,191,100,178,106,152,
+ 45,177,234, 80, 68, 68, 68, 68, 68, 68, 68,228,233,104,176,234, 80, 68, 68, 68, 68, 68, 68, 68, 68,164,113, 76, 5, 16, 82,241,
+ 56, 4,213,162, 90, 98, 68, 75, 68, 68, 68, 68, 68, 68,135,111, 75, 20, 0, 0, 32, 0, 73, 68, 65, 84, 68,228,233,216, 2,192,
+181,194, 96,157, 0,144, 33, 26, 45, 17, 17, 17, 17, 17, 17, 17,145,103, 67,245,188,172, 65,213,204,151,104,180, 68, 68, 68, 68,
+ 68, 68, 68, 68,158,146, 58,115,180, 40,212, 93, 57, 16,102,194, 15, 52,166,250, 32, 76,212, 20, 53, 69, 77, 81, 83,212, 20, 53,
+ 69,205,255, 57,205,134,180,195,240,252, 49,213, 20,243,245, 44, 17, 75, 95, 69, 77, 81, 83,212, 20, 53, 69, 77, 81, 83,212,252,
+159,229,153, 87, 29,118, 0,204,197,205,250, 66,226, 92, 49,137,136,136,136,136,136,136,212,207,223, 83,117,232, 15,252,103, 92,
+128,106, 19, 27,153, 99, 29, 9,148,213,247, 89,149, 74,181, 89,169, 84,142, 43, 43, 43, 83, 83, 20, 37, 84,190, 78, 8, 1,128,
+234,247, 58,138,207,201,201,233,217,208,111,203,229,242, 53,206,206,206,255, 41, 45, 45, 45,163, 40,138, 80, 20, 5,138,162, 0,
+224,137, 57,207,243,169,121,121,121, 29,159,235, 38, 36,132,113,116,118,254, 67,202, 48,238,166,126,149, 23,132, 71,217, 89, 89,
+ 93, 77,248,202,114,138,194,188,242,159,197, 87, 0, 62,121,209,254, 17, 4, 96,140,249, 92, 0, 96, 21, 11,140,226,105,250, 93,
+ 41,176, 94, 39, 8,155, 0,128, 2,248,198,254,182, 46, 28,205, 41,130, 64,138,130, 13, 33, 40, 34, 20,238, 40,130, 16,247, 47,
+109,138,225, 82,169,116,136,181,181,181,101, 94, 94,222, 5, 0,123, 1,140,118,112,112,232, 93, 92, 92, 92,202,178,236, 81, 0,
+135, 27, 35,220, 51, 16, 31,201,101,210, 73, 90, 3,187,242,202, 29,252,216,187, 3, 28, 56, 1, 43,204,100,146,158, 58, 61,247,
+213,229,187,216,102,162, 36, 85, 49, 85, 30, 51, 76,190, 71,218, 1, 35,219, 29, 0,142,216,217,249, 42, 84,214,191, 73,229,204,
+163,194,172,210,113, 35,178,179, 83, 70, 62, 69,187,255, 55,226,232,232, 56,145,166,233, 47, 9, 33,224,121,126, 65,126,126,254,
+246,103, 36,189, 0,128,109,197,227, 66, 0, 95, 62,165, 94, 18, 0,175,138,199,201, 0,188,197,243,122,163,217,248,203, 47,191,
+ 76,239,211,167, 15, 86,175, 94,141,141, 27, 55, 38,230,228,228,172, 0,176, 3,128,254, 95,208, 17,169,139,214,192,192,175,251,
+ 7,241,236, 79, 95, 8,213, 94,238, 91,199,159,249,135,241,227,199, 27, 8, 33,228,254,253,251, 68,175,215, 19,150,101, 9,199,
+113,132,227, 56,194,178,108,213,228,238,238,158,246,216,215,159,208,164,105,122,237,235,175,191, 94, 66, 8, 33, 55,110,220, 32,
+ 26,141,134,232,116, 58,162,215,235,137, 86,171, 37, 26,141,166,198,228,236,236,156, 85,159,166,181,181,245, 13, 59, 59,187, 44,
+ 59, 59,187, 44,123,123,251, 44,123,123,251, 44, 7, 7,135,170,201,209,209,177,106, 82,169, 84, 89, 42,149, 42,203,222,222,254,
+ 70, 67,203, 89, 65,127, 0, 23,140,152,250,215,242,221,190,213,141,150,171,171,107, 22,105, 4, 30, 30, 30, 41, 70, 44,103, 37,
+206, 20, 5,190,242,187, 20, 5, 65,161, 80,120, 85,127, 31, 79, 70,186, 26, 12, 41,187,185,185,189,238,234,234, 26,230,234,234,
+122,214,205,205,237,117, 35,118,177, 26,154, 86, 86, 86, 55, 28, 29, 29,179, 92, 92, 92,178, 43, 39, 87, 87,215, 26,147,155,155,
+ 91,213,228,236,236,156,101,103,103, 87,103, 27, 17,128,169,107, 58, 15, 72, 20,192,203, 18,134, 9,117,118,118, 46,142,136,136,
+224, 9, 33,132,166,233,180,202,207,152,178,238,143,155,172,178,203, 88,144,123, 78, 17, 94,250,104, 69, 81,238, 57, 69,120,217,
+101, 44,208,133,163,121, 99, 53,141,164, 54,205, 9, 19, 38, 76,184,147,149,149,149, 86, 88, 88,152,177,105,211,166, 88, 51, 51,
+179,203,155, 54,109,138, 45, 44, 44,204,200,202,202, 74,155, 48, 97,194, 29, 0, 51, 76,208, 4, 0,116, 13, 68,151,201,195, 93,
+203,238, 28,121,179,236,229, 78,146,219,221, 3, 16,210,175,171, 44,109,221,199,254,101, 23,183,246, 40,235,243, 18, 29,105,162,
+ 38, 37,145, 72,186,121,121,121, 77, 82,169, 84,227, 43,166, 55, 43, 39, 23, 23,151, 55, 93, 92, 92,222,180,179,179, 27, 89,159,
+230, 1,128, 49,102,242, 52, 51,235, 54,178,169, 87, 89,210,146,197, 36,226,253,119,201,164,102,158,197, 35,156,156,154,252, 11,
+109,244,183,106, 58, 57, 57,165,179, 44, 75, 12, 6, 3,113,112,112, 72,127,134,203,249, 13, 33,228, 27, 66,200, 55, 0,190,121,
+ 6,154, 85,199, 51, 19, 12,118,125,154,102, 18,154,158,163,148,203,207, 42, 36,146,108,133, 68,146,173,148,203,207, 74,104,122,
+ 46, 0,179,255,166, 54,250, 27, 52, 45, 85, 42, 85,194,154, 53,107, 72, 89, 89, 25, 41, 43, 43, 35,107,214,172, 33, 42,149, 42,
+ 1,128,165, 9,154,141,213,121,145, 34, 88,143, 79,207, 46,162,229, 15,116,124, 57,176,197,161, 89, 19, 71, 65, 56,184,134,106,
+224,138,233,135,174, 29, 59, 78,218,177, 99, 7, 0, 96,220,144, 33,120,181,115,103, 88, 89, 90, 64, 46, 47, 95, 28,138, 80,144,
+ 73,101, 24, 58,251, 3, 99,126,254,171,161, 67,135,142, 61,120,240,160, 37, 0,108,220,184, 17,195,135, 15,135,189,189, 61,148,
+ 74, 37,100, 50, 25,164, 82,105,141,121, 67, 48, 12,227,145,150,150,230,100,102,102, 86, 21,101, 19, 4,161,198, 68, 8,169,140,
+190,129,227, 56,180,108,217,210,216,205,245,113, 81, 81, 81, 47,181, 90, 93,165, 81,219,212,180,105, 83, 0, 56,109,140,224,151,
+ 75,191,128,192,169, 33,145, 0, 28, 7,232, 12, 52, 4, 82,171,185,193,140, 25, 51,170,150,187, 49, 12, 26, 20, 66, 81, 20,117,
+240,230,205,155,135,178,179,179,125, 4,129,159,210,200, 72,215, 59, 15, 30, 60,176, 4, 0, 95, 95,223, 25, 0, 14,153,178, 28,
+ 18,137,196,227,238,221,187, 78, 10,133,162,206,200,101,181, 8, 38, 12, 6, 3, 58,116,232,192,153,242, 27,206,128, 87, 62, 77,
+ 79,105,255,210, 75, 83, 23, 13, 29,106,246,199, 31,127,152,209, 52, 13,142,227,240,245,215, 95,115,132, 16,219,214,128,117, 20,
+ 80, 92,143,204,124, 0, 19, 43, 78, 6,219, 0,124, 93,195, 45, 16, 4,106, 88, 69, 72,124,233,208,206, 65, 77, 62, 66,212,189,
+136,206,205, 44,143,192, 74,162,139, 3,254,217,168,150,181,181,245,144,213,171, 87,171,182,109,219, 86,124,255,254,125,195,166,
+ 77,155, 84,211,166, 77,179, 50, 24, 12,152, 62,125,122,142,159,159,159,108,245,234,213,170,195,135, 15,191,172, 86,171, 55,152,
+212, 94, 20,190, 24, 61,228, 85,104, 89, 26, 44,203,169, 92, 85, 86,187,102, 77, 8,150, 18,162,199,206,163, 55,193,114,194,143,
+ 38, 70,178,186,142, 24, 49,162,217,158, 61,123, 36, 49, 49, 49,146, 86,173, 90, 65, 16, 4,240, 60, 15,150,101, 1, 0,130, 32,
+160, 69,139, 22, 79,189, 93, 38, 1,190,142,206,246,103,187, 14, 28, 96,238,106,166,128,125, 65, 14, 38,203, 36, 86,219,149,186,
+221, 0,186,189, 80,145, 93, 66, 32,145, 72,144,146,146, 2, 39, 39, 39,115, 65, 16, 50, 0, 44, 46, 40, 40,216,130, 23,151,206,
+114,137,228,208,206, 31,215,186, 4,117,235,198, 56,187, 58, 33,246, 65, 50, 36, 20,223,247,238,159, 55,131, 39,189, 61,103,150,
+158,227, 94, 7,240,199,139,182,226, 46,221,102, 12,163,104,102, 35, 69, 4,124,190,238, 88,201,242,175,214, 40,167, 79,153,192,
+204,158, 61, 27,158,158,158, 62,195,134, 13,251, 10,192,219, 13,234, 4,205, 24, 6,134,222, 8, 66,176,232,251, 99, 37,203,190,
+ 90,163,124,187, 17, 58,207, 57,117,254, 71,158,218,104,249, 3,205,218,120, 58,157, 89, 62,239,109, 41,249,245, 39,186, 44, 47,
+187,206,207,170, 84,170,205,175,189,246,218,184,237,219,255,138, 70,119, 13, 8,192,176,151,123,192,201,193, 6, 74, 11,121,249,
+233, 72,160,112,231,254, 35,163, 12,129,167,167,231,244, 67,135, 14, 89, 86, 55, 19, 50,153,172,106,170,110,178, 42,167,202, 19,
+112,125,152,153,153, 33, 44, 44, 12, 18,137, 4, 12,195, 64, 34,145, 84, 77,213,159, 51, 12, 3,103,103,147, 82,151, 86,216,216,
+216,180, 43, 41, 41,177, 46, 44, 44,132,151,151, 87, 49,128,187,213,222,111,151,147,147, 99,109,138,160,192,169, 49,123,178, 63,
+164,250,235,208, 75, 59, 67, 35,233,142,171,127, 70, 35,244,244, 5,164,165,103,162, 71,151,246, 24, 63,102, 4,206,158, 61, 11,
+158, 55,185,167, 35,139, 16,124, 53,120,112,200, 71, 0, 69,245,237,219,183,112,230,204,153,116, 76, 76,204,216, 97,195,134, 6,
+ 60,120,240,176, 34,170, 72,205, 35, 4,107, 1,100, 25,169, 43, 7,128,139, 23, 47, 2,128,162, 49,251,158, 66,161,192,181,107,
+215, 80,217, 77, 76,211, 52,104,154, 6,195, 48, 56,254,208, 17,106, 61,141,178,172, 72,188, 27,226,133,166, 77,155,130,166, 27,
+ 78, 73, 12, 6,204,174, 2,195, 40,169,116,182,171,155,155, 79,239,102,205,148, 97, 97, 97, 12, 0,120,123,123,147,140,140,140,
+194,163, 71,143,150, 72,128,141,222,132,236,168,207,100,121,122,122,118, 79, 75, 75,251,178,114,155, 83, 20,245, 85,147, 38, 77,
+ 22, 86,181,155, 32, 96,241,143,106,233,172, 89,239,203,130,130, 63, 5, 0, 4, 13,222,131,226,248,229,254, 84,254,124,155,127,
+250, 40, 81, 92, 92,188,175, 69,139, 22, 76, 94, 94,222, 85, 0, 73, 44,203,126,188,107,215, 46,167,201,147, 39,103,239,222,189,
+123, 5, 0,183,149, 43, 87, 6,171,213,234,253,166,232,246,104,135,129, 47,181, 11,232,226,229,233,137, 11, 87,255,128, 76, 46,
+181,157, 49, 49, 4,150,150, 18,124,179,237,132,144,148,154, 63,243,242, 93,236, 48,193,100,117, 30, 49, 98,132,207,158, 61,123,
+228, 0,112,247,238, 93,100,102,102, 66,165, 82,193,220,220, 28, 82,169, 20, 12,195, 64, 42,149, 62, 19,147,101,227,233, 16,126,
+228,200, 81,115,123,123, 91,172,251, 96, 22,198,103,103,193,214,202, 18,108,169,218,231, 5, 59, 81,248,246,236,217,211,140,231,
+121,168,213,106,156, 63,127,222,198,220,220,220,198,195,195, 99, 17, 76,168,158, 50, 51, 51,203,210,106,181, 78, 21,143,179,181,
+ 90,173, 51,128, 98,133, 66, 81,121,156, 46,173,152, 27,219,157,152,132, 39,187, 9,147, 41,138,170,254, 90, 99,233,212,185, 83,
+187,176,195, 7,127,182, 44, 42,201,132,173, 93, 54,104, 20, 97,203,150,245, 48, 55,183,198,162, 69,243, 37,143,250,190,236,222,
+127,224,235, 97,247,162, 99,251,190,112,102,139, 80, 91,250, 14, 30,103,111,174,180,170, 56,151,176,216,190,117, 22,104,154,198,
+194,133, 11,209,166, 77,155,169,247,238,221,251, 20, 64,126,253, 50,216,210,182,215, 27,246,114,179,242, 38, 22,120, 22,155,246,
+206, 45,215,249,100, 26, 70, 15,110, 58,245,195, 17, 9,167,218, 52, 67, 73,197,133,185, 70, 74, 35,153, 10, 66,149, 97, 8, 13,
+ 13,237, 29, 18, 18,114,161,174,231,207, 1,174,248,107,252,172, 26,230, 75, 18, 26, 26, 74, 66, 66, 66,168,106, 43, 87,227,121,
+125, 4, 2,142,118, 54,202,176,141,139,103, 89, 74,174,159, 96, 52,201, 15,145,174,173,113, 34,175, 81,162,169, 84, 42,199,109,
+223,190,189, 70, 72,201,203,217, 9, 50,153, 20, 82, 25, 5,219,158,229,163,215, 23, 94, 10, 5, 69,213,105,178,106,104,170,213,
+106,237,237,219,183, 45,183,109,219, 6, 39, 39, 39,248,248,248, 64,169, 84,194,204,204,172,134,185,170,110,184,106, 49, 90, 53,
+ 52, 43,223,151, 72, 36,160,105, 26,103,207,158, 5,199,113, 24, 49, 98,196, 19, 38, 75, 34,145,212,101,220,234, 42, 79, 61, 13,
+224, 46, 33,164, 87,197, 9,248, 46,128,222,213,222,239,175, 82,169, 62, 6,176,194, 88, 77,134, 33, 96,180, 87, 33,120,172,129,
+ 36,101, 22,244,210, 64,156,187,124, 19,219, 55,175, 6, 0,248,180,234,132,145,195, 66,170,162,113, 70, 46,103, 21,238,238,238,
+123,115,114,114, 7,188,252,242,203, 40, 40, 40, 96, 23, 47, 94,140,118,237,218,193,215,215,215,168, 54,170,227,202, 57,235,238,
+221,187,158, 26,141, 6,132, 16, 99,204,217, 19,154, 20, 69, 97,215,174, 93,208,106,181, 79,124,216,174,247, 50,204, 29,238,141,
+183,222,221,129,175,238,239,199,134, 13, 27,234, 93,119, 37,208, 78,107,211, 98,173,156,225,218,173,152,255,142, 98,252,248,241,
+204, 91,111,189,133,228,228,100, 76,158, 60, 89,123,246,236, 89,125,102, 70,198, 81,185, 32,172, 51,212, 52,198,117,106, 42, 20,
+138,157,167, 79,159,198,254,253,229,190, 36, 54, 54, 22, 45, 91,182,180,168, 97,146,243, 15,160, 36,105, 29,194,143,199, 32,104,
+240, 30,132, 31, 31, 3,190,240,132,180, 99, 75, 20,153,178, 61, 27, 65,109,154,251,243,242,242,170, 76,212,238,221,187,205,119,
+239,222, 61, 20,192, 49, 0,251, 1, 32, 63, 63,255, 91, 19, 53, 1, 10,111,189, 49,124, 40, 36, 50, 43,196, 60, 76, 69,239,174,
+ 29,224,236,228,132,187,209,113, 72, 74,203,207,162, 40, 76,236,223, 77,190, 66,163,209,127,122,233, 14,126,104, 64,147,242,240,
+240,240, 61,112,224,128,172, 90, 4,186,234, 63,206, 48, 76,213,243, 74,227,221,152,253,179,210,100, 89,121, 88,134,127,177,190,
+187, 69,120,196,110,180,244, 30, 8,187,129, 33,248,225,204, 25, 60,184, 23,165,213,151,113,175,252, 11,109,244,119,105,250, 14,
+ 31, 62,252,234,207, 63,255,108,155,146,146,130,139, 23, 47,194,199,199, 7,101,101,101,198, 92,240,214,208,212,106,181, 78,149,
+223,161, 40,202,169, 50,240,174,215,235, 43, 27,163,242,143,104, 91,237,115,182,245,104,122, 85,251, 92,165,185,242,126, 6,235,
+ 46, 55,147,201, 14, 28, 57,188,215, 50, 42,230, 34,218, 7,118,129,165, 77,107, 8,124, 38,242,242, 75, 81,240, 48, 29, 75,151,
+126,133, 69,139, 23,224,216, 47, 7, 45,253,252, 3, 15,233, 57,174, 5, 0,237, 11,211,238, 20,153, 26,118,124,247, 70,138, 8,
+208,100,197, 40,164,234, 4,229,184, 49,175, 51,163, 70,141,194,177, 99,199,112,239,222,189,141,245,152,172,176,106,145,249,169,
+145, 23,247,111, 4, 33,208,100,199, 40,100,154, 4,229,132,177, 35,153,241,163, 95,197,245,223,215,226,213,246, 9,145,110, 78,
+ 24, 86, 80, 97,177, 37, 12,242, 20,102,184, 66,194,113,189,154,217, 58, 15,128,170,102,176,206,227,175, 28,204,231,129, 65, 21,
+198,106,234,227, 23, 38,146,198, 24, 44, 0,104, 9, 88, 82,114, 89,248,246, 69,239,184, 41,147,239, 73,116,145,215,144,174, 19,
+200,166, 68, 78,232, 0,152,223, 2, 52,143,127,167,172,172, 76, 29, 23, 23,103, 62,113,216, 48,116, 11, 8,128,171,131, 3, 90,
+120,120,192, 92, 33,135, 92, 38,173,113,201,106,116, 31, 2, 69, 17, 63, 63, 63, 12, 30, 60, 24, 82,169, 20, 74,165, 18,150,150,
+150,144,203,229,181, 70,179,140,189,202, 37,132,128, 97, 24, 68, 70, 70, 34, 41, 41, 9,182,182,182,184,114,229, 10, 94,121,229,
+149, 39,162, 90,213,205,153, 41, 33,250, 90, 78,252,149, 70,236,180, 41, 90, 60, 79,161,148, 4,194, 44,113, 38,202,168, 14,208,
+233, 56,232,116, 58,252,112,217,128, 63,226,212, 48, 24,244,208,233,116,245,253,102, 93,208,110,110,110,227, 90,180,104, 49, 99,
+204,152, 49,172, 92, 46,135, 90,173, 70, 89, 89, 25,238,221,187,199, 14, 24, 48,176,112,240,224, 16,155, 19, 39, 78,144,138,174,
+195, 44, 19,180,243,220,221,221, 61, 43,186,103,243, 26,179, 87, 83, 20, 85,101, 98, 30,103,226,183, 81,144, 48,229,109,178,113,
+227, 70,240, 60, 15, 66, 72,157,141,164,165,168,223, 22, 47, 91,101,179,114,205,143,176,177,119,198,133, 11, 23,248, 83,167, 78,
+149, 80, 64,236,131,123,247,190,253, 63,224,228, 1,192, 96,202,242, 21, 20, 20,152,251,248,248,192,195,195, 3,130, 32,128,101,
+217,170,232, 75, 94, 94, 30, 52, 26, 13,236, 45, 10,209,220,193, 3, 92,201,121,100, 68,126, 14, 87,203, 24,236, 56,173,103, 95,
+242,197,157,255,130, 3,199, 79, 21,211, 83, 94, 53,195,221,201,197, 19, 52, 97,145,158,157,135,161,131, 94, 5, 35,179,196,163,
+148, 92, 4,182,110,230, 58,246,255,186,187, 50, 20,135,121, 43,246,204, 0,132, 31, 26,146, 43, 45, 45,229, 99, 98, 98,112,247,
+110,185,223,181,182,182,134,133,133, 69,141,255, 56, 77,211, 79, 21,209,170, 52, 89,203, 54,190, 98, 65, 75,213, 40,230,195,176,
+109,215, 77, 4,250,133, 96, 83,248,159, 90, 62, 43,191,239, 55, 90,109,236,222,231, 56,152,225,226,226, 50, 77, 16,132, 69,132,
+144,194, 30, 61,122, 56,239,217,179,199, 46, 45, 45, 13, 55,111,222,196,194,133, 11,115,120,158,231, 8, 33, 20, 33,228,243,103,
+240,115, 66, 53,131,245, 44,145, 42,205,240,174,163, 53, 53, 68, 66, 91,251,112,197,165,143,114,245,228,104, 25, 39,124, 15,128,
+173,247,224, 70,211,255, 57,184,111,163,155,163, 74, 64,176,234,101,100,100, 25,176,236,131, 9,200,203, 43,193, 15, 91,151, 3,
+144,195,192, 49,232, 21,252, 58,156,156,220, 49,117,202, 84,151,141,155, 55,189,195, 9,194, 55,120, 65,200,188,186,225, 23, 0,
+ 97, 42,149,234,222, 59, 83,167,170,124,124,222,132,153,153, 25,246,238,221,139, 61,235,214,241,107,128,145, 10,224,220,116,224,
+151,122,117,194,255,210,153, 53,125,186,202,223,127, 58, 20, 10, 5,126, 63,245, 19,180,153,187, 74, 6,117,131,161, 76,139, 65,
+ 77, 6, 19,251,196,227, 84,190, 84,138,135, 0, 32, 53, 67, 6,128,199,187,193,158, 55,131, 85,201, 9,252,149,151, 53,181, 70,
+ 68,171,209,199, 78,169, 60, 98,235,251,163,189,157,161,163,244,151,143, 35, 77, 39,240, 43, 31, 24,152, 91, 69,100,110,116, 45,
+ 38,171, 98,199, 22,188,188,188,240,114,199,142, 24,214,179, 39, 36, 18, 9,204,228, 50, 88,153,153,131,240,229,145,172,202,174,
+195,122,206,137,168, 45,250,228,224,224, 0,153, 76, 86,101,176, 76,136,102,213,170, 41, 8, 2, 36, 18, 9,238,222,189,139, 30,
+ 61,122,192,211,211, 19,251,247,239, 71,255,254,253,159,232, 74, 52,213,100, 85, 26,173,199,186,241,250, 3,168,140,100,153,100,
+180,180,122, 10,185,250, 64, 80, 84, 0, 56, 14,224, 9,160,211,106, 65, 8, 64, 8,192, 26,244,208,106,181, 85,191,105, 76,151,
+172,139,139,139,151,185,185,249,146,143, 62,154,231, 31, 24,216, 30, 57, 57, 57, 16, 4, 1, 22, 22, 22, 40, 43, 43,131,181,181,
+ 53,186,117,235,246,104,201,146, 37, 25,132, 96,170,137, 38,235,169,169,220,230,103,206,156,169,209,109, 88, 57,169, 51, 82,241,
+214,123,187, 33,151,148,119, 45, 85,230,240,212,119,220,237,211,171, 59,174,222,138,229,254, 51,111,173, 78,154,119,115,133,139,
+ 32,108, 79,125,138,245, 34,132, 32, 55, 55, 23, 89, 89, 89, 24, 50,116, 40,246,252,252, 51, 18, 19, 19,209,186,117,107,244,233,
+211, 7, 78, 78, 78, 72, 76, 76,196, 31,151,116,208, 21,228, 35, 95,127, 19, 74,171, 32, 28,185, 16,167, 91,184,209, 16,247, 47,
+ 30, 48,134, 0,152, 96,109,109,221,180,172,172, 44,131,227,184, 3, 0, 14, 0, 24, 41,145, 72, 70, 42,149, 74,215,226,226,226,
+ 4,148, 87, 19, 29,109, 72,204,220,204,204, 65, 97,102, 13,129,211, 65, 34,145,192,211,211, 7,132,215,163,160, 88,131,137,163,
+ 6,227,214,221,104,156, 58,119,157, 99, 89,225, 59, 99, 54, 43,195, 48,196,215,215, 23,217,217,217,144, 74,165, 48, 55, 55,135,
+165,165, 37, 62,249,228, 19,172, 91,183,174,202,100, 53,214,104, 77, 2,124,173,189, 44,175,127,185,190,220,100,101,166,103, 32,
+ 43, 85, 10,149,131, 51,190, 91,183, 70, 93,144,152, 25,244, 35, 16,251,188,159,100, 5, 65,248, 60, 45, 45,205, 73, 34,145,184,
+112, 28,135,148,148, 20,220,184,113, 3, 51,103,206,204,202,203,203, 11, 70, 35,215,209,204,204, 44,187, 50,146, 85,209,117, 88,
+ 87,119, 98, 97,181, 72, 86, 97, 61,146,117,117, 19, 54,243,241,176, 58,187,117,245,108,175, 78, 65,221,104,165,196,186,160,244,
+ 97,102,143,203, 23, 47,116,155,185,250,135,119,146, 10, 74, 95, 5, 16, 95,151,168, 66, 42, 29,208,165,123,119, 9, 72, 22, 36,
+242, 30,248,106,229, 40,228,228, 22,163, 32,191, 4, 50,153, 5,244, 44, 3, 94,160,208,173, 71, 79,252,180, 99, 31,218, 76,153,
+204,200,165,210,126,156, 94,255,194, 24,173, 10,150,127,255,253,247, 94,126,126,126,216,190,125, 59,206,237,220,137,241, 69, 69,
+184, 64,211, 12, 43,149, 58,158,100,217, 45,104,192,104, 85,215,105,211,166, 13,126,252,241, 71,236,218,181, 43,121,220, 43,217,
+135,102,143,131,147,193,128,215,110,222,135,125,147,193,192,205,251,176,127,201, 15, 45, 56, 9, 30, 82, 84,205,225,160, 66, 67,
+ 67,123, 87,159, 63,103,100,160,142, 46,118, 9,128,224,208,208, 80, 82,125,222,224,129, 83,213,114,250,242, 87,155,122, 7, 52,
+247,162,216,253,107,145,162,230,244,159,222, 55,200, 31,148,146,217,209,192,154,122,174, 32, 8,195, 48,176, 50, 55,135,202,214,
+182, 60,204, 79,211,128, 0, 8, 44, 64,241,229, 6,128, 8, 20, 8,111,210, 1, 3,114,185,188,214,196,119, 83,115,179,170,107,
+150,148,148,224,209,163, 71,152, 58,117, 42,148, 74,101,185,115,207,204,132,183,183, 55, 36, 18, 9,210,210,210,240,251,239,191,
+163,105,211,166, 80, 40, 20, 38,185,173,106,209,165,118, 40,175, 50,108,151,145,145, 97,237,234,234, 10,147, 35, 90, 2, 65,153,
+142,130, 94,207,227,193,131, 7, 72, 79, 79,199,163,132,135,232,164, 46, 6, 1, 3, 66,136, 73, 17, 45,119,119,247,128,102,205,
+154,109, 90,177, 98,133,204,195,195, 3,132, 16,216,217,217,162,172,172, 12,185,185,121,104,221,186, 53, 60, 61, 61,177, 98,197,
+ 10, 0,216,243, 79,155,172,199,246,169, 42,163, 85,221,112,189,247,127, 94,200,207,183, 4,195,208, 85,198,185,129, 28, 45, 25,
+ 0, 4,191, 58, 92,114,246,212, 73, 11, 14, 88,146,201, 48, 75, 36, 13,183, 35,203, 11,130,178,174,247, 83, 82, 82, 32,149, 74,
+113,240,192, 1,228,103,101, 33, 48, 48, 16,157, 59,119,198,195,135, 15,113,235,214, 45, 56, 56, 56, 64,229,209, 21, 23, 18, 12,
+136, 74,215,192,198,198, 6,113,169,244,191, 57,100,192,148,190,125,251, 46,252,246,219,111,157, 92, 92, 92,164, 57, 57, 57,126,
+235,215,175, 15, 92,191,126,253,172,119,222,121,199,249,157,119,222,177, 83,169, 84,146,204,204, 76,223, 15, 62,248,224,165,176,
+176,176,166, 0, 86,213, 39,104, 97, 97,101,207,200, 44, 64, 81, 18,216,218,216, 65, 34,183,128,192, 73,192, 11,128,181,141, 10,
+ 87,111, 29,196,149,136,146,105,217,121, 56, 96, 84,124,172,162,221, 29, 28, 28,158,136, 84,207,156, 57, 19, 91,183,110,173,234,
+ 70,108,172,201, 90,182,254, 21, 75,170,194,100,101,166, 72, 64,233,154,226,248, 47,215, 10, 11, 18, 51,123,188, 8, 38,171,242,
+ 24, 71, 8, 65, 66, 66, 2,202,202,202,112,233,210, 37,124,254,249,231, 57,143,155, 44, 39, 39,167, 41,214,214,214,139, 75, 75,
+ 75,191,202,204,204, 92,219,224,133, 95,185,137,170,124, 92, 57,175,181, 59,209,200, 69,245,174, 45,146,229,233,106,118,250,214,
+165,221,222, 54,228, 14,133,164,169,192,131,226,123, 86,225, 78,189, 6,118, 26, 68,119,216,240, 69,147,206,211, 62, 57,157, 82,
+172,245,171, 43,178, 37,240,124, 7, 11, 75, 43, 0,217,184,121,227,124,149,201,202,203, 47,130,206,192, 64,167,167,160, 53,208,
+120,185,239,107, 88,183,105, 23,210,178,243,193,243,124,219, 23,204,100,217, 7, 4, 4, 76, 31, 57,114, 36,150, 44, 89,130,176,
+111,191,213,191, 77, 81,197, 18,128,156,224,121, 8,132, 80,180,113, 73,236, 53,116,190,249,230,155, 95, 0,140, 94, 49, 19, 93,
+ 11, 74, 49,209,109, 48,177,111, 50,184,252,131, 35, 62, 34, 0, 96,159, 19, 86,243,148, 25, 18, 18, 66, 85,246,172,153,218,195,
+246,223,142, 36, 36, 36,228, 66,104,104, 40,170,207,235,251,130,149,179,223,192, 15,231,204, 88,217,169,127, 79, 42, 99, 78, 63,
+228, 23,107,185,249, 81, 6,121,170,166,126,147, 85,157, 15,215,175,199,173,216,242,255,177,135,147, 19,230,141, 29, 11,194, 1,
+ 87,238, 69, 97, 95, 88, 24, 70,245,237, 11, 11, 51, 51,163, 35, 27,130, 32,212, 26,197,170, 30,205, 50, 53,234, 84, 88, 88,136,
+ 3, 7, 14,160,115,231,206, 80, 42,149,144, 72, 36,104,215,174, 29,162,163,163,209,172, 89, 51, 80, 20,133, 35, 71,142, 96,216,
+176, 97,136,143,143, 71,215,174, 93, 45,147,146,146, 76, 54, 90, 81, 81, 81,214,132,144, 94,149,209,143,198,162,211,233, 16, 19,
+ 19,131,193,131, 7,195,206,206, 14,238,238,123, 16,118,122, 55,148, 1,227, 65, 81, 48,201,104,241, 60, 63,105,208,160, 65, 50,
+138,162,160,209,148,193,204,204, 28, 22, 22,150,176,178,178,134,175,175, 31,210,211,211,209,191,127,127,125, 92, 92,220,134,140,
+140,140,253,166, 46,171,191,191,191, 69, 98, 98,226,248, 38, 77,154,200, 1,192,220,220,188,117,179,102,205,230,198,199,199,151,
+152, 26,213,170, 52, 88, 20, 69,129, 97,152, 42,163, 37,161,105,184,186, 56, 85, 61,175,200, 79,163,234,209, 42, 78,203,211, 41,
+ 0,192,203,203, 11,235, 54, 31,163, 7, 13, 26,132, 89,179,102,129,101, 89,108,216, 80, 94,100, 55,102,204, 24, 24, 12, 6, 28,
+ 58, 84, 94, 36, 41,145, 72,234, 13,155,220,184,113, 3, 55,111,222, 4,203,178, 40, 42, 42,194,175,191,254,138, 11, 23, 47, 98,
+239,145,223,144,152,240, 16,237,252,188, 49,121,242, 36, 72,165, 82,236,216,177, 3, 61,122,244,248, 87, 15, 8, 82,169,116,220,
+214,173, 91, 93,183,111,223, 94,120,228,200, 17,117,151, 46, 93, 20,107,214,172,113, 90,183,110,157, 74,175,215,227,253,247,223,
+207,190,126,253,186,110,232,208,161, 22, 91,182,108,113,109,222,188,121, 63,142,227,106, 51, 90, 22, 0, 70, 1,120,179,160, 68,
+ 47, 41, 44,209, 64,224,244, 72, 72,124,132,162, 82, 61, 4,222,128,228,212,116,148,106,121,228,229,151,160, 93,135, 87,191, 63,
+127,254,252, 2,131,193, 48, 31, 64,104, 67,203,121,239,222, 61, 92,191,126, 29,137,137,137, 72, 72, 72,168,233, 20,167, 76,193,
+174, 93,187, 76,142,104,213,110,178, 24, 80,186,102, 8, 61, 18, 94,152,253, 48,227,133, 49, 89, 21,199,160, 69,174,174,174,139,
+ 92, 93, 93,205,206,156, 57, 99,211,164, 73, 19,112, 28,167,127, 60,146, 21, 28, 28,252,233,214,173, 91, 93,155, 53,107, 54, 19,
+192,218,255,134,101,167,105, 76,249,106,227,116, 71, 43,121,114, 58, 30,172,170, 24, 75,144, 1,202,138,129,243, 63, 67,210,253,
+179, 71, 51,135,126,100,247,241,246, 37, 83, 4, 8,117, 86,200,198,197,167, 96,227,198,117,152,253,254, 68,252,244,195, 87, 16,
+ 4, 9,116, 44, 3, 47,159, 46,208, 25, 4, 80,180, 4,129, 29, 58,226,220,249, 75,144,210,192,129,237, 27, 95, 48,159,133,252,
+200,200,200, 13, 71,142, 28,121,119,214,172, 89, 16, 4, 65,190,120,227, 70, 77, 78, 78,206,114,152, 54,254,213,227, 58,195, 54,
+110,220, 24,251,241,186,156, 95,102,143, 3,147,120,156,202,191,121, 31,246, 35, 62, 34, 56,184,146,194, 75,126,200, 87,214,126,
+138,191,248,216,252,197, 48, 90,149, 78,178,250,188, 54, 58,180,108,250,133,141,189,221, 36,218,202,221,113,222,172,183, 37,241,
+153, 90, 28,106, 50,182,244,247,157,223, 89,100,114,138,239,227,160, 93, 99,202, 15,239,251,253,247,170,199, 95,239,217, 83,235,
+123, 25, 35, 70, 24,125,101, 86, 87, 20,203,212, 72, 22, 0, 40,149, 74,219,126,253,250,225,149, 87, 94,193,235,175,191, 94,149,
+147,213,190,125,123,236,221,187, 23,195,135, 15,199,237,219,183,225,234,234,138, 86,173, 90,161, 85,171, 86, 56,121,242,164,169,
+ 7, 57,240, 60,143,128,128,128,202,170,195,118,169,169,169,214,141,109, 72,157, 78,135,188,188, 60,216,219,219, 67, 46,151, 35,
+ 40,168, 51,222,125, 47, 8,142,174, 63, 34,192,223, 15,106,181,186,170,252,221,136,147,109, 64,139, 22, 45,144,147,147,131,156,
+156, 28,168, 84, 42,184,185,185,193,197,197, 5,171, 86,173, 34,107,215,174, 61,101, 48, 24, 54,228,230,230,154, 28,201,114,113,
+113,233, 73, 81,212,167, 26,141, 70, 94,237, 10, 87,174, 82,169,142,106, 52,154,229, 25, 25, 25, 70, 39,130, 82, 20, 5,131,193,
+ 0,138,162,112, 34,193, 13,106, 61,133,226,212,155,152,245,127,222, 53,140,151, 84, 42,109,176,187,148, 16,162, 30, 61,122,180,
+147,167,167, 7, 82,226,238,225,224, 65,130,111,191,253,182,178, 42, 18,177, 21, 23, 6,149,207,251,244,233, 3, 31, 31, 31, 16,
+ 19,198,202, 16, 4, 1,119,239,222,197,158,163, 23,224,234,237,143,228, 7, 49,184,117,242, 56,154,168,236,209,166, 67, 71,176,
+ 44,251, 84, 67,111, 60, 11, 88,150,221,214,178,101, 75,162,215,235, 47, 0, 88, 23, 17, 17, 49, 49, 35, 35,227,253, 99,199,142,
+185,141, 28, 57, 50,253,248,241,227,107, 0,108,143,136,136,152,190,116,233,210, 87, 56,142,171,181, 90,144, 97,152,159, 62,248,
+224,131,224,145, 35, 71, 82, 50,154,213,159, 57,189, 67,194,113, 44,245,225,252,109,252,249,203, 23,104,142, 99,169,215, 71,127,
+ 32,156,252, 61,130,158,246,222,215,124,251, 46,131, 16, 25, 25,233, 18, 18, 18,178,148,101,217,122,141, 86,101,164,170,174, 8,
+ 37,195, 48,152, 56,113, 34,246,238, 53, 62,131,106, 50,208,204,218,219,242,250,178,245,125, 45, 41, 73,105, 53,147,213, 28,161,
+ 71,194, 11,179, 30,164,191, 80, 38, 11, 0,242,242,242, 54, 3,216, 44, 8, 66,150,133,133, 5, 74, 74, 74,106,219,255,204, 34,
+ 34, 34,204,228,114, 57, 94,125,245, 85,251,176,176,176, 88,154,166,215,166,167,167,215,233, 56,106,235, 38,172,173, 59, 17, 79,
+ 81,117,104,167, 66, 72, 80,207, 14, 86,247,109,150, 88,153, 73,180,183,155,196,154, 89, 83, 0,138,116,206, 9, 87,147, 70, 21,
+ 83,217,138,246, 29,251,188, 4,107,137, 69, 72, 33, 87, 82,171,209,162, 25,230, 86, 81, 65,225,128,226, 18, 61, 46, 95,137,196,
+232, 81, 45,160, 51, 80, 16, 4, 26,165,106, 29,192, 72, 65, 3, 24, 51,118, 2, 8, 37, 65,126, 86, 58, 24,134,137, 0,199,225,
+ 5,227,147,233,211,167, 15,152, 63,127,126,211,121,243,230, 97,222,188,121,222, 91,183,110,221,188,108,217,178,121, 57, 57, 57,
+109,209,192,224,227,245,232, 52, 57,190,247,179, 57, 71, 47,109, 42, 26,212, 77,243,224, 37,191,242,200,215, 75,126,200,151, 74,
+241, 80,194, 32,143,144,154,105, 70, 33, 33, 33,189,171,207,159, 51, 30, 79,130,175,122,110, 84,142, 86,139,166,238,175,117,104,
+ 31,240,222,130,249, 11,172,162,175,158,199,199, 95,172, 35, 45, 59,246, 43,217,124,233,150,190,212,194,103, 64,105,238,195, 43,
+198,250, 11, 0,120,237,229,225,104,215,186,243, 19,111,246,232, 83, 62, 88,251,229,115, 55,144,149,147,102,244,201,182,194, 28,
+212,154,147,101, 76, 73,255,227,104, 52,154,194,200,200, 72,167,212,212,212, 26,137,239, 62, 62, 62,160, 40, 10,225,225,225,184,
+126,253, 58, 70,143, 30, 13,137, 68, 2,169, 84,138, 11, 23, 46,152, 20,141,169, 22, 93,170,172, 58,236,239,225,225, 81, 87,181,
+ 97,131, 90, 26,141, 6, 69, 69, 69, 56,125,250, 52, 90,180,104,129,101,203,150,193,205,213, 25, 11, 22,204,129, 32, 8, 40, 46,
+ 46, 6,207,243,198, 70,180,132,202,104,145, 32, 8,200,201,201, 65,211,166, 77,177,126,253,122,172, 89,179,102,105, 70, 70,198,
+ 49, 83,151,209,211,211,211,150,231,249, 15, 7, 13, 26,212,111,232,208,161,232,223,191,230,120,172, 63,255,252,179,213,161, 67,
+135,150,127,247,221,119,175, 25, 12,134, 21,217,217,217, 57,198,232,254,248, 99,249,240, 75,202, 46,139,240,241,200, 38,120,115,
+198, 14,172, 90,117, 24, 10,133,162,198,137,119,201,146, 37,245,154, 24,129,144,150,178,220,171,233,115, 62,250,198,105,249,242,
+ 48,132,133,101,131,166,105,184,186,186,130,166,105, 60,122,244, 8, 52, 77,195,219,219, 27, 52, 77, 35, 45, 45,173, 50, 39,176,
+ 0,181, 84, 61,214,126, 21, 78, 67,171,213, 34, 37, 57, 17,169,113,177,176, 44,206,132,202, 90,137,130,123,119,209,110,242,148,
+170,241,159,254,101,118,233,245,250, 93,213,158,127,115,252,248,113, 61, 69, 81,175,163, 60, 79,163, 50,162,177,148,227,184,165,
+117,137,116,233,210,165,253,252,249,243,165,149,195,109,184,121,125,201, 25, 12, 6, 1, 0,252,218,245,170,225,246, 31, 62,124,
+136, 85,171, 86, 65,173, 86, 67, 38,147,201,140,217, 14,130, 32, 84, 85, 24,214,102,194, 76, 49, 89, 0,224,224,237,241,125,248,
+205, 11,252,157,184, 77,154,136,251,191,154,103, 36,211,160,245, 47,174,201,122, 60,178,229,225,225,177, 72, 16, 4, 66, 8,249,
+172,218, 91, 10, 47, 47,175, 75,103,206,156,113,224, 56, 14,223,125,247,157,109,102,102,166,109,175, 94,189, 62, 6, 80,167,209,
+170,173,155,176,182,238, 68, 84,171, 58, 84, 40, 20,246,122,125,157,193,147, 39,170, 14,121, 30,190,214, 86,182, 40, 64, 42,116,
+142,108,251, 66, 7, 46,255,108,198,148,219,110, 73, 29, 90, 91,240,108, 83,186, 88, 15,119,165, 45, 4, 66,234, 44,141,214,177,
+236,175,183,111,222,122,213,203,179, 5,115, 44,244, 34,134, 12, 27, 9,157,142,134,150,165, 64, 49, 82, 80,140, 12,109,219,117,
+ 64,171, 54,237, 64, 0,220,248,227, 42,167,103,217,179, 47, 82,219,187,118,127,119, 52, 69, 97, 45,136, 64,106, 25, 71,171,233,
+176, 97,195,150, 3,120,175, 33, 29,167, 46,239,142,166,233,114,157,234,227,104,125,240,238,116,220,251, 67,106,115,241,230, 74,
+ 89,255, 46, 56,145, 19, 70, 65,105,246, 87,213,161,148,126,170,161, 57,158, 23,195,213,176,209,242,244,244,180,181, 86,152,253,
+248,206,228, 73, 86, 73,119,174, 33, 51, 42, 28, 87, 46,198, 22,236, 59,116, 56, 95,157,151, 61,217, 4,147, 85,213,205,231,224,
+210, 4, 62,254, 79, 26, 45, 51, 75, 21, 0,192,199,191, 51, 24, 11,211,134, 17,170, 45,154,213, 24,147, 85,253,128, 93,219, 24,
+ 90,211,166, 77,195,214,173, 91,209,189,123,119,180,108,217,178,234, 96,111,106,212,172,150,232,146,201,213,134,213, 41, 41, 41,
+129,183,183, 55,182,108,217,130,136,136, 8, 88, 89, 89, 97,244,232,209, 40, 41, 41,169, 50, 88,198, 38,195, 19, 66, 30,158, 57,
+115,166,211, 27,111,188, 65,164, 82, 41, 85, 88, 88, 8, 91, 91, 91,172, 95,191, 94,157,145,145,113,162, 17, 38,107,164, 76, 38,
+155, 51,106,212, 40,198,207,207, 15, 89, 89, 89,176,182,182,102, 41,138,146, 2,128,173,173, 45,107,110,110,142,233,211,167, 35,
+ 48, 48,176,231,188,121,243,186, 75, 36,146,245,233,233,233, 59,234,219,151, 40,138,170, 58,161, 78, 94, 27, 3,189,190,252, 4,
+189, 97,195, 6, 84,228,186,253,213, 69, 16, 23, 7, 24, 81,201, 98,105,105,137,150, 45, 91,214,218,246, 61,123,246,196,141, 27,
+ 55,202,187, 38, 37, 18, 56, 57, 57,225,202,149, 43, 70, 85, 82, 85, 14, 4, 25, 25, 25, 9,127, 31, 71, 68,132,157,129,163, 82,
+138, 64, 55, 23,120,244,236,141,216,216,216,127, 51,154, 69,161, 60, 15,163,111,197, 62,184, 13,192,180,106,207,215, 3,248,222,
+ 20, 65,142,227, 8, 77,211, 84, 74, 74,138, 65,169, 84, 82,246,246,246, 18,133, 66, 1,157, 78, 87,101,184, 30, 62,124,136,208,
+208, 80,164,166,166,194,222,222,158,182,177,177,129,193, 96, 40, 48, 70,223,215,215, 23, 46, 46, 46, 53, 18,223, 39, 79,158,220,
+ 40,147, 53, 17, 8,216,250,229,138, 38, 10,154,177,241,119,124, 13, 9, 49,143,180,180, 30,102,255, 11, 38, 11, 0, 10, 11, 11,
+ 55, 3,216, 92,249,220,209,209,241, 45,134, 97, 22,232,116, 58,155, 11, 23, 46,216,170, 84, 42,106,199,142, 29,236,103,159,125,
+ 86,200, 48, 76, 1, 69, 81,171,255,125,115,136,168,220,162, 56,111,169,157,155,112, 71, 75,174,190,159,242,113,171, 2,105, 11,
+ 21,213, 38, 0,195,178,163, 47,191,197,197,117,203,202,200,164, 9,132,168,122,142,193,219, 62,158,191,228,195,216,152, 91, 94,
+102,214,102,152, 54,125, 62, 78,156, 58, 7,138,150,226,210,213,112,232, 13, 60,114,243,139, 48,106,204, 56,120,184, 58, 34,234,
+250,233, 28, 78, 16,214,191, 88, 38, 91, 88,247,234,144,183,236, 20,230,202,138,109,194, 99,215, 15,115, 64,211,107,177,112,225,
+ 66, 4, 4, 4,204,136,140,140,252, 28, 13,140,163, 69, 81,194,186,182,189,199,216,201, 20,229, 58, 68,224,177,229,192,199, 21,
+227,104,205,198,250,205,135,218,182,241, 73, 88, 92,223, 56, 90, 47,144,201,170, 62,175,223,104,121,123,123, 43, 44,164,152, 42,
+101, 36,243,222, 25, 59, 84,149, 29,119, 15,169,209,183,202,187, 23, 12, 26, 67,230,131,104, 99,134, 66,239,139,154,227,119,144,
+250,186,174,180, 90,163,174,232,107,104, 86,158,112, 31,143,102,153,104,178,158,208,172,110,182,170,143,155,229,233,233,137,229,
+203,151, 27, 51,142,214,227,235, 94, 73,127,148, 39,192, 87, 79,134,239,111,164,201,170, 85, 83,165, 82, 6,231,135, 96, 0, 0,
+ 32, 0, 73, 68, 65, 84, 33, 47,175,124,132,132,224,224, 96, 4, 7,255, 85,207, 96, 48, 24,170,162, 88, 86, 86, 86,181, 69,180,
+158,208, 52, 55, 55,255,248,240,225,195,147,174, 94,189,250,198,220,185,115,165,175,188,242, 74,165,153, 43,131,113,247,118,171,
+161,201,243,252,244,211,167, 79, 51,130, 32, 96,203,150, 45,184,113,227, 6, 81, 42,149,159, 42,149,202,117,230,230,230,188, 70,
+163,153, 54,101,202,148,113,139, 23, 47,166,123,246,236,137,107,215,174,209, 77,155, 54,157, 0,212, 24,196,178,214,117, 15, 15,
+ 15, 7, 77,211,224,242,147, 49,227,227,125,176, 48,151, 32, 38, 38, 6,249,249,249, 79, 12, 98,106,204,246,172, 30, 41,169,156,
+122,246,236, 89,213, 13, 25, 20, 20, 4,134, 97,112,251,246,237,186,186, 97,171,107, 18, 7, 7,135,170,253, 67, 38,147,225,220,
+185,115,248,226,139, 47,224,101,111,139,130,232, 8,184, 4,191,140,126,147,166, 96,244,232,209, 96, 24, 6,246,246,246, 85,145,
+ 95, 35,246,165,167,161,186,230, 36,127,127,255, 9, 81, 81, 81, 30,109,219,182,117,141,140,140,236, 19, 16, 16,224, 29, 17, 17,
+ 81,249, 92, 1,227,114,115,170, 52,255,252,243,207,131,235,214,173,155, 62,113,226, 68,153, 32, 8,124, 82, 82, 18, 11,128,114,
+113,113, 97,254,252,243, 79,225,216,177, 99,208,104, 52,240,240,240,160,221,221,221,169,179,103,207, 10,209,209,209,225,132,144,
+249,198,172, 59,207,243, 53,134,113,168,124,252,243,207, 63,155,252,127,111,210,202,119,217, 43,189,252, 60,115,211,111, 35, 35,
+ 45, 14,124,145,202, 16,122,228,184,206, 68,147,245,119,183,209, 63,169,185,228,193,131, 7,238, 58,157, 14,114,185, 28, 27, 54,
+108, 48, 44, 95,190, 60, 42, 55, 55,183, 7,106,175, 40,175,161,217,200,170,195,252,122, 52,159,168, 58, 44,202,195,137, 35, 71,
+255,236,100, 57,108, 27,102,164,231, 84, 37, 54, 18,138,178, 63,236,220,186,135,178,115,219, 52,250,228, 34,186,132, 47, 59, 81,
+207,186,235, 53,122,253,200, 97,195,199,252,182,119,239, 30,203,207, 22, 45,194,149,240, 8,228, 21,150, 66, 32, 12, 4,138,194,
+130, 5,159,193,197,209, 30,197,233, 15,202,116, 6,195, 48,212, 28, 67,235,185,111,119,138,162,103,158, 61,182, 99, 45, 77, 65,
+ 80,103,221, 87, 48, 37,113,202, 55, 71, 15,147,140, 28, 57, 18,135, 15, 31, 70,100,100,228,166,122, 76, 86,149, 38, 33,244,204,
+136, 11,251,214, 82,128,160,201,185,175,144,148, 38, 40, 39,140, 29, 38, 25, 61,122, 52,126, 9,189,138,189,199, 19, 54,238, 61,
+142,227,120,177, 49,125,100,120, 43, 9, 34,123,180,110,230,222,179, 67, 27, 51, 9,175, 65,106,116, 28,242,213, 90,156,189,151,
+ 84, 72, 19,186,209, 99,235,148, 31, 32,101, 72, 78,126, 80,203,149,149, 89,197, 9, 93,107,146, 38, 77,211, 53,162, 89, 79, 19,
+201,170,190,156,206,206,206, 53,110,231, 82,253,196, 93,153, 3,212,136,161, 29, 62, 78, 78, 78,182, 78, 78, 78, 6, 33, 4,225,
+225,225,214, 65, 65, 65, 31, 63, 77, 52,107,206,156, 57, 85, 81,171,199,231,181,189,214, 16, 21, 73,233,107, 88,150, 61, 48,111,
+222,188, 25, 65, 65, 65,175, 46, 90,180,136,130, 9, 55,224,125, 44,154,195, 9,130,128,243,231,207,227,240,225,195,188,193, 96,
+152,154,145,145, 17, 81,237, 35,223,221,188,121,243,236,240,225,195,119,220,191,127,159,137,138,138, 2, 33, 13,215,157,106, 52,
+ 26,180,108,217, 18, 28,199, 97,229, 12, 79,148,148,180, 5,199,113,224,121, 30, 22, 22, 22, 85, 81,188,234,230,185,161,253,136,
+231,249, 39,140, 86,120,120, 56, 24,134, 65,143, 30, 61,112,235,214,173,170,136, 86, 67, 17, 40,131,193,144,236,236,236,236,188,
+100,201,146,170,229,202,201,201,193,153, 51,103,208,165,107, 55,180,158, 58, 13,233,233,233, 88,189,122, 53,220,220,220,176,108,
+217, 50,228,231,231,131,227,184,127, 58,156, 62, 32, 42, 42,202, 99,236,216,177,217, 17, 17, 17, 30,161,161,161,182, 33, 33, 33,
+ 22, 99,198,140,201,142,136,136,240,160, 40,170, 27, 76, 76,130, 22, 4,225,147, 5, 11, 22,156, 90,182,108,217,199,239,189,247,
+ 94,208,196,137, 19,165, 82,169, 84, 72, 75, 75,227,246,236,217, 67,181,108,217,146,150,201,100,212,233,211,167,133, 63,254,248,
+227, 58,199,113, 43, 1, 92, 50, 37,226, 92,221,100, 49, 12, 99,172,201,170,193,251, 78,138, 9, 86,116, 78,143,117, 27,150,211,
+126, 62, 30,134,157,123,206,164, 92,186,246, 32,158,209,113,239,255, 88,207,208, 0, 47, 50, 12,195,236,247,247,247,127,107,230,
+204,153,230,253,251,247, 87, 44, 94,188,184,168,164,164,164, 46,147, 85,203, 5,243, 63, 82,117,248,195, 39,115, 67,223,255,160,
+237, 91,205,254,227,210, 4, 97,234,108, 20, 72, 24,218,218,150, 70, 7,111, 6, 37,185, 15, 85,199,127,219,254, 8, 64, 67,227,
+178,253,121,243,110,100,223, 54,109,219, 31, 90,185,108,165,211,167, 31,205,147, 30, 10,253, 21,132, 51, 32,252,194, 5, 88,202,
+120, 18,125, 51, 44, 75,103,208, 15,197, 11,120, 11,158,140, 43,223,239, 5,112,212,222,222,254,206,164,137, 19, 91,250,251,143,
+129, 82,169,196,193,131, 7,177,235,187,239,248, 53,192, 27, 10,224,214,244, 6,198,211,203,190, 94,165,115,123,202,164, 73,190,
+ 29, 58,252, 7, 74,165, 18, 7, 14, 28,192,142, 53,107,140,214,121,206,169, 28, 25,254, 4,254, 26, 33,190,129, 28, 45,154, 42,
+185,254, 32,169, 52,252, 65, 82, 41, 4, 66, 4, 66,116, 52,141, 20,181,193,176,236, 65, 66, 90,163, 76, 65,101,215,225,210, 47,
+103, 62,187, 62,143,106,230,167,177, 37,221,181,152,172,212,234,247, 72,171,126,146,174,235, 49,203,178,169, 70,202,175,240,242,
+242,122,226,181,198,135,126,137, 73, 38,203,216,113,180, 0, 32, 47, 47, 47, 3,192,167,215,174, 93,251,249,213, 87, 95,157, 2,
+ 32,173,145,109,180,165,119,239,222, 83, 1, 48, 20, 69,109, 74, 79, 79,143,120,226, 15,159,145, 17,235,230,230,246,181,143,143,
+207,180,242, 11, 83,106, 75, 3, 39,242,132,182,109,219, 26,106,107,139,186,158, 11,130,208, 96, 27, 21, 22, 22,162,115,231,206,
+ 79,220,211,146, 16,130,164,164,164,202,136, 83,213,182,175,207,192,149,150,150, 78,123,247,221,119, 55, 75,165, 82, 47, 0, 84,
+165,201,229,121,158,249,254,251,239,205,120,158,103, 0, 80, 52, 77,115, 82,169, 84,123,248,240, 97,142,227,184,100,157, 78, 55,
+237, 31, 62, 64, 28,160,202,111,197,160,142,138,138,242,171,136,100,165, 70, 70, 70,222,222,187,119,175, 10,192,190, 70,234, 94,
+ 42, 43, 43,187,180,124,249,242,158, 27, 54,108,248,100,218,180,105,157, 71,143, 30, 45, 9, 14, 14,198,137, 19, 39,248,243,231,
+207,135,107, 52,154, 21,166, 24,172,138,182, 44,242,244,244,172, 50, 92, 13,252,151,235, 77,228,117,240, 86,172, 27,247,182,155,
+217,150, 21,103, 74,115,211,245, 87,217, 82,253,252,237, 64, 36,254,135,201,202,202,154, 11,224,179,213,171, 87,167, 7, 6, 6,
+ 42,100, 50,153,222, 88,147,245, 15,194, 9,133,165, 3,191,237, 55,226,104,239, 5,239,250,244,235,211, 67,233,217,196,201, 61,
+ 58, 46, 11, 15,175,157, 80,223, 57,254,101, 34,209, 21, 12, 1, 96, 76,230,250, 31, 58,131,161,197,156,121,115,102,200,165,210,
+ 87,121,158,111,247,202,217, 35,132, 97,152, 8, 61,203,158,173,232, 46,212,190,192, 77,190,244,235,175,191,110,233,239,239,143,
+131, 7, 15,226,236,238,221, 24,149,155,139,115, 12,195,208, 50,153,195,113,131,225, 27, 24,103,144,150,174, 90,181,202, 55, 32,
+ 32, 0,251,247,239,199,233, 29, 59,240,255,236, 93,103, 88, 20,201,218, 61, 61, 57,146, 36, 11,136, 24,128, 69, 49, 98, 90,113,
+ 49, 99,118,205,113,205, 57,103, 92,117, 13,107, 14,107, 90,149, 85,215,128, 57,187, 98, 22,179,152, 5, 65, 17, 84, 50,195,144,
+135, 48,121,166,167,251,251, 65,184,168,132, 1,221,187,247,126,119,206,243,244, 51, 51, 29,206, 84, 87, 85, 87,157,126,171,234,
+125, 7, 87,143,167,188,190,174, 5, 0,219,162,159, 89, 0,162, 1, 52, 7, 32, 0,160, 65, 97,104, 39,155,210, 93, 88,209,177,
+226,227,247, 9,130,248, 59, 39,194, 86,238, 25,254,115, 68,126, 72,104,254,173, 83,161, 82,169,114,220,221,221,171,180,230, 90,
+175,215, 87, 56,134, 75,146,100, 74,221,186,117,141,182, 90, 24, 35,138,114,114,114,124,254,198,194,248,170,185, 88,159,116, 34,
+ 20,149,224,232,232, 72, 21,119,250,101,137,176,178,246,209, 64,124, 85,254, 39, 45, 45, 45, 26,192,220,234,166, 51, 53, 53,245,
+ 44,140, 8, 26,109,236,121, 0, 32,147,201,190,121, 48, 95,130,166, 37, 43, 86,172,168,146,192, 6, 77, 87, 36, 62, 35,228,114,
+121, 43, 99,254, 91,167,211,225, 31,196,169,162,141, 17, 25, 25, 57,129, 32, 8,127, 20, 14, 9, 4,226,219,120,243,126,144,159,
+159,255, 96,227,198,141,237,246,238,221, 59,155,166,105,228,231,231,111,171,170,192, 42,121,123,206,200,184,252,173,110, 60, 39,
+ 93,123,251,120, 96, 74, 71, 85,174,110,246, 62,185,246, 48, 76, 40, 49, 70,209, 52,125,112,228,200,145,173, 1, 28,250, 90,178,
+114, 86, 29,126, 45,226, 41, 89, 94,147, 59,243,126, 29,123,199,210,172, 39, 12, 44, 79,104, 25,151,160,205,190, 12,224, 0,140,
+155,230, 80,114,191, 36, 69,109, 33,181,218, 45,165, 58,151,255,133,114,174,225,237,237, 61,123,204,152, 49, 88,182,108, 25,174,
+111,222,172,155, 66, 16,121,108,128,190, 86,248,162,201, 32,128, 69,198,242,140, 26, 53, 10,203,150, 45,195,149, 13, 27,170,203,
+ 83, 17,108, 9,130, 8, 6,128,128,128,128,159,215,173, 91,103,181,120,241,226,198,235,215,175, 95, 91,244,251, 77,241,241,162,
+190,174,215,226,197,139, 27,150, 58, 94, 0,224,249,223,156,159,101,122,134,255,187,209,217,196,105,226, 52,113,154, 56, 77,156,
+ 38, 78, 19,167,137,243,107, 64,211,116,207,194,143,242, 63,203,251, 94,234,243, 31, 1, 11, 38,152, 96,130, 9, 38,152, 96,130,
+ 9,255,133, 40,109,197,170,206,241,111,136,226, 57, 90,165,177, 23, 40, 92,214, 93,158, 42,173,202,170,135,234, 40,219, 91, 38,
+ 78, 19,167,137,211,196,105,226, 52,113,154, 56,255,231, 56, 43,227,254,226,122,154,166,123, 18, 4, 17, 76,211,116,175,242, 62,
+139,133,213,231,223, 75,125,126,179,105, 7,101,160,120,110,214, 23,115,180,254,110,152,204,170, 38, 78, 19,167,137,211,196,105,
+226, 52,113,154, 56,191, 10,197, 67,128, 0,232,128,128,128,197,255,129, 67,135,142, 69, 34,171,244, 6,160,130,161, 67,154, 62,
+205,148, 72, 96,206,229, 10, 57, 0,160,213, 42,117, 78, 78,200, 39,136, 65,255,100,192, 91, 19,254, 59, 81,188,220, 59,253, 27,
+159,107,130, 9, 38,152, 96,194,255, 6, 50,139, 45, 85, 0, 50, 1, 16, 69,191,181, 69,159,153, 69,130,236,243,239,159, 28,255,
+ 27, 33, 69, 57,150, 44, 86,121, 34, 43, 43, 75,104,195, 98,201, 60, 12, 6,245,119, 0,192, 98, 49,222,101,101, 89,197,208,244,
+233,172,234,136, 45, 27, 59,187,151,108, 38,211,201,152,115,245, 6,131, 36, 43, 61,253, 83,215,241, 4,241,255, 65,224, 25, 43,
+ 34,190, 70,108,252,237, 66,197,198,198,198,222,222,222,190,143,185,185,121,155,220,220,220,103,153,153,153,231, 43,136,123,184,
+142, 32,176,176,176, 94, 97, 35,128,197, 21, 80, 87,229,220,207,225, 46, 20, 10,167, 18, 4,225, 93,244,128, 69, 42,149,202,221,
+ 0,222,255, 15, 54, 72, 2, 0, 63,178, 88,172, 81, 54, 54, 54, 45,211,210,210, 86, 0,168,174, 55,111, 22,128,121,150,150,150,
+ 67, 44, 45, 45,235,230,228,228,196,230,231,231,159, 2,176, 5, 64,165, 75,165, 87,204,116,108,211,222,191,253,210,187,215,239,
+174, 94,177, 67,250,248,139,227,243, 28,173,187,118,105,187,236,238,165,208, 85, 63,239, 74,205,169, 98,218, 24, 69, 27, 80,184,
+ 58,146,198,151,206, 94,191, 22,108, 0,189, 1,180, 7,112, 23,192, 37, 99,238,187, 28,180, 6,240,115, 81,154,183, 0,184,243,
+ 31, 94,143, 68,246,246,246, 27, 0,244,102,177, 88,111, 37, 18,201, 68, 0, 41,255,112,154, 88, 0, 90, 0,240, 70,161, 27,142,
+231, 48,206,133, 67,165,176,182,182,238,197, 98,177,166, 22,185,118,217,157,157,157, 29,252,159, 90, 48, 92, 46,119,155,131,131,
+195,120,149, 74,165, 36, 8,130, 46,237,239,145, 36,201,148,172,172, 44,159,255,111,141, 26, 65, 16,207,255,195,147, 56,177,140,
+125,229,251,209,146, 72, 96,206, 98,201, 60, 50,210, 34,134,164, 74, 95, 15, 6,128,154,142,141, 79,217, 57, 52, 58, 41,145,112,
+117, 14,158,253,196,108, 33,107, 55,147,201,110,170,214,106,108,216, 44,118,150,142,212,135, 49,180,244,212,180,232,243,101, 58,
+ 91,100, 51,153, 78, 9, 49,119,236, 72, 93, 14,216,252,154, 96, 11,106,149,155,218,154, 53,107, 86,235, 46,173,172,234,154,233,
+120,252,217,108, 54,179, 11, 69,147,222, 52, 5, 48, 8,118, 36,105,208,135,112, 52,154,223,100,178,216,130,234,230,160,167, 53,
+ 28,104, 96, 40, 8,116, 1,141,155, 4,112, 34, 58, 27,105, 85,160, 48, 86, 68,124,141,216, 40,125,237, 86, 0,243,191,117, 77,
+114,114,114,178,234,213,171,215,182, 95,127,253, 85, 32, 22,139,137,164,164, 36,255, 69,139, 22,253,240,226,197,139,185, 18,137,
+ 36,245,115,209, 71, 16, 88, 72, 81, 52, 3, 0, 24, 12, 98,145,173,173,157,144,201,100,126,225,219,200, 96, 48, 8, 51, 51, 51,
+166, 83, 20, 77, 20,157,187,144,166,177,221, 24,193,200,231,243,135,121, 55,106, 58,119,195,166, 45, 98,123, 59, 59, 17,105,160,
+116,241,137, 9,194,165, 1,243, 91,125,252,240,126,187, 90,173, 62, 94,157,231,154,201,100, 14,225,241,120,189, 0,120, 21,237,
+139,210,104, 52,193, 6,131,225,164,177, 29,186,189,189,253,125, 38,147, 89,187, 42,127,108, 48, 24,146,210,211,211,125,171, 89,
+ 68,131,106,213,170,117,192,207,207, 79,216,178,101, 75,112,185, 92, 44, 91,182,108,158, 84, 42,173, 76,104,177, 0,204, 19, 10,
+133, 67, 68, 34, 81, 93,185, 92,254, 81,165, 82,157,229,114,185,157,183,111,223,238,210,182,109, 91,179,244,244,116,130,201,100,
+218, 95,185,114,229,167,109,219,182,249,147, 36,217,169,178, 78, 46,239, 35,189,148,215,219,171, 93,222,199, 59, 75, 1,116,255,
+252, 56,169,230,143,162,153, 46,189, 84,244,171,228, 34,241, 97,180,200, 98,179,217,219, 29, 28, 28,198,168, 11,125, 5,208,159,
+119, 56, 0,160,213,106,101,185,185,185,158,213,121,228, 1,140,179,180,180, 28,179, 96,193, 2,171,238,221,187,227,232,209,163,
+211,246,237,219, 39,203,207,207, 63,136, 66, 71,152,209, 85,228, 92,152,150,150,214,131,205,102, 19, 46, 46, 46, 76,149, 74, 85,
+ 21,161,229,129,194, 32,204,207, 1,236, 70,161,235,130, 14, 64,225,243, 14, 96, 99,177,112, 99, 48, 24,187, 61, 61, 61,251, 68,
+ 69, 69,237, 1,176,186,186,207,186,131,131,195, 31,187,118,237, 26,220,183,111, 95,102,102,102,166, 83,147, 38, 77,142,165,165,
+165,181,251, 6,205,200, 88, 30,143, 55,167,113,227,198, 13,162,163,163, 99,242,243,243,183, 20,229,103, 69,207,148, 51,128,206,
+150,150,150,157,150, 44, 89, 34,238,213,171, 23,246,238,221,219, 99,223,190,125,242,130,130,130, 16, 20,206,233,249, 42, 17,200,
+ 98,177,166,166,164,164,216,208, 52, 13, 71, 71,199,169, 0,254, 35,133, 22,131,193,216,222,191,127,255, 49,199,142, 29, 19, 38,
+ 36, 36, 8,157,156,156, 74,156,103, 19, 4, 81,237,254,211,132,175,198,222, 82,130,171,114, 63, 90, 92,174,144, 99, 48,168,191,
+ 75,149,190, 30,252,131,223, 78, 11, 0,184,127,111,198, 96, 59,135,134,145, 92,174, 48,134,103,206, 63,215,191,119,231,166, 3,
+123,249, 17,206,142,118, 72,145,102,216,255,121,226,122,183,224,235,119,206,161,208,129, 88,153, 32,117, 57, 16,232,110, 33,250,
+225, 14,216,180, 79,197,239, 87, 82,240, 56, 60, 30,202,188, 44,212,118, 16, 96,211,236,174,112,176, 18, 86,239,213,203,206,189,
+ 3,201,226,157, 28, 62,108,164, 69,159, 31,189,216,174, 14, 14,160,105, 30, 98, 62,202,191,191,122,227, 78,139,179,167,143, 79,
+ 21,177,221,135, 40, 50,222, 27,221,184, 53,115,132, 64,161,195,143, 44, 38,241, 83, 91,159, 6,157,134,245,104,199,104,224, 85,
+ 31,111,223, 68,117,189,120,251,233, 38, 70,232,155, 16,210, 64, 7,137, 56,184,240, 74, 90,161, 67,191, 47, 4, 71,167, 78,157,
+219,241,120,188, 79,156, 39,105, 52, 26, 78, 72,200,173,214,213, 17, 27,197,255,161,213,106, 24,108, 54, 23, 12, 6, 49,215,219,
+187,145, 87, 86, 86,214, 29,130, 32, 14,164,166, 86,205, 90, 48, 3,224,202, 88,172,230, 12, 30,207,209,160,213, 90, 3, 0,193,
+229,202,226, 25,140, 70, 75,126,254, 89,204,100, 50,169,236,236,108, 40,149, 74, 98,194,132, 9,252,143, 31, 63,246,151, 72, 36,
+ 59, 42,121, 35,193,190,125,251, 60, 28, 29, 29,191,136, 30, 43,149, 74,185,125,251,246,169, 78,209,123, 52,110,210,108,206,245,
+235,215,188,242,115,100,234,125, 91,255,120,169,231, 11, 53,117,188, 60,217,187,247, 30,182,152, 56,102,196,140,119,239,222,132,
+161,106,241,234,106, 9, 4,130,115,155, 55,111,246,238,208,161, 3,219,206,206, 14,233,233,233,136,138,138,242,190,125,251,246,
+143,135, 15, 31,158,167, 82,169,250, 3, 70, 5, 68,117, 15, 9, 58, 96, 39,170, 97, 13,131, 94,143,154,141,155,149,248, 55,251,
+112,251, 6, 72,157, 14,148, 94, 15,175, 94, 63, 22, 89,147,105,120,121,121, 85,215,235,110,205,134, 13, 27, 30, 89,187,118, 45,
+ 71,163,209,224,233,211,167,184,115,231, 14, 37,149, 74, 43,115,136,203, 34, 8,226,198,242,229,203,157,125,125,125,205,178,178,
+178, 96, 48, 24,108, 46, 92,184, 48,181,105,211,166,230, 46, 46, 46,220,160,160, 32,200,229,114,144, 36, 89,163,110,221,186, 53,
+134, 13, 27,166, 13, 10, 10,154, 7, 96, 67,121,150,172,252,143,244, 82, 41, 81,183,155,103,243, 81, 72, 35,174,117,155,211, 13,
+ 87,205,235, 17, 37,150,173,110,117,235,154,229, 75,132,139,196,230,141,106,228, 75,110, 45,234, 86,183,238,190,107,177, 70,189,
+ 12, 49,138, 58,155,225, 39, 78,156, 16, 70, 69, 69, 9,189,188,188, 64, 81, 84,137, 7,254, 98,135,179,238,238,238,213,201,199,
+245,147, 39, 79, 94, 52,120,240, 96, 52,110,220,184,196, 41,234, 47,191,252,130, 69,139, 22, 89,221,191,127,127,222,241,227,199,
+231,157, 63,127,126, 3,128,128, 42, 90, 99,138, 81,213, 50, 94, 25, 23, 23, 55,232,220,185,115, 35, 22, 46, 92,232, 14, 96, 58,
+128,101,217,217,217,126, 69,214, 24,110,145,208, 26, 59,111,222,188, 41, 1, 1, 1,232,209,163,199,178,167, 79,159,174,169,166,
+149,143, 73,146,100,143,190,125,251, 50,245,122, 61, 68, 34, 17,244,122,125,189,175, 53, 74, 0,216, 53,105,210,164, 41,147, 39,
+ 79,134,149,149, 21,244,122,189,199,137, 19, 39,246, 45, 91,182,172, 13,128,113,229,164,117,212,148, 41, 83, 6,140, 28, 57, 18,
+ 62, 62, 62, 96,177, 10,179,113,243,230,205, 88,181,106,149,248,198,141, 27, 63, 6, 5, 5,253,120,241,226,197,179,248, 52,108,
+ 87,149, 64, 81, 20, 88, 44, 22,146,147,147, 97,103,103,199,163, 40,234, 58, 65, 16,123,115,114,114,206,255, 7,117,230, 27, 7,
+ 13, 26, 52,252,216,177, 99, 98, 0,216,180,105, 19,230,204,153, 3,123,123,123,136,197, 98,147,212,249,207,177,104, 77,172,212,
+162, 85, 25,148, 74,101,179,197, 51,127, 2,131, 81,248,214, 88,191, 78, 45,172,251,121, 34,113, 49,248,122,179, 10,109,240,252,
+154,136,126,184, 3, 60,151,217,208,232, 73, 60, 9,143,195,205, 77,254,133,189,101,247, 37,208,232, 58, 21,119, 54, 53,184, 2,
+193, 70,173,193,240, 8, 14, 14, 79,145,152,152, 89,153,200,178,117,176, 15, 14, 12,220, 32,240,174,231, 9, 29,169,135, 36, 67,
+ 2,130,224,193,217,201, 12, 99, 71,117,103,251,249,213,180, 89,185,242,143,203,105, 20,250, 41,179,222, 87,234, 48,212,195, 6,
+135,154,121,187, 15, 30,214,211,151,215,200,187, 33, 56, 60, 65,201,177,230, 62, 62,104,238,227,195, 8,144, 23,116,121,246,252,
+101,151, 51, 55,158,104,148,250,196, 83, 49, 89, 24, 93, 73, 35, 83, 34, 56,102,205,154, 5,123,123,251, 79, 78, 72, 79, 79,199,
+237,219, 33,101, 94, 83,133,134,172,228, 63,214,172, 89, 99, 38,147,201,186,239,223,191,191, 35, 69, 81,107,210,210,210, 30, 26,
+ 67, 50, 18,168,157,199,227,117, 26,179,101, 11,213,180, 79, 31,166,165,131, 3,131, 50, 24,136,212,216, 88,235,173, 59,118,180,
+207,249,240, 65,160,168, 81, 35, 71,166, 82, 41, 99, 98, 98,192,231,243, 9, 22,139,213,162, 12,170,116,154,198, 70, 6,131, 88,
+ 68, 16, 4,120, 60,126,204,228,201,147, 95, 21, 29,171,125,233,210, 37, 97,239,222,189,149, 0, 18, 0,128,199,227, 59, 49,153,
+ 12,143, 66, 79,236,216,104,140,192, 20,137, 68, 51, 87,175,221, 32,202,207,201, 85,233, 20, 10,189,173,185,152, 32,196,102,204,
+252,188,130, 2,137, 52, 83,179,100,197, 42,230,164,177, 35,103, 42, 20,138,169,198,138,172, 38, 77,154, 60, 59,119,238,156,157,
+181,181, 53,114,115,115,145,157,157,141,103,207,158,129,162, 40,244,239,223,159,247,125,171,150,205,126, 94,178,244,113,178, 68,
+210,198, 24,177, 37,170, 97,131, 77,190, 77, 11, 59,235,132,236,146,242,217, 59,168, 87,201, 57,171, 82,242,138,173,115, 95, 19,
+ 66,170, 77,167, 78,157, 56, 0, 48,110,220,184,252,130,130,130,117, 0,142,161,114,143,254,243,150, 46, 93,234, 84,167, 78, 29,
+215, 99,199,142, 65, 46,151, 3,128, 93,157, 58,117,224,225,225, 97,184,123,247, 46, 60, 60, 60, 96,102,102,134,251,247,239,227,
+241,227,199,240,241,241, 49,227,112, 56,131,117, 58, 93,153, 66,171,189,127,251,165,188,222, 94,237, 60,155,143,130,216,220, 17,
+251,142,159, 68,244,203,195,237, 52,186,168,165, 28,195,189,145, 42,154, 55, 58, 51, 73, 28, 80,219,199,207,186,126,195, 62,112,
+109,254,202, 70,109,120, 16,183,180, 75,157,245, 44,190,250,240,138, 45,210,236,242, 68, 22,128, 77,253,251,247, 31,116,226,196,
+ 9, 75, 0,136,136,136, 64,122,122, 58,108,109,109,193,231,243,193,102,179, 75,226,147, 86, 19,163,119,239,222, 93, 34,218, 72,
+146, 44,137, 2, 32, 20, 10,241,195, 15, 63,160,105,211,166, 56,127,254,252,232,114,132,150,111,171, 86,173,142,186,186,186,186,
+148,222,169, 80, 40, 48,116,232, 80, 0,128,159,159, 95, 39,129, 64, 64, 23, 11, 66,169, 84, 42,127,254,252,121, 23, 0, 79,203,
+ 81,150, 42,137, 68,130, 5, 11, 22, 32, 62, 62,126, 90, 96, 96, 96, 34, 0, 62,151,203, 45,121, 63, 6,224,209,176, 97,195,237,
+115,230,204,193,199,143, 31,241,246,237,219,103,168,254, 80,170, 65, 36, 18,125,208,235,245, 62, 36, 73, 66,165, 82,161, 95,191,
+126,252,179,103,207,166, 51,153,204,119, 89, 89, 89, 35, 80, 56, 39,197, 88,240, 1,108,153, 60,121,242,148,133, 11, 23, 34, 36,
+ 36, 4, 23, 47, 94,196,200,145, 35, 49,123,246,108,136,197,226, 49,179,103,207,126,140,194,128,230,159,163,211,238,221,187, 97,
+ 48, 24,190,120, 54,248,124, 62,124,125,125,209,160, 65, 3, 92,188,120,177,211, 87, 8, 45, 87, 95, 95, 95, 46, 69, 81, 80, 40,
+ 20,184,123,247,174, 88, 32, 16,136,157,157,157, 39, 0,248,143, 17, 90,174,174,174,147, 79,156, 56, 33, 46, 61,250,195,227,241,
+ 80,170, 30,152,240,207, 91,180, 42,124,195, 42,129, 86,171,212,177, 88,140,119, 53, 29, 27,159,186,127,111, 70,201,208, 33,192,
+120,167,213, 42,117, 0, 96,160,104,228, 43, 73, 8,120, 12, 36,164, 21,224, 77,108, 86, 89, 84,159, 44,209,100, 11,106,129,215,
+ 50, 1, 52, 77, 67,171, 51, 64,147,151,134,117,151,149,136, 74, 81, 67,171,144, 65,171, 43,156,134,101, 99, 99,195,186,126,253,
+234,156, 91,183,110, 79, 57,120,240, 32, 51,197,194,226,109, 1,208,172, 44, 78, 43,171,186,102, 20,151,123,106, 79,224, 50, 1,
+205,140, 69, 76,146, 2,245,157, 91,194,198,210, 5,105, 89, 10, 60,122,123, 5,239,222, 7,163,142,163, 43,102,207,236,198, 95,
+189,246,216, 73, 14,233, 86, 43, 55, 55, 62,191,188,116, 22,191, 69,253,113, 45, 6,100, 78, 44, 12,217, 31, 97, 40, 72,253,226,
+ 4,177,109, 45, 52,239,224, 4, 91,151,122,188,209,179, 87,141, 2, 62, 17, 90,165, 57,211, 9,130,177,135,193, 32,166, 16, 4,
+129,198,141,155,164,108,217,178,165, 44, 87,224,186,198,141,155,164, 48,153, 12,231,194,134,157,177,155,166,169,244, 74,210,249,
+137,168,225,114,121, 11, 11,205,254,142,201,151, 47, 95,214, 13, 26, 52, 8,155, 55,111,230, 46, 90,180,104, 9,147,201, 28, 87,
+198,240,222, 39,156,253,128, 90,150,245,234,117, 93,243,232, 17,205,214,235,137,156,103,207,242,115,165, 82, 50,173,160,128,123,
+250,221,187, 30,227,231,207,231,186,184,184,224, 97,112,176,117,166, 66, 65,231,106, 52,170,220,220, 92,154, 36,201,103,229,112,
+ 46,182,181,181, 19,238,219,183,207, 99,242,228,201,175,164, 82,233, 98, 0,112,116,116, 92, 7,160, 1,128,132, 82,251, 16, 24,
+120, 82, 50, 97,194,132,152,140,140,140,197, 21,165,179, 20, 26,218,217,218, 9,143,255, 17,244,186,134,153,128, 97,235, 92,147,
+193,182,180,100,145, 92, 1,135, 2, 84,117, 92,234,137, 0, 52, 44,231,218,207, 57, 9,129, 64,112,238,175,191,254,178, 99,179,
+217, 48, 24, 12,176,181,181, 69,124,124, 60,114,115,115, 81, 80, 80,128,184,119, 81,112,115,113,193,202,128, 69,142,211, 23, 5,
+156, 83, 42,149, 62,159,117,102, 95, 6, 64,214,235,190,176,236,149, 21,197,224,243, 97, 47, 35,203,189, 52,226,147,146,146, 32,
+ 22,139,225,237,237, 45,126,244,232,209,131, 10, 68, 86,233, 32,192,131,219,182,109,107,118,236,216, 49,248,248,248,192,194,194,
+ 2,119,239,222, 69, 68, 68, 4,116, 58, 29, 67, 46,151, 67, 44, 22, 99,253,250,245,168, 85,171, 22, 10, 10, 10,144,144,144, 96,
+205,102,179,109, 62,243,104, 95,194,121,247,250,221,213,121, 31,239, 44, 77, 35,174,117,219,119,252, 36, 38, 12, 27, 2, 7, 58,
+246,129, 69, 61, 98,117,215,222,109,127,161,153, 46,189, 68,102,141,173,220,189,123,131,195, 21, 99,250,194, 85,136,137,188,100,
+165, 44,120, 61,141, 48, 36,187,172,216,114,122, 86, 25,247, 78, 0, 96,184,184,184,140, 63,125,250,180, 89,137,233,133,201, 44,
+137,121, 88, 58, 8,124, 5, 1,223, 43,205, 79,130, 32, 16, 31, 31, 15, 59, 59, 59,136,197,226,146, 0,226, 81, 81, 81,120,242,
+228, 9,138,163, 81,148,195, 57,226,214,173, 91, 46, 34,145,232,147, 19,104,154, 70, 86, 86, 22, 72,146,132, 80, 40,132,193, 96,
+128, 78,167,131, 94,175,135, 90,173, 22, 55,104,208, 96,170, 94,175,127, 90, 22, 39, 69, 81,115, 7, 15, 30,220,246,233,211,167,
+117,119,236,216, 1,173, 86,187, 41, 45, 45, 13, 3, 6, 12, 0, 69, 81,232,212,169, 83,107,154,166,163,151, 44, 89, 2, 0,152,
+ 51,103,142, 94,161, 80, 76,174,206,189, 23,161, 65,243,230,205,235,134,132,132,160, 93,187,118,208,104, 52,216,188,121,179,121,
+ 96, 96,160,121, 80, 80,144,237,194,133, 11, 15,100,102,102,250, 87,194, 73, 0,216,228,224,224, 48,165,125,251,246,130,162, 24,
+166, 56,124,248, 48, 86,174, 92,121, 2,192,146,171, 87,175, 46,191,120,241,226,168,241,227,199, 99,229,202,149,179,115,115,115,
+247,151,199, 25, 23, 23, 7, 91, 91, 91,152,155,155, 23, 54,150, 58, 29,194,194,194,112,243,230, 77,124,247,221,119,198,220, 83,
+121,233,116,237,223,191,255,129,227,199,143,155, 37, 39, 39,227,254,253,251,112,115,115,131, 82,169, 52, 38, 54,236,173,191,161,
+195, 46,151, 83,165, 82,169,147,146,146,196, 27, 54,108,128,163,163, 35, 92, 93, 93,193,231,243, 65, 16, 4,244,122,125, 69,225,
+213, 42, 77,167,159, 31, 88, 89, 18,171,190, 22,150, 86,211,104,154,102,229,229,201,254,208, 33,247, 76,108, 44,180,255,198,123,
+255,111, 70, 51, 0,175,240,105,204, 67,105,137,208, 10, 14, 14,166,123,245,234, 69, 20,127, 58, 57, 33, 63, 43,203, 42,198,206,
+161,209, 73, 59,135,134, 69,113,191, 24,239,152, 76,171, 24,123,123,101, 62, 0,232, 72, 26,161,239,114,241,250, 67, 26, 34, 62,
+164, 65,196, 51,206,248,162,209,145,133, 51, 86,105, 26,106,249,191, 94, 90,117, 74, 25, 52,186,194,233, 30, 90,141, 18,121,153,
+111,137, 65,253,186,240,167, 76,153, 4, 71, 71, 39,219,242,248,116, 60,254,236,233,115,122, 88,214,176,100, 35,248,209, 53,180,
+254,174, 31,248, 60, 54,178,243,212, 0, 1,188,143,189, 9, 80,102,136,140, 73, 66,171,134, 66,248,119,245, 18,159, 63, 19, 61,
+ 31,192, 50, 99,210, 75,166, 60, 3,199,189, 59,216, 6, 61,244, 89,209,160,114, 19, 1,145, 3, 84,132, 24,217,210, 68,188,123,
+112,214,168,119, 70,138,162,166,217,216,216,228, 46, 89,178,164,125,253,250,245,117, 83,167, 78, 13, 79, 76, 76,156,251,217,219,
+202,111,187,119,239,198,135, 15, 31, 36,107,214,172,185,155,149,149,181,180,138, 5, 29, 64,211,216, 86, 52, 20,151,117,225,194,
+133,230,247,238,221,155,189,109,219, 54,251, 25, 51,102,112,103,204,152, 49, 22,192,175, 21, 13, 23,230,243,120,157,215,220,191,
+ 79,147, 41, 41,154, 35, 59,119,114,119,133,134, 46,209, 81, 84, 77, 27, 59, 59,226,251, 86,173, 20, 66, 6, 35, 43, 59, 61,157,
+180,173, 91,151, 25,127,243,166, 53, 45, 16,164, 94,189,122, 53, 95, 46,151,151, 27, 58,135,201,100, 42,203, 26, 46, 44, 11,142,
+142,142,218,178,230,112, 85,208, 33,230, 83, 52,173,179,172, 83,135,238,218,169, 77,253, 15,209,177,177,124, 75, 75,166,123,125,
+ 55,207, 55,239,226,159,209, 6,131,154, 32,136,124,163,198, 74,152,204, 33,219,182,109,107,100,110,110, 14,138,162, 96, 97, 97,
+129,204,204, 76,104,181, 90,228,231,231, 67, 91,144, 7,109, 94, 30, 34, 18,227,209,182,125,123, 12,234,214,213, 43,232,194, 95,
+ 67, 12, 6,195,137, 10,199,243, 26, 55, 43,177,100,173,170,109,253,175,177,160,228,220, 18,209,181,161,153, 59, 56, 98, 49,186,
+204, 13,248,154, 7,253,213,229,203,151,175,244,239,223,191,199,252,249,243, 25, 82,169,244, 90,124,124,124, 91, 0,111, 43,186,
+ 72, 44, 22,215,203,202,202,130, 92, 46,135,133,133, 5,182,109,219, 6,123,123,123, 40,149, 74, 60,127,254,156,118,118,118, 38,
+238,222,189, 11,103,103,103,100,103,103, 67,167,211, 65,165, 82,165,105,181,218,114,135,203,139,134, 7,187,207,233,134,171,209,
+ 47, 15,183,115, 34,226,158, 15,158,231,247, 33, 58,226, 93,210,141,155,143,126, 37,213,252,228,220,148, 91,139,234,180,120,101,
+ 51,109,193, 74,252,190,105, 57,162,159,222,207,177,175,149,191, 75, 64,104, 14, 85,148, 94,133, 66,161,126,247,238,157, 89,120,
+120, 56, 8,130,128,133,133, 5,132, 66, 97,153, 98,171, 26, 96,148,182, 64, 41, 20, 10,112, 56, 28, 88, 91, 91, 99,255,254,253,
+ 37, 29,175,155,155, 91, 69, 28,127,116,233,210,101, 72,173, 90,181,204, 74,239,108,209,162, 5, 38, 77,154,132, 61,123,246, 32,
+ 52, 52,244,147,120,154,105,105,105, 82,189, 94, 95,209,125,231,166,167,167,119,235,215,175,223,203, 7, 15, 30,152,239,223,191,
+ 31, 36, 73,150,185,237,219,183, 15, 79,158, 60, 89, 6,224, 93, 53,235,209,119, 3, 6, 12,184,127,244,232, 81,203,204,204, 76,
+ 20,215, 13,133, 66, 1,131,193, 0, 79, 79, 79,130, 36,201,202,230,189, 49,152, 76,230,133,157, 59,119,246,158, 48, 97, 2, 88,
+ 44, 22,180, 90, 45,118,238,220,137, 69,139, 22,165, 23,189,148,234, 0, 44, 57,116,232,208,168, 62,125,250,160, 73,147, 38, 94,
+119,238,148, 63,179, 67, 46,151, 67, 46,151,131,205,102,195,193,193, 1,171, 87,175,134, 86, 91,216,172,120,120,120,148, 60,198,
+ 0,254,240,240,240,232, 29, 19, 19,179, 25,133,115,215,190,128,131,131, 67, 63,154,166, 39, 26, 12,134,130,118,237,218, 89, 31,
+ 63,126,220, 76, 34,145,224,229,203,151, 88,182,108,153,140,162, 40, 3, 69, 81,132, 74,165,138,179,179,179,123,201,227,241, 4,
+ 74,165, 50, 39, 59, 59,123, 45,128,107,255, 84, 79, 78, 16, 4,193,102,179, 49,110,220, 56,176, 88, 44, 8, 4, 2,168,213,106,
+232,245,250, 18, 49,143, 42, 14, 75,215,175, 47,182,102,129, 51,193,202,172,193,236, 65,179,122,217, 58,214,116,130,165, 57, 15,
+ 81, 81,111,219,222, 14,185,185,147,203,138, 14,164,180,250,192,232,132,188,191, 61,216,253,231, 90,228,191, 84,104,125, 17,243,
+144, 85,118, 97, 14, 50,208,244,233, 44,137,132,171,227,114,133, 49,197, 86, 46,123,123,101, 62, 65, 12, 50,216, 54,236, 11, 82,
+167, 47,106, 40,232,162,205, 72,161,165, 55,224, 67,116, 36, 30,220,248, 11, 54, 74, 9,178,226,154, 2,156, 70,208,170,242,160,
+214,234,138, 68,137, 1,225, 47, 67,144,159,151, 3,111,159, 94, 0,131,241,164, 60, 62, 11,107,162,215,247,205, 27, 51, 63, 36,
+ 69,162,133,199, 64,212,117,110,135, 68,105, 62,114,229, 26,200,242,213,104,234, 29,128, 76,153, 10,249, 74, 53,222,126, 8,130,
+ 83,205,186, 12,130, 21,219,201, 88,161,165,121,123, 14,154,119, 23,193,113,109, 11,174,103, 31, 48, 93,125,145,244,250, 14,194,
+175,110, 69,202,155,135,160, 41, 3, 28, 61, 90, 26,251,144,236,188,118,237, 90,203,182,109,219,178, 58,119,238,220,228,202,149,
+ 43, 77,164, 82,105,120,145,192,104,210,185,115,231, 38,182,182,182,216,190,125,187,138, 32,136,157,213, 44,236, 18, 11, 88, 70,
+ 70,198, 51, 0,107,206,157, 59,183,115,210,164, 73,176,179,179,107,148,154,154, 90,238,133,153,108,118,147,209,107,215,210,108,
+ 38,147, 62,241,251,239,156,149,215,174,109, 57,120,232, 16,167, 99,135, 14, 4, 77,211, 8, 11, 11, 19,110,248,253,119,225,240,
+190,125, 19, 18, 51, 50,200,123,161,161, 58,105, 74, 74, 65,134, 66,177, 82, 42,149,166,253, 19, 53, 91,175,215, 63,142,139,143,
+115,242,105,213,212,246, 85, 84,220, 27,255,142,223,127,207, 96, 48, 24,209,177,137,161,182,182,230,194,155, 55,110,234,244,122,
+253, 99, 99,184,120, 60, 94,175,142, 29, 59,178,100, 50, 25,106,214,172,137,204,204, 76, 72, 36,146, 66,139, 67,158, 12,186,188,
+ 60,232,243,115, 97, 80,200, 17,247,252, 25,154,214,173,195, 59,205,227,245, 82, 42,149, 21, 10,173,226,183,204,178, 2, 93, 23,
+239,227,154,153,129, 43, 22,131,168,250,176, 97, 95, 75, 75,203, 69,185,185,185, 87, 0,172,214,233,116,211, 23, 45, 90,212, 98,
+199,142, 29, 54,107,214,172, 49,159, 56,113,226,105,185, 92,222, 20,133, 65, 85,203,235,192, 62,146, 36,105, 13,192, 62, 36, 36,
+ 4,118,118,118,200,203,203, 43,182,180,104,149, 74, 37, 63, 59, 59, 27, 26,141, 6, 90,173, 22,230,230,230,120,241,226, 69, 14,
+ 73,146,151, 42, 75,156,121, 61, 98,181, 70, 23,181,212,218, 75,148,170, 35,173,252, 50,114, 40,217,138, 45,210, 85, 0,182,116,
+171, 91,119,159,142,186, 31,247, 62,242,146, 85,252,243,187, 57,169,239, 21,117,247, 95,137,171,104,142, 22, 13,128, 34, 8,130,
+246,240,240, 64,102,102, 38,152, 76, 38,132, 66, 33,196, 98, 49, 22, 47, 94,140,157, 59,119, 86, 71,104,241, 69, 34,209, 90, 6,
+131, 49,132,193, 96,216, 26, 12, 6, 4, 4, 4,160,119,239,222,224,114,185,208,233,116, 37, 22,205, 98, 43, 85, 37,150,142,176,
+ 39, 79,158,152, 63,121,242, 73,179,213,193,198,198,230,182, 70,163, 65,108,108, 44, 46, 92,184,208, 30,192,189, 42,150,117,108,
+ 88, 88, 88, 55, 95, 95,223,195,205,155, 55,175, 71,211, 52, 26, 53,106,132,161, 67,135, 34, 40, 40, 8,225,225,225,200,203,203,
+163,110,222,188,121, 16,192,230,170,246,225, 69,249,235, 57, 96,192,128,135,199,142, 29,179,202,206,206,134, 74,165,130, 66,161,
+192,233,211,167,209,182,109, 91,216,216,216,224,232,209,163, 36, 77,211, 21,149, 61,131,193, 96,236, 15, 12, 12,236, 61,126,252,
+120,236,218,181, 11, 39, 78,156, 64,159, 62,125, 48,100,200, 16,100,102,102,218,111,218,180,105, 84,209, 48,225,242,161, 67,135,
+ 66, 46,151,227,249,243,231, 81, 70, 62,243,200,205,205, 69,110,110, 46, 4, 2, 65,233,103,140, 0, 16,180,117,235,214, 97,179,
+103,207, 70,221,186,117,151,199,197,197,109, 69, 25,171, 68, 41,138,154, 44,145, 72,172, 88, 44,150, 53, 73,146, 72, 78, 78,198,
+139, 23, 47, 48,109,218,180,156,156,156,156, 73, 0, 18, 1, 44, 25, 55,110,220,234,185,115,231,150,212,165,185,115,231, 6, 95,
+185,114,165,219,191,219, 24, 35, 46,110, 0, 0, 32, 0, 73, 68, 65, 84,154,227,225, 97,217,144,203,228,205,146, 21, 48,173,101,
+ 50, 89, 73,219,161,213,106,161,209,104, 62,177,100,113, 56,108,235, 22, 77,107, 93, 86, 41, 11,126,126,251, 62,183,220, 0,233,
+ 94,245, 44, 26, 11, 69, 22,179,219,182,235, 56,162,107,183, 31,153,164, 94,143,235,215, 47,225,207, 63,119,163,131,175, 7,234,
+214,111,132, 25, 51,103, 89,104,180,100,192,205,155,215, 22, 89, 62,121,112,173, 32, 63,119,113, 69,156,255,227,184, 92, 36,174,
+ 46,151, 57,116, 88,150,130, 44,114,225, 32, 43,250,105, 99,101,101,245,187,193, 96,232, 96,110,110, 14, 42, 55, 6,111, 95, 60,
+ 69,142,140, 13,141,202, 0,138, 46, 20, 91, 70, 9, 23,141, 22,247,175, 95,196,182,173, 91,144,157,157, 13,223, 31,218, 67,206,
+114, 65, 45,151, 90, 80,171,148, 69, 15, 13,160,211,234, 97,107,239,138, 87,175,194,245,249, 10, 69,185, 13, 18,135,175,243,170,
+101,239, 1,141,174, 13,248, 92, 46,242, 10,180,144, 21,137,172,163,103, 6, 67,163, 84,129,212,234, 64,106,245,176,173, 53, 0,
+223,217,119, 4,101,184,212,176, 74,217, 71, 25,160,139,191, 15, 93,252,125, 8,218,204,196, 95,235,134,125,214,145, 26, 23,119,
+ 55, 51, 51, 51,227,205,155, 55,151,194,194,194,250, 13, 30, 60, 24,119,238,220,153, 8, 96, 74,209,240,205,196,193,131, 7, 35,
+ 44, 44, 12,111,222,188,185,148,153,153,153,241, 45, 74,158,203,229,170, 52,154,194, 62, 86, 40, 20,242, 43, 57,215,169, 69,255,
+254,140,188, 87,175,242,183, 62,122,180,124,223,254,253,156,206,157, 58, 17,122,146, 4,101, 48,160,190,187, 59,209,181,107, 87,
+ 81,208,169, 83,214, 76,189,254,201,130,233,211, 67,246,140, 28, 89,240, 76,161, 48,118,162,121,237,162, 33, 67, 0,168, 93,193,
+ 62,163,161,209,104,118, 76,158, 48,166,243,189,251, 15, 93,106,185, 56,153, 95,191,121, 47,156, 39,224, 50,234,186,213, 99,202,
+242,114, 88,171,150,255, 44,208,104, 52,198,138, 86, 47, 27, 27, 27,164,165,165,225,195,135, 15,208,104, 52,208,235,245,160,148,
+ 10,104,101,185,208,230,229,128, 80,171,192, 51, 24,160,206, 74, 71,237,186,117,128,127,173, 72,172,116, 40,170, 44,161, 85,252,
+201, 55, 55, 7, 71, 36, 6,131,205, 54, 58, 56, 58,128,230, 45, 91,182, 60,117,246,236, 89,206,216,177, 99, 91,221,186,117,235,
+119, 0,137, 18,137,164,211,178,101,203,158,253,254,251,239,188, 73,147, 38,121,110,222,188,121, 20,128, 63,202, 35, 81,171,213,
+167, 46, 95,190, 60,220,213,213,213, 62, 34, 34, 2,106,181, 26, 20, 69,161,123,247,238, 64,225,220, 26, 0, 64,116,116,180, 74,
+173, 86,103, 68, 70, 70,230, 39, 38, 38,234, 96,196, 42,193, 21, 59,164,143,243,211,238,247,183,119,112,122,194, 23,212,118,163,
+229,175,250,205, 25,232,180,105,235, 25,137,250, 90,108,108,193,210, 46,117,214, 43, 10, 94, 79,179,116,150,239,186, 22, 28,103,
+204, 68,248,146,213,133,214,214,214, 96,177, 88, 96,179,217,224,112, 56, 32, 8, 2, 51,103,206,196,222,189,123, 43, 27, 58,252,
+ 68,100,153,153,153,189, 89,185,114,165,243,164, 73,147, 56,124, 62, 31, 50,153, 12, 71,143, 30,197,184,113,227,240,231,159,127,
+150, 57,255,197,136, 33,165,207,173,165,179, 71,142, 28, 9,173, 86,139,161, 67,135, 98,223,190,125,179, 13, 6,195,189,106, 60,
+210, 79,194,195,195,221,195,195,195,205, 1,244, 25, 50,100,200,161, 1, 3, 6,224,222,189,123,184,116,233, 82,123, 20, 46,250,
+ 80, 1, 88, 7,192,174,232,179,162,231, 83,100,111,111,191,155,162,168, 62,182,182,182,225, 30, 30, 30,222,199,142, 29,179,204,
+200,200, 40, 94,252,128,248,248,120, 28, 56,112, 64,186,127,255,254,124,131,193, 96,205, 96, 48, 46,231,230,230, 46,174, 64,176,
+237,223,186,117,235,152,162,225, 64,156, 61,123,150,222,178,101, 11,177,108,217, 50,200,100, 50,116,232,208, 1,129,129,129,179,
+228,114,121,147, 45, 91,182, 76, 24, 52,104, 16, 86,173, 90, 5,133, 66,177,181,178,151,149, 10,196, 23, 1,224,251,173, 91,183,
+186,206,158, 61, 27,103,207,158, 69,243,230,205, 5,113,113,113,123, 0,140, 47,171,252,104,154, 70, 92, 92, 28,148, 74, 37, 30,
+ 62,124,136,229,203,151,203, 74,137,172, 89, 83,166, 76, 89, 61,107,214, 44,172, 93,187,150,142,136,136,200, 24, 48, 96,128,253,
+222,189,123,153,245,235,215,159,165, 84, 42,255,109, 66,203,179,126,141,245, 45,154,183, 91,228,232, 84, 31, 71,143, 29, 71, 78,
+ 78, 78, 73,158, 20,231, 11, 77,211, 40, 40, 40, 64, 90, 90, 26, 44,204,205,176,105,243,234, 30, 83, 39,142,113, 65,161, 27,140,
+ 47, 77,150,117,173, 54, 15, 24, 50,118,222,208,225, 99, 16, 17,254, 18, 65,135,254, 64,100, 68, 88, 9, 31,169,215, 33, 38,234,
+ 5, 98,162, 94,192,222,193, 21, 93, 59,183, 39,134, 13, 27,214,125,228,240, 33,182, 0,254, 54,215, 17,255,197,214, 44,224, 75,
+ 63, 90,123, 63, 17, 90,149,152,235,108,172,172,172,222,156, 60,121,210,218,215,215,151, 73,146, 36,174, 93,191,142,105, 83,126,
+194,168,145, 1,208,193, 10,164,150, 3,138,195, 55, 42, 37, 42,149, 18, 52,104, 40, 20, 10,132,134,134,130,166, 72, 4,237,221,
+ 2,154,166, 74,132, 22, 64, 67,171,211,193,169,150, 39,118,239, 91, 67,130,205,126, 6,125,217,174,107,242,179,153, 6, 61, 73,
+ 67,146,145,132, 36,105, 36, 44,204,106,129,197,174,133,236, 92, 37, 88, 12, 7,232,213,209, 48, 20, 93,171, 84,164, 64,165,251,
+186,242, 51,148, 97, 61,165,171,208,232,170, 84,170, 35, 71,142, 28,233,241,219,111,191,113,123,246,236,233,113,230,204,153,239,
+ 1,160,103,207,158, 30,230,230,230, 56,114,228,136, 86,165, 82, 29,249,134, 22,159,142, 45, 91,182,132, 76, 38, 67,124,124,124,
+120,133,247,166,213, 90,139,237,236,152, 25,119,238,232, 51,101, 50,151,142, 29, 59, 18,122,146, 4,131, 32,144,147,151,135,196,
+132, 4, 88, 90, 90, 18,111,162,163,197, 59,103,204, 56,239,225,237,205, 42, 94,145,104, 12, 46, 93,186, 36, 68,225,188,172, 10,
+247, 85, 17,138,140,244,180, 49,211,167, 79, 63,127,228,200, 81,139,244,140,244, 24, 30,151, 75,138,197,252,154, 35, 71, 76,101,
+229,230,230, 14, 7, 32, 55,150, 76, 38,147, 33, 46, 46, 14, 2,129, 0, 28, 54, 27,148, 74, 9,131, 66, 14,117, 78, 38,152, 58,
+ 45,184, 6, 3,106, 8,121,112,177,183, 71, 45, 91, 27,163, 56, 63,220,190, 81, 50,241,189,244,112,225,166,150, 94,224,138,196,
+224,154,137, 49, 53,248,110,209,219, 40, 7, 88,246,171, 49,180, 54, 78, 78, 78,127, 29, 59,118,140,147,153,153,137,176,176,176,
+112, 0,121, 0,204, 0, 80, 81, 81, 81,183, 34, 35, 35,123, 21,173,186,171,108,181,216,150,115,231,206,117,241,245,245, 37,221,
+220,220, 68, 25, 25, 25, 46, 50,153,140,146, 74,165,159,152,132,110,220,184,193, 43, 40, 40, 80, 80, 20,117,190, 72,100, 85,234,
+191,104,206, 64, 39,126,232, 43,204,244,243,175,221,200,220,166, 49,114,200, 87,141,158,132, 75,103,206, 25,232,180, 99,235, 25,
+137, 90, 64,104, 14, 17,134,100, 23, 22, 95,109,236, 36,102, 26, 40,156, 43, 21, 26, 26,138,196,196, 68,196,197,197,125, 34,168,
+ 38, 78,156,136,160,160, 32,163, 44, 90, 34,145,104,237,138, 21, 43,156,103,207,158,205, 41, 37,138, 48,125,250,116,228,229,229,
+ 97,223,190,125,152, 62,125,122,149, 59,254,207, 80,167, 99,199,142, 61, 29, 29, 29,145,157,157, 13, 7, 7, 7,248,250,250,246,
+190,119,239,158, 27,128,248,106,214,251,169,254,254,254,171, 87,174, 92, 9,189, 94,143,113,227,198,225,253,251,247,167,222,191,
+127,191,173, 86,173, 90, 51, 23, 46, 92,104,111,111,111,143,193,131, 7,139, 72,146,236, 95, 30, 73,141, 26, 53,214,253,241,199,
+ 31,195,123,246,236,201,208,233,116, 63,220,190,125, 27, 9, 9, 9,208,106,181, 32, 73, 18, 31, 63,126,196,244,233,211,165, 69,
+171, 27, 63, 26,145,174,177, 75,150, 44, 25, 51,115,230, 76,108,216,176, 1, 43, 86,172, 56,104, 97, 97,225,221,180,105,211,102,
+ 43, 86,172,192,130, 5, 11,224,234,234, 10,107,107,235,239,150, 45, 91,230, 53,119,238, 92,236,216,177, 3,203,151, 47, 63, 8,
+224, 64,117, 50,130,162, 40, 98,253,250,245, 77,182,110,221,234, 88, 44,178, 24, 12, 6, 78,158, 60,137, 87,175, 94,245,142,141,
+141, 45,235,154, 64, 7, 7,135,137,142,142,142,220,155, 55,111,138, 93, 93, 93, 65,146,164,190, 72,100,237,172, 85,171,214,180,
+143, 31, 63,162,103,207,158,136,141,141, 61, 2, 96,148,133,133,133, 98,238,220,185, 66,129, 64, 96,161, 84, 42,255, 93,157, 55,
+152, 12, 98,244,218, 85, 11,240,252, 85, 52,206,157,227,224,249,243,231,176,183,183, 7,143,199, 3, 77,211,208,104, 52,200,204,
+204,132, 94,167, 65,163,134,117,112,120,255,122,100,100,100, 2, 12,162,220, 41, 55, 4,131, 24, 49,230,167,126,120,240,240, 58,
+246,236,249, 3,114,185,162,156,151,111, 62,234,123,120,193,169,166, 29,146, 83,146, 65, 48, 96,243,119,222,235,127,249,208, 97,
+ 73, 19, 4, 99,220, 59,148,134,165,165,229,182, 19, 39, 78, 88,119,232,208,129,169, 80, 40, 64, 81, 20,218,249,250, 98,230,236,
+217,184,116,236, 24,220, 91, 13, 5,161, 21,131, 20, 26,183,234, 65,173, 82,162, 65,179,239, 49,104,240, 16, 36, 37, 38,194,191,
+215, 0,168,213,202,146, 55,140, 98,139,150, 86,171,131,141,157, 11,110,220,184,193,196,184,113,111,177,179,108,163,132, 65,199,
+125, 29,243, 81,221, 54, 87,245, 10,161,207,131,160,211,232,208,168,209, 50,232, 40,107,216, 57, 79,132, 94,127, 1,249,153,183,
+ 11,135, 49,172, 59, 32, 37, 41, 9, 12, 38,231, 77,117,115,144, 82,100,126, 85,163,155,151,151,151, 23, 23, 23,119, 38, 52, 52,
+116, 68,255,254,253,113,227,198,141, 9, 0,208,191,127,127,132,134,134, 34, 46, 46,238, 76, 94, 94, 94,222,183, 40,109, 71, 71,
+199, 62,237,219,183, 31,218,162, 69, 11, 4, 7, 7,131,166,233, 7, 70, 61,216,108, 54,205, 96, 48, 64, 81, 20, 8, 0,217,185,
+185,120,255,254, 61,178,179,178,160,215,235,161,144,203, 41, 47, 15, 15, 57, 77, 81,102, 85, 73, 79,233, 21,134, 40, 99,213, 97,
+241,190,106,220,106,226,179, 39,143,146, 10,228,114, 91, 43, 75,171, 2, 46,151,107,144,229,230,230,189,125, 19,161, 53,178,115,
+ 40, 70, 84,100,100,164,119,106,106, 42,146,146,146, 64, 42, 10,192,212,104,193,208, 40,209,233,251, 54, 16,128, 6, 31, 20,216,
+148, 30,108, 38, 27, 5,133,171,243, 42, 29,238, 48,148,122, 73, 40, 22, 89, 4, 65, 20, 14, 23,138, 68,224,138,205, 62,177,112,
+ 25, 83,159,120, 60,222,177,211,167, 79, 59, 58, 57, 57, 97,213,170, 85,112,118,118,254,174,102,205,154, 74, 11, 11, 11,129,189,
+189, 61, 26, 52,104,128,239,191,255, 30, 87,175, 94,133, 17,121, 64,210, 52,221,245,193,131, 7,243, 30, 61,122, 52, 72, 36, 18,
+ 17, 51,102,204, 96,117,239,222, 29, 60, 30, 15, 74,165, 18, 50,153, 12,199,143, 31,207,162, 40,170,120, 81,138,181, 80, 40, 60,
+ 64, 16, 68,188, 66,161,152,253, 57,225,225,223, 26,213,204,200,161,198,209,114, 97, 63, 63,255,218,141, 58,250,119, 70, 29,247,
+142,232,232,159, 4, 0,235,107,176, 18,134,110, 92, 98,121,222,210,140, 56,112,227,218,205,229,190,126, 29,151, 44,146,223, 89,
+189, 97,111,110,165,243,233, 8,130, 0, 69, 81,159,248, 14,250,252,248,168, 81,163,112,242,228,201, 74,243,145,193, 96, 12,153,
+ 52,105, 18,231, 51,203, 51, 36, 18, 9,122,245,234,133,254,253,251,127, 34,180,108,108,108,224,224,224,128,132,132, 4, 0,200,
+ 54,178, 94,205, 28, 59,118, 44,161, 82,169, 48,126,252,120,236,219,183, 15, 67,135, 14, 37,238,221,187, 55, 19,192,236,170, 86,
+118, 6,131,177,105,225,194,133,243,166, 79,159,142,156,156, 28, 92,185,114, 5,221,187,119,199,201,147, 39,109,175, 92,185,178,
+182, 67,135, 14, 96, 50,153, 8, 14, 14, 6, 73,146, 21,250,250,226,112, 56,125,122,246,236,201, 72, 78, 78, 6,135,195,129,143,
+143, 15, 82, 82, 82,160, 84, 42, 33,145, 72, 48,107,214,172,180,236,236,236,246,198, 62, 71, 28, 14,103,246,204,153, 51,113,226,
+196, 9, 4, 4, 4, 28, 2, 48, 62, 47, 47,111,208,163, 71,143, 78,244,237,219, 23, 18,137, 4,231,207,159,199,242,229,203,137,
+ 81,163, 70, 97,215,174, 93,152, 53,107,214,193, 34,171, 83,121, 21,191, 32, 35, 35,195,162, 94,189,122, 72, 79, 79,135, 92, 46,
+199,249,243,231,237,174, 94,189,234,230,228,228,100, 30, 23, 23,103,248,245,215, 95,185,179,103,207,198,182,109,219, 16, 22, 22,
+134,160,160, 32,116,236,216,145,140,141,141, 45,211, 74, 86,228,178,225, 60, 77,211, 55, 69, 34, 17, 10, 10, 10,138,159,187,249,
+ 1, 1, 1,211,215,173, 43, 52,178,167,166,166, 98,244,232,209, 35, 67, 66, 66,168, 14, 29, 58, 8, 57, 28, 14,212,106,181,226,
+223,217,107, 83, 6, 10, 0, 5, 55, 23, 49,174, 95,218,143,151,225,177,120, 25, 30, 9, 46,175,112, 18,188, 74,165, 68,179, 70,
+245,209,202,167, 37, 82,165, 18, 28, 9,218,143, 26, 54, 78, 21,182, 35, 52, 77,131,195, 50,192,203,195, 1,199,130,254, 64,240,
+149, 16, 4, 29, 57, 94, 50,231,141,197, 98,163,105,179, 86,240,241,241, 69,108,220, 71,236,223,191, 7,182,118, 46,166,193,193,
+106,162,100,232,176,244,231,103,202,191,163,175,175, 47, 83, 46,151, 67,173, 86, 35, 45, 45, 13, 9, 9, 9,176,180,178, 68,108,
+106, 60,218, 11,117, 72,163,242, 17, 21,254,198, 64, 48,217, 97,149,253, 97, 79,191,166,128, 95, 83, 76, 27, 59,180,130, 87, 86,
+ 26, 34,115,155,194,161, 27,146,252,128, 29, 59,200,242,132, 22,105,208,223,186,126,243,118,203,177,163,250,176,111,220,222, 7,
+189,150,130, 74,111, 1,133, 90, 11,133,142, 13,134, 69,119, 32,235, 30,152, 44, 30, 90, 55,169,143,243,231,174,234,104, 82, 31,
+ 98,116, 6,217,123,131, 76,143, 44, 37,180, 50, 62, 27,119,168, 97,244,208, 97, 73,199,107, 48,156, 60,122,244,232,143,109,218,
+180, 17,118,232,208,161, 94, 81,199,169, 59,122,244,168,178,200, 25,102, 85,241,137, 55,120, 7, 7,135,102, 28, 14,103,104,247,
+238,221,155,141, 25, 51, 6,111,223,190,197,145, 35, 71, 98,234,215,175,127, 71, 42, 45,127, 69, 54,147,203,205,150,103,100, 88,
+138,221,220, 88, 86,102,102,169, 87,175, 92,113,237,220,165, 11,145,148,148,132,236,236,108,168,213,106,132,133,135,211,108, 38,
+ 51,133, 48, 55,103, 68,191,122,197, 96,114,185,217,229, 89, 27,203, 64, 66, 37,171, 14,215, 85,215,186,229,226,104, 85,111,121,
+192,228, 58,106,141,218, 59, 63, 63,159,100,177,217,108,103, 7,203,196,232,143,198,183,137, 26,141, 38,248,214,173, 91, 63,118,
+238,220,153, 23,243, 58, 12,100, 94, 30,180,121, 50,112, 40, 3,106, 52,107, 2,166, 78, 3,104,245,112,242,162,161,206, 21,226,
+222,211,104,189, 70,163,169,212,169, 97,177,208, 98,124, 38, 12,184, 98, 49,120,102,230,224,137,197,159, 11,134,202,222,228,132,
+ 93,187,118,237,212,186,117,107,208, 52,141,189,123,247, 66,167,211,113,117, 58, 29,180, 90, 45,116, 58, 29,242,243,243, 17, 20,
+ 20,132,221,187,119, 63, 2,112,208,136,219, 39, 5, 2, 65, 95,130, 32,236, 88, 44,150,210,214,214, 86,116,242,228,201, 18,119,
+ 19, 77,155, 54,133,153,153, 25, 7, 69, 78, 33,237,236,236,216,127,254,249,167,101,239,222,189,239,151, 57,220,209,232,187, 5,
+117, 72, 43, 63,190,160,182,155,185, 77, 99,212,113,239, 8, 0,232,210,107, 44,234,212,175,133,252,172,215,110,106, 85, 66, 63,
+ 14, 75,102,245,102,135,228,173,160,167,247, 24, 69,198,221,247, 40,123,121,127,153, 29, 5,131,193, 40,119, 56,214, 24,145, 85,
+168, 89, 24,182,197,243,124, 0, 32, 59, 59, 27, 82,169, 20, 81, 81, 81,240,244,244, 68, 78, 78, 14,156,156,156,160,213,106,209,
+162, 69, 11,168, 84, 42,108,221,186, 21, 15, 31, 62,124, 4, 96,150, 17,255, 33,112,119,119, 31,221,172, 89, 51, 92,185,114, 5,
+207,159, 63,151, 92,191,126,221,201,215,215, 23,110,110,110, 99,226,227,227,127, 46, 26,234, 51, 22, 34, 95, 95,223, 25,211,167,
+ 79, 71,100,100, 36, 38, 79,158,156,157,156,156,124,254,212,169, 83,227,151, 47, 95,206,240,247,247,135, 84, 42,197,166, 77,155,
+ 12, 15, 31, 62,220, 12, 96, 85, 37,249,248, 46, 57, 57,217, 89,173, 86, 35, 39, 39, 7, 36, 73, 66,169, 84,226,234,213,171, 8,
+ 10, 10, 74, 47, 18, 89, 31,140, 77, 92,147, 38, 77, 26, 48, 24, 12,156, 56,113, 2, 0,150,162,208, 99,255,249,126,253,250, 73,
+126,253,245, 87,167,197,139, 23, 99,194,132, 9,208,233,116,216,176, 97, 3, 22, 47, 94,124,185, 72,100, 85,212,136,254,230,224,
+224, 48,113,242,228,201,223,205,157, 59, 23,161,161,161,118, 47, 94,188,240, 9, 11, 11,131,139,139, 11,178,179,179, 89,214,214,
+214,216,182,109, 27,230,204,153,115, 22, 64,214,227,199,143,135,196,197,197,173, 3,176,169, 18,209, 30,232,228,228, 52,145,166,
+105, 90,169, 84, 38, 4, 4, 4,108, 90,179,102, 13,230,204,153,131, 55,111,222, 32, 47, 47, 15,102,102,102,196,194,133, 11, 71,
+ 47, 93,186, 20,227,198,141,163, 21, 10,197,238,127,119, 71, 77,211, 6, 40,101,145, 48,104,172,208,180,145, 39,154,122,215,198,
+245,219, 47, 1, 0,157, 6,248, 66,169, 40,192,161, 67,123,241,225,195,123,176,216,108, 88,214,112, 48,198, 18, 8,109,254, 59,
+228,234,164,232,220,193, 7,221,253,219,227,224,225,147, 32,245, 58,140, 31, 59, 28,178,220, 92, 28, 62,188, 31,177,113, 31,193,
+ 98,179, 97,109,243,247, 59, 66,173, 72,139,252,215, 11, 45, 35,134,159, 64, 81, 20, 36, 18, 9, 94,188,120,129,248,248,120, 8,
+133, 66,168, 72, 3,181,231,214, 67,138, 32, 56, 41, 20, 77, 63,162,201, 18, 47,197, 95,114, 24, 12,146, 82, 30,107, 45,172,172,
+172,184, 26,141, 10, 36,169, 47,213,171, 16, 0, 1,112, 88,128, 99,205, 58, 72, 78, 74,166,213,106,245,221, 10,223,160, 52,234,
+109, 23,207,159,158,254,125, 91, 95,155,238,157, 86,226,252,133,101,144,229,231, 67,173, 99, 67,161,214, 65,169, 6, 44,107,120,
+160, 69,163,198, 72, 77,205,198,235,231,247,228, 44,141,210,152,137,162,239,119, 46, 25,235, 62,118,218, 2, 8, 92,219, 66, 19,
+117, 30,148, 60,189,196,162,197, 23, 91,161, 70, 45, 47,228, 42, 52, 56, 29,242, 18,168, 66,168,151,140,140, 12, 37,147,201, 60,
+ 58,125,250,244, 13, 47, 95,190,112, 6,128,151, 47, 95,166, 72,165,210, 69, 25, 25, 25, 85,181, 73, 23,123,131, 39,248,124,193,
+203,250,245,235,167,250,248,248, 88,244,235,215, 15, 54, 54, 54, 8, 11, 11,195,186,117,235,222,233,116,186, 5,247,238,221,171,
+112,168, 71,171,213, 74, 94, 94,184, 96,222,254,167,159, 44, 23,244,238,189,105,250,244,233,219, 86,173, 90,197,118,119,119, 39,
+244, 58, 29, 34, 34, 34,232, 99, 71,143,234,119, 47, 94,188,149, 43, 18,177,158, 93,188,200, 38, 53, 26,201, 63, 93,137,157,156,
+156,252,124,127,104,231,181,249,183, 29, 80,171,228,120, 26,122, 25, 50, 89, 38,254,216,123,206,203,201,137,246,147, 72, 36,247,
+140, 21,192, 7, 14, 28,152,215,170, 89,179,102,117, 93, 92, 16,145, 24, 15, 46,101, 0,135, 36,193,212,105,192, 32,213,112,241,
+166, 65, 48,204, 32, 77,203,199,154, 19,103, 34,141, 17,198,223,245,232,131, 85, 41,121, 32, 8, 2, 91,218,120,131,107, 38, 6,
+ 71, 36,198,212,191,110,151, 8,131,224, 85,139,193, 21,139, 81,175,149, 81, 14,225,149,119,238,220,121, 17, 17, 17,209,194,219,
+219, 27,243,230,205, 67, 66, 66, 2, 40,138, 66,122,122,186, 90, 42,149, 74, 50, 51, 51, 19, 80,232,255,103, 95, 37,157, 88,105,
+213,225,116,239,222,189,146,225,134,144,144, 16,212,172, 89, 19, 22, 22, 22,200,207,207,199,164, 73,147, 44,127,249,229, 23, 0,
+192,139, 23, 47, 80, 90,160,124,142,136,151, 81,155,115, 11,104, 25, 45,127,213, 47,135,124,213,168,163,127, 50,186,244, 26,131,
+155,193, 7,113,251,250, 45,212, 96, 37,196, 67, 84,112, 53, 43, 62, 43, 63, 69,225, 30,232,213,124, 60, 83,170,184, 30, 56,163,
+ 79, 12,211,209,145, 58,189,120, 79,126,110, 69,105,117,119,119,135,189,189,125,201, 28, 45, 22,139,133,113,227,198,129,166,105,
+ 99, 69, 86, 81, 95, 67,101,170,213,106,123, 62,159,143,180,180, 52,124,252,248, 17,177,177,177, 37,174, 3, 40,138,210,207,159,
+ 63,159, 61, 99,198, 12,236,217,179, 7,119,239,222,125, 4, 96, 37, 0, 99, 95,214,134, 15, 30, 60,216, 76,171,213,226,248,241,
+227, 36,128, 94,167, 79,159,126,209,162, 69, 11, 86,183,110,221,204,118,237,218, 53,188,168,140,140, 22, 90,230,230,230, 28,157,
+ 78,135, 93,187,118, 33, 57, 57,217, 15, 64,212,179,103,207, 2, 7, 15, 30,188,219,219,219,187,126,100,100,228,123,185, 92, 62,
+ 21,192,235,202,200,210,211,211,199,250,248,248,156,166, 40,202,181,115,231,206,162,223,126,251,205, 60, 58, 58, 26,206,206,206,
+160, 40, 42, 2, 85, 12, 97,245,254,253,251, 40,169, 84,234,213,190,125,123, 92,189,122,117,189,193, 96, 88, 11, 96,195,148, 41,
+ 83,156, 18, 19, 19,209,172, 89, 51,212,168, 81, 3,209,209,209, 5, 82,169,116, 55, 10, 67, 18, 85,102,194,141, 3,176, 40, 48,
+ 48,176,113, 96, 96,224,208, 26, 53,106,180, 14, 11, 11,195,131, 7, 15,176,121,243,102,252,242,203, 47,104,215,174, 29,230,205,
+155,151, 5, 96, 40, 0, 50, 46, 46,206, 40,191,121,197,150, 45, 0,104,222,188,121,234,186,117,235, 48,126,252,120,250,207, 63,
+255,220,126,244,232,209,217,195,135, 15, 47,233, 3, 71,143, 30, 77, 31, 57,114,100, 52, 10,195, 48,253, 59,161,215,233,180, 48,
+175, 81, 7,242,220, 36,100, 38,135, 66,104,230, 0,255,142, 77,160, 84,105,113,233,226, 89,188,142, 8, 7,131,193,128,189,131,
+ 11, 44,173,108, 16, 19,243, 30,168,120,181,177, 94,167,211,193,204,170, 54,228,121,201,208,102,188,132, 64,108,135, 49, 63,245,
+131, 82,165,195,185,243,103, 17, 25,249, 26, 76, 38, 19, 14,142, 46,176,176, 44,228, 36,232,138, 87, 48,155, 0,160, 12,127, 90,
+149, 10, 45, 38,147,121,231,218,181,107, 3, 91,181,106,197,250,240,225, 3, 62,124, 40,124,185,145,201,100, 36, 1,195,153,140,
+136,139,195, 42,184,188, 51,138, 86,103,148,142, 93, 40, 54, 51,147, 68,191,139,178,151,229,164, 35,252,213, 67,124,136,137, 64,
+124,108, 20,116, 58, 53,152, 12, 6, 24, 76, 6,106,215,105,136,135,143, 66,181,106,146, 12, 45,143,179, 48, 29,177, 5, 34, 59,
+247, 33,171, 87,253, 28, 60,103,193, 10,193,160,129,123,240, 58,250, 45,228,164, 3,104, 26,112,176, 22,161,105,221,133,144,164,
+102,226,196,193, 93, 74, 74,167, 27,241,153, 15,173, 47, 56, 1,192, 62, 11, 13,118,239, 61, 56,110, 95,208,177, 21, 11,102, 76,
+178,239,219,127, 4,184, 57,111,161, 79,125,137, 58, 45,186,131,224, 89,226,202,141,219,184,247,226,109, 58,101,160, 87,216,103,
+227,207,152, 74, 56, 75, 35, 55, 55,247,113, 90,154,212,185,148, 23,120,103, 30,143, 95,217,234,184,207, 57, 63,241, 56,207,100,
+ 50,154,175, 94,189, 90,111,111,111,175,139,140,140,196,158, 61,123,168,151, 47, 95,222, 96, 48, 24, 59,165, 82,169,186, 50, 78,
+ 91,189, 62,252, 88, 64, 64,131,150,253,251,211,195,102,204, 80,130,199,155,185,105,203,150,128, 76,153,172, 38, 77, 81,176,173,
+ 81, 35,101,211,226,197,235, 6, 14, 30, 44,123,243,240,161, 32,244,194, 5, 1,151, 36, 95, 26,145,206,111,129,114, 57, 37, 18,
+201,189,187,119, 31,224,208,190,223,160,211,105, 32,149, 36, 2, 0,178,178,243, 80,137,200,250,156,147, 86, 42,149,253,151,254,
+242,203,147,165,115,102, 59,252,208,169, 51,146,194,195,160,203,201, 4,161, 39,193, 38, 88, 80,100, 8,145,145, 46,199,162, 35,
+167, 50,228, 74,101,255, 50, 58,137, 50,211, 89,108,177,226,153,155,129, 35, 18,131, 43, 54,251,196,138,197, 55, 55, 7, 87, 36,
+ 6,139,203, 45,107, 2,247, 23,156,114,185,124,192,192,129, 3, 95, 63,123,246,204,106,252,248,241,248,254,251,239, 95,169, 84,
+170, 14, 0, 10,170,155,159, 20, 69, 73,126,248,225, 7, 6, 65, 16,226, 17, 35, 70,240, 50, 51, 51, 75, 60,171,203,229,114, 92,
+189,122, 21,158,158,133,171,250,223,188,121,131,134, 13, 27,150,203, 57, 97, 81,164, 4,192,170, 57, 3,157, 54, 61, 9,151,206,
+ 4,176,190, 78,125, 23,220,190,126, 11, 15,110,135, 6,180,246,166,118,244, 24,209,226, 87, 97,135,193, 11,188,154,143,103,138,
+205, 29,113,248,220, 89,102,212,203,253,107,148,202,136,122,216,115,126,126,121,233, 36, 8, 2, 52, 77,127,225,202,129,201,100,
+226,232,209,163, 85,189,247, 83,251,246,237,155, 50,121,242,100,142, 84, 42,197,187,119,239,160, 80, 40,192,231,243,113,253,250,
+117, 18,192,174,163, 71,143, 94, 63,122,244,104, 55, 20,174, 38, 10,169, 74,253, 20,137, 68,211,253,253,253,241,238,221, 59, 60,
+127,254,252, 44,128,215,175, 94,189, 58,251,225,195,135, 33,237,218,181,195,193,131, 7,167,171, 84,170,125, 85,225,164, 40,170,
+180,207,164,226,136, 15,225,114,185,188,117,104,104,104, 85,203, 93,154,157,157,221,182, 72, 88, 39,219,219,219,155,135,135,135,
+163, 86,173, 90,208,233,116,173,170, 90,151,242,242,242,126,219,185,115,231,159, 99,199,142,197,175,191,254, 58,226,212,169, 83,
+ 35,122,244,232,129,158, 61,123,226,192,129, 3,120,253,250,245,122, 24, 23, 86,172,172,123,127, 13,224,181,189,189,253, 52, 23,
+ 23, 23,108,222,188, 25, 17, 17, 17,235, 86,173, 90,181,248,245,235,215,240,244,244,228, 69, 69, 69,145,213,105, 67, 0,192,220,
+220,220, 92,175,215,227,194,133, 11, 79, 1,204, 25, 49, 98,132,221,182,109,219,134,138,197, 98,228,228,228,168, 34, 35, 35,135,
+ 3,184,248,239,110,235,104,130, 88, 50,126,194,204,192, 9,227,135,243,125,154, 55,133, 50, 63, 5, 42,121, 58,148, 5,105,216,
+185,239, 6, 8,130, 1, 91, 91, 71,216, 57, 56, 35, 49, 49, 9,143, 46, 95,209, 42,148,170,109, 92, 61,181,190, 98,206, 25,133,
+156,205, 10, 57,149,138, 12,168,228, 25, 37,156,118,118, 53,139, 56, 19,241, 48,244,138, 90,165, 80,252,166,165,137,141,127,243,
+189,255, 55,163,106,177, 14, 75, 67, 38,147,205,154, 52,105, 82,135, 69,139, 22, 89,147, 36,201,172, 81,163, 6, 18, 19, 19,201,
+ 51,103,206,228,200,229,242, 89,213, 73, 13,139,205,126,237,238,225,217,161,111,223,190,100,159, 62,189, 57, 35,199,118, 99,217,
+218,217, 33, 47, 55, 27, 49,239,194, 16,253,246, 37,220, 61,155, 96,249,170,173,128,165,101,165,129, 36,139,194,234,244, 90,185,
+116,254,201,182,126, 93,205, 61, 27, 54,225, 52,173,103, 1,157,158, 68, 74, 74, 10, 46, 94, 8,215, 69,190,120,144, 79,145,218,
+ 33,202, 44,227, 66,240,220, 3, 72,100,227, 15,111, 59,221,209,181,155,118,206,219,245,199,161, 5,139,102,142, 23,181,243,237,
+130,136, 91, 7,113, 54,248,164, 66,173,209,110,226, 48,177, 37, 50, 27,202,152, 42,230,129, 90,173,214,125,222,159,170,213,106,
+221,215,150,244,129, 3, 7,144,158,158,174, 77, 72, 72,184, 70,146,228,169, 10,130, 61,127,129,157,128,182,159, 70,115,107,169,
+175,111,183,165,215,175,243, 71, 47, 92,168, 29, 49,114,228,124,104, 52, 58,112,185, 52, 75, 36, 98,128,199, 99,191,121,248, 80,
+176,125,202,148, 26,132, 86,123,243, 80, 5,110, 3,202,192, 55, 95,117, 88,108,209,106,223,190, 29, 70,143,159, 3, 85, 41,139,
+214,227,231, 49,208,232, 96,180, 69,171, 8, 73, 9,201,201,173,103, 46, 89,122,110,136,127, 39, 47,111,215,218, 60, 91,183,218,
+ 16, 59, 56, 32, 59, 51, 19, 15,159, 71,235, 87,157, 60, 23, 89, 36,178,140,242, 43, 67, 81, 84,225, 36,119, 0,157,102, 45, 2,
+193,100, 2, 69,110, 28,138, 87, 14,185,181,248, 30, 4,139, 5, 3, 77, 65,163,209, 24, 51,233, 47,229,227,199,143, 3, 70,140,
+ 24, 17, 18, 28, 28,204,240,247,247,111,122,254,252,121,234,107,234,142, 74,165,106, 13, 0,124, 62, 63,222,210,210,210,105,236,
+216,177,208,235,245, 80, 42,149,200,203,203, 67, 74, 74, 74,238,216,177, 99,117, 0, 32, 16, 8,184, 3, 7, 14, 52,175,140,115,
+235, 25,137,122,206, 64,167, 29, 53, 88, 9, 67,243,179, 94,187,213, 96, 37,196,183,246,166,118,108, 61, 35, 81,155,215, 84,172,
+206, 74,184, 23, 35, 85, 92, 15, 60,124,238, 44,115, 84,191, 1, 6,103,241,251, 0,190, 29,125,166, 50, 94,130, 32,190,112, 78,
+106,164,200,250, 4, 5, 5, 5,139,151, 45, 91,214, 83, 38,147, 57,119,235,214,141,227,229,229,133, 39, 79,158, 32, 56, 56,152,
+124,252,248,113,178, 66,161,248, 25,128, 26,192,141,234,228,169,135,135,135, 27,139,197, 42, 30, 74,251,189,104,247,239,231,207,
+159, 31, 50,126,252,120,212,174, 93,187, 65, 84, 84, 20, 15, 85,120,142,104,154, 46, 25,101,248,150, 32, 8, 34,118,251,246,237,
+ 78, 14, 14, 14,196,213,171, 87, 73, 38,147, 89, 29,203,205,129,253,251,247,183,210,235,245, 19, 38, 78,156, 8, 63, 63, 63,144,
+ 36,137, 35, 71,142, 96,255,254,253,198,138,172, 10, 17, 19, 19,243, 50, 57, 57,249,135,249,243,231, 99,243,230,205,139,231,207,
+159,143,228,228,100,196,196,196,132,125, 13,111,126,126,190, 42, 41, 41, 73,216,166, 77, 27,159,200,200,200,200, 14, 29, 58, 52,
+ 28, 63,126, 60,214,175, 95, 79,223,189,123,119, 32,128,171,255, 68,239, 29,253, 33, 39,136,109, 96, 93, 95,181,250,183, 95,234,
+213,117,155, 60,110,204, 96,166,135,123, 67, 40,242, 82, 96,109, 99, 15,103,151, 58,200,204,200,194,181,107, 87, 13, 89, 89,185,
+ 7, 12, 12, 98,229,135, 15, 57,169, 95,195,233,228, 92, 7, 25, 25, 25,184,114,229,138, 33, 87,150,191, 23,122,198,170,168,196,
+220,116,152, 96,140, 37,107, 34, 42,240, 18, 95, 17,108,172,172,172,142,155,155,155,167,155,155,155,167, 91, 89, 89, 29, 7,140,
+ 90,125,208,185, 84,235,192,252,100, 27, 56,144, 15, 62,191, 53, 88,172,185,150, 86, 86, 87, 45, 44, 44,178,219,183,111,175, 13,
+ 12, 12, 84, 71, 69,189,161, 36,146,100,218,194,194, 34,175,228,252,178, 56, 63,131,149, 85, 93, 51,145, 99,195, 95, 44,156,155,
+ 62, 20, 59, 54, 40, 16, 59, 54, 40,176,112,110,242, 72,228,216, 96,133,149, 85, 93, 51,163,210, 89, 14,234,216,193,214,221, 6,
+187, 60,109, 9,149,187, 13,118,213,177,131,173,209,247, 94,241,176,159,129, 32, 96, 64,225, 50,108, 84,131,179,152,131, 98, 50,
+153,135,156,157,157, 29, 81, 53,135,117, 95,112,142, 4,106,143,228,241, 38,156, 14, 8, 24, 29,127,247,238,136,252,184,184, 97,
+121,177,177,131,195, 78,158, 28,242,251,144, 33, 35,135,241,120, 19, 7, 2,117,141,229,116,116,116, 92,247,242,229,203, 96, 99,
+183, 82,194,203,232,252,172, 91,199,233,186,127,231, 86,244,244, 73,253,233,233,147,250,211,254,157, 91,209,117,235, 56, 93,255,
+138, 50, 34,152, 76,230, 80,161, 80,120, 92, 36, 20, 70,136,132,194, 8,161, 80,120,156,201,100, 14, 69,197,115,168, 62,225,180,
+182,182,126, 97,111,111,159, 94,149,205,198,198,230, 85, 21,210, 57,204,205,205, 45,153,193, 96,108,173,226, 51, 93, 17,167,187,
+ 64, 32,136, 21,137, 68, 41,165, 55,129, 64, 80,218, 49,148,181, 80, 40,188, 36, 18,137,182, 25,195,185,113, 73,195, 95, 30,221,
+152,246,122,227,146,134,191,124,126,108,198,143, 86, 99,159,132,172,204,158,241,163,213, 88, 99,210,105,103,103,119,215,206,206,
+ 78,106,103,103, 39,181,183,183,175,112,179,177,177,121, 97, 4, 39,223,204,204,108,155,153,153, 89,186, 72, 36, 50,136,197,226,
+116,145, 72,180, 21,165, 92, 91, 84, 55, 63, 25, 12,198,250, 6, 13, 26,168,153, 76,230,159,159, 29,218, 92,175, 94, 61, 53,139,
+197,218, 84, 69, 78,243,118,237,218, 25,194,195,195,105, 63, 63, 63, 26,128,213, 55, 44,119, 7, 43, 43,171,171,230,230,230, 73,
+102,102,102, 59, 1,136,170,201, 73, 0, 24,234,228,228, 20,214,177, 99, 71,165,147,147, 83, 40,128,190,223, 48,157, 61,127,252,
+241, 71, 42, 41, 41,137,166,105,154, 78, 74, 74,162,127,252,241, 71, 10,133,142, 34,191,166, 77, 94, 50,101,202, 20,250,241,227,
+199,244,227,199,143,233,208,208, 80,186,103,207,158, 20,128,159,190,178,157,199,183,186,119,175, 58, 54,117,191,171,111,117,106,
+248, 0, 95,234,198,197,173,244,242,159, 39,211, 93,252, 26,210,158,245,172,206,185,187, 91,187,127, 11,206, 95,126,158, 68,119,
+254,161, 1,229, 85,215,234,164, 87, 29,155,186,255,230,123,255,255,104,213,194,223, 61,225,236, 95,166,197, 79,197, 82,217,168,
+ 89,179, 38,178,179, 91,241, 89, 44, 95, 30,143,215,129,193,100,222,201,201,204,156, 93,244,186,101,248,119,153,106, 43,236,208,
+235,130, 91, 65, 72,130,234,112,126, 50,145,189,154,156, 85,225, 48,138,179,188,160,210,148, 70,147,106, 77,146, 47,118,162,194,
+ 60,248,132,211,201,201,105, 2, 69, 81,110,198, 38,136,193, 96,196, 75, 36,146,125,213,201,207,250,245,235,211, 69,195,219,196,
+183, 44,247,191,163, 46,253, 47,113, 30,254,173, 81, 77,207, 70,223, 45,136,120, 25,181,185,104, 88,177, 4, 43,102, 88,153,249,
+118,108,191,236,225,237,187,191,174,216, 41, 43,248,135,239,157, 1, 35,231,180,125, 3,206, 98, 39,161, 85,226,100,179,217,129,
+ 45, 91,182,156,240,228,201,147, 63, 13, 6,195,196,255,209,250,217,147,201,100,206,247,240,240,104, 26, 19, 19, 19,102, 48, 24,
+ 54,163, 12, 71,145,213, 72,231,207,110,110,110, 83, 57, 28, 14, 79, 46,151,203, 82, 83, 83,151, 1, 56,245,159,150,159, 94,245,
+107,248,208,116,137,211,237, 53,239, 62,230, 60,251,102,156, 52,101,160,104,230,234,152,184,236, 87,255, 64,185,255,127, 19, 89,
+123,255, 29,127,220,217,196,105,226, 52,113,154, 56, 77,156,223,156, 83, 96,202, 79, 19,231,255, 67,206,255,151, 96,153,178,192,
+ 4, 19, 76, 48,225,191, 14, 42, 83, 22,152, 96,194,127, 28, 74, 91,181, 74,172, 89, 68, 5,170,180, 42, 38,193,234, 40,219, 91,
+ 38, 78, 19,167,137,211,196,105,226, 52,113,154, 56,255,231, 56,255,191,138,172,189, 21,252,254,219, 96, 50,171,154, 56, 77,156,
+ 38, 78, 19,167,137,211,196,105,226,252, 95, 16, 90,101,254, 54, 13, 29,154,240,183, 99, 71, 63, 56, 1,192,204,243,144,252, 29,
+231,155, 96,130, 9, 38,152, 96,194, 63,140,189, 40,103,232,240, 63, 65,104,213, 4,208, 26,133,129,111,163, 1, 60, 0, 32,251,
+ 10, 62, 27, 0,131, 9,130, 24, 4, 0, 52, 77,159, 70,225,170,145, 44, 99, 46,230,243,249,233,106,181,218,174,232,123,134, 90,
+173, 46, 29,203,128,192,151,171,217,232, 82, 91,153,112,115,115, 75,215,104, 52,118, 70,252,125, 30, 77,211,175, 25, 12, 70,132,
+ 88, 44,190, 29, 19, 19, 19, 92,149, 27,239,208,161,195,104, 38,147,185, 6, 0, 12, 6,195,146, 59,119,238, 28,250, 27,203,173,
+149, 75, 77,135,131, 58,189,142, 76,207,204, 89,134, 47, 29,249, 1, 0,118,245,194, 58,130,196,130,162,239,155,166, 5, 87,236,
+ 71,167,170,231, 87, 0, 31, 54,155, 61,221,222,222,190,123, 74, 74,202, 11, 0, 11,129,202,189, 26,187,184,184,252,196, 98,177,
+ 70, 24, 12,134,186, 76, 38, 51,150, 36,201,163,201,201,201, 65,166, 54,196, 4, 19, 76, 48,193, 4, 35,196,214, 23,168,146,208,
+242,180,134, 3, 13, 12, 5,129, 46,160,113,147, 0, 78, 68,103, 35,205,216,235,123,120, 66,175, 39, 11,255,147,195,128,225,234,
+ 71,198,222,238,221,187, 59,207,152, 49, 3,223,127,255, 61,158, 60,121,210,230,192,129, 3, 99, 79,157, 58,245,154,162,168, 59,
+ 0,158, 0, 70,185, 82, 16,161,208, 79,203,240,238,221,187,119, 94,179,102, 13,179, 97,195,134, 80,169, 84,184,123,247,174,239,
+166, 77,155,182, 61,122,244,232, 22,128, 99, 69,130,160,220, 0,120,106,181,218,174, 56, 24, 39, 65, 16,118, 3, 7, 14,124, 86,
+ 90, 92, 21,197, 87, 35,104,154,126, 76, 16, 68,168,193, 96,120,114,230,204,153,100, 79,160,213, 36, 55,206,153,217,241, 58,231,
+207, 57, 53, 26,141,221,133,141,107,193,226,241,160, 41,200, 71,155, 49,255, 18,189, 55,127, 89, 0,130, 34,193, 4, 45,235,176,
+122,219,107, 0, 17,169,169,169,175,253,252,252,226,171, 90,194, 76, 38,115,205,181,107,215, 28,105,154,134,191,191,255, 26, 0,
+127,151,208,226,181,246,105,114,231,210,217,227,124,121, 78, 58,186,245,123,156,100,255, 0, 0, 32, 0, 73, 68, 65, 84, 29,114,
+244,125,114,198,104, 0,103, 63, 17, 77,221, 97, 79, 16, 88, 48,101,237, 49, 38, 0,236,254,121,248,194,173, 93,177, 99,206, 13,
+164, 1,232, 80, 36,126, 0, 96, 35,128, 59,187,186,195, 30,192,162, 41,107,143, 17, 0,176,231,231,225, 11,118,117,199,246,105,
+ 87,171,236,182, 98,234,232,209,163,119,172, 89,179,134,233,232,232, 8,137, 68,210,173, 65,131, 6, 30,249,249,249, 13, 80,193,
+ 36,226,218,181,107,159,108,215,177,119,157,254,131,134, 10,109,109,172,144, 42,205, 50, 63,121,252,207, 73,204,199,119,187, 39,
+ 36, 36, 12, 49,181, 33, 38,152, 96,130, 9, 38,148,131,234,123,134,111,230, 8,129, 66,135, 31, 89, 76,226,167,182, 62, 13, 58,
+ 13,235,209,142,209,192,171, 62,222,190,137,234,122,241,246,211, 77,140,208, 55, 33,164,129, 14, 18,113,112,225,149,180,226,149,
+ 48,122, 18,172, 27, 23,142, 21,246,132, 99,135, 51,159, 61,123, 86,191,121,243,230, 37,161, 97, 58,117,234,132, 78,157, 58, 17,
+187,119,239,110,114,227,198,141, 38,251,247,239,215,133,132,132, 28, 68,197,254, 81,166,215,171, 87,111,211,142, 29, 59,120,126,
+126,126,224,241,120, 37, 7,196, 98, 49,122,247,238,141,222,189,123, 51, 83, 83, 83,253, 47, 93,186,228,191,113,227, 70,109, 98,
+ 98,226,124,252,203, 75,115,133, 88,182,108,153, 79, 25,187,175, 17, 4,241,145, 36,201,176, 38, 77,154, 36,123, 0,245, 39,245,
+248,254,230,212,182,238,162,217,139, 15,148,201,195,226,114,113,120,116, 97, 95, 93, 90,104,197,223,190, 10,177,185, 89,182,208,
+204,236, 53,128, 8, 0,175,105,154,142,136,141,141,141,250, 14,104,210,218,138,113,240, 79, 25,213,184, 10, 98, 11,201,201,201,
+176,176,176, 16,248,249,249, 73, 9,130, 88,113,247,238,221,111, 61, 33,175,213,138, 5, 83, 57,178,132,215, 72,123,247, 24,115,
+ 7,249, 10,103,239,252,235, 87,181, 86,127,182,162,139, 8,130,193,216, 24, 74, 5,160, 48, 24,239,178,236,236,108, 63, 0,176,
+182,182,230, 2,184,179,245, 41,122,204,105, 75,124,141,111, 55, 14,147,201,220,117,224,192,129,241, 63,253,244, 83, 97,232,136,
+135, 15, 33, 22,139,177,106,213,170,218,243,230,205, 91, 71,146,228,172,242, 44, 89,237, 58,246,174,179,125,243,175, 13, 10,114,
+242, 52,127,236, 58,245,188,166,183, 39, 99,202,244,121,102,219,117, 26, 7,131,193,240,147,201,178,101,130, 9, 38,152, 96, 66,
+ 85,172, 89,149, 10, 45, 15, 27, 28,106,230,237, 62,120, 88, 79, 95, 94, 35,239,134,224,240,254,229,186,165,185,143, 15,154,251,
+248, 48, 2,228, 5, 93,158, 61,127,217,229,204,141, 39, 26,165, 62,241, 84, 76, 22, 70, 27,155,170,226,160,180,107,250,218,119,
+ 84,228,102,240, 1, 64,100,105,167,254,249, 66,218,237,182,109,219,194,217,217,153, 19, 18, 18, 50,174, 18,161,245,115,116,116,
+ 52,143,201,172,216, 31,106,205,154, 53, 49,112,224, 64,120,122,122,114,219,183,111,255,115,121, 66,139,207,231,103, 16, 4, 97,
+ 7, 0, 53,106,212, 48,172, 88,177, 34,140, 46, 4, 0,208, 52, 77, 63,102, 48, 24, 79, 40,138,122,250,215, 95,127,165, 52, 0,
+236,186, 53,247,124, 48,117,228, 64, 33,125,102, 91,185, 34, 65,157,159, 95,230,126,161, 88,148, 41, 16,137, 94,243,132,252, 8,
+ 20,198,242,138,112,118,118,142,106, 0, 56,183,244,116,187,177,123,206,112,179, 63, 39,254, 90,105, 94, 54,107,214,204,163,113,
+227,198,124,131,193, 0,133, 66,129, 61,123,246, 88, 8, 4, 2,139,238,221,187, 47, 47, 93, 1,188,128, 70, 3,106, 50, 39,174,
+ 76, 53, 76,171, 70, 69,178,108,215,198, 39, 97, 96,239,238,230, 62,173,219,225,253,157, 35,200,201, 41, 64, 94,174, 28, 20, 69,
+125,225,215,103,218, 85,164,239,234,133, 77,187, 23, 15, 95, 68, 48, 24, 68,147,126, 11,209,199, 33,111,102, 96, 96,224, 27, 0,
+108, 46,151, 91,186, 30,214, 20, 56,121,111,170,223,181, 29,246, 44, 25, 9,154,162,104, 0,155,170, 96,205,178, 51, 51, 51,187,
+120,227,198,141, 86, 45, 90,180,192,147, 39, 79, 16, 23, 23,135,169, 83,167,106,167, 77,155,198, 25, 53,106, 20, 49,119,238,220,
+ 25, 27, 55,110, 60, 3,224,209, 23, 15, 2,139, 53,162,111,255, 33, 92,121,110,190, 90,171,209,105,107,216, 88, 82, 26,133, 90,
+153, 37,203, 87, 15, 25, 62, 65,251,230,213,211, 17, 0,190, 16, 90, 95,153,159, 38,152, 96,130, 9, 38, 24, 1,154,166, 91, 0,
+176, 5,144, 73, 16,196,243,210,191,139, 78, 41,142,214,242,249,239, 44, 20,142, 74, 89,151,162,203, 66,225,116, 31, 91, 0, 6,
+ 0,207, 8,130,144,125,101, 18, 43, 94,101, 24, 28, 28, 76,151,254, 44, 37,180,104,154,166,105,125,246, 71, 90, 19,115,149, 86,
+ 62,223,247,197,166,122,115,150,150, 62, 59, 69, 63, 61,246, 11,237, 97, 83,113, 20,246, 30,158,208, 15,111, 12,122, 74, 11,208,
+179,218, 91,170,159, 61,123, 22, 66, 81, 84,112, 64, 59,208,244,219, 99, 52,253,246, 24, 61,167, 13,232, 51,103,206, 92, 91,183,
+110, 93,112, 80, 80, 80, 48,128,202,230, 41,165, 23, 60, 15,165,159,218,129, 46, 15,209,209,209,116, 96, 96, 32,189,120,241, 98,
+250,207, 63,255,164, 81,137, 7,117,127,127,255,187,145,145,145,244,168, 81,163,194, 80,129, 99, 64, 47, 64, 52,162,182,195, 59,
+205,201,109, 58,237, 79,141,104,217, 15,252, 50,239,223,209,209,241,147,244,172,119,119,160,127,111,233, 78, 31,234,210, 60,141,
+166,233,107, 52, 77,175,167,105,122, 8, 77,211,158, 0,208, 12, 48,239,235,104,253, 65,125,106,187, 74, 59,177,117,165,113,239,
+154, 53,107,230, 49,127,254,252, 28,173, 86, 75,199,199,199,211,127,252,241, 7,125,243,230, 77,250,194,133, 11,180,175,175,111,
+106,169,244,218,143,245,116, 77,215,238, 95,169,169, 78, 45, 98, 51,153,191, 63,191,121,134,254,240,224, 52,253,236,196, 58,250,
+232,210, 97,244,140,190,173,116,230, 2,158, 26, 64,199,242,174,155,214, 22,245, 61,107,219,198, 36, 38, 38,210, 58,157,142, 30,
+ 51,102, 12,237,239,239, 79,119,237,218,149,238,220,185, 51,221,169, 83, 39,186, 99,199,142,244,237,219,183,233,212,212, 84,186,
+115,187,230,138, 94, 94,240,169, 66,210,188, 93, 93, 93,211,226,227,227,105,157, 78, 71,135,132,132,208, 71,142, 28,161, 67, 66,
+ 66,232,128,128, 0, 26,192,161, 41, 83,166,168,100, 50, 25,237,239,239,159,130, 50,188,198,187,186,186, 70, 69,198, 36, 39,111,
+ 93,187,239,246,225,223,143,223, 62,119,230,230,237,139,215,159, 93,190,112,253,249,169,167,225,177, 23, 92, 93, 93,163,202, 40,
+255,175,202, 79, 19, 76, 48,193, 4, 19, 42,215, 34, 69, 66,171,103,145,177,163, 39, 77,211,157, 63,251,221,179, 72, 56,125,241,
+ 59, 32, 32, 96,113,233,223,197,231, 4, 4, 4, 44, 6, 64,183,105,211,230, 56, 77,211,245,191, 65,242, 39,150,177, 85,110,209,
+ 42, 6,153,242, 12, 28,247,238, 96, 27,244,208,103, 69,131,202, 77, 4, 68, 14, 80, 17, 98,100, 75, 19,241,238,193,217,138, 3,
+ 73, 20,225, 74, 52,216, 0, 66,162,162,162,240,238,221, 59, 36, 39, 39, 67, 40, 20,126,113,222,195,135, 15, 33, 16, 8,224,232,
+232,104,156,210,213,126,218,207,189,110,238, 10,113, 27, 63,100, 13,155,140,144,144, 16,100,100,100,128,195,225,128,203,229,130,
+ 36,201, 74,249, 24,140,194,136,191,197, 86,172,178,206,241, 3, 88,188, 26,226, 75,187,151,207,114, 99, 60, 14,102,171,146, 62,
+ 32, 85,109, 48,206,146, 39, 22, 65, 40, 18, 74, 5, 2, 97,201,112, 33,128, 8,130, 32,222, 55, 3,216, 34, 49,255,210,193,213,
+115, 29,152,175, 66,248,170, 15,175,203,228,232,220,185,243, 36, 0,203,105,154,206,109,220,184,177,253,154, 53,107,172, 36, 18,
+ 9,222,190,125,139, 83,167, 78,101,146,133, 55, 74,208, 52,189, 18, 0, 90, 3,124, 75, 91,203,235,191,255, 50,203, 12,119, 78,
+114,171, 83,139, 44,188,122, 95, 30, 48,106,202,180, 29,179,122, 67, 81,160,194,177,155,175,112,237,229,199, 62, 0, 30,162,130,
+121,111,187, 30,225, 3,144,217,169,127,255,254, 97,247,239,223,183,217,191,127, 63, 72,146, 44,115,219,191,127, 63,110, 61,120,
+ 57, 19,192, 11, 35,147, 85,211,205,205,237,214,211,167, 79,109,133, 66, 33,110,222,188,137,220,220,220, 18, 75,214,232,209,163,
+137,220,220,220,161,123,246,236, 25,144,144,144,176,249,193,131, 7,217, 40,140, 5,249, 73, 69, 96, 50,153, 31, 73, 82,247,157,
+163, 87,125,214,160,222,237,218,201,179, 95, 67,108,221, 24,143,195, 63, 94,202,149,101,171,152, 76,230,199,210,231,127,139,252,
+ 52,193, 4, 19, 76, 48,161,106, 32, 8, 34,152,166,233, 94, 4, 65, 4,127,190,239,243,239,197,231,173, 91,183,174,228,119,241,
+ 53,235,215,175, 95, 91,234,183,242, 27, 37,175,194,201,240,237,139, 20,100,251,178, 78,210,188, 61, 7,205,187,139,224,184,182,
+ 5,215,179, 15,152,174,190, 72,122,125, 7,225, 87,183, 34,229,205, 67,208,148, 1,142, 30, 45,141, 77,136,250,187,239,190,131,
+ 90, 93, 56, 53, 75,163,209,128, 35,178, 82,207,157, 56,156, 15, 0, 20,139,175, 41,165, 96,141, 34, 52,107,219, 1, 45,211,105,
+ 60,179, 47, 52, 84,180, 76, 47,188,110,245,152, 49,224,112, 56,224,112, 56, 32,138,166,254, 24, 35,180,136,162,147,169,194,225,
+171,178, 18, 65, 40,121,236, 99, 39,150, 79,111,201, 75,136,224,106, 34, 31, 35, 85, 67,209,151,210, 13,151,141, 73,175, 80, 36,
+148, 8,132,194, 8,129, 88, 84, 34,180, 8,130,248, 8, 0, 52,155, 29,116,100,229,244,198,162,244, 88,145,250,121, 8,164,106,
+ 74, 87, 14,205,202,171, 87,175,218,177, 88, 44, 7,131,193,128,164,164, 36,188,121,243, 6,219,183,111, 79, 47, 40, 40,104,255,
+234,213,171,152,210,218,209, 32,224,158, 10, 90, 53,171, 14,235,245, 61,190,230, 99,100,149,107,143,141,247,143,254,125,218, 55,
+185, 60,105,228, 18,252,216,163, 43, 70,181,111, 64,199,167,230,168, 1,220, 44, 50,189, 86, 6,201,171, 87,175,186,252,240,195,
+ 15, 71,155, 54,109,234, 69,211, 52, 26, 53,106,132,161, 67,135, 34, 40, 40, 8,225,225,225,200,207,207,215,221,184,113, 99, 27,
+128, 3, 70, 38, 75,104,101,101,117,237,246,237,219,182, 66,161, 16, 55,110,220,128, 74,165,130,163,163, 35,166, 77,155,198, 93,
+191,126,253,225,252,252,252, 65,235,214,173,227,199,199,199,255,126,253,250,245,218, 40,140, 59,247, 69, 37,208,106,181,123,143,
+ 5, 29,218, 49,109,250, 12,167,219, 79,222,134,104,228, 5, 22,174,174,201,249,182, 86, 98,179,109, 27, 86,214,210,106,181,147,
+202,206,207,187,213,202, 79, 19, 76, 48,193, 4, 19,190, 64,133, 90,164,180,120,250, 92,108, 85, 69,164, 1, 80, 5, 4, 4,252,
+ 76, 16, 68,112, 64, 64,192,207,235,214,173, 83, 1, 72,253, 59, 68, 86,137,208,234,213,171,215,189,224,224, 96,244,234,213,235,
+ 94,185, 20,148, 1,186,248,251,208,197,223,135,160,205, 76,252,181,110,216,103, 55, 79, 85, 59,117,189, 87,221,188,173,209,104,
+ 88,135, 14, 29, 42,153,183, 5, 0, 6,131,225,155,151, 98, 85,132, 86,145,208,251, 34, 17,110, 60,241,189,189,115, 6,181,182,
+ 54, 40,217,218,135,151, 32,209, 80,228,230, 15, 58,229,243, 92,122, 99,121,156, 23,102, 79, 66,242,131, 91, 16,138,197,201,227,
+239, 71,148, 88,177,138, 68, 86, 28, 0,212,230,153,133, 4,206,250,209,215,129, 3,142,246,242,105,164,106, 40, 77, 96,130,254,
+ 64, 57,149, 13, 52, 77,255, 31,123,223, 29, 22,197,213,120,125,102,182, 47, 75,239,160,128,138,162, 52, 65, 81, 20, 27, 98,137,
+ 26, 49,177,247,146,152,232,107, 55,150,136, 26, 99, 73, 20, 18, 99, 47, 81,147, 24,203, 27, 11,177, 69, 68,141, 45,104,196,134,
+ 40, 93, 80, 68,154, 75,111, 11,108,159,153,239, 15, 96, 69,100,217, 5,205,247,203,155,236,121,158,125,102,103,103,230,236,157,
+123,103,238, 61,247,220,134,231,207,159,163,186,186, 26,209,209,209, 56,117,234, 84, 97, 35, 34, 11,109,249,198,127,252,244,249,
+148, 30,166,146, 60,174,226,193, 85,188,148,211,122, 53,117, 89,119, 30,217,155, 75, 18,191, 19, 36, 75, 56,176,103, 71, 44,254,
+116, 20,182,253,244,155, 90, 97,219, 55,120,231,185,200,241,149,114,229, 42, 61, 69,150,198,108,140,141,141,245,140,141,141,229,
+ 3, 8,154, 56,113, 98,228,152, 49, 99, 16, 21, 21,133,243,231,207,187, 1, 16,215,158,183, 1, 53, 11,101,127, 11, 32, 93,155,
+241,200,229,114,143, 95,189,122,213,203,209,209, 17, 87,175, 94,133, 84, 42,197,156, 57,115, 20,243,231,207,231,206,152, 49,131,
+ 40, 47, 47,215, 56, 89,209,209,209,197,218, 68, 22, 0,228,230,230, 94, 60,117,242,104,175,126,253,250,141,106,231,214,201, 52,
+ 93, 82, 81, 96,100, 36, 16,222,138,186,193,125,112,239,246,238,220,220,220,251,141,199,231, 53,189,227,211, 0, 3, 12, 48,192,
+ 0,237,208, 75,139, 52,112,166,154,131,122,215,113, 66, 67, 67, 19, 67, 67, 67, 95,115,188,222, 18, 13, 71, 29, 94,168, 43,211,
+ 90, 52,143, 22, 85,158,245,230, 13,208,116,115,110,246,141,223, 44, 44, 44,212, 66,161,240, 53,161, 69,235,201, 89,114,230, 24,
+210,231, 78,214, 56, 89,117,206, 22,134,206,120, 43,161, 69,211,116, 52,128,215, 2, 97,100,219,113,210,246, 17, 30,189, 61,219,
+181, 34, 85, 39,119, 32,167, 90, 45, 91,251, 68, 41, 75,145, 48, 31, 36, 55,210,201, 90,195,169, 86, 65, 32, 18,102, 10,141, 69,
+ 13, 69,214, 11, 0, 16,217,185,141,249,110, 88,167,254,190,157,218,147,234, 19, 91,145, 91,173,170, 12, 73, 86, 42,211,171,152,
+211, 90,226,112,237,123,239,189,183,214,202,202, 74,176,115,231, 78, 51, 23, 23, 23,168,213,106, 69, 67,145,101,100,219,113,210,
+142,145,222,189, 59,218, 91,144,170, 95,119, 33, 91, 74, 85,239, 72, 87, 29,214, 71,100, 89,155, 25, 95,222,183,105,174,208,136,
+207,129, 76, 38, 67,216,222, 95,241,251,237,132,224,162,132,179,151, 1, 92,126,139, 7,242,147,224,224,224,109, 27, 54,108,128,
+ 74,165,194,204,153, 51,241,236,217,179,223,159, 60,121,178,195,217,217,121,217,231,159,127,238,104,111,111,143,241,227,199,115,
+ 85, 42,213, 12, 45, 28,223,252,242,203, 47,193,190,190,190,136,138,138, 66, 89, 89, 25, 28, 28, 28, 48,127,254,124, 94,104,104,
+232,225,138,138,138,113,155, 54,109, 18, 60,127,254,188, 73, 39,235,181,231,154,162,190,222,191,109,238,178,238, 61,251,144, 79,
+159,166,170,179,252, 3,201, 27, 87,207,223,180,178,178, 58,156,149,149,245, 42, 62, 71,117,110,118,124, 26, 96,128, 1, 6, 24,
+240,110, 64, 16,196,133,218,126, 87,175,185, 92, 13, 69, 88,157, 99, 85,127,191,225,249,181,199,223, 69,101,249, 64, 35,194,235,
+245,233, 29,130,131,131,245, 30, 86, 79, 87, 21,234, 37,158, 26,226,253, 78, 80,181, 50, 6,123, 85, 32, 9,174,200, 66, 54, 98,
+195,149,235,218,206, 21,137, 68,122, 59, 90,180, 92,166, 43, 81,154, 37,180,106,251,104, 93, 98, 24,230, 53,161,101,102,215, 49,
+112,197,231,139,182,247, 25, 51,148,204,255, 52, 0,101,149,114,249,231, 73,106, 58,167,186,105,145, 85, 83,138,171, 50,140, 68,
+198,241, 2,145, 81,125,145,149, 5, 0, 2,219,246,254,203, 23,207,219, 59, 96,210, 8,162,112, 78, 31,148,150, 73,229,203, 18,
+213, 68,174,148, 25,151, 12,220,104,140,238,250,245,235,251, 1,236, 15, 12, 12,204, 23,137, 68,168,172,172,124, 35, 13,234,194,
+219,123,204, 80, 50,255,147, 30, 40,169, 82,202, 63, 79, 84,227,165,148, 62,174, 75,100,217,152,155, 92,222,183,113,174,209,203,
+156, 23,224,114,185, 48, 54, 54,198,149, 63,227, 81,148,120,238,109, 4, 22, 72,146, 92, 23, 18, 18,178,118,222,188,121, 40, 46,
+ 46,198,249,243,231,241,254,251,239,227,216,177, 99, 46,145,145,145,219,130,130,130,192, 98,177, 16, 17, 17, 1,149, 74,149,166,
+133,102,212,172, 89,179,150,141, 25, 51, 6,247,239,223,135, 88, 44,126,205,201, 42, 43, 43,155,184,119,239,222, 49, 25, 25, 25,
+ 58,157,172, 6,240,111,219,190, 43,119,229,154, 45,144, 87, 23,176, 11,115,239, 70, 93,187, 66,222, 41, 41, 41, 49, 2, 80,222,
+210,248, 52,192, 0, 3, 12, 48, 64,111, 87, 75,155, 22, 41,172, 21, 81,133,141,237,215, 19, 88,141,237, 19, 13, 92, 48, 69,131,
+227,143,255,202,123,210,203,209, 98,219,121, 67,157,159, 80, 79,104, 21,188,118, 92, 96, 98,169, 87,211,161, 74, 13,246,190,131,
+154,121,180, 4,197,197,197, 2,107,107,107, 89,125,129, 96,100,100, 4, 71, 71, 71,148,150,150,226,192,129, 3,128,238, 78,209,
+106,211, 49, 83,225, 63,105, 38, 30,180,230,129, 81, 41, 53,206,214,190,143, 62,122, 77,108,113,185,220,186,190, 97,186, 10,221,
+123,181, 78,211, 29, 0, 76, 87,183,118, 95, 9, 68,162,143, 4,214, 78,214,139,231,126,194,201, 40,144,227,122,159,149,101,191,
+126,179,194, 56,155, 49,158,151,133,242,219, 58,248,210, 63,252,254,104, 67, 39, 43,167,139, 91,187,213, 2, 35,193,167, 60,203,
+ 54,246, 33, 75,230,114, 50,242,229,196,117,255,207, 43, 78,125,251,185,209,115,152, 44,203, 65,217, 13, 61,146,103,237,251,239,
+191,191,150, 97, 24,134,166,233, 53, 0, 80, 63,188, 75,230,127,202, 73,207,147,225, 90,159,213,165,167,190, 89, 97,146,141,166,
+195,107,221,121,100,111, 59, 11,211,203,251, 54,205, 51, 18,231,102,130,207,231,195,196,196, 4,217,249,229,224,176, 89,210,183,
+124,222,248,125,251,246, 93, 49,119,238, 92,196,199,199, 99,206,156, 57,226,172,172,172,211, 39, 78,156,152,243,229,151, 95,178,
+135, 12, 25, 2,177, 88,140,205,155, 55,171,254,252,243,207, 77, 0, 54, 55,250, 60,178,217,159,124,245,213, 87,204,203,151, 47,
+137,231,207,159,195,193,193, 1, 11, 22, 44,224,109,218,180, 73,211, 39,171, 57, 78, 86, 29,114,115,115,163,126,191,122, 7, 31,
+ 92,220, 14,181, 74, 30, 85, 86,156,117, 51, 37,189, 52,202,146,199, 91,218,170,107,231, 22,197,167, 1, 6, 24, 96,128, 1,239,
+196,197,122,208,212,254,223, 0,141, 53, 29,234, 37,180,210,118,173,254,216,237,227,121,203, 33,116,233, 13,121,242, 25,208,149,
+249, 26, 71, 75, 96,108, 1, 75,103, 15,148, 85,201, 17,126,237, 33, 0,164, 53, 39, 84, 18,137, 4,126,126,126,216, 51,163,227,
+ 0,153,164, 88, 32, 4, 32,231,155,202,206,242,250, 94,143,140,140,172,166,105,250, 56,128, 72, 29, 52,235,188,188,188,118,111,
+217,178,133,231, 49,233, 99, 84,222,189,213,208, 65,129, 80, 40, 4,159,207, 71, 92, 92, 28,174, 95,191,174, 0,176, 78, 71,130,
+222, 83,171,213,143, 79,156, 56,145,211,161, 93,171,161,126, 93,124, 22,174, 90, 25, 98,146,116,235,119,172,217,180,155,238,208,
+109, 72,121,216,177,179,146,114, 99,231,129, 82,241,147, 71,122,220,234,227, 6, 34,235,165,123, 91,167, 1, 93,188,189,150,175,
+ 89,179,218, 52,241,214, 21,124,249,237, 62,198,205,119, 80,249,183,167,206, 85, 20, 25,181,121, 79, 86,144,114, 95,159, 56,140,
+138,138,218, 15, 96,127,221,126,195,240,134,108,216, 65,119,236, 62,180, 52,236,216,169,170, 10, 19,231, 65, 77,133,215,198, 99,
+ 84,175,214, 54, 22,151,119,125,253, 31,163,188,220, 44,240,249,124, 24, 27, 27, 35, 75, 92,134,181,219, 79, 86, 41,105,122,232,
+219, 10, 45, 19, 19, 19,190, 82,169,196,158, 61,123,144,149,149, 21, 0, 32, 43, 38, 38,102,223,132, 9, 19,118,118,238,220,217,
+ 61, 49, 49, 49,173,178,178,114, 30,128, 20,109, 36,230,230,230, 1, 54, 54, 54,196,157, 59,119,240,159,255,252, 71,177, 96,193,
+ 2,238,244,233,211,137,210,210,210,150, 58, 89, 0,128, 86,173, 90, 5, 14, 30,216, 19,189, 7,207,137, 82,200,202,110,102,164,
+ 28,142, 34,153,219,130,150,198,167, 1, 6, 24, 96,128, 1,255, 26,180,108, 98,240, 64,128,221,209, 10,179,189, 90,113,243,142,
+124,179,128,145,164, 71, 51,210,251,251,153,138, 51,159, 50, 23, 54, 79,103, 34,119, 45,102,230, 12,247, 98,220,109,137,188,142,
+ 86,152, 29,248,166,112,123,109,117,239,247, 59, 65, 53,184, 61,152,193,237,193, 12,239, 8, 21,128, 85, 93,187,118, 61, 59,223,
+255,213, 60, 90,243,253,193, 0,248, 15, 0, 99, 45,193,106,108,197,112, 7, 0, 7,252,252,252,212, 55,110,220, 96,158,140, 27,
+196,196,186, 91, 51,243,230,205, 99,190,252,242, 75,102,242,228,201,140,141,141,141,186, 54, 34, 28,116,113,126,240,193, 7,173,
+ 1,192,201,201,201,188,155, 71,135,188,184,107,231,153,155, 71,118, 50, 63,205, 31,205,244,232,236, 81,100,239,222,239,177,208,
+161, 83, 23, 29,209,167,225,180,183,183, 95,201, 48,204, 80,134, 97, 28, 0,192,205,205,202,184,171,123,135,151,143,175,158,103,
+110, 29,221,205,252, 52,127, 52,211,211,199,179,184,181, 71, 80,138,192,214,221, 95, 31,206,198,208,104,120,189,221,139,236, 58,
+244,122,212, 68,120, 53,156,237,252,199,159,203,121,153,207,220,187,119,143,137,140,140,100,110,221,186,197, 28, 57,113,142,113,
+238, 62,174,210,186,243,200,222,205,120,116,180,133,211,108,248,240,225, 76, 90, 90, 26, 51,108,216, 48, 6,128, 89, 11, 57,207,
+102,100,100, 48, 9, 9, 9,204,170, 85,171, 24, 0,135,230,206,157, 43, 45, 47, 47,103, 6, 13, 26,148, 85, 43,176,216, 45, 9,
+167,107,219, 86, 97,163, 70,244, 93, 55,255, 63, 99, 2,223, 54, 62,223, 33, 12,156, 6, 78, 3,167,129,243,223,192,249,191, 12,
+135, 90, 87,171,110,219, 85, 47, 71, 43, 10, 80,163, 24,251,189,109,149,255,221,180,121,215,210, 61,251, 15, 45, 95,177,240, 19,
+ 81,223, 62,131, 17,127,245,103,156,138, 56, 81, 37,147, 43, 54,115, 89,216,146, 80,140,234, 84, 29,161,168,157, 71,235, 53,196,
+198,198, 26, 89,182,127, 53, 7,211,211,154,185, 89,247, 53,243, 6,197, 0,102, 61,124,248,112, 75, 80, 80,208,198, 79,123,251,
+143,158,223,107, 0, 84, 42, 21,142, 28, 57,130,204,204,204,211, 0, 86,235,235,184,197,199,199, 23,121,182,119, 89,196, 97,177,
+151,207,155, 60,202,166,240, 89, 18,114,146, 99, 1, 0,114,185, 84,149,151,118,211,183, 57,129, 19, 10,133,247,108,108,108,158,
+216,216,216,148,118,108,231, 52,139, 15,206,154, 57, 19, 63,180, 45,206, 72, 65,118, 98, 77,203,168, 92, 86,173,204, 73,187,225,
+222,146,212,117,113,113,225,139, 56,152,221,104,120, 21, 50, 85,254,211,148, 46,250,240, 84,203, 21,155,214,111, 59,242,222,215,
+203, 63,226,155,154,154,226, 97,194, 83,172,217,122,172, 74,170, 80, 13, 45,138, 63,251, 78,154,199, 24,134,129, 74,165,210,123,
+160,131, 22,172,240,245,245,237,180,113,227, 70,183, 25, 51,102,224,109,157,172,250, 72,207,200, 13,105,229,228,234,249,244,201,
+195, 32, 75, 33,247,191,111, 19,159, 6, 24, 96,128, 1, 6,252,107, 48,188,214,204,153, 85,111, 27,171, 83,104,213, 33,161, 0,
+213, 0, 54,180, 99, 85,238, 91,185,113,219, 90,146,216,254, 17,205, 48, 63,171, 73,172,127, 94,140,194,183, 12, 92, 53,135, 13,
+245,123, 35, 39,179, 1,128,195,110, 89, 1, 89,139, 52, 0, 99,126,184,125,191,251, 15,183,239,127, 81,251,219,215, 0,154,213,
+150,107,194, 70, 66, 31, 79,215, 86,125,187,122, 9, 88,148, 20, 57,201,207, 80, 82, 37,195,149,196,204, 50,146, 33,127,110,110,
+160,158, 63,127,254, 7, 0,216,153, 25, 37,247,245,108,239,220,207,207,203,136, 67, 40,144,147,244, 16,229, 82, 5,126, 79,204,
+ 44, 7, 65,180,184, 67,245,187, 10,111,126,252,185, 7,191,129, 24, 68, 16,196,213, 85,243, 39,241,215,110, 61,254, 78, 69, 22,
+128,234,220,220,220,226,234,234,106,171,151, 47, 95, 42,208,242, 73,226,158, 86, 84, 84,116, 94,188,120,241,134,101,203,150, 45,
+255,230,155,111,184, 45,233,147,165, 13,165,185,153,103,250,121,189,187,244, 55,192, 0, 3, 12, 48,224, 95,129, 89, 13,182,208,
+ 91,104,105, 4, 67, 1, 10, 1,204,115,117,101,150,164,167, 67,241,174, 66,214,152,211,245,150,120, 0, 96, 68,139,175, 38, 9,
+201,221,180,204,202,123,105,153,149,160, 25,134,102, 24, 57, 73, 34,187, 74,169,220,148,246, 60,183,229,163,238, 8,130,122,240,
+ 52, 75, 26,243, 44, 91,198,208, 52, 67, 51,140,130, 32,144,167, 82,209,155, 18,159,103,158,251, 59,132,183, 40,254,236,237, 8,
+ 53,209,247,246,189,132, 37, 85, 85,202,221, 69,201,103,163,223, 97,186,168,226,227,227,167, 4, 4, 4,124, 76, 81,212, 62, 0,
+170,183,224, 82,168,213,234, 21, 97, 97, 97,167,227,227,227, 79, 70, 71, 71,139,223,133,200,250, 75,211,223, 0, 3, 12, 48,192,
+128,127, 42, 90,182,168,180, 54,188, 75,145,245,119, 68,194,211, 23,126,127, 5,111,226,211, 23,222,255, 11,225,205, 79, 62, 19,
+147, 15, 76,252,139,162,247,119,138,162,126,127,151,162,250,210,165, 75,109,209,200,178, 58,127,183,244, 55,192, 0, 3, 12, 48,
+224, 31,139, 89,218,196, 23,219, 16, 55, 6,252, 3,192,188, 43,145,101,128, 1, 6, 24, 96,128, 1, 45,128, 86, 71,139,128,246,
+145, 3, 87,155,241, 7, 45, 25,125,112,213,192,105,224, 52,112, 26, 56, 13,156, 6, 78, 3,231,191,142,243,159, 8, 7,212,116,
+136,191, 80,187,109, 82,124,189, 75, 24,134,190, 26, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,252,167,163,209,142,240, 64,
+ 77,231, 97, 3, 12, 48,192, 0, 3, 12,248,171,192,175,253,180,244,184, 1, 6,252, 47,138, 45,141,224,106, 73, 31,173, 14,181,
+219,167,127, 97, 96,231, 59, 56, 56,204,242,241,241,241,224,114,185,164, 68, 34, 89,127,227,198,141,117, 13, 79,234,235,201,142,
+ 97,145,104,253,234, 23, 2, 32, 88, 0, 73,130, 98,144,115, 43, 78,218,205,144,238,127,107,184, 8, 77,109,126, 35, 72, 22,143,
+ 82, 43, 65,169,148,168,233,110, 85, 3,154, 86,103, 82, 74,249, 16,109, 23,219,251,142,114, 86, 83,244, 55, 0,179, 7, 32,231,
+ 2,244, 94, 2,236, 57, 12,212,223, 19, 96,253, 7, 44,230, 91, 80,196,231,108, 14,107,165, 56,246,215,236,127, 66,132,133,135,
+135,179,222,230,250,113,227,198, 53,186,128,168,163,163, 99,132,145,145, 81,123,109,215, 85, 85, 85,137,197, 98,113,208, 63,252,
+121,236, 7, 96, 23, 0,175, 6,191,167, 0, 88, 4,224,218,219,254, 65, 32,192,182, 3,102,115,129,207, 1, 64, 9,124,155, 15,
+236,143,250, 27,245, 49,180,177,177,185,201,102,179,221,170,170,170,170, 36, 18,137,171,137,137, 73,186, 72, 36, 18,169,213,234,
+180,194,194,194,126,205,164,155,139, 87, 75,105, 45, 7,176,183,153,199, 13, 48,224,127, 5,111, 53,234,176, 99, 77,254,128, 64,
+ 0,253,186,119,239,110, 87, 85, 85,133,148,148,148,124, 0, 55, 1, 68,213,126, 82,223, 69, 72, 73,146,252,110,219,182,109, 75,
+ 23, 44, 88,160, 89, 12, 58, 46, 46, 14,190,190,111,206, 17,202, 34,209,250,198,249,171,182, 15,226, 83,209,125,208,216, 90,161,
+ 69, 2, 85, 98, 4, 13,246,111,105, 16, 76, 44, 44, 44,214, 19, 4, 49,142, 36, 73,157,133, 26, 77,211, 20,195, 48,225,165,165,
+165,107, 1, 72,154,243, 71, 34, 35,190, 74, 77, 81,141,254, 7,155,197,162,170,170,229, 90,167,189,176,180,180,140, 38, 73,178,
+ 93,253, 5,179,129,215, 23,208,214,118, 76,173, 86,231, 20, 21, 21,233, 35, 66, 5, 36,155,187,136, 32,184,131, 65,210, 29, 1,
+ 2, 4,200, 84,154, 82, 92,161,213,202, 29, 0,100,111, 35,178, 28,156, 92,111,125,182, 58,172,117, 66,114, 10, 86,205,159,140,
+111,118, 29,194,202, 69, 31, 99,199,129, 99, 88, 52,107, 18, 60, 61,189,208,212,178,226, 52,184,155, 86, 47, 28, 55, 40,116,207,
+201, 62, 43,231,141,227,135,238, 9,239,187,106,254, 4,222,166,221, 39,251,174,154, 63,158, 31,186,251,100,159,149, 11,199, 9,
+ 55,237,253,149, 6, 48,181, 37,129,156,228,230, 88, 69,168,213,141,214,182, 25, 54, 91,126, 44,237,165,232,255,226,141,158, 49,
+ 99,134,143, 84, 42,125, 56,121,112,215,176, 46, 29, 91,229, 54,118, 78,113, 94,110,171,244, 39,177, 33, 28,174,208,239,195,144,
+ 67,113, 77, 90, 14,124,126,187,148,148, 20, 55,154,166, 65, 81, 20,212,106,181,102,171, 80, 40,208,175, 95,191,119, 53,112,102,
+ 4,128,245, 53, 47, 43, 66, 1,156,124, 11, 46, 99, 54,155,253, 25,143,199, 11, 84,171,213, 30, 0,192,225,112,146,229,114,121,
+148, 90,173,222, 6,160,178,153,124,219,115,115,115, 61,141,141,141,161, 84, 42, 53, 11,208,179, 88, 44,119,103,103,231, 61, 50,
+153,204,237,109,111,222, 14,152,221,171, 79,159, 29,211,151, 46,101, 73,111,222,196,142,131, 7,183,163,162, 2, 0,246,232,186,
+150,199,227, 93, 38, 73,210,165, 57,255, 71,211,116,166, 66,161, 24,210,156,107,216,108,182,219,203,151, 47,109, 29, 29, 29, 33,
+145, 72, 32, 18,137, 68,117,251, 45,112,178, 54, 51, 12, 35,172,205,219,119,244,236,217, 51,128, 32, 8, 53, 0,134,166,105,242,
+222,189,123,147,104,154,102,215,230, 79,155, 1, 28, 4, 32, 55,148,217, 6,252,143,186, 89, 7,154, 43,180, 34, 1, 4,118,239,
+222, 93, 56,113,226, 68, 4, 6, 6,194,205,205, 13, 2,129,160, 38, 19, 47, 46,182,123,244,232,209,248,155, 55,111,142, 63,127,
+254, 60,146,146,146,164, 0,254, 4,208,232, 75, 61, 48,184,207, 2,129, 49,127, 39, 0, 20,230, 20,139,115,158, 23,236, 20,139,
+197,155, 1,212,159, 34,220,117,234,212,169, 75, 22, 46, 92,136,136,136, 8, 28, 59,118, 12,114,185, 28, 18, 73, 19,250,165,186,
+ 0,165,215,195, 0, 81, 6,144, 21, 5, 24,217, 2, 34,187, 22,199,148,133,133,197,250, 69,139, 22, 45,246,244,244,212,204, 98,
+174, 82,169,160, 86,171,161, 82,169, 80, 90, 90,138, 37, 75,150,212, 20,180, 12, 3,154,166,113,241,226,197, 5,179,102,205, 66,
+105,105,233,103,141,113,246,244,115,138, 33, 9,178,117,157, 87,195, 80, 84,206,221, 71, 57,221,212, 20,197,146,201,148,141,174,
+ 84, 46, 16,112,155, 20,121, 28, 14,167,117,210,111,191,217,146, 60, 30, 24,138, 2,104, 26, 12, 77,215, 70,103,237,135,169,249,
+141,161,104, 48, 42, 10,180,154,134, 90, 42,135,255,220,185,250, 68, 69, 47, 14, 79,120,108,202,167, 75,237,123,244,236,201,105,
+227,228, 8, 53, 69,227, 89, 70,142,253,195,152,187,189,195, 15,239,153,163,144, 74, 38, 1,104,209, 60, 91, 60, 35,211,223,119,
+127,255, 67,235, 7,143, 18,112,237,198, 77, 92,189, 30, 5, 0,184,124, 35,186, 78,112,235, 76, 42,168, 43, 59, 47,154, 57,146,
+ 31,182,251, 56,103,209,204, 81,172,111,118,159,224, 44,252,248, 67, 86,216,206, 99,220,133, 31,127,200, 10,219,117,140,187,112,
+230, 72, 86,232,142,159,124, 0, 88, 0, 40,213, 70,166, 45,141, 8,181,154,255,223,244,124, 22, 0, 20,238,219, 7, 85, 65, 1,
+ 28,215,174, 5, 0, 76,113,181,211,187,185,195,218,218, 58,134,195,225,180,214,117,158, 74,165,210, 41,130,103,204,152,225, 43,
+149, 74, 99,212,106, 53,195,102,179, 67, 38,143,122,239,236,208,190,190,197,245,207,137,139,123,108,181,105,211,111, 35, 79, 62,
+148, 48,227,253, 76, 30, 70,124, 55,163, 91,240,178, 67,143,155, 40,144, 73,185, 92,142,180,180, 52,212, 95,228,189, 30,168,150,
+214,157, 0,236,176,178,178,234, 81, 92, 92, 60, 5,192,170,138,138, 10, 31, 22,139, 5, 75, 75,203, 85, 10,133,226,153,153,153,
+217,143,229,229,229,209,181,174,145,190, 75, 6,244, 51, 53, 53, 61,114,230,204, 25,139,174, 93,187,146, 69, 69, 69,104,219,182,
+ 45, 74, 74, 74,252,111,222,188,233, 55,115,230,204,153, 18,137,100, 90,109,101, 80, 95,116, 50, 50, 50, 98,166, 79,159, 78, 80,
+212,171,219,253,233,167,159, 48,196, 91,221,222,198,220,168, 90,166, 96,202,175,165,153,253,135,203,229,254,153,153,153, 89,222,
+220,200,224, 2,159, 79, 95,186,148,101,252,226, 5,140, 31, 63,198,148,138, 10,246, 55, 53,238,150, 78,161, 69,146,164,203,145,
+ 99, 63,187,241,120, 60,168,213,106,141, 24,172,203,163, 84, 42, 21,148, 74, 37, 84, 42, 21, 40,138,130, 74,169, 66,232,215,223,
+182, 56, 47, 52, 50, 50, 50,114,112,112,200, 55, 50, 50, 50,122, 23,165, 16,159,207,103, 31, 62,124,120, 18,143,199, 3, 0, 40,
+ 20, 10,120,123,123, 19,134,242,217,128,127,152,216,122,195,229,106, 74,104, 13,171,168,168, 0, 69, 81, 48, 49, 49, 1,139,245,
+122,185,111,101,101,133,193,131, 7,163, 95,191,126,152, 56,113, 34,146,146,146,132, 19, 39, 78, 28,172,141,108,242,210, 96, 56,
+185,217,213, 22, 38,180,195,237, 11,143,194,126,250,234, 87,155,188,188,188,165,245, 78,155, 57,123,246,108,162,184,184, 24,227,
+198,141,187, 41,151,203, 63, 0, 80,161,141,147,162,145, 19, 52,113, 10,104,134, 16,110,187,247, 3,161,144, 73, 25,146, 36,165,
+117, 77,135, 45,137, 37,130, 32,198, 57, 58, 58,226,248,241,227, 80, 40,222,156, 46,204,212,212, 20,137,137,137,175, 92, 53, 22,
+ 11, 61,123,246,100, 17, 4, 49, 14,192,103,141,115,146,173,111, 63,120, 97, 91,183, 31, 60,216,139,219,211,143,204,127,153, 95,
+197, 0, 32, 86,175, 94,173, 17,110, 0,176,126,253,122,125,194, 9,146,195, 65, 97, 84,212,171,140,152, 77,130,228, 18, 32, 56,
+ 0,201,174,105, 69, 5, 3, 48, 20, 64,171, 1, 90, 5, 8, 28,156,244,137, 6,255, 86,206,110, 17,155,182,238, 53,151,171, 24,
+ 28, 63,119, 13, 25, 25,207,193, 34, 73,184,182,119,195,123,253,251,114,252,186, 7, 56,125,187,110,233,249,151, 89, 79,135, 1,
+184,223,236,136,166, 25, 65,123,103,107,252,248,211, 67,216, 88, 24, 99,220,200,247, 33, 20,240,241,205,174,159,241,245,202,249,
+112,115,117,193,254,237, 27,181, 94,110,102,102,182,193,195,173,189,203,222,195, 23,224,225,238,206,218,123,228, 2, 60, 60,107,
+183, 94, 30,172,189, 71, 46,192,211,203,147,181,247,200, 5,248,120,117,106, 19, 35,190,183,161,164,164,100,190,246,248,108,144,
+ 70,239,213,164, 17,167,146,214, 20, 4, 47,230,204, 1, 0,141,208,106, 14, 56, 28, 78,235,151, 47, 95,218,234, 58, 79,151,107,
+ 80,235,100,197,168,213,106, 20, 20, 20, 16,101,101,101,140,185,185,249,200, 75,251, 87,157, 25,210,199,183, 4, 0, 30, 63,126,
+108, 25, 26,186,105,228,137,152, 10, 72,239,238, 38,254,251, 91, 20, 61,229,131,192,152,115, 97, 51,252, 80,187, 36, 68, 67,200,
+229,242,140, 46, 93,186, 48,181,223, 91,241,249,124,110,131,231,205,177, 67,135, 14,111,184,214,122, 52, 41,238,184,115,231,206,
+124, 79, 79, 79,184,187,187, 71,247,232,209,195, 84, 36, 18,225,210,165, 75,240,240,240,240, 50, 53, 53,189, 23, 30, 30,206, 89,
+177, 98,133,239,193,131, 7, 1, 96,129, 30,209, 57, 40, 40, 40,232,120, 68, 68,132,128,203,229, 66, 42,149, 34, 49, 49, 17,102,
+102,102,224,241,120,248,240,195, 15, 89,189,123,247,182,234,223,191,255,169,212,212,212, 73,104,198, 8, 40,153, 76,198,172, 90,
+181, 10, 70, 70, 70, 48, 50, 50,130, 72, 36,130, 72, 36,130,177, 0,196,190, 69,206,194,133, 7,202,132,159,173,221, 23,118,100,
+239,186, 27, 78, 78,244,151,217,217,217,101,205,125, 22,164, 55,111,194,248,241, 99,160,222,187,171, 47,204, 68,150, 8, 9, 9,
+209,229, 72,129,203,229,162, 87,175, 94, 58,249, 44, 45, 45, 79,179,217,236,215,106,166,106,181, 90, 16, 18, 18, 66,165,166,166,
+138, 72,146, 20,209, 52,141,144,144, 16, 74,173, 86, 11,108,109,109,163,105,154,206, 47, 42, 42, 26,173, 71,112,229, 0,150,147,
+ 36,185,131,207,231,179,219,180,105,147,185,102,205,154, 59,181,110, 38, 24,134, 33,219,180,105,227, 47, 20, 10, 93,228,114,185,
+ 26, 53, 77,135, 6, 55,203,128, 70,193, 48,140, 95,141, 41,172,129, 2, 0,175,246,123,113, 77,105, 7,235, 6,191, 3, 64, 81,
+109, 69,209, 78,203,126, 49,128, 36, 0,157, 0,216,214, 30,123, 64, 16, 68, 73, 11,130,169,221,209,138,136,136,208, 84, 97,131,
+131,131, 53, 5,139,137,137, 9, 30, 60,120, 0,130, 32, 96, 98, 98, 2, 83, 83, 83,152,153,153,161,162,162, 2, 73, 73, 73, 72,
+ 73, 73,193,139, 23, 47, 64, 16, 4, 92, 93, 93, 81,247, 2,213,131, 38,131,251,101, 75, 4, 4,198,124, 16, 4,208,117,128, 15,
+124,250,121,163,251,253,244, 69, 49, 87,137, 3, 98,177, 56, 13, 0,219,219,219,123,102,207,158, 61,177,117,235, 86,200,229,242,
+173, 90, 68,150,134,243, 86,146,186, 27, 0, 56, 56, 56, 44, 59,122,233,153,209,212,161,237,171,197, 98,241,119, 45,136,156,215,
+ 50,226,162,162, 34,189,215,226,163,105, 26,165,165,165, 77,114, 54,116, 8,182,237,216,109, 46, 41,207,199, 87,223, 28, 63, 96,
+234, 77, 0, 0, 32, 0, 73, 68, 65, 84,133, 74,165,194,210,165, 75, 65,211,180,230, 83, 86, 86,166, 87, 56, 25,138,122,211, 59,
+ 32,107, 90, 79, 9, 54,224, 60,161, 70, 87,100, 29,223, 13,130, 1, 8, 10,192,155,247,213,176, 16, 18,176,184,194, 19,235,190,
+217,105, 30,155,146,131,115,215, 98,161,172,200,133,248,241,153, 26,203,177,215, 36,156,148,179,208,195,167, 61, 22,175,254,214,
+226,139,197,211, 78, 40,164, 18,119,188,222,140,120, 85,247, 75, 67,225,171, 13, 27,112, 96,231, 86,124,187,117, 39, 42,202,203,
+192,225, 88,215,102,244, 20, 40,138,106,250,222, 25,102,104,200,162,143,136,111,190, 63, 13,127, 79, 7,156,186,116, 31,125,186,
+184,224,204,239, 49,232,231,215, 22,231,174,198, 98, 64,143,246,136,140, 74,192,226,217,147,136, 73,151, 15, 14,109, 78, 26,109,
+223,190,219, 92, 82,145,143,136,141,135, 81,176,103, 15, 50,231,207,135,127,237, 57,247, 9, 2,220,214,173, 1,174,238, 52,106,
+136,228,228,100,200,229,242,198,106,251,240,240,240,208,153,238, 82,169,244,161, 90,173,102,242,243,243,137,252,252,124,136, 68,
+ 34, 34, 49, 49,129,242,242,242, 30,197,164,252,250, 3, 0,132,134,110, 26,117,242, 97, 5,170,163,119, 66,122,103, 23,184,109,
+227,200, 3,235,103, 43,103,173,221,255,176,222, 59,250, 90, 56,243,242,242,134,229,229,229, 1, 0,218,181,107,151,146,154,154,
+218,169,174,169,185,182, 9,145,171, 86,171,221,234,154, 19,213,106, 53,228,114, 57, 6, 13, 26,196,106,234,222, 45, 44, 44,122,
+122,120,120, 32, 54, 54, 22, 59,119,238,180, 12, 10, 10,194,211,167, 79, 65, 16, 4, 54,109,218, 68,120,122,122,114,138,138,138,
+ 48,100,200, 16,156, 62,125,186, 87, 69, 69,133,174,248, 52, 17,137, 68, 7,207,159, 63, 47, 32, 73, 18, 18,137, 4, 52, 77,163,
+119,239,222, 32, 73, 18, 9, 9, 9, 88,189,122, 53, 78,159, 62,141,179,103,207, 10,253,252,252, 14, 86, 87, 87,123,224,245,102,
+125,109,105,196,200,100, 50,134,207,231,131,207,231, 67, 32, 16, 64, 32, 16,128,199,227,161, 82, 6,204,218,150, 41,103, 9,172,
+105,175, 46,125,218,127,180,112, 19,249,221,154,143,175, 3, 56,167,239, 51, 15,212,244,201,218,241,243,207, 59,167,148,151,147,
+ 0,240, 35, 65,208, 74,134,249, 86,159,247, 29, 0, 42,101,229,112,113,109,141, 83, 39,206, 98,204,132,145,141,138, 44, 14,135,
+ 11, 46,135, 3, 83, 75,145, 78, 78, 46,151,107,151,146,146, 98,197,225,112,192, 48, 12, 40,138,130, 82,169,204,255,226,139, 47,
+108,134, 15, 31,110,114,241,226, 69,114,248,240,225,180,133,133, 69,213,253,251,247, 11,212,106,181, 85,223,190,125,155,243,204,
+239,245,241,241,233,122,230,204,153,143, 67, 66, 66, 98,150, 45, 91,246, 85,253,131,155, 55,111,222, 16, 25, 25,233, 50,106,212,
+168, 35,143, 31, 63,222,219,156, 60,228,109,243,121, 3,231,223,143, 83,155, 22,169,133, 29, 65, 16, 17,245,242,236,224,186,253,
+144,144,144, 85,161,161,161,137, 4, 65, 68,212,255,189,238,188,218,202, 98, 68, 99,251,181,215, 90,174, 92,185,210, 59, 44, 44,
+108, 83, 64, 64,192,241,232,232,232,231, 0,154, 43,180,154,238,163, 85,119, 67,245,111,178, 65,161,134,138,138, 10, 84, 84, 84,
+ 32, 59, 59, 27,251,246,237,171,125,161, 57, 96,179,217, 96,179,217,154,254, 12,218,112, 45,226,207, 93, 0,118,117,237,218,149,
+ 19,127, 39,252,226,231, 7, 22, 14,236, 54,168, 43,235,225,181,248,177,168, 89,143,112,216,244,233,211,173, 1,224,240,225,195,
+ 69, 0, 46,254, 31,169,230,240,180,180,180,197, 14, 14, 14,154, 62, 42,245,155, 15,213,106, 53, 4, 2, 1,234,250,178,200,100,
+ 50,236,219,183, 79,205, 48, 76,120, 19,156, 72, 77,188,142,180,196, 27, 53,215,209, 52,104,234,213,245,235,214,173, 3,195, 48,
+154,194,126, 78,173,115,162, 83,228, 53, 22,231, 76,131,109,131,223, 25,138,210,209, 60,193, 93, 56,118,218,124, 7,154, 96,227,
+183,235,143,192,225,112, 64,215,115, 51, 57,172,154,218,114,226,211,151,112,180,243,194, 7,147,102,219,159, 57,178,123,161, 90,
+ 41,251,166,185,113,237,238, 19,128, 69,139, 23,227,135, 3, 7,176,122,237, 6,141, 2, 80, 83, 20,212, 58,195, 73,146,131,122,
+123, 67, 93,249, 18, 44, 22, 11, 3,252,219,131,197, 98, 97,112, 64, 71,176, 88, 44, 12,233,237, 14, 54,155,141,161,125, 60,209,
+161, 67, 7,176,217,108, 82, 71,186, 35, 53,241, 26,210, 18,255,168, 39,122, 25, 48, 0,148, 98,241, 27,231,171,196, 98, 48,206,
+ 86,205,125,182, 48,115,230,204,178,236,236,108,101,195, 99, 78, 78, 78,220,155, 55,111,154,107,105,182,211, 64, 40, 20,250,177,
+217,236,135, 37, 37, 37,180,145,145, 17, 73,211, 20,237,229,229,205,186,180,127,213,153,186,115, 86,174, 92,117,102,188,159,233,
+168,163,225, 17, 12,183, 77, 31,130,224,240,213,159,174,221,207,229,112,133,126,128, 84,159,202, 3, 41,151,203,241,228,201, 19,
+232, 10, 15,195, 48, 77, 54,253,148,150,150, 78,247,240,240,184,185,107,215, 46, 75,130, 32,112,235,214, 45,176, 88, 44,205, 39,
+ 61, 61, 29, 36, 73,226,243,207, 63, 87, 86, 84, 84,124,162, 43,108,108, 54,123,241,169, 83,167,204,120, 60, 30, 36, 18,137,230,
+189, 97,177, 88, 72, 73, 73,193,119,223,125,135,233,211,167, 35, 43, 43, 11,142,142,142, 88,186,116,169,113, 88, 88,216, 98,165,
+ 82,185, 65,143, 36,138, 83, 40, 20,221,140,140,140, 32, 16, 8, 80, 39,184, 0,224,247, 68, 78,130, 84, 42,237,108,101, 85,109,
+111, 19, 21,241, 91,175,160, 15,124,173,108, 28, 2,196, 98,113,179,150,206,122, 6, 28,200,160,168, 47,134,157, 57, 99,123,251,
+204, 25,250,238,249,243, 57,124,137,100,191,222,207,144,138, 68,102,122, 14,252,252,252,240,240,225, 67,248,249,249,213, 23, 77,
+224,241,120,224,114,185,224,114,185,176,182,208,171, 11, 5, 67,146, 36,110,223,190, 13,138,162,160, 80, 40,160, 80, 40,224,233,
+233, 89,114,227,198, 13, 99, 0, 72, 79, 79,103,166, 78,157, 90,118,239,222, 61,116,233,210,244,122,234,118,118,118, 55, 89, 44,
+ 86,155,250,191, 21, 23, 23, 91,140, 30, 61, 26,165,165,165,239,143, 30, 61,186, 79,237,251,155,251,235,175,191, 78, 5, 0, 30,
+143, 7,146, 36, 41, 24,240,175,135, 46, 45, 82, 95, 40, 53, 20, 92,161,161,161,193, 13,127,171, 47,170, 26,251, 94,255,218,176,
+176,176, 77,245,184,165, 45, 8,190,238, 62, 90, 17, 17, 17, 76, 35, 10, 82,111,232, 18, 90,117,136,141,141, 85, 57, 58, 58,254,
+144,246,232,197,192,246, 62,174, 16,138,248,239, 1,216,197,231,243,151, 76,155, 54, 13,119,239,222, 69, 66, 66,194, 79,120,203,
+ 81, 56,222,222,222,151,249,124,190,139,150,102,146,204,132,132,132, 33, 90, 10,134,181,231,207,159, 71, 83,157,225,175, 95,191,
+ 94,191, 80,170,223, 25,190,241, 7,131,102,160, 82,170, 80, 85, 45,125, 85,136,215, 10,173,170,170, 42, 76,152, 48,225, 53, 71,
+171,160,160, 64,231,253, 17, 4,129,239,206,157,195,149,240,112,188,239,235,139,211,247,239, 35,108,218,100,184,187,180, 2, 67,
+ 17, 96, 8, 32,235,216,110, 20, 87, 84,226,151,107,183, 81, 34,169,198,148,190,125,225,102,106,221, 52, 47,135, 59,216,191,103,
+ 0,247,106,116, 18, 56, 28, 54, 72,208, 96, 84,213,112,244,232, 15, 22, 73,194,204,174, 45,184, 28, 14, 56, 28, 54,210,179,139,
+224,225,221,157, 23,193, 19, 12,110,137,208,114,114,105, 11,138,162, 48,125,250,116, 28, 63,126, 28, 86,246, 46, 48,115,242,198,
+215, 91, 15,224,253, 65,125,117,222,127, 93, 13,158,205,102,131,197, 98,189,177,173,251,174,143, 59,201,208, 12,148, 13,211,136,
+102, 0,134, 65,235,141, 27,209,122,227, 70,220,175,253, 79,207,170, 42, 72,165, 82,160,135, 87,179, 68,150, 66,161, 64,118,118,
+182, 50, 47, 47,207,174,145,227,249, 10,133, 66,167,176, 57,116,232, 80,220,140, 25, 51,186, 89, 90, 90,198,196, 61,126,172,242,
+241,245,229, 92,220,183,234,108, 93,179, 33, 0,248,250,250,150,172, 90,181,234,236,212,113,193, 35,247,134, 76,164,230,110, 56,
+194,230, 11,133,221,130,151, 29,138, 59, 54,110,156,238,246, 30,185, 60,195,199,199,135,209,231,190,170,171,171,243,154, 56, 60,
+ 2,192,250,174, 93,187,154, 6, 5, 5,225,230,205,155, 24, 51,102,140, 92,169, 84,166, 1,192,240,225,195, 59,254,242,203, 47,
+188,164,164, 36,216,216,216,112, 50, 51, 51, 15, 66, 71, 7,121, 30,143,215,191,123,247,238,164, 92, 46,127, 67,100,133,133,133,
+ 97,210,164, 73,232,216,177, 35,104,154, 70,101,101, 37,130,130,130, 56, 59,119,238,236,175,167,208, 90,228,238,238,254, 29,106,
+ 70, 29,214,207, 11,147, 81,211,172,133,226,226,226,188, 71,247,174, 37,246, 29, 52,186, 91,155, 14,222, 14, 9,113, 15,155, 36,
+180,181,181, 93, 73,146,228,120,154,166, 89, 21, 21, 21,217,143, 20,138, 14,158, 46, 46,118,189, 71,142, 68, 57,135,195,218,113,
+237, 26,153, 47,145, 24, 3,208,171, 9, 82,166,170,130,139,107, 77, 87,191, 49, 19, 70,226,225,195,135, 24, 59,113, 20,184, 92,
+ 46,216,108, 78,205,187,201,173,113,180,204,173, 77,245,122, 54, 85, 42,149, 38, 15,175,235,231,165, 84, 42, 81,215, 53,203,200,
+200, 72,115, 76, 46,151,131, 32,136,166,158, 13,183,147, 27,214,216, 10, 77,205, 64,169, 84,240, 26, 57, 86,243, 76,223,251,113,
+175, 16, 52, 45, 44,203,204,192,130,240,243, 28, 24, 96,128, 22, 87,171, 41, 45, 82, 95, 40,189, 45, 8,130,136, 8, 9, 9, 89,
+ 5,128, 9, 9, 9, 89, 85,183, 31, 26, 26, 42, 5,144,219, 66,177,245,134,203,197,126, 23, 34,171,174,121,161, 41, 4, 5, 5,
+ 45, 48, 49, 49,217, 89,183,159,125, 55, 23,217,119,115,225,209,201,171,119, 87,223,110,229,147, 38, 77,130,149,149, 21,150, 45,
+ 91,198, 0,248,169,185,255,159,158,154,104, 12,128,113,112,112, 88, 86,155, 33,251,222,191,127,223,230,193,131, 7,232,222,189,
+251, 43,235, 94,169, 68,159, 62,125,154,162,146,212,118,106,255,236,221,185,100, 52,148, 74, 37,170,171,165, 80, 40,148, 80,171,
+104,168,213,106,248,121,153,224,200,129,144,154,223,212,117,238, 89,141,107,214,218,222, 4, 38,198, 28, 21, 73, 18,210,152,184,
+188, 70,115, 76,133, 66,129,184,204, 76, 60,126,241, 2, 0,240, 65,104,211, 29, 95,143, 92,187, 9, 79, 79, 79, 93,161,109,223,
+218,209, 30, 47,175,196,213,100,222,210,108, 60,248,243, 36, 76, 76,140, 1, 0, 94,129, 83,192,229,214, 8,173, 42,169, 18,214,
+157,156, 64, 48,140,214,105, 1,140, 44,236, 47,179,185, 2, 23,134,162,193, 48, 52, 24,154, 2,195,208, 96,113,184, 70, 11,230,
+124, 12,154,166,224,239,239, 15,130,197, 2,165,146, 99,220,136,193, 40, 45,151,192,202, 92,191, 66,130,203,229, 34, 48, 48, 80,
+168,237,248,211,167, 79,165,245,133, 89,211,105,164, 66, 85,149, 20,114,185, 28, 74,133, 26, 74,149, 26, 84, 59, 46,190,250, 98,
+ 50,212, 74, 53,170, 39, 6, 64,169, 82,131, 94, 60, 10, 74,133, 10, 89, 70, 36,233,227, 97,173, 34, 65, 72, 31, 37, 23,154,234,
+ 18, 90,117,226, 64, 27, 26,235, 19,168, 69,108, 61,158, 49, 99,134,159,143,175,239,195,241,131,124,183,196, 39, 36,190,140, 79,
+ 72,124,227, 60,151,142,190, 25,115,195,142, 47,229,112,133,126,193,203,154, 30,117, 88, 31,245,155, 17,223, 18,171, 36, 18,137,
+143,177,177, 49, 82, 83, 83,193, 98,177, 64, 16,196, 83, 0, 62, 0,224,224,224,240,140,205,102,187,178, 88, 44,236,217,179,135,
+ 96,179,217,157, 3, 2, 2, 86,201,100,178,147, 77, 84,232, 60, 76, 76, 76, 94,115,179,184, 92, 46, 66, 66, 66, 48,117,234, 84,
+141,200,226,114,185, 56,116,232, 16,186,117,235, 6,133, 66,225,161,103,120, 31, 0,232,171,135,227, 71,212,138,115,157, 98, 84,
+173, 86,207, 40, 30, 63,190, 3,162,162,208,219,213,213,211,207,207, 15, 74,229, 43, 67,211,213,213,213, 73, 34,145,228, 73,165,
+210,255,162,102,106,131, 71, 77,138, 34, 25,141,204,244,154,238,167, 15, 31, 62,132,191,191,191,198,193,170,239,102,113,185, 92,
+ 8,121,198,205, 18, 90, 52, 93,147, 47, 73, 36, 18, 50, 42, 42,202,218,221,221,157, 0, 0,119,119,119,226,209,163, 71,150, 70,
+ 70, 70, 69,237,219,183,215, 89, 1, 22,154,154,225,208,140, 9, 0,128, 47, 7, 13,213, 84,140, 46,173, 95, 5, 14,135,131,129,
+203, 86,189,241,220,211, 52,205,130, 1, 6,145,165,135, 22,121, 87, 34,171,161,163, 21, 26, 26,154, 24, 26, 26,250,134, 59,214,
+ 76,232,118,180,234, 91,119,205, 69,221,203,170, 13, 91,183,110, 69,231,206,157,155, 44,136,118,238,220,137,163, 71,143,110, 5,
+144,222,108,203,113, 96, 87, 47,108, 59,147,232,218,209,139, 0,128, 13,139, 71,144, 85, 85, 85,184,125,251, 54,204,204,204,240,
+244,169,222,211,126,153,152,153,153,173, 39, 73,114, 28,171,225, 8,128,198, 5, 38, 69,211,116,120,121,121,185,214,233, 29, 24,
+ 6, 80,170,212,168,170,150, 65,161, 80, 96,241,231,187,117, 6, 34, 20, 32,148, 10, 9, 59,176, 95,128, 80,155,163,227,223,185,
+ 63,230, 77, 51,126,163,240,102,145, 0, 73, 2, 93,252,107, 28,151, 71,247, 19, 65,211, 0, 69, 3,214,182, 22,248,233,216,150,
+ 38, 69,190,154,162,107,107,199, 20, 42,229, 20, 60,122, 6, 35, 39, 57, 74,227, 32,241,184, 53, 77,198, 92, 14, 7, 52, 67,212,
+204,250,160, 77, 8,241,132, 46,165,226,116,183, 3, 17,241,152, 21,220, 25,191, 94,141,195,216, 65, 62,184,113, 47, 9, 65, 61,
+ 60,145,152,246, 2, 94,110,109,176,231, 96, 56, 24, 6,146,239,183,125,157,247,170, 64, 83,103,234,227,104,221,189,123, 87,218,
+208,197,170,191,101,116,151,135, 96,152, 87,142,150, 84, 38,199,178,149,122, 77,231, 83,147, 70,125,123, 10,245, 57,185, 41,199,
+ 74, 31, 33,214,208,217,130,142,233, 89,218, 1,232, 6,172,248,191,204, 56, 41,138,194,133, 11, 23, 52,233,209, 88, 58,214, 79,
+ 59, 61, 68, 14, 50, 51, 51,145,152,152,136,158, 61,123,162,188,188, 28, 28,146,196,210,248,120,120, 78,155, 6, 5,151, 11,154,
+166,193,227,241, 48,123,246,108,189,227,179,153,185,115,109,103,110, 74, 23,249,150,128,128,128, 14,169, 85, 85, 72, 76, 73,193,
+160,117,235, 0, 0,145,145,145,175, 61, 19, 75,150, 44,225, 37, 37, 37,205,140,137,137,153,249,242,229,203,173, 0,150,106,205,
+103, 25,185,166,143,214,248,201, 99,208,193,189, 29,142,254,124, 76,115,124,201,242, 69,224,112,184,224,112, 57, 48, 55, 51,215,
+235,110, 84, 42,149, 70,180, 86, 87, 87,147,145,145,145,173, 7, 15, 30,204, 93,180,104, 17, 1, 0, 71,143, 30, 37,119,237,218,
+ 37,186,114,229, 10,183, 85,171, 86, 98,157,226, 82,169,124, 35,141, 9,130, 0,135,195, 1,151,199, 5,104, 26, 4, 65,136, 54,
+111,222,188, 33, 49, 49,177,187,187,187, 59,228,114,249, 52,212, 12,212, 48,204,163,101, 16, 91, 77,106,145,198,250, 90,213,186,
+ 82,218, 80, 88,191,223,150, 54,161, 86,191,207, 22, 90, 54, 40, 67,191, 62, 90,141,129,197, 98,233,116,171, 72,146,212,217,116,
+184,100,201, 18,152,152,152,104, 43,128,152,248,248,248, 36,177, 88,124, 0,192,238, 22, 37,206,181,216,196,245,159,141,146,160,
+182,109,213,220,220,188,104,192,128, 1,149, 0,148, 39, 79,190, 94, 65,150,203,229, 90, 11,112, 51, 51,179,245, 63,254,248,227,
+194,145, 35, 71,146, 13,167, 24,168,223,188, 87,247, 81,169, 84, 56,121,242,228,194, 21, 43, 86,160,188,188,252,179,166, 10,241,
+234, 42, 41,164,181, 29,161,159, 37,252,170,111,166,174,245,144,177,185, 3, 90,183,243,209, 90,152,144,220,154, 62, 68,118,206,
+175, 10, 48, 19, 19, 1,168, 38, 56, 9,130, 76,127,145,245,178,149,147,189, 37,158,101, 23,194,174, 77,103,148,230,190,138, 7,
+ 54,155, 5, 78,109,211,161,185,169, 8,133, 5, 5, 32, 73, 86,147,194,248,235, 95, 98,113, 47,225, 5, 78, 93,125, 4,165,172,
+ 10,219, 14, 95,130, 82, 94, 9,165,172, 10, 74, 89,205,118,211,138, 79, 65, 16,200, 83,201,171, 58, 54, 39,221,217,108, 54,122,
+244,232,161, 85,232,228,230,230,234,233,104, 49, 26, 71, 75, 42,107,102, 26,233, 87,115,106,210,177,170, 59,222, 82, 97, 80, 55,
+229,131, 80, 40,236,118,232,144,246,105, 28, 26,131,189,189,253, 69, 99, 99,227,182,250,158,223,140,201, 75, 55,153,155,155,175,
+119,119,119,247,216,182,109, 27,135,197, 98, 97,224,192,129, 29,237,237,237, 51, 1,192,203,203,203,177, 46,143,153, 59,119, 46,
+115,247,238,221,132,154, 58,134,118,240,120,188, 20, 51, 51,179,110, 65, 65, 65, 40, 47, 47, 71,118,118, 54, 68, 34, 17, 60,183,
+108, 65,252,220,185,240,221,183, 15,228,128, 1, 32, 8, 2, 60, 30, 15,241,241,241, 16, 10,133, 41, 50,153,214, 41,223,122, 0,
+248, 22, 64,111,188,106, 46,100, 0,220, 70,205,180, 11,247, 26,201,239, 72, 0,160,104, 90, 87, 98, 77, 94,182,108, 25,202, 56,
+ 28, 96,248,112,112,211,211,161, 84, 42,209,179,103, 79,141,203,222,179,103, 79,176,217,108,248,248,248,192,209,209, 17,123,246,
+236,153,220,148,208,146, 85, 42,145,153,158,131,128,128, 0,141,115, 53,124,248,112,141,163,197,225,112, 52,206, 22, 65,233, 22,
+174, 4, 65, 48,245, 43,201, 20, 69, 17,108, 54,155,253,217,103,159, 17, 99,198,140, 97, 20, 10, 5,205,227,241,200, 83,167, 78,
+ 17, 55,110,220, 96, 87, 85, 85,233,172,136,123,143, 26,135, 47, 7, 15,171,121,247,219,218,128,195,229,128,199,229, 98, 89, 74,
+142, 38, 93, 76, 15, 29,231,133,133,133,141,117,119,119,175,105,134, 7,216,134,121,180, 12,208, 97,244, 20, 54, 16, 73,138,122,
+251,133, 0,136,218,253,194,122,130,170,144, 32,136, 7, 12,195,116,111,112,110,221,113, 69,131,109,221,241,199, 45, 8,126,221,
+ 90,135,111,136,175,166,106,196,105,119,238,220,113,243,243,243, 67, 86, 86,214, 27, 35,225,234, 10, 46,145, 72, 4,161, 80,136,
+232,232,104, 0, 72,211, 70,118,227,198,141, 93,168,153,117,185, 38, 68, 14, 14, 1, 65,227,251, 71,251, 15,237,142, 95, 66,143,
+149,139,197, 98, 31,188,154, 67,135,112,116,116,156,202,225,177, 39,184,122, 59, 7,130,166,191,189,118,254,246,186,166,238,208,
+181,163, 87, 37, 0,105,221,168,195, 22,142, 62, 4, 73,146,227, 70,142, 28, 73, 38, 37, 37, 97,194,132, 9, 56,122,244,168,214,
+115,167, 78,157,138,227,199,143, 99,228,200,145,228,202,149, 43,181, 78,239,240,186, 91,162,120,103, 15,101,234,211,199, 56,114,
+252, 71,173,125,144,108,109,107,250, 99, 21, 20, 20,105,126,235,238,215,116,203, 8,173, 86, 92,137,141,185, 31,208,171,223, 64,
+110,118,126, 25,104,181, 28, 50,201,171,235,171,203,242,193,168,101,224, 26, 89,194,222,218, 12, 15,239,252,174, 80, 42,100, 87,
+154,226, 92, 56,210, 11,115, 71,120, 0, 12,141, 81, 75,127, 66,196,238, 5,154, 26,116,159, 49,139,112,237,228, 14,189,251,248,
+ 53, 4,135,195, 65,124,124,188, 84,155,155,197, 98,177,244,153,147,171,214,117, 84,161,186, 90,138,106,169,236, 93,230, 29, 54,
+118,118,118,223, 91, 88, 88, 8,180, 8, 41, 27, 27, 27,155,239,173,172,172, 4,250, 54, 29,106, 19, 89,181,243,106,197,204,152,
+ 49,163, 89, 98,139,207,231,183, 77, 75, 75,211, 76, 86,218,212, 86,161, 80, 32, 40, 40, 72,223,201, 75,207, 3,120,238,224,224,
+112,219,211,211,211,236,217,179,103, 56,118,236, 24,151,195,225, 56,215,229, 31, 18,137, 4, 44, 22, 11, 5, 5, 5, 42, 0, 31,
+ 67, 71,211,153, 92, 46,143,138,138,138,234, 50, 98,196, 8, 86, 74, 74, 10, 88, 44, 86, 77,184, 2, 2,224,187,111, 31, 18, 62,
+251, 12,129, 47, 94, 64,166, 84, 66, 32, 16,224,242,229,203,202,234,234,234, 40,109,124, 66,161,240, 64, 70, 70,134,151, 64, 32,
+128, 82,169, 4, 77,211, 32, 73,146, 96,179,217,125,204,205,205,119, 2,232,222, 32,177,108,125,187, 7,117,162,212,106, 74,156,
+245,172, 80, 87, 4, 20, 23, 23,227,252,249,243,232,217,179, 39, 2, 3, 3,145,155,155,139,244,244,116,188,255,254,251,154,115,
+ 30, 63,126,140,216,216, 88,180,111,223, 94,183,163, 71,170,208,190, 83, 91,112,185,220, 26,135,136,195,173,173,248,112, 52, 78,
+ 22,151,195, 5,135,205,129, 64, 40,208,219,209, 34, 8, 2, 36, 73,130, 32, 8, 8,133,194,186, 74, 54,221,186,117,107,113, 73,
+ 73,137, 3, 0,150, 80, 40, 4, 69, 81,122, 85, 90,234,202,136, 58,145,197,229,113, 53,206, 22, 0,148,149,149,201, 70,142, 28,
+249, 95,185, 92,254, 17, 90,182, 66,137, 1,255, 50, 16, 4,241,224,255,226,218,102, 96,120,173,176,122,163, 83,124, 83, 15,248,
+251,189,122,245,218, 55,105,210,164,129,219,183,111,135,177,177, 49,196, 98,177,166, 64,228,241,120,112,114,114, 66, 73, 73, 9,
+246,239,223,143,156,156,156,235, 0,102,235, 27, 34,177, 88,124,247,233,163,180,226,160,177,189,172,188,122,117, 50,207, 78,203,
+233, 41, 22,139,163,107, 69,214, 79,147,150,188,255, 81,208,104,127,112,121, 28,100, 63,205,195,181,243,183,255,191, 36, 38,139,
+197, 98, 17, 4,129, 9, 19, 38,232,117,254,196,137, 19, 17, 21, 21,133,166,154, 25,233, 58, 71,171, 90,134, 42,233,187,171,172,
+205, 91, 48, 21,243, 22, 76,213,136, 9,125,154, 94, 0,192,209,241, 68, 19, 66, 75,185, 61,226,196,254, 89, 93,253, 3, 92,186,
+121,181,197,189,152, 71,248,101,223, 43,147,225,224,174, 13,248,230,224,117, 56,217, 89, 64, 41,175,194,197, 95,127,200, 83,202,
+171,183,183,208,148,171, 17,183, 4, 1,134,161,155,117,239,117,226,137,195,225,192,219,219, 91,171,163, 85, 82, 82, 34,213, 85,
+ 48,104,210, 72,161, 66,101,149, 20,210,234,119, 38,180,124,251,244,233,115, 37, 60, 60,220,202,214,214, 22, 47, 95,190,108, 40,
+180,124,123,247,238,125, 37, 60, 60,220,202,206,206, 14,217,217,217,122, 79, 43,210,136,200, 66, 97, 97, 33, 81, 90, 90, 74, 91,
+ 88, 88, 52, 75,108,145, 36, 9,185, 92,142,228,228,100,125,255, 86,239, 17, 98,102,102,102,135,142, 31, 63,110, 86, 84, 84, 4,
+ 22,139,133,228,228,228,215, 70, 29,214,125,126,250,233, 39,238,168, 81,163,126, 44, 43, 43,107,114, 88,155, 90,173,222, 58,117,
+234,212,153,185,185,185, 22,182,182,182, 16,139,197,224,241,120, 96, 24, 6, 68, 80, 16,250, 62,127, 14, 37, 69, 65, 40, 20, 34,
+ 53, 53, 21, 7, 14, 28,168,170,157, 42,166, 81,131,140, 32, 8, 55, 46,151,139, 41, 83,166,188,118,224,240,225,195,248,160, 27,
+171,155,141, 25,187, 82, 13,129, 60, 95, 56,236, 34,139,197, 34,124,123, 12,232,216,163,223,112,239, 39, 9,247,158, 21,230,231,
+232,202,148, 84, 10,133, 2,238,238,238,120,240,224, 1,174, 94,189,138, 1, 3, 6, 32, 48, 48, 16,113,113,113,248,253,247,223,
+ 17, 27, 27, 11,130, 32, 96,101,101, 85,215,253,162,201, 62, 24,138,106, 53, 10, 94, 22,191,225, 94, 53,220,231,114,185,144, 75,
+149,122,165, 81, 74, 74, 10, 30, 60,120,160,153, 90,134,197, 98,169,167, 77,155, 6,134, 97,152,140,140, 12,152,152,152, 48, 51,
+102,204,160,216,108,182, 58, 55, 87,191,254,193,117,162,170, 78,100,177,185,156,215, 4, 26, 77,211,146,184,184,184, 89, 0,226,
+106,157, 44,192, 48,143,150, 1,255,219,184,128, 55, 23,150,214,233,104, 61, 7, 48,232,216,177, 99,147,207,158, 61,187,117,231,
+206,157, 54,193,193,193, 40, 45, 45,133,139,139, 11, 28, 28, 28, 16, 17, 17,129,200,200,200, 34,138,162,150, 2,104,204,250, 25,
+132, 38,230,172,201,125, 38, 14,151, 87, 86,206,245, 11,244,192,245,147,183, 66,237,237,237,103,179, 88,172,197, 51, 86,125,248,
+ 81,255,145,221,145, 26,155,129,187,191,199, 35, 63,171, 72, 39,103,195,206,240,230,230,230, 51,141,140,140,120, 0,148,141,212,
+138, 27,142, 58,212,112, 82, 20, 69, 41, 20, 10,156, 56,113, 66, 47,177,117,236,216, 49,200,100, 50, 80,111,182,175,106, 56, 25,
+154, 33,216, 28, 62, 28,157,220,161, 84, 86,129,166, 91, 60,160, 82,195, 89, 87, 3,125,198,227,193,182,168, 8,247,238,221,211,
+ 79,114, 15, 31,174, 43,141,100, 10,153,100,202,142,141,203, 34,230,135,124,107, 62,160, 87, 23,124,185,229, 48,148,202,131, 32,
+ 89, 36,132,124, 46,252,252,123,131, 5, 57,190, 15, 91, 94, 86, 93, 81, 58, 5,111, 46,197,243, 26, 39,211, 84, 11, 11, 3, 80,
+ 52,141,171, 55,239,235,125,239,154,210,158,162,192,102,179,241,244,233, 83,105, 99,163, 13, 89,172,154,102,206,186,154,122, 83,
+156, 12, 77, 19, 28,174, 0, 78, 46,158, 80,200, 43,223, 73, 26,217,218,218, 46, 63,115,230,140, 85,221, 84, 9,113,113,113, 32,
+ 8, 34,249,149,227, 88,115, 92, 42,149, 34, 33, 33, 1,113,113,113, 64,205, 8, 55,189,223,163, 58, 39,171,176,176,144, 16,139,
+197, 48, 50, 50, 34,227,226,226,228, 62, 62, 62, 49, 58,222,111, 13,167, 76, 38,123,161,173,255,164, 76, 38,107, 37, 16, 8, 56,
+ 13, 10, 81,199, 14, 29, 58,164, 54,210,132,248, 70, 56,203,203,203,239,173, 88,177,194,111,232,208,161, 88,190,124,121,137,133,
+133,133,201,247,223,127,207,102,177, 88,196,252,249,243,169,130,130,130,202, 31,126,248,193,236,236,217,179, 40, 43, 43,139,214,
+227,222, 37, 50,153,108, 86,175, 94,189, 14, 95,186,116,201,200,205,205, 13, 21, 21, 21, 96, 24, 6,135, 14, 29,194,252,249,243,
+ 33, 16, 8,144,154,154,138, 15, 62,248,160,186,186,186,122, 22,222,236, 59, 89,199, 73, 16, 4,193,208, 52,141, 53,107,214,104,
+ 38, 39,173,155,172,212, 68, 72,224,192,146,118,162, 69, 63,148,139, 38,127,249,195, 52, 0,160,212,106,234, 73,194,189,103,135,
+118,127,121,131,203,229,222,212,145, 70,171, 23, 45, 90,244,253,240,225,195,133,198,198,198, 40, 41, 41,193,237,219,183,113,231,
+206, 29,220,189,123, 23, 10,133, 2, 86, 86, 86,176,176,176,128, 88, 44, 70, 74, 74,138, 20,192,234,166, 56,121, 70, 28,184,118,
+172, 27,249, 91,227, 96,113,234,141, 54,172,239,110,113, 57, 28,189,222,163,126,253,250,161, 71,143, 30,117, 2,136,202,204,204,
+ 20,203,229,114,162,158,232,207,173, 19,228,206,206,206,234,163, 71,143, 50, 77,113,222, 61,176, 7,151,190, 90, 13, 30,151,139,
+165,201,217, 26,209,117,120, 64, 87,112,120, 92,120,140, 24, 83,255,218,189,168,105, 46, 68, 3,145,213, 84,217,241,214,239,166,
+129,243,111,203,249,191, 12, 49, 90,176, 4, 79, 29,126,145,201,100, 23, 63,253,244,211, 48, 95, 95,223, 79,183,109,219, 70,112,
+185, 92,172, 91,183,142,121,249,242,229,207,181,181,144,210,150,132,138, 97,152,159,255, 56, 29, 61,103,122,200, 72, 98,201,246,
+ 25,125, 98,174, 37,164,116,238,229,134,206,189,220, 16,115, 61, 9,187, 87, 29, 59, 74,169,168, 53,121,121,121, 89, 58,168,228,
+131,122,119,106,216, 25,222, 42,234,198, 53,171,230,142, 58,164,105, 58,252,216,177, 99, 11, 71,143, 30, 77,222,191,127,255,141,
+ 62, 89,117,203,238,208, 52,141, 43, 87,174, 64,169, 84,226,231,159,127,166,105,154,214, 62,143, 22,152,115, 59,182,135, 77,255,
+249,200, 57, 30,143, 75,224,206,205, 83, 40, 47,109,122, 84, 23,151,203,193, 79,135, 78, 43,185, 92,206,147,198,142, 43,149,202,
+236,107,215,174,217, 13,161, 40, 14, 73,146,141, 9,168, 70, 17, 30, 30,174,162,105, 58, 83,199,105,209,249, 57, 89, 35,190, 94,
+254,241,177,225,227, 63,181,235,213,171, 15,199,218,214, 14, 4, 65,160, 32,191, 0,169, 9,247, 85, 23, 79,253,152, 95, 85,173,
+223, 18, 60, 31,127,247,135,166, 79, 22, 0, 4,207,223,169,233,159, 5, 0, 35,102,172, 64, 80, 79, 47, 16,250, 88, 79,175, 68,
+ 22,173, 86,171, 33, 18,137,160, 86,171, 27,157,226,193,204,204, 76, 40,147,201,164,181, 19, 49, 54,105, 21, 49,192, 59, 79, 35,
+138,162, 60, 74, 75, 75, 81, 85, 85,133, 59,119,238, 48, 27, 55,110, 44, 44, 44, 44,212,116,218, 84,169, 84, 30, 37, 37, 37,168,
+172,172, 68,116,116, 52, 19, 22, 22, 86, 88, 92, 92,188,170, 57,239,144, 80, 40,236,198,102,179, 99, 74, 75, 75,105, 35, 35, 35,
+ 82,165, 82,169,124,124,124,248, 66,161, 80,239, 5,213,197, 98,241, 80,109,199, 92, 93, 93,211,210,210,210, 58, 80, 20, 85,127,
+ 13, 68,174, 76, 38,115,235,213,171,151, 62,249,199,162,131, 7, 15,226,244,233,211,254, 21, 21, 21, 83, 51, 51, 51, 15, 3,240,
+103,179,217,120,244,232, 81,178, 76, 38,155, 52,122,244,232, 67,165,165,165,247, 80,179, 4,143, 62,184,148,154,154, 58,197,195,
+195,227,224,250,245,235,141, 3, 3, 3,217,142,142,142,232,222,189, 59, 82, 83, 83,113,225,194, 5,213,222,189,123,171,170,171,
+171, 63, 6,112,165,233,100, 7,161, 86,171,193,227,241, 52, 31, 62,159, 15, 46,151, 11,137,148,193, 39, 91,210,165,106, 8,165,
+ 91,215,205,186,192, 0, 68, 94,118,122, 81, 65, 94,246, 61,130, 32,110,138,197,226,114, 45,113,198,147,201,100, 93, 24,134, 97,
+ 17, 4,177, 93,169, 84,206, 88,176, 96,129,195,166, 77,155,208,169, 83, 39, 20, 21, 21, 65, 36, 18,193,205,205, 13,133,133,133,
+184,127,255, 62, 85, 93, 93,189, 15,192, 6,212,246, 31,209,134,178,162, 10,180,182,119,126,205,249,100, 24, 6, 12, 5,168,228,
+ 20, 40, 37, 3, 5,161, 2,135,163, 2,151,203,213,199,121, 98,104,154, 70,169,131, 3,232,132, 4,220,189,123, 23, 12,195,104,
+117,213,220,221,221,245,200,216,105,240,248,188,215,154, 11, 9,130, 0,151,199, 3,135,199,109,108,228,140,193,197, 50,224, 31,
+ 13,125,219,198,203, 0,204,126,252,248,241,225,254,253,251, 71, 48, 12,195, 65, 77,123,228,173,183,249,243,188,188,188,135,209,
+ 23, 30,174,180,107,109, 17, 54,108,106, 31,116,234,226, 2, 74, 77,225,118,228, 35,252,188,233,236,241,220,236,220, 25,208, 99,
+237, 51,154,166,111,244,238,214,137, 68,189,185,186, 29, 29, 29,233,150,140, 58, 44, 47, 47, 95,187,116,233, 82, 44, 95,190,188,
+ 37,163, 14, 27, 69,124, 74,225,108, 2, 76,235, 17,195,250, 14, 1, 65, 50, 10,133,188,137,140, 15,154,153, 75,185, 92,206,147,
+ 7,113, 98,159,198,206, 43, 44, 44, 28,242,209, 71, 31, 93, 97,179,217,109,155, 19,231, 52, 77,103,230,231,231, 15,212,125,166,
+250,182, 92, 90,225,118,254,248,254,207, 46,157, 62, 56,132,166,169,246, 4, 0, 22,155,251, 76,165, 84, 94,150, 75, 43,182, 65,
+207, 69,165, 55,207, 14,192,162, 29,191, 99,207,242, 17, 88, 16,118, 18, 63,174,249, 4, 43,183, 28,195,183,203, 23, 97,227,206,
+255,226,203, 69, 83, 48,118,242, 71, 52, 67,144,127,234,123, 31, 44, 22,235,210,254,253,251,167,127,242,201, 39,154, 65, 11, 12,
+195,188,150,177,171, 84, 42, 41, 77,211,216,183,111, 31, 13,224, 82, 83,124,175,167, 17,193, 52,213, 95, 74,223, 52,170,168,168,
+248, 56, 32, 32,224, 16, 0, 62,195, 48, 79, 75, 75, 75,255, 3,188, 90, 26,170,178,178,242,227, 94,189,122, 29, 98, 24,134, 79,
+ 16,196, 27,199,245, 65,237, 84, 15,221, 44, 44, 44, 98,106,157, 44,126, 75, 58,196, 55, 21,213, 77, 52, 43,234,211,132, 72, 3,
+ 88, 80,111,198,247, 77,254,254,254,245, 23,149, 78, 46, 45, 45,237,214,130,112, 93,145, 74,165, 94,107,214,172,249, 76, 32, 16,
+ 4, 85, 87, 87,119, 4, 0,145, 72,148, 42,151,203,111, 72,165,210,109,208, 61, 55,149,130,166,233, 84,181, 90,237,109, 99, 99,
+ 83, 51,162,182, 86,108, 1,192,111, 49, 84, 12, 64,117,175, 49,197,127,209, 59, 96,145,145,145,109, 44, 44, 44,222, 35, 8, 98,
+ 44,195, 48,238, 18,137, 68,190,102,205,154,232,240,240,240,242,182,109,219, 14, 27, 62,124, 56, 97,105,105,137, 7, 15, 30, 48,
+197,197,197,167, 0,172,130, 30, 35,173,105,154,206,220,188,121, 51,154,251,190, 55,117, 92,169, 84,230, 69, 70, 70, 90, 15, 45,
+ 40, 96,211, 52,141, 17, 35, 70,188, 38,224, 26,226,201,147, 39,144,203,229, 77, 78,230, 40, 47, 47,197,128,207, 86, 0,181,163,
+ 63,235, 80,227,100, 49, 96, 20, 6, 93,101,192,191, 11,127,245,130,158,122, 89,139, 14, 14, 14, 19, 4, 34,254, 60,151,142, 14,
+ 62, 47,211, 11,146, 36,229,213, 71,197, 98,241,126, 45, 25,185, 94,156,205,156,176,212, 96,255,254, 69,156,175,230,209,162,192,
+ 48, 20, 24,154, 1,195,208,160,105,170,102,193,107,134, 6, 67, 81, 4, 65,224, 79,133,180,201,153,193, 27,134,211,194,218,218,
+122, 3,195, 48, 67, 89, 44, 22, 89,223, 12,171,255,189,214,201,186, 84, 88, 88,248,101, 35,206,235,255, 92,124,134,135,135, 55,
+ 42,254,245, 29,117, 56,110,220, 56,170,153,239,230, 13,145, 72,228,208,216,177,170,170,170, 44,177, 88,252,222,223, 36, 62,235,
+143, 24,108, 14,103,179, 71, 29,234,226,116,113,113,225, 43,149,202,174, 0,220, 8,130, 48, 7, 80,162, 84, 42, 47, 23, 21, 21,
+229, 3,232, 6, 96, 77,237, 53, 95, 1,136,249, 63,126,223,133,214,214,214, 7, 73,146,108,173,207,197,106,181, 90, 81, 82, 82,
+ 50,189, 65,133, 64,195,105,101,101, 21,195,102,179, 91,235,193,147, 83, 92, 92,220,205,144,127, 26, 56,255, 65,104,216, 9, 94,
+235, 76,241,127,133,208, 50,112, 26, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,252,167, 11,173, 70,247, 13,195,106, 13, 48,
+192, 0, 3, 12, 48,192, 0, 3,222, 14, 23, 26,136,173, 11,117, 95,136, 38, 84,105,115, 44,193,150, 40,219,171, 6, 78, 3,167,
+129,211,192,105,224, 52,112, 26, 56,255,117,156, 6,188, 67, 24,108, 85, 3,167,129,211,192,105,224, 52,112, 26, 56, 13,156,255,
+116,104,109, 58, 36, 13,113, 99,128, 1, 6, 24, 96,128, 1, 6, 24,240,215, 64,111,161, 37,178,115,247,176,118,241, 57,100,209,
+186,115,156, 69,235,206,113,214, 46, 62,135, 68,118,238, 30,255,210,120, 19, 2,152,204,102,179,175,216,219,219, 87, 64,203,210,
+ 59,255, 0,152, 2, 24,139,154,249,125, 70, 1, 48,122,151,228,129, 0,123, 2, 48,111, 26,144, 53, 13,200,154, 0,204, 11,252,
+ 7,246, 27, 92,183,208, 33,224,230,197,201, 23,215, 45,116, 8,104,244,248, 82, 7,171,187,191,143,219,177,105,158,163,229, 59,
+250, 75, 19, 91, 91,219, 3,118,118,118, 47,108,109,109, 51,109,109,109, 15, 2, 48, 51,100,119, 6, 24, 96,128, 1,127, 25,234,
+250,104,213,125, 52,125,180,216, 0, 16, 17, 17, 17, 8,224, 15, 0,253,131,131,131,163, 26, 94,109,225,236,253, 73,251,118,237,
+151,127,189,110, 21, 97,111,107,109,164,166,104,101,198,139,108,207,181, 95,135,253,250,146,199,222, 90,154,149,240, 99, 11, 2,
+ 69,176, 88,172, 9,124, 62, 63, 24, 64,157, 96, 75,150,203,229, 17, 20, 69,157,128,126,195,180, 97,103,103,119,147,197, 98,181,
+105,206, 31, 83, 20,149,149,159,159,223,167,133,145, 57,206,217,217,249, 96, 96, 96,160,145,191,191, 63,120, 60, 30,214,172, 89,
+179, 84, 44, 22,111,211,151,192,194,194,213, 68,201, 23, 44,102,243,120,131, 25,149,194,155, 1, 3,144,252, 4, 90, 45,191,198,
+149,203,183,150,150,166, 75,244,164, 90, 5, 96, 70,109, 92,253, 8, 96,243,219, 60, 37,211,187, 64,165,162,106,158, 9, 46, 27,
+212,185,231,102,127,172, 94,189,154, 29, 28, 28,140, 31,127,252,177,207,129, 3, 7,102, 73, 36,146,107, 0,126, 3,240,236,109,
+159, 74, 59, 96,118,175, 62,125,118, 76, 95,186,148, 37,189,121, 19, 59, 14, 30,220,142,154,249,150,246, 52,247, 89,226,114, 49,
+214,218,154, 19,204, 48,232, 74, 0, 4, 1, 60, 42, 44,166, 35,149, 74,234, 4,244,152,139,173, 9, 76,198,235,195,241,127,105,
+ 46, 65,249, 51,230, 11,254, 8,143,190,229,207,110,124, 1, 96, 88,195,227,106,153, 96, 58,195,114, 10,150, 50,177,217, 0,182,
+188,101,180, 26,217,216,216,196,157, 59,119,174,181,191,191, 63, 27, 0, 98, 98, 98,166, 5, 7, 7, 15, 40, 44, 44,244, 6, 80,
+241,127,148, 9, 9,216, 36, 57,143,199,225, 12,166, 40,170, 51, 0,176, 88,172,120,133, 74,117, 69, 77,211,123,160,231,156,108,
+ 6, 24, 96,192, 63, 23,186,180,200,223, 28, 90,103,134,175,187, 57,166,254,182, 62, 68,182,157, 60,123, 14, 28,243,164, 92, 82,
+ 45,123,241, 34,183,116,201,188,141, 87,102, 45,250,238,236,150, 31, 34, 34,163,238, 37,223,245,240,127, 47, 73,100,219,201, 83,
+ 11,181,182, 54, 92,103,161, 80,248,112,239,222,189,202,212,212, 84,166,172,172,140,121,242,228, 9,115,234,212, 41,102,206,156,
+ 57, 50,161, 80,248, 16,128,179, 62,156,118,118,118,249, 79,174,255,206,228,196,197, 50,153, 49,247, 24,149, 74,197, 40,149, 74,
+ 70,169, 84, 50, 73,151, 34,152,184,223,111,128,202, 97, 0, 0, 32, 0, 73, 68, 65, 84, 78, 51,143, 78,157, 96, 20, 10, 5,163,
+ 80, 40, 24,185, 92,206,180,107,215,238,165,158,225,108, 8, 71, 47, 47, 47, 69, 68, 68, 4,243,235,175,191, 50, 75,151, 46,101,
+124,125,125, 41, 0,243,245,189,119,145,173, 91,144, 73, 43,159,194, 79, 66,246, 40, 47, 68, 95,102, 18,159, 63, 98, 18,159,167,
+ 49,225, 87,147,153, 25,203,118, 42, 77, 90,249, 22,138,108,221,130,116,221,187,133,133, 69, 79,130, 32,152, 58, 0, 96,218,180,
+105, 83, 89,255,227,236,236,252,218,199,201,201,169,178,109,219,182,207,172,172,172,186, 54,198, 57,169, 51, 24, 38,233, 23,134,
+ 73,250,133, 89,221, 15, 76, 98, 98,226, 93,134, 97,254,168,251, 72,165,210, 63,206,156, 57,243,199,135, 31,126,248, 7,128, 15,
+154,136, 39,189,226,115, 26,144, 37, 57,119,142, 97,182,109, 99,152,192, 64, 38, 25, 96,166, 1, 89,205,228,108,103,111,207,121,
+244,221,230, 89,138,115,231,126,102, 46, 94,188,192, 68, 70, 70, 48,103,207, 28,100,182,111,155,167,180,179,227, 36, 0,232,208,
+ 12, 78, 54,128,141, 0,182,162,198,185, 76, 45, 44, 44,100,242,242,242, 24, 0,169,181,191,109,181,177,177,217,130,198,221,183,
+ 65,245,157,172,207,134,218, 95, 28, 63,172, 15, 35, 41,127,201,140, 31,214,135,249,108,168,253,107,206,214, 80, 87, 87,147, 5,
+ 35, 58, 23, 38,198, 28,165, 22,140,232, 92, 56,212,213,213,164,133,241, 73,160,102,157,208,189,215,175, 95, 87, 51,245,160, 82,
+169,152,195,135, 15, 83, 22, 22, 22, 63, 55,131,179,163,141,141, 77,166,165,165,101,106,253, 31,109,124, 70,245,114,239, 59,109,
+173,149,231,135,129,205, 8,167,191,128,203,205,185,114,242,123,170, 56, 43,158, 81, 72,243,153,242,167,177, 76, 78,242, 93,230,
+240,254,173, 42, 30,155,157, 3,192,255,109,158,165,102,194,192,105,224, 52,112,254, 13, 57,155,210, 34,255,203, 96, 55,188,193,
+134,224,243,121, 33,107, 87,175, 32,202,138,203,164,178, 10,137, 66, 37,147,201, 72, 46, 35,139, 79,122, 94, 64,178, 89,101,159,
+ 45, 90,104, 18,178,114,117, 72, 21, 48, 69,207,255,116,246,245,245,189,127,250,244,105, 91, 75, 75, 75,148,151,151,163,184,184,
+ 24,247,239,223, 7,195, 48, 24, 61,122, 52,191, 71,247,238, 93,191, 88,179,230, 78, 78,110,110, 0,180, 23,188,175,196,139,165,
+ 53, 54,247,169, 89,139,246,203, 23,197, 53,165, 14, 65,224,192,184, 96,205, 57, 27,114,106, 86,203, 16, 8, 4,154, 5,137, 91,
+128,128,129, 3, 7,114, 1, 96,230,204,153, 21, 18,137, 36,180,214,225,208,107,165, 85,145,173, 91,144,181,131, 99,196,247,251,
+ 54, 11, 59,183,119,131, 82,165, 70,102,222, 75,176, 57,230,104,221,154,139,143,166, 12,230,244,235,101,105,189,241,171, 3, 23,
+242,104,140,170, 46, 74,187,172,141,203,220,220,252,240,137, 19, 39,112,242,228, 73, 0, 64,106,106, 42,220,220,220, 68,186,194,
+144,144,144,224,250,193, 7, 31, 28, 47, 46, 46,238,160,235,220,134, 19,227,243,249,124,244,233,211, 7,158,158,158, 56,119,238,
+ 92,255, 90,103,235,173, 32,189,121, 19,198,143, 31, 3, 81, 45,170,188,180,243,243,115,185, 27,121,225,168,245,133,200,100,108,
+217,114, 16,207,158,213, 24,109,174,174,174,152, 60,105, 28, 39, 62, 62,218,107,236,216,201,209,183,110, 61,235, 83, 43,148,116,
+ 97,253, 15, 63,252,176,170,109,219,182, 24, 59,118,236, 56, 47, 47, 47,123, 83, 83, 83,236,223,191, 31, 14, 14, 14,174, 10,133,
+226,233,185,115,231, 28,243,242,242,176,112,225, 66,228,231,231, 47,213, 70,212,127, 72,255, 47,248, 35, 60,250,118,242,155, 14,
+ 99, 83, 7,252,112,236, 4,158, 60, 60,220, 87,174, 76,254,130, 75, 69, 77,149, 50,252, 25,133, 89,198, 33,109,186, 5, 90,117,
+240,250, 0, 46,126,177,214, 50,234,214,243, 47, 6,183, 11, 99, 11,100,135,215,109, 17, 23,191, 65, 58, 54,156,229, 93,145, 98,
+153,112, 5,197,192, 58,186, 78, 96,105,220, 90, 6, 31,244,235,215, 79,147,112, 47, 94,188,128, 92, 46,135,135,135, 7,169, 80,
+ 40,130,244,140,215,142,239,189,247,222,159,145,145,145, 86, 29, 59,118, 44, 44, 41, 41,209, 28,176,183, 50, 31, 18,117,122,251,
+194,141, 59,254,235,126,132, 33,202, 10,147,207,198,235,224,242,239,221,211,239,234,197,211, 71,141,137,202,108,240,204,139, 0,
+186, 24,233,199,127, 2, 97,100,137, 9,115,150,176,131, 6, 14,104, 53,120,216,152,171, 79,210,158, 13, 4,240,192, 80,175, 55,
+192,128,127,181,171,197,252,211,238, 73, 35,180,130,131,131,137,198,110,144,102,104, 31, 59, 91, 43,225,246,239, 14, 61, 96, 41,
+ 21, 10,145,185,153,130, 99,102, 74, 19, 38,102, 44,165, 66, 85,233,226,234,194,163, 25,218, 71, 11,127,195, 33,158,132, 80, 40,
+ 60,253,219,111,191,217,114, 56, 28,208, 52, 13, 27, 27, 27,100,100,100,160,172,172, 12, 18,137, 4,207,146,147,209,214,217, 9,
+235, 66, 86, 56, 44, 92, 17,114,186,186,186,186, 27, 94,111, 70,124, 99,216, 40,165,122,125,221,232,186, 37, 88,222,168,242,215,
+254,214,200, 49,125,135,162,102,100,101,101,193,216,216, 24,222,222,222,198,183,111,223,190,213,132,200,122,141,211,194,194,213,
+132,230,243, 78,238,253,126,141, 80,169, 74, 64, 82,122, 9, 58,181,237, 11, 59, 43,103,188, 44, 81,224,238,253,223,144, 16,247,
+ 11,218,183,114,198,252, 57, 3, 4, 97,155,127, 61,193, 85,183,117, 46, 43,203,168,104,140,179,162,162,194,184, 93,187,118,112,
+118,174, 89,247,140,162, 40, 36, 37, 37,129,162, 40,205,126,253,237,161, 83,215,161,174,200,196,244,105,211, 80, 92, 92,108,220,
+ 24, 39,135, 5,245,146, 89,147,217, 66, 14,192, 19, 89, 42, 42, 43, 43, 53,203,112, 40,149, 74, 60,122,244, 8, 1, 1, 1,129,
+225,225,225,186, 84,145, 94,241,169, 4,190,221,241,243,207, 59,167,148,151,147, 0,240, 35, 65,208, 74,134,249, 86,223,103,201,
+214,150,115,234,210,197, 35,214, 44, 50, 5,150,102,223,224,254,253, 76, 40,149, 53,225, 45, 46, 46,192,130,121, 21,224,114, 76,
+112,238,220,127,173, 60, 60,250,156,202,203, 83,122,227,245,102,196,198,194, 41,184,120,241, 34, 22, 44, 88,128,164,164, 36, 71,
+ 22,139,133,123,247,238, 65, 40, 20,226,187,239,190, 99,121,120,120, 56,138, 68, 34, 92,186,116, 9,249,249,249, 68, 83,225,252,
+227,242, 31, 95,151, 63,187,241, 69, 30,113,105,232, 15,199, 78,224,211, 73, 19, 96,207,164,223, 50,107, 79,124,253,222,136,222,
+ 95, 50, 44,167, 96,145,137,143,133,155,247, 8,112,121,198,152,255,249, 6,164, 38,156,183,168,150,196,205, 35,168,108,167,117,
+ 91,194, 23,189, 17,206, 95,199, 81, 51,127,185,237,119,197,249,129,203,227, 71,179,238,137, 99, 15,196,189, 18, 90,174,108,130,
+164,204,128,154,229, 83,158, 62,125,138,103,207,158,129,205,102, 67, 42,149, 66,173, 86, 55, 26, 78, 71, 71,199,217,106,181,250,
+203,218,116, 62, 36, 16, 8, 62, 62,122,244,168, 85,125,161,109,227, 51,170,151,149,137,104, 96,126, 65,113,105,244,131,196, 39,
+ 75,102,143,237,127,243,110, 66,182,146,243, 97, 86,121,220,185,114, 45,241, 41, 16,242,120,167, 46,157,249,175,177,234,249,117,
+136, 60,250,131, 99,236, 6, 74,149,139,234,210, 42, 72,158,137, 33,255,126, 55,186,204,251, 12,231,207,254,106,236,213,185, 91,
+184, 92,165,114, 3,160,104,193,187,217, 28, 24, 56, 13,156, 6,206,191, 39,167, 86, 45,194, 48,140, 31, 0,187,218,221,226, 90,
+ 93, 96, 13,160, 8, 53,171,200,216,213,230, 29,188,122,151, 53,220,175,127,110,195,253,250,223,139,107,191,219,214,110, 31, 16,
+ 4, 81,162, 35,232, 14,168, 89,154,240, 66,237, 22,168,109, 74,212,217,241,152, 32,200, 10,138,162,249, 92, 27, 91,217,204,241,
+ 3, 59,255,126, 53,230,145,145,181, 41,123, 72,255,174,129,247,227,159,223, 33, 72, 66, 69, 16,164, 94,253, 62, 88, 44,214,132,
+237,219,183,119, 54, 53, 53, 5, 77,211, 48, 51, 51, 67, 97, 97, 33, 20, 10, 5,202,203,203, 33,151, 84, 64, 41,169,192,227,236,
+ 23,232, 29,216, 31, 99,134,190,231,241,223,179,191, 77,160, 40,234,120, 83,188,142, 62, 93, 53, 78,214,134, 54, 86,175,172,137,
+236, 50,141,232,250,166,171, 27,184,198,198, 24,188, 36,228,109,158,129,216, 11, 23, 46, 92, 28, 61,122,244,176,101,203,150,145,
+ 98,177,248, 82, 70, 70, 70,111, 0, 73, 58, 69, 5, 95,176,120,238,226, 96, 11, 11, 99, 6,225, 87,126, 67,191,174,147, 96,196,
+ 99,161,184, 66, 9,130, 0,146, 19, 79,131, 32, 44, 17,151, 42, 70,223, 46,166,120,111,136,135,241,217, 95,147,151,225, 85,255,
+160, 55,146,166,180,180, 20, 5, 5, 5, 80,169, 84, 80,169, 84, 24, 59,110, 28,142, 28, 62,140,170,170, 42, 72,165, 82, 40, 20,
+ 10, 80, 20, 5,146, 36,113, 37, 34, 28,217,207,147,209, 43, 32, 0,208,178,244,210,225, 71,224, 0,184,251,228,201, 19, 36, 39,
+ 39, 35, 39, 39, 7, 2,129, 0,246,246,246,216,176, 97, 3,228,242,154, 53,202,198,141, 27, 23, 8, 32,254,109, 95,168,103,192,
+129, 12,138,250, 98,216,153, 51,182,183,207,156,161,239,158, 63,159,195,151, 72,246,235,115, 45,151,139,177,155,191,157,211, 73,
+ 36, 18, 33, 39,107, 59,220,221,185, 88,250,153, 21, 66,191, 41, 2, 0, 44, 92,208, 26,221,187, 89,163,162,236, 87, 88,219,174,
+194,206,157,139,218,207,152,177,117, 90,117, 53,117, 72, 7,245, 23,191,253,246,219, 24, 55, 55,183, 86,177,177,177, 4,143,199,
+131, 80, 40,132, 80, 40,132, 64, 32, 64, 65, 65, 1, 50, 50, 50,152,205,155, 55,231, 2,248,162, 41,162,117, 59,197,119, 0, 12,
+251,108, 40, 46, 62,121,120,184,111, 43,214,243,199, 99,230,247,121, 17,119, 55, 86,242,251,149,219, 95,169,101,130,236,178,156,
+171, 43,218,117,143,181,158,183,124, 61,118,111, 94,139, 39,247,110,150,216, 57, 87,236, 17, 18,242, 70,195, 25, 24,184,142,237,
+ 96,103,169,158, 61, 99,140,249,121,187,232,217,145,108,162, 48,175,232,225,119,200,136,149,242, 59,116,157,218,209,149, 84, 92,
+191,126, 93,216,175, 95, 63,200,100, 50,141, 51,121,244,232, 81, 90,173, 86,223,104,244,217, 84, 42,191,204,205,205,117,144, 74,
+165, 24, 58,116,232,194,239,190,251, 78, 84,183, 70, 29, 69, 81,175, 57, 89, 95,111, 59,114,121,241,151,123,110, 92, 62,254,141,
+227,215, 33, 31,247,159, 50,127,227, 13,104, 89, 71,146, 77,146,243,206,159, 57,104, 47,176, 80, 65,104,249, 30,100,249, 82, 60,
+ 57,240, 41,170, 43,100,232,254,245,122, 0, 60, 40, 84, 36,246,143, 24, 11,142,149, 35,214,126,242,177,227,234,253, 63,204,161,
+105,122,187,161, 94,111,128, 1, 6, 52,128, 29, 65, 16, 17, 0, 16, 18, 18,178, 42, 52, 52, 52,145, 32,136, 8,134, 97,130,107,
+ 13,148, 8,134, 97,130,235,206,169, 21,103,111,236,215,157,219,112,191,225,247,149, 43, 87,122,133,133,133,109, 10, 8, 8, 56,
+ 30, 29, 29,253, 28,128, 46,161, 53,188, 86, 88,189,177,244, 14, 89,167, 32,235,111, 95,115,180,104,250,230,211,231, 47,170,223,
+ 27,212,163,117, 68, 84,252,131,143, 62, 26, 62,112,194,136,126, 67, 50,178,138,147,219,187,216, 91, 39, 38,198,155,210, 52,125,
+ 83,159, 88,226,243,249,193, 3, 6, 12, 96,151,150,150,194,200,200, 8,133,133,133,200,205,205,133, 82,169,132,172,188, 12,242,
+242, 50,200,202, 74,161, 44, 47,197,179,152,251,240,105,239,202,175,237, 44,223, 36,234, 92,151,134, 78, 85,125,103,139,103, 98,
+ 2,190,137, 9,136,230, 55, 27,126,104,110,110,126,183,174, 80, 85, 42,149,243, 86,172, 88, 81, 68,211, 52, 54,110,220,104,106,
+108,108, 28, 14,128,175,139,196,196,134, 21, 28,208,197,155, 76,201,136, 67, 31,223,233,232,216,238,125,100,228, 75, 81, 36, 81,
+162,160, 76,137,238,253,118,161,141,239,122, 56,117, 9, 69,114,102, 9, 28, 91,185,145, 96,243,155, 92,252, 57, 59, 59,251,181,
+253,227,199,142,161,186,186, 26,237,219,183,199,164, 73,147,176, 98,197, 10, 76,154, 52, 9,142,142,142,152, 50,254, 3,172, 93,
+187, 22,121,121,121,186,130, 42,239,216,177,163,220,197,197, 69,238,226,226, 34, 87, 42,149,168,172,172, 68, 89, 89, 89,195,248,
+ 94,212,220,136,180,181,181, 93,105,111,111, 31,103,107,107,155,200,231,243, 35, 31, 17, 68,138,204,197,197,174,247,200,145,132,
+231,248,241,172, 76,161,144,136, 2,140,245,225,178,182,228, 12, 15, 26, 48,140, 87, 86,122, 80, 99, 82,125,252,145, 13,254,140,
+242,194,237, 91,221,176, 96, 94,123, 16,164, 0, 4,201, 67,117,213,117,244,240, 15,224,154,155, 19,186,158,165,201, 0, 30,245,
+238,221,219,113,254,252,249, 4,159,207,199,194,133, 11,149,159,124,242, 73,218,164, 73,147,210,174, 93,187, 70,185,184,184,192,
+201,201,137,112,114,114,114, 0,240,168,246,154, 38, 97,218,158,248, 90,174, 76,190,101,238, 38,122, 78,193,186, 87,165,138, 63,
+118,221, 22,113,241,215,123,159,111,201,120, 82,237,250,228,222,205,226,180,132,243,116,198,131, 63,138, 94,166, 73, 92,191,222,
+251,124,203,170, 61, 47, 27,125,169,163,162, 64,159,142,136, 82, 86, 87, 85,179, 71,142, 8,170,158, 61,115, 66, 71, 75, 99,175,
+163,104,245,158,111, 27,231,214, 83,214,110,218,169,252,100,206, 98,229,143, 63, 29,100, 36, 18, 9, 42, 42, 42,176,115,231, 78,
+245,249,243,231,115, 41,138, 90,172,173, 14, 4, 0, 42,149, 10,179,103,207, 22,153,154,154, 34, 59, 59, 91,227,136, 2,128,184,
+176, 56,254,246,131,132,148, 37,255, 25, 23, 88, 37,151,203, 47,255, 17,147,236,233,230,210,154, 32, 24,173, 3, 81,120, 28,206,
+224,110, 61,122,176, 24,166, 12, 4,219, 25,207, 14,111, 70, 69, 94, 9, 42, 10, 74,192,226,136,160, 6, 31, 42,154, 7,115, 31,
+127,164, 62,136, 69, 43, 27, 59, 54,159,195, 25, 98, 40, 79, 12, 48,224,223,137,166,180, 72,125,177, 20, 22, 22,182,169,169,227,
+245,182,138, 6,251, 26, 33,213, 80,132,213,255, 14, 0, 97, 97, 97,155, 24,134, 9,142,142,142, 62, 6, 64,170,231, 45,204,170,
+183,213,127, 30, 45,150, 76, 17,186,108,197, 23,176, 48, 19,154,249,119,117,179, 63,119, 41, 42,230,102,116, 76,114, 27, 39,107,
+ 27, 70,165,176,248,118,235,238,214, 68,181, 52, 76,207, 64,120, 88, 91, 91, 67,169, 84,226,233,211,167,200,201,201,129, 82,169,
+132,186,170, 10,242,178, 50,200, 74, 75, 65, 85, 73,192,165, 40, 72, 11, 11, 96,101, 36, 0, 94,141, 72,212,225,188, 17,141, 10,
+173,186,173,192,212, 20,124, 19, 83,144, 28, 78,163,205,138, 90,224,231,239,239,127, 50, 33, 33,161,199,160, 65,131,190, 66,205,
+ 16,249,204,220,220,220,129,107,214,172,145,219,217,217, 97,246,236,217,157, 0, 76,215, 41, 50,121, 10, 15, 23,251, 78,232,232,
+ 58, 29,109,156, 6,160,172, 74,133,194, 10, 21, 10,202,148,216,191, 43, 0,167,126,244,199,159,167,250, 34,225,242, 96,148,169,
+236, 97,236,248, 33, 24, 74,225,213, 20,231,149, 43, 87,176, 97,195, 6,124,245,213, 87,216,184,113, 35,190,250,234, 43,228,230,
+230,194,219,219, 27, 89, 89, 89,184,120,241, 34,196, 98, 49,172,173,173,113,255,254,125,108,219,182, 13,127,254,249,167,206,155,
+174, 19,174,122,156,211,172,182,116,181, 90, 61, 67, 60,114,100,231,124, 75, 75,207,174, 93,187, 14, 91,184,112,161,107,239,222,
+189, 53,199, 93, 93, 93,157,133, 66, 97, 30,106, 70, 80,118,105,138,139, 6,186,218,216,120, 67, 33, 79,169, 77, 99, 14, 8, 66,
+128, 1,131,147,209,187,111, 12,148, 42, 46, 72,130, 15,146, 20, 64,173, 46,134,133,133, 35, 24,134,240,214, 17,196, 53,133,133,
+133,110, 87,175, 94, 37, 51, 50, 50, 32, 16, 8, 0,224,197,186,117,235,118,111,217,178, 37,201,202,202,138,138,136,136,192,217,
+179,103, 17, 28, 28,204,250,228,147, 79,220,156,156,156,246,233,186,239,117, 59,197,119,126,217,122,113, 34, 71,101,209, 69, 32,
+108,211, 22, 85,198, 31,206, 13,180, 22, 1,192,165,244,116,137,173,115, 69, 88,149, 36, 46,203,188,117,229, 55,151,210,117,141,
+ 56, 93, 71, 63, 76, 75,185,251,203,153, 75,229, 5,249,165,156,174,157,189,164,161, 27,150,115,219,180,237,240,237,218, 21,255,
+177,207,173, 16,148, 13, 94,120, 49,229,244,165,251,149, 83, 63,250, 84, 61,115,214,124,217,197, 75, 87,206,208, 52,221, 25, 90,
+ 70, 28,210, 52, 13,177, 88,140,196,196, 68,164,167,167,163,176,176, 16, 69, 69, 69,144, 72, 36,154,230, 70, 35, 73,197,133,221,
+ 63,159,127, 44, 18, 10,141,122,116,118,115,190, 23,155, 84, 32, 18, 10,141,220,218, 58,119,196,255, 99,239,186,227,162,184,214,
+246, 51,179,189, 81,150,206, 2, 42,160, 40, 42, 8, 68, 68,236,168,145,196,222,176, 68,177, 68,163, 73, 52, 70,147, 24,176, 36,
+118,141,215,168,209,152,168,137, 61,118, 49, 42,118,197,222, 5, 84, 4, 20,164,247, 14,203,246, 50, 51,223, 31, 2, 23, 13,101,
+209, 36, 55,247,187, 60,191,223,176,236,238,204,179,231, 76, 57,231, 57,239,251,158,247, 96, 73,157,237, 8, 69, 81,222, 2,145,
+ 16, 0,129,242,184,235, 80,148, 41,160, 40, 87,160,178, 84, 1,173,158, 5,141,150,132, 90, 71,162,101,239, 1, 80, 40, 53, 80,
+148, 84,128,166, 40,159,230,238,166, 25,205,104, 70, 3,125,125,100, 88, 88,216, 2, 19,247, 53,217,189,249,186,240, 10, 11, 11,
+ 91, 64, 16, 68,100,120,120,120, 71,212, 63,161,170, 54,182,215,177, 1, 48, 33,189, 67, 73, 73,146,194,140,104, 63,114,238,252,
+111,206, 30,216,177,217, 78,171, 85,101, 90, 75, 37,148, 68,196,179,249,112,198, 74, 84, 42,202, 70, 40, 77, 79, 71,128,178,178,
+ 50,164,166,166, 66, 40, 20,130,203,225,128, 82,171, 65,169,149, 80,151,149,128,212,107,193,165, 40, 88,137,132,104, 41,115, 64,
+ 43,123, 7,147, 56,147,163, 46,212, 4,190,215,118, 23,254,171, 75,123,240,196, 18,240,204, 36,248, 36,242, 42, 0,128,203,229,
+ 2,139,151,155,100, 52,113,114,114, 58,185,127,255,126,110, 81, 81, 17, 98, 99, 99, 31, 1,168, 0, 96, 6,128, 78, 72, 72,184,
+ 20, 23, 23, 55,216,195,195, 3, 0, 90, 55, 70, 38, 47, 38, 41,131,145, 65, 86,126, 58,210,178, 99, 96,101,225, 6,142,168, 45,
+ 10,203,245,224, 11,221, 96,208,254,219,251,168,145,103, 64,173,103,153, 84,119,157, 78, 7,163,209, 8,163,209, 8,157, 78,135,
+143, 62,250, 8,183,110,223,198,193,223, 47, 35,245,197,115,180,115,117, 64,104,232, 68,116,233,210, 5,183,111,223,110,144,107,
+146, 47, 12, 78, 18,176,215,191, 79,130, 39,177,214,118,253,250,252,189,198,196, 22, 65, 16, 12,234,113, 69,190,134,239, 3, 3,
+ 3,219, 60, 87, 42,241, 52, 49, 17,253,151, 44, 1, 0,156, 57,115,230,149,186,204,155, 55,143, 23, 31, 31,255,225,195,135, 15,
+ 63,204,205,205, 93, 15,160,238, 96,115, 6, 56,125,250, 14,102,206,140, 71, 81, 81, 17, 0,224,208,129,127,235,210,180, 84, 61,
+222, 27,244,210,163,101,105,105,137,245,235,189, 76, 58,159, 20, 69, 97,251,246,237, 53,238, 66, 0, 96,179,217,221,231,205,155,
+ 55,178,174,253,219,180,105,195,109,140,115,238,104, 39,193,205, 71,204,167, 22,109, 90,117, 52,183,233,132, 18, 67,140, 87, 76,
+ 78,222,236,185,163,157, 54,110, 56,154,163, 17, 18,218,221, 4,149,229,194, 22,104,246,152, 82,198,148,115,155,117, 37, 45, 39,
+239,201, 47,146, 47,156, 53,253, 3,107,115, 75, 59,229,175, 63,174,150,146, 44,146, 57,249, 80, 95,222,209,221,218,114, 88,215,
+ 31, 20, 51,231, 46,142,209, 25,179,102, 33,235,228,115, 52,144,226,130,162, 40,228,230,230,162,168,168, 8,153,153,153, 40, 46,
+126,233,126, 45, 46, 46, 6, 77,211,111,211, 32, 66,157,153,137,140,227,191,162,213,196,137,240, 95,190, 12, 20,205,134, 90, 69,
+ 97,125,183,126, 40,171, 80, 67, 75, 19,144,189,211, 13,211,207,220, 0,201, 80,192,182, 45,205, 61, 73, 51,154,241, 63, 10, 83,
+210, 59, 84, 11,162,213,171, 87, 15,254,179,127,191,182,216, 90,189,122,245,211,213,171, 87, 55,229,183, 94,119, 25,214,188,175,
+142,209,186, 90, 43, 0,237, 15,157,102,101,113, 66, 74,124, 60, 59, 87,169, 86,138,236,237,108,181, 34, 1,159,174,144, 87,178,
+ 98,158, 60,210, 43,243, 95, 60,107, 66, 61, 18,226,226,226,188,114,115,115,145,153,145, 1,163, 90, 9, 82,171, 3,163, 81,161,
+127,143,110, 16, 0, 16,144, 4,184,180, 30,108, 22, 15,149, 10, 57, 0, 36, 52,218, 57, 26, 12,127,176,108, 17, 4, 1,158,153,
+ 25,120, 98, 49,120, 18,179, 87, 44, 92,166, 88,108,248,124,254,254, 35, 71,142, 56, 58, 57, 57, 97,217,178,101,112,118,118,246,
+148,201,100, 42, 11, 11, 11,161,189,189, 61, 58,116,232,128,110,221,186,225,236,217,179,128, 9, 57,165, 12, 70,193,227,103,233,
+232, 94, 92,122, 27, 55,174,254, 12,157, 90, 11,191,222, 63, 67,207,110, 5,219,142, 75, 65, 39,239,131, 42,255,196, 75,235,129,
+195, 16,100,103,166,131, 96,241,158,154,106,121,170,254,255,209,163, 71, 56,112,226, 26, 28, 91,182, 71,102, 82, 34, 18,175, 92,
+194, 45, 91,107,180,108,223,161,198, 13, 84,111, 25, 41,176, 87,108,121,153, 38,106,209,167, 31,240, 75, 75, 75,249, 86, 86, 86,
+218,234,115,231,232,232,248, 54, 98,235,131, 47,191,252, 18,229, 28, 14, 48,104, 16,184, 41, 41,208,235,245,232,218,181, 43,252,
+253,253, 1, 0, 93,187,118, 5,155,205, 70,167, 78,157, 32,147,201,176,101,203,150, 15,234, 19, 90, 36,129, 88,163,177,196,211,
+221,221,189, 70,104,237,217, 91,132,152,135,239,130, 0, 15,155,126, 76,174,217,183, 69,139, 22,200,207, 75, 1, 65, 48,113,141,
+148,113,185,131,131,195, 98, 71, 71, 71,247,239,191,255,158, 37, 16, 8,240,241,199, 31,187, 41, 20,138, 86, 85,166,100,132,135,
+135, 3, 0,190,253,246, 91, 44, 89,178, 4, 90,173, 86, 85, 31,217,158,245,222,178,194, 82,250, 67, 70, 33, 26, 17,100,211,202,
+187,111,112,127,184,121,244, 69,223,224, 76, 0, 88,101,197, 78, 31,179,118,161,229,113, 75, 51, 98,231,133,115, 23,191,237,209,
+187,239,194,175, 21, 87, 86,124,183,189,188,209,152,199,138,140,221,149,207,120, 99, 55,108,222,186,119,195, 55,225,115, 4,153,
+ 69,186,178,156, 50, 70, 33,225,179, 37,173,237, 9,201,236,249,203, 83,115,115, 83,190, 64,214,185, 70,103, 90,210, 52,141,148,
+148,148,154,152, 62,141, 70, 3,165, 82,137,172,172,172,154,123, 70, 45, 54,127,111,214,148, 33, 62, 74,181, 90,117,239, 73, 82,
+230,162,207, 38, 4, 42,213,106, 85, 82, 90,230,115, 96, 83,157,106,140, 36,201, 39,170, 74, 85,127, 85,185, 6, 69,177,207,224,
+220,175, 37, 12, 70, 2, 58, 35,133,162,146, 74,104,141, 0, 69,114,208,113, 76, 40, 40,130,141,226,220, 28,144, 44,214, 35,188,
+ 26,180,223,140,102, 52,227,127, 7, 13,106,145,106,139, 86, 96, 96,224,193,218, 86,167,234,255, 1,104,209,112, 40, 79, 81,109,
+ 49, 85,237, 78,172,239,119, 94,227, 53, 21,127,136,209,106, 52,189, 67,245,111,186, 88,200,101,255,250,118,130, 51,109, 52,182,
+ 43, 44, 46, 48,178,217,124,142,139,133, 58,175, 52,211,244, 95,215,106,181,145,151, 46, 93, 26,254,238,187,239,242,147,158, 60,
+130,174,162, 2,186,138,114,112,104, 35,172,132,157, 65,234,181, 32,116, 58, 56,121,210,208, 84, 10,113,237, 86,156, 65,171,213,
+ 70,154, 42,180, 72, 22,235,213,184, 44,137, 4,124, 51,115,240, 37,146,215, 93,139,141,137, 2,209,128, 1, 3,250,117,237,218,
+ 21, 12,195, 96,251,246,237,208,235,245, 60,189, 94, 15,157, 78, 7,189, 94, 15,185, 92,142,189,123,247,226,167,159,126,186, 5,
+ 96, 87,163,157,153, 81,119,233,252,197,168, 46, 83, 39, 12,230,156,137, 92, 15,163,142,130,154,112,134, 82,105,128, 66, 39, 2,
+101, 61, 17, 40, 56, 13, 22, 91,128,192, 78,110, 56,113, 52, 66, 15,163,246,178,137, 42,252, 21,171, 80, 86,102, 58,178, 95, 60,
+135, 68,158, 15, 91,115, 17, 84, 41,207,225, 23, 58,233,141,172, 19, 46, 46, 46,160,105, 26, 65, 65, 65, 53,193,213,111, 42,182,
+ 74, 74, 74,112,234,212, 41,116,237,218, 21,189,123,247, 70, 78, 78, 14, 82, 82, 82, 48,112,224,192,154,125, 30, 61,122,132,152,
+152, 24,180,110,221,176,145,176,184,212,112, 38, 59, 43, 54,100,216,176, 97,220,187,119,239,130, 97, 24,120,120,152,195,220, 76,
+ 12,130,228,163,125,123, 59, 0, 47,199, 0,125,250,244,129, 92,158, 98, 44, 43, 99,206, 52, 82,221,253, 0,126,215,233,116,201,
+189,122,245,146,189,120,241, 2,115,231,206,101, 31, 58,116,168,218,148,140,176,176, 87, 39, 83,168,213,245,187,238,219,121,123,
+126,229,102,148,246, 22, 8, 91,185,154,219,116,130,155, 71, 95, 0,192,187,131,167,194,173, 77, 11,200,139, 31,187,106,212,233,
+ 35,184,236, 50,233,227, 77, 57,241,194, 65, 94, 83, 52,133, 87,147,240,210,117,218,232,101, 87, 39, 29, 42,200,228, 76, 60,252,
+251,201,179, 51, 6, 14, 30,202, 49, 80, 70,163, 87, 75,142,229,145,227,167, 11,115, 50, 50,127, 64,230,185,184,127,219,255, 26,
+180,226, 81,114,185, 28, 98,177, 24,113,113,113,218, 65,131, 6,241, 73,146, 68,114,114,114,141,208,178,179,177,234,208,221,223,
+203,115,197,134,189,231,197,124, 62, 63,184, 79,231,246,241, 73, 25,217, 12, 67,164,215,107,109, 53, 24, 46, 62,137,125, 20,100,
+ 43,107,195, 74,185,122, 23,214, 61, 7, 66,171, 37,161,214,209,208, 26, 1, 35,139, 11, 71,223, 0, 88,182,110, 15, 6,192,131,
+187,183, 12, 90,131,225,124,115, 95,211,140,102,252, 79, 91,181,152,134, 68, 82,213,255,165, 0,210, 87,175, 94, 93, 92,203,218,
+ 84, 4,224, 17, 0,159,170,253,138, 94, 59,174,136, 32,136, 7, 12,195,248,215,226, 41,170, 37,184,106,255,175,123,109,159, 71,
+ 77, 16, 89,181, 95, 95, 21, 90,245, 77,169, 4, 0, 27, 27, 27, 59, 63,191,206,173,127,217,113, 24, 12,195,224, 89,204, 58,148,
+ 21, 38, 98,241,170, 59,173,157,156,156,122,231,228,228, 92, 51,165, 4, 20, 69, 29,218,185,115,231, 23, 1,239,248,249,185, 58,
+ 59,227, 81,122, 26,184, 12, 5, 46, 69,129,212,107,193,166,116,112,246,162, 64, 18, 18,228,230, 86, 96,205,254,195,113, 85, 89,
+226, 27,132,231,192,161, 88,150, 93, 1,130, 32,240,125,160, 23,120,102, 18,112,197, 18,124,114, 50,170, 70, 92, 69, 46, 11, 7,
+ 79, 34, 65,235, 0,147, 18,194,171,174, 92,185,242,240,201,147, 39,254, 94, 94, 94,248,226,139, 47,144,158,158, 14,154,166, 81,
+ 80, 80,160,201,203,203,203, 41, 42, 42, 74, 7,112, 28,192, 47, 48, 33,243, 56, 87,171,217, 24,121,108,207,172,192, 30,189,109,
+134,141,248, 9,191, 31,157,135,242, 10, 57, 84, 70, 33,148, 26, 35,148, 90, 22,172,172,189, 17,208,169, 19,114,115, 10,241,244,
+238,121, 5, 91,171, 90,215,148, 27,148, 32, 8,196,196,196,192, 93,102,134,231, 55,174,193, 70,196,129,143,204, 1,178,238, 61,
+106,242, 75, 53, 4, 14, 11,198, 15, 62,248,160, 38, 51,252,128, 1, 3,210, 38, 78,156,232, 56,111,222, 60,236,216,177, 3,183,
+110,221,250, 67,128,118,239,222,189,113,253,250,245,165, 0,190,109,204,168,167,211,233,224,233,233,137, 7, 15, 30,224,210,165,
+ 75,232,219,183, 47,122,247,238,141,199,143, 31,227,194,133, 11,136,137,137, 1, 65, 16,176,182,182,134,225,165,120, 54,212, 71,
+166,215,227,200,119,107,119, 46,216,176,225,167,142, 19, 38, 76,192,177, 99, 7, 49,117, 74, 59, 16, 36, 31, 4,193,199,208, 33,
+237,176,108,249, 3, 4, 4,244,129,141, 13, 7, 27,214,159, 72, 85,171,169,189, 38,156,198, 21, 23, 46, 92,144,105, 52, 26,148,
+151,151, 51, 18,137,132, 40, 41,121, 57,163,181, 46,139,150, 74,165, 18,212, 71,244, 36, 58, 97, 93,121, 37, 83,198, 40, 98, 70,
+148, 26, 99,188,251, 6,103,225,221,193, 83,112, 49,114, 23,162,206, 95,130, 21, 59, 61, 13,226,202,179,197,105,197,242, 60,165,
+199,214,246,239, 76, 99,101, 43,207,111,157, 61,244, 57,203,209,145, 62, 18,254,179,188,188, 33,161, 5,128, 40,141,223,119,242,
+ 56,131,161,221, 2, 3,218,120,181,112,228,149, 21, 23, 50, 71, 79,156,141,211,167, 29, 59, 85, 75, 96, 49,141, 8,245,101, 97,
+ 97, 97,223, 84,253,191,123,209,162, 69,211,214,172, 89, 99,155,159,159, 95, 19,163, 85, 88, 92, 26,213,109,208,108,170,164,188,
+ 66,183,115,195,252,209, 66, 1,159,183,104,205,206,171, 6, 22,238,214,199,107,164,233, 45, 99,230, 46,158,147,244, 44,198,169,
+149,144,135, 19,243,191,197,163, 11, 87, 96, 32,185,152,121,233, 30,180,122, 10,229,197, 37,184,252,225,167,144,216, 75,241,211,
+213, 99, 5, 52, 77,255,220,220,213, 52,163, 25,255,187,168, 79,139, 16, 4, 81, 87,142,189,130, 58, 62,123,208,208,113,245,240,
+252, 25,168, 55, 43,188, 73, 83,240,138,139,139, 11,175, 95,191,135,171,145, 43,112, 45,114, 5,158,198, 60, 66,110,142, 14, 57,
+ 5, 26,152,155,155,223,105,224,208,215, 51,199, 50, 42,149,106,228,162,197,223,228, 11,132, 34,244,234,215, 15, 14,182,118, 16,
+113, 57, 96, 25,105,176, 8, 14, 20, 69,150,120,254, 88,133,175,119,238, 43, 84,168, 84, 35,235,232, 36,250,215, 39, 50, 8,130,
+ 0,223,220, 12, 60,137, 25,248,102,230,175,184, 17, 5,230,230, 16,152,153,131,205,227,213, 21, 12,255, 7, 78,133, 66, 49,106,
+244,232,209,101, 21, 21, 21,152, 54,109, 26,174, 93,187, 22,115,254,252,121,243,199,143, 31, 11,139,138,138,218, 0, 24, 0, 96,
+ 91, 3, 34,235, 21,206,178,178,148, 74,198,168, 29,187,250,155,207,213, 26,163, 53, 66, 38, 29,130,152,204,130,145,162,193, 0,
+144, 89,241,208,189,255,114, 20,234,186,225,208,214,149, 42, 90,175,153,240, 90, 14,173, 87, 56, 25,134, 97,236,237,237,255,112,
+ 14, 46, 93,186,132,144,209,163, 16, 60, 98, 56,108, 93,221, 97,215,127, 32,130,167,205,196,214,173, 91, 65,146, 36,108,108,108,
+ 94,239,120,107, 56,247,196,130,115,224, 9,136, 3, 79, 64,236,142, 1, 27, 64,232,190,125,251,190,243,241,241,185,114,235,214,
+173,117, 0,198,214,254,173, 90, 88,242,154, 53,171,174,107,180,112,206,156, 57,234,164,164, 36,136,197, 98, 24,141, 70,220,186,
+117, 11, 63,253,244, 19,190,255,254,123,196,196,196,192,218,218, 26,173, 91,183,134, 86,171,197,131, 7, 15,212, 0, 22, 54,192,
+ 73, 23, 21, 25, 71,109,218,180,166,100,240,224,158,216,185,243, 71, 56, 56,116, 3,135,237, 0, 54,199, 22, 98,137, 39,126,253,
+229, 59,188,255,190, 31, 78,158, 56, 92, 90, 92, 98, 28, 5,192,104,194,189,164,185,119,239, 30,182,110,221,138,209,163, 71,231,
+132,132,132, 80, 21, 21, 21, 53, 22, 45,134, 97,192, 48, 12,150, 84,197,152,105,181, 90,126,125,156,211,191,142,203,153,191,242,
+233,178,130,252,156,174,215,174,220,249, 32,234,252, 37,164, 38, 69, 33,234,252, 37,220,136,186, 29, 86,144,159,211,213,175, 75,
+ 91,238,200,105,179,190,218, 19,113,140, 37, 49,119,196,158,136, 99,172,241,179, 63, 95,217, 57,184,239,194,198,238,249,170,235,
+200, 40, 10, 11,194, 87,173,219,172, 48,234, 53,228,191,126,216,146,171, 46,202, 91, 88,235,190,100, 26,187, 63,213,106,245, 54,
+141, 70, 35,211,104, 52, 50,173, 86,187, 48, 61, 61,189,215, 23, 95,124, 81, 68, 81, 84,141,181,180, 40,254,228,157,196,155,187,
+ 87,217,217, 72,133,221,252, 59,182, 91,191,237,232,213,204,172,130,223,106,229,208,170,171,156, 26,133, 90, 51,106,248,200,137,
+202,242, 50, 45, 2, 63, 15, 3, 45,144, 64, 75, 1, 6,134, 5, 35,193,198,147, 21,235, 33,180, 50,195,254,180,104, 85,133, 65,
+ 63, 10,175,230,208,106,168,238,111,131,102,206,102,206,102,206,127, 38,231,127, 51, 28,241,234, 90,135,142,175, 88,180, 26,155,
+ 82,233,228,228,212,107,216,208,254,232, 51,120, 17, 24,134, 65, 98,244, 90,148, 21, 61,131,147, 3, 31, 41,153,242, 64, 0,215,
+154, 80,152,204,244,172,172,174,115, 22, 46,138, 8, 25,208,175,189,151,171, 43,191, 85,171,150, 16,219,217,161,184,184, 8, 55,
+239,198, 27, 86, 30, 56, 18, 87, 37,178, 76,114, 76,210, 52,253, 50,200, 29, 64,191, 57, 95,131, 96,177,128,170, 52, 14,213, 29,
+163,171,127, 55, 16,108, 54, 40,134,134, 86,171, 53,101,182, 92,246,139, 23, 47, 70, 77,152, 48,225,114,100,100, 36, 25, 28, 28,
+236,123,252,248,241,183, 89, 51, 15,202,194,164, 43, 0, 6,175, 12,159,113,168,107,223,225,230, 30, 29, 59,115, 59,183, 98, 65,
+111, 32,144,155,147,129,200,136,251,250,248,123,231,229,140, 81, 51, 86, 85,156,116,165, 33, 46,189, 94,159,217,166, 77, 27,251,
+173, 91,183,214, 4,195, 83, 20,133,226,226, 98,220,185,115, 7,222,254, 1,104, 63,229, 67, 20, 21, 21, 97,211,166, 77,104,209,
+162, 5,134, 12, 25,130,210,210, 82, 24,141, 70, 83, 29,190, 20,128,243, 85, 27, 94, 19, 89, 68,213, 18, 64, 13,186, 13,221,221,
+221,121, 26,141,198,151, 97, 24, 22, 65, 16, 27,117, 58,221,228,240,240,112,199, 85,171, 86,161, 93,187,118, 40, 46, 46,134, 88,
+ 44,134,135,135, 7,138,138,138,112,255,254,125, 74,165, 82,109,197,203,133,172,139, 26, 41, 95,242,253,251,105, 93, 63,251,236,
+147,136,239,214,204,240,208,104,251,240,172,172,122,128, 97,140, 40, 42, 74, 71,165,252,150,126,249,178, 93, 47, 10, 10, 13, 35,
+ 1, 36,153, 88,231,111,103,205,154, 5, 0, 2, 0,139, 82, 82, 82, 98,219,183,111,239, 81,159, 69,203, 20,108, 56,154,163, 1,
+112, 96, 84,176,108,174,188,248,177,135, 21, 59, 61,173,171, 23,189,105,195,209, 28,141,185, 76,185,162, 56,253,218,243, 60,229,
+249,173,123, 34,142,177, 38,141, 24, 69, 57, 75,146,194, 4,118,204, 81, 19,168, 25, 31, 31, 31, 23,130, 40,117, 43, 44,121,246,
+112,234,180, 25, 99, 44,184,234, 51, 62,206, 37,173,201, 22,126,130,152,152,152, 52, 52,113,102,104, 21,158,231,228,228,244, 10,
+ 15, 15, 63,207, 48,204, 43,177, 9,133,197,165, 81,129,131,103, 49,229,229, 21,177, 69, 9, 39, 77,201,165,118,255,126,116, 76,
+ 63, 47,111,191, 99,223,173, 90, 99,223,103,206, 23,236,231, 87,174, 2,148, 1, 25,215,174,130,226,235,232,245,183, 47, 22, 84,
+232,245, 35,208,156, 21,190, 25,205,248,159,183,102, 53,164, 69,254,225, 24,132,122,130,225, 77,174,140,187,155,211,249,118, 30,
+173, 6,180,112,182, 5, 0,164,164,229, 34, 37, 45,231, 66, 74,106, 78,112, 35,138,183,190,233,149, 53,139, 74, 19, 85, 41, 28,
+ 24,211, 22,149,126,133,211,218,218,250, 33,155,205,118,110,202,217,160, 40, 42,183,184,184,216,207,196,114,142,119,117,117, 93,
+147,145,145, 17, 65,211,244,220, 38,170,253, 58, 57,171, 23,149, 38,217,188,254,140, 81,231, 13, 0, 4,155,103,202,162,210,181,
+ 57,189, 37, 18,201, 54, 14,135,211,162,250, 58, 86,199, 96, 81, 20,197,210,235,245, 2,138,162, 88, 0, 8,146, 36,141, 28, 14,
+ 71, 67, 16,132,209,104, 52,102,106,181,218, 25,248,119,194,209,134,234,222,104, 71, 95, 37,180, 80,135, 69,235, 18, 0, 36, 37,
+ 37,181,149, 74,165, 99, 9,130, 24,205, 48,140,103,101,101,165,118,241,226,197, 49, 71,142, 28,145,187,186,186,190, 55,104,208,
+ 32,226,241,227,199,136,139,139, 99, 74, 74, 74,142, 86, 89,177, 82,154,120, 47,145,124, 62,107,156,149, 21, 57,136, 97,224, 3,
+ 6, 4, 65,226, 73, 69, 5,125, 70,165,162,126,171, 18,140, 77,189, 63,171,241, 65,171, 86,173,118,165,165,165,113,234,179,164,
+214, 87,247,215,177,118, 97,199, 69,129, 61,123,142,186,115,227,198,241,249, 43,159, 46,171,253,221,236,225,210,169,227, 63,157,
+179,246,192,150, 31,230,111,254,189,108,167, 41,229,244,245,245,117, 39, 8, 98, 44, 0, 47,134, 97,218, 48, 12, 33, 32, 8,166,
+140, 32,136,167, 0, 30,235,116,186,200,248,248,248,236,183,168,251,155,140,112,235,227,172, 89, 84, 26, 20,213,137, 2, 24, 19,
+ 23,149,254,187,203,217,204,217,204,217,204,249,159,227,252,111,198, 71,117,124,102, 90,102,248,106,164,164,230, 4,167,164,230,
+160, 77,155, 54, 76,114,114,114,147, 68, 90,125,157, 52, 69, 81, 7, 85, 42,213,193,183, 33, 41, 41, 41,233,252, 23,159,188, 3,
+105,105,105, 7,254, 76,194, 42, 33,181,172,106,123, 83, 60, 81, 40, 20, 1,166,238,172,215,235,255,138,115, 67, 84, 89,179,150,
+214,183,195,128, 1, 3, 50,244,122,253, 37, 0, 89, 4, 65, 88, 2, 40,213,235,245,231,141, 70, 99, 65,114,114,114,231,245,235,
+215, 87,103,190, 95, 14,224,225, 27,150,131,214,106,169,253,185,185,212,254,191,160,142,204, 60, 4, 45, 0, 0, 32, 0, 73, 68,
+ 65, 84,251,117, 58,221, 60,107,107,235,214, 26,141,134,167,209,104,184,181, 39, 31, 8,133,194,162,134, 2,226,107,195,210,140,
+216,205,101,151, 89, 91,154, 17,175, 11, 41, 88, 57,225,152, 90, 25,215,206,202, 9,199, 76, 45, 88,108,108,108,138,143,143,207,
+ 62,146, 36, 93, 25,134,177, 7, 24, 11,134, 65, 17,195, 48,197,108, 54, 59, 39, 62, 62, 62,231, 31,212, 8,105,140, 52,189,206,
+168,211,253, 59,238,176,121,118, 97, 51,154,209,140,255, 63,168, 55, 70,139,221, 84,166,228,228,100,162,249,124, 54,163,182,216,
+106,232,203,140,140, 12, 45,128,219, 85,219,235,120, 8, 96,200, 63,189,130,121,121,121,126,245,125,103,170,200, 2, 94,198,108,
+ 1,113,117,102,103, 95,178,185,172, 18,155, 35,190,106,106,217, 30, 61,122,148, 9, 19, 93,236,205,104, 70, 51,154,209,140,191,
+ 12,111,111,209,106, 70, 51,154,209,140,102, 52,163, 25,205,104, 70,157,216, 94, 75,112,189, 98,221, 34, 80,255,204,129,166,248,
+ 94,223,100,246,193,165,102,206,102,206,102,206,102,206,102,206,102,206,102,206,255, 57,206,255,175,248,131,200,250, 59,208, 60,
+245,181,153,179,153,179,153,179,153,179,153,179,153,179,153,243,127, 65,100,189,190, 1,104,118, 29, 54,163, 25,205,248, 31,198,
+145, 35, 71, 76, 90, 84,116,220,252, 95, 7, 75, 36,210,197, 10,121,197,154,131,235,166, 30,175,254, 60, 36, 36,132,106, 62,139,
+205,104, 70, 51,240, 38,193,240,110,110,206, 29, 72,138,238,206, 48, 36,139, 33, 25, 3, 33, 87, 31, 74, 41, 43,123, 37,237,128,
+139,139,139, 37,135,196, 16,130, 97,196, 4, 65, 83, 52,139,188,149,154,154, 29,223,132,130,241,164, 82,233, 44, 46,151,219, 95,
+167,211, 57,147, 36,153,173,213,106, 47,169, 84,170, 31,241,199,196,133,255, 49,180,109,219,118,252,213,171, 87, 45,123,244,232,
+161, 21, 10,133, 70,181, 90,205, 62,119,238, 28,255,253,247,223, 47,127,241,226,197, 27,205, 72,148,201,100,125,127,253,245, 87,
+183,224,224, 96,180,105,211, 70, 57,118,236, 88,110, 96, 96, 32,119,218,180,105,169,185,185,185, 81, 77,164,235, 64, 16,196, 94,
+130, 32, 88, 52, 77,135,226,223,169, 27,254,108,144, 36, 73,206, 32, 8, 98, 4,195, 48,238, 4, 65,164, 48, 12,115,156,166,233,
+134, 18,183, 54,132, 81, 0, 6,146, 36,233, 7, 0, 52, 77,199, 0, 56, 3,152, 62,243,238,239,228, 20,137, 68,190, 0,160, 82,
+169, 98,255, 44, 78,130, 32,124, 1,128, 97,152, 55,229,156, 34, 20, 10,167, 3,128, 90,173,254, 5, 38, 44, 7,245, 58,152,173,
+158,140,223,210, 68, 0, 64,204,183,158, 0,128,166,188, 39,102, 38, 18, 77,249,173,186,248,154,194, 81, 7, 6, 78,152, 48, 97,
+213,111,191,253,246, 45,128, 19,127,197,141,239,224,224,242,227,247, 63,108,151,125, 62,235,195, 53,120,185, 34, 68,195, 15, 36,
+240, 46,143,197, 26,170,163,168, 27,241,192, 17, 0,108, 43, 43,171,241, 60, 30,175,151, 78,167,115,100,179,217,121, 58,157,238,
+122, 69, 69,197, 1, 52,176, 2,130,201,231, 53, 1, 82,189, 10, 14, 4,253,239,117,222, 24, 18, 90,174, 8,249, 68,123,148,253,
+ 3,154, 81, 18,192,156,170,186,238, 64,253,233, 60, 26,106,124, 62,151,201,100, 35,228,114,185,138,197, 98, 49,120, 57,235,249,
+229,159,151,223, 19, 52, 77, 23,150,150,150,134, 54,198, 37,110,129,118, 60, 49,177,151, 50, 64,109,212, 50, 31, 43,179,144, 40,
+113, 65, 55, 6, 8,101, 0, 87,146, 69,218,210, 52,157, 7, 32,138, 52,226,148, 34, 23,201,255,208,206,189,101,213,121,109, 85,
+245,158, 3,192, 30,192, 99, 0,159, 3, 80, 52,235,159,191, 13,175, 7,195,159, 6,144, 87, 35,180,106,165,187,239, 51,120,240,
+224,107,110,110,206, 29, 70, 15, 31,185,106,230,140,143, 9, 22,139, 68,220,211,167,236, 15, 66,167, 12,144, 74,165, 78, 18,173,
+182, 61, 8,130, 86, 9, 4,113,114,121, 69,206,145, 3,191,153,121,182,107, 71, 81, 20,141,173,219,126,126,255,232,239, 17, 11,
+ 76, 20, 91,109, 29, 28, 28,246,134,133,133, 57, 12, 29, 58,148,229,224,224,128,244,244,116,203,131, 7, 15,182,219,188,121,243,
+152,178,178,178, 80, 0,207,223,160,178, 61, 29,172,200, 1,102, 66,162, 31, 42, 41, 84, 26,112, 57, 95,141, 11, 0,110,188,233,
+217, 83,169, 84,179, 85, 42, 85,128,191,191, 63,179, 99,199, 14, 98,242,228,201, 12, 65, 16,132, 90,173,222, 13,224,141,132,150,
+ 88, 44,222, 18, 28, 28,236,225,225,225,145,242,226,197,139,129,135, 15, 31, 62, 51,105,210, 36,119,177, 88,156, 4,160,109, 19,
+233,118,149,148,148,248,168,213,106, 56, 59, 59,239, 0,240,206, 95,112, 19, 17, 44, 22,235,184,147,147, 19,179,118,237,218, 19,
+ 62, 62, 62,246,165,165,165,198,175,190,250,170,255,221,187,119,223,167, 40,106,104, 19,196,150,148, 32,136,109,246,246,246, 54,
+107,214,172, 73,238,220,185,243, 99, 62,159,207, 75, 74, 74, 18,205,155, 55,111,238,243,231,207,199, 48, 12, 51, 3,104, 82, 7,
+ 33, 37, 8, 98,155, 76, 38,179, 89,181,106, 85,186,159,159, 95, 28,151,203,229, 38, 37, 37,137,191,254,250,235,207, 19, 19, 19,
+223,136,147, 36,201,173, 1, 1, 1,210,111,191,253, 54,161, 93,187,118,183, 89, 44, 22, 47, 59, 59,155, 92,178,100,201,172,139,
+ 23, 47,134,208, 52, 61,243, 77,202,105,103,103, 39, 93,178,100, 73, 66, 96, 96,224, 93, 46,151,203,125,246,236, 25, 25, 22, 22,
+ 54, 43, 57, 57,217,228,114, 90, 89, 89, 5, 17, 4,177, 61, 63, 63,159, 13, 0,142,142,142, 93,204,205,205, 55,215, 94,211,178,
+ 58, 21,133,193, 96,168,212,104, 52, 19, 74, 75, 75,235, 76,132, 59, 57,124,211, 16, 0,216,172,175,126,255,242,181,177,247,192,
+214, 83,166, 84,218,215,225,101, 94,188,239,149, 83,135, 3,192,248,170,165,194,191, 87, 2,108, 54,155,246,117,248,156,137,205,
+111, 82,202,152, 97,125,251,246, 93, 18, 21, 21,245,115,159, 62,125,190,222,183,111,159, 93, 86, 86,214,119, 55,110,220,112, 25,
+ 55,110,220,228,203,151, 47,175, 46, 46, 46, 62,250,103,221,252, 60, 46,159, 79,144, 4,132, 2,145,185, 41,251,115, 72,114,240,
+237, 97,195,166,255,242,236,153,223,230,196, 68, 55,165,163, 99,192,103,159,125,102, 63,114,228, 72,210,197,197, 5,201,201,201,
+214,251,246,237,107,255,203, 47,191,140, 40, 47, 47,159, 3, 32,227,109, 68,150,178, 28,222, 90, 29,252, 24, 6,150, 53, 15, 44,
+129,114,190, 30, 49, 76, 2,158,252, 3,196,214, 55,187,118,237,250, 54, 57, 57, 25,171, 87,175, 6,128, 31,155,120,252,188, 97,
+195,134, 13,138,136,136, 16, 30, 57,114, 68,232,239,239, 15, 7, 7, 7, 84, 13,166,106, 18, 83,187,185,185,153,118,206,104,124,
+191,241,204,212,119,226, 74,207, 98,203,200,252,213, 66,103, 24,187, 13,243, 24, 49,120,178, 31, 44,108, 69, 16, 72,216, 40, 47,
+145,123, 61,139,201, 10,190,114, 56,249,187,228,232,162, 53,202, 76,124,131,250,115,242,253, 71, 96,109,109,189, 35, 53, 53, 53,
+ 72, 44, 22,191,242,121, 74, 74,138,175,135,135, 71, 5,128, 47,154, 42,220,108,109,109,247,211, 52,173, 45, 41, 41,249, 16, 0,
+204,204,204,126, 19,139,197,210,188,188,188, 5,127,213, 64,166, 26,175,107,145,255,114,139, 86, 77,188, 86, 93,107, 29, 18, 36,
+ 69,119,159, 57,227, 99, 98,236,248,113,249,201, 41,169, 52,155,195, 27,127,238,252,121, 81,135, 14, 29, 72,237,143, 63,194, 88,
+ 84, 4,195,220,185,221, 46, 93,186,100, 8, 25, 63, 81,205, 97, 17,187,220,221, 92, 69,135, 14, 28,116,136, 56,118,180, 59,128,
+198,132, 22,207,193,193, 97,239,213,171, 87,157,220,220,220, 80, 94, 94,142,244,244,116, 40,149, 74,140, 25, 51,134,211,189,123,
+119,167,209,163, 71,239,173,168,168,232,209, 4,203,150,125, 27,103,118,228,140, 41, 35,219,190, 63,160,187,216,201,165, 53,152,
+124, 13,178, 94, 36,250, 71, 94,189,251,217,174, 99,103,158, 39, 87, 48,131, 81,247,218, 72, 13,162,184,184,120,254,136, 17, 35,
+142, 5, 5, 5,217,242,249,124,200,100, 50, 98,232,208,161,133,185,185,185, 75,223, 88,181, 84, 45, 97, 67,146, 36, 85,251,181,
+142,229,129, 76,129,179, 84, 42,133, 84, 42, 5, 0,167,183, 29,121, 90, 90, 90,254,104,102,102, 54, 90, 46,151,171, 73,146,100,
+ 8,130, 96,116, 58,157, 80, 42,149, 62, 74, 72,124, 46,211,106,181,109,214,109,252,229,135,190, 61,125,204, 47, 94,188,136,145,
+ 35, 71, 50, 23, 46, 92,152, 97,234, 58,117, 4, 65,108, 27, 49, 98,132,106,241,226,197,154,228,148,116,167,132,231, 41,132, 88,
+192,163,109,108,108, 56,247,239,223,103,111,216,176, 65,176,100,201,146,109, 12,195,140,110,194,249,220, 54,110,220, 56,253,151,
+ 95,126,153,247, 44, 57,213,238, 73, 66, 50, 35, 17,112,140, 54, 54,214,172,187,119,239,210,111,194, 73,146,228,214,249,243,231,
+203,103,204,152, 81, 86, 82, 90,225, 80, 38, 87, 48,124, 14,203,224,224,224,192, 62,113,226,132,118,255,254,253,228,244,233,211,
+183,210, 52, 29,210,132,243,187,117,232,208,161,149, 97, 97, 97,229, 73, 41,105, 14, 79,226,159, 67,196,231, 24,236,237,237, 88,
+ 15, 30, 60,208,175, 91,183,142, 92,177, 98,133, 73,229, 20,139,197,123, 14, 31, 62,204, 62,113,226,101,219,119,231,206, 29,210,
+221,221, 93, 84,123, 31,181, 70, 11,146, 0,138,139,139, 69,129,129,129,123, 0,252, 33,185,175,223,210, 68, 76, 14, 7,102,207,
+158,157,215,212,155,197,207,241,179, 70,247,161,126,246,100, 54,168,166, 14,103,179,217,244,244,233,211,243, 95,255, 94,163,209,
+ 16, 0,134,226, 59,211,197,214,192,129, 3, 23,158, 62,125,186,245,190,125,251,214,239,223,191, 95, 7, 0, 2,129,192,230,224,
+193,131,171,199,140, 25,131, 49, 99,198, 44, 62,122,244,232,159, 38,180, 40,134,210, 3, 0, 95,192,231, 39, 38, 38, 18,158,158,
+158, 13,102,220,215,211,244,195, 95,158, 61,235,252,137,167,167,127, 41, 77,183,225,190,255,190, 98,222,188,121,197,114,185, 28,
+233,233,233,208,235,245,152, 60,121, 50,171, 79,159, 62,178, 49, 99,198,108,170,172,172, 28, 5, 64,111,194, 61,185,206,201,201,
+233,163,138,138, 10, 69,181, 85,167, 71, 40,197,238,229,107,228,119,106, 99,224,113, 89, 70,238,144,185, 52,113,225, 71, 66,233,
+233,134,155, 0,192, 85,161,168,137,131,129, 58, 97,238, 12, 55,138,131, 21,182,206,194,190, 69, 25,234,101,202,204, 6,197,210,
+ 40,177, 88, 60, 92,169, 84, 30,173,234,156,219, 14, 30, 60, 24,119,239,222, 5,128,238, 85, 66,171, 47, 73,146, 31,208, 52,253,
+ 43,128,134,150,114,251,108,216,176, 97,239, 70, 68, 68,152, 1,192,209,163, 71, 97, 48, 24,224,238,238, 14, 46,151, 11, 30,143,
+ 7, 14,135, 83,179, 58,136,137,112,180,181,181,129,141, 5, 7, 82, 43,241,251, 95,255, 52,140,221,162,131, 57, 10,169,167, 40,
+101,202, 97,100,180,224, 90,139,209, 46,216, 18,126, 3,250,146,167,182,198, 45, 56,181, 37,161,179,138,196, 16,100, 64,251, 79,
+233,217, 73,146,228, 63,126,252, 24, 50,153,236,149,207, 89, 44, 22, 0,244,122, 3,202,197, 41, 41, 41,129,209,209,209, 8, 10,
+ 10, 90,236,237,237,253,222,181,107,215, 28, 74, 74, 74, 16, 20, 20,180, 41, 59, 59,251,196, 95, 93,167,218, 90,228,255,139,169,
+139,124, 77, 73,246,121, 57, 10, 38, 89, 44, 22,137,212,148,116, 67, 80, 80,191, 73,153,153,153,146,128,128, 0,146,195,225, 64,
+ 25, 21, 5,205,131, 7,144, 72, 36, 24, 49, 98, 4,231,250,245,235,230,230, 18,243,105,105,169,105,149, 44, 22, 9,134, 33, 27,
+141,121,144, 74,165,179, 22, 44, 88,224,224,225,225, 1,163,209, 88,147,209,220,104, 52, 34, 43, 43, 11, 18,137, 4,161,161,161,
+118, 34,145,104,150,137,245,104,213,214,221, 46,230,234,153,109,239,204,155, 57, 80,220, 86,116, 17,226,172, 57,144, 28,253, 4,
+237,115,207, 33,108,120,128,248,194,150,197,126,173,101, 86, 49,181, 76,172, 38, 67,171,213,222,140,139,139,155,118,237,218, 53,
+ 26, 0,174, 92,185,194, 36, 36, 36,204,120,155, 81, 40, 77,211, 40, 47, 47, 7, 77,211,172,170,247,213,175,255,209,251,193,220,
+220,124,235,123,239,189, 55, 46, 35, 35, 67,120,246,236, 89,235,204,204, 76,155,180,180, 52,219,182,109,219,178, 87,175, 94,125,
+ 90,163,213,179, 12, 20,163, 51, 82,134,202,188,167, 79, 83,202, 10, 10, 98,118,238,220,169, 38, 8, 98,132,137,191, 49,202,209,
+209,209, 58, 60, 60, 28, 4, 71,212,165, 93,123,111, 15, 22, 71,104, 65,114,120, 22,106,181,134, 74, 77, 77,205, 10, 15, 15,119,
+245,241,241,145,225,165,123,205, 36, 78,153, 76,102,243,229,151, 95,130,205, 55,243,237,228,227,215,154,199, 23,155,177, 56, 66,
+179,128,128,128, 62, 41, 41, 41,185, 97, 97, 97,142,254,254,254, 77,226,244,247,247,151, 78,159, 62,221, 40, 16,154, 5,186,185,
+185,183,239,212,177,253,160,182,109,219, 14,103,179,217,198,162,162,162,140,208,208, 80,199, 33, 67,134,216, 55,133,211,206,206,
+ 78, 26, 22, 22,102,116,105,233, 30, 28,252,238,128,174, 92,161,153, 5,155, 39,182, 84,169, 52,212,179,103,207, 50, 22, 45, 90,
+228,232,235,235,107,103, 10,167, 74,165,226,216,216,216,192,203,203, 11, 29,220,221, 81, 81, 81,129,136,136, 8,236,218,181, 11,
+191,254,250, 43, 14, 28, 56,128,206, 61, 6,192,204,204, 12,185,185,185,144,203,229,156,191,251,134,162,126,246,100, 54,235, 62,
+ 26,250,241,199, 31,231, 78,159, 62, 61, 95, 40, 20,210,175,111, 86, 86, 86,212,132, 9, 19, 10, 66,191,222, 56,180,218,181,216,
+136, 37,235,241,153, 51,103, 94,236,219,183, 15, 29, 58,116, 64,112,112, 48, 15, 0,102,205,154,197, 27, 51,102, 12, 14, 31, 62,
+140,163, 71,143,198,123,120,120,220, 2, 48,204,148,114,134,134,134,246, 8, 9, 9,185, 17, 18, 18, 18, 59,118,236,216,237, 51,
+102,204,120,165,231,202,203,205,126,168,211,233,224,227,231, 47, 90,190,227,222,132,198,248, 18,128,125,219, 19, 19,119,173,121,
+250, 52, 99,113,135, 14,150, 45,211,210,172,118,175, 91,103, 83,189, 72,183,193, 96, 64, 86, 86, 22,164, 82, 41, 38, 76,152, 96,
+195,231,243, 67, 77, 40,230,134, 97,195,134, 77,201,204,204,148,252,242,203, 47,142,177,177,177,178,188,188, 60,199,203,151,206,
+219,126,245,197, 44, 51, 11, 9,143,151, 91,196, 16, 0,144,150, 11,113, 98, 42,122, 48, 12, 44,107,187, 19,223, 8,142, 16, 10,
+157,177,185,117, 15,203,231, 95, 30,246, 29, 27, 22,233,103, 35,117,228,135, 55,112, 68,167,181,107,215, 30, 57,117,234,212,248,
+ 30, 61,122, 28, 3, 32,172, 99, 31, 65,231,206,157, 35, 14, 31, 62, 60,165,103,207,158, 55, 1,120,213, 59,138,116,118, 30,241,
+251,239,191, 91, 87,191,183,177,177,129, 64, 32,248,131,200,226,114,185, 32, 73,178,201,213, 91,121,112, 60,219,170,189, 22,113,
+101,103,112,120,237, 99,172,125,255, 25,189,170, 91,154,246,199,208, 68, 92, 56,252, 24,133,120,140,129,159,180,198,248, 69, 62,
+253, 69, 20, 86,252,147, 58,240,162,162,162, 15,122,245,234,117,100,224,192,129,218,232,232,104, 20, 21, 21,193,201,169,102,172,
+157,255, 6,148, 86, 34,145, 8, 46, 46, 46,240,240,240, 24,127,253,250,117, 7,131,193,128,180,180, 52, 20, 22, 22,198,252, 29,
+117,170,173, 69,254,203,240,122, 32,252,233, 63, 8,173,170,181,133,174, 2, 0, 67, 16,202,199,113,113, 28, 22,143, 55,241,183,
+253,251,249, 92, 46, 23, 25, 25, 25,136,143,143,135,234,242,101,168,111,223, 70, 65, 65, 1, 20, 10, 5,236,237,237,177,109,199,
+ 14,177,142, 98,166, 62,123,254,156,197,144, 76,237,120,131, 58,167,120,242,249,252,254, 35, 71,142,172, 87,144,229,230,230, 98,
+224,192,129, 28, 22,139, 85,215,172,134,215, 57, 9,153, 45,113,234,242,177,229,142,142,188,120, 32,121, 30, 80, 25, 3, 48, 90,
+192,168, 3,114,158, 0,167,151,162,165, 34,145, 56,191,124,146,131,147,136,125,170, 14,165,220,216, 84, 84,119, 79, 79,207, 95,
+ 39, 78,156, 72, 2, 64,223,190,125, 9, 79, 79,207,237, 0,220, 27, 56,230, 82, 35,157,228,221,178,178, 50,140, 25, 51,198,186,
+117,235,214,151,198,140, 25, 99, 93,253,249,155,114, 86, 91,147, 59,116,232, 80, 34, 16, 8, 14, 0, 38, 53,176, 53,156,150,150,
+150, 63, 14, 28, 56,112,244,254,253,251,185, 0,112,245,234, 85,156, 58,117, 10, 79,159, 62, 69, 82, 82, 18,237,231,231,103,187,
+241,215, 35, 91,127,252,121,207,134,225,221,125,100,125,186,248,181,151, 40,202, 20,246,246,246,221, 25,134,113, 55,177,156, 3,
+151, 46, 93, 26,159,240, 34,195,130,100,115,216, 92, 14,155,111,110, 46,182,151,154,137,157,173, 68, 2, 39, 62, 73, 72, 84, 42,
+ 85,254,129, 3, 7,104, 0, 3, 77,229, 92,190,124,121,106, 66,114,134, 37, 65,178,217, 28, 54,135, 43,145,136, 44,223, 15, 14,
+242, 7, 0, 46, 24,174, 92, 46, 47,216,181,107,151,190, 41,156,223,126,251,109, 92,105,185, 66,202,230,112, 56,108, 54,171,230,
+ 92,138,133, 66, 91, 17,159,207,211,106,181, 57, 63,252,240,131,186, 41,156, 75,151, 46,141,127,246, 34,211,138, 36, 8, 22, 65,
+144,108,115, 51,177,181,181,133,200,214, 86, 34,180, 17,177, 89, 60,185, 92,158,179,119,239, 94,147, 56,245,122, 61,183,160,160,
+ 0, 9, 9, 9,112,241,247,199,197,139, 23,209,162, 69, 11,140, 25, 51, 6,227,198,141,131, 80, 40, 68,223, 64,111,132,135,135,
+227,197,139, 23,208,235,245,252,186, 56,171,227,164, 94,135, 76, 38,139,110,236,230,121,237,216, 87,202,233,235, 0,102,179,238,
+163,161,181, 5, 86,125,252, 86, 86, 86, 84, 93,214,174,215, 57, 7, 14, 28,184,240,242,229,203,173,247,238,221, 59, 52, 52, 52,
+244,230,222,189,123,209,181,107, 87, 36, 36, 36,192,213,213, 21,187,119,239,198,184,113,227,110,110,218,180,105,104,116,116,180,
+143,155,155,219,130,198, 56,199,142, 29,251,169,175,175,111, 84,126,126,126, 96,105,105,169, 87, 68, 68,196,212, 17, 35, 70,164,
+142, 31, 63,190, 95,141, 96, 52, 24,246,159, 62,121, 12,131,134,142, 68,187,142, 94, 91, 39, 47,216,231,221,200,179,201, 60, 5,
+182,239,202,203, 43,218,175,209,168,198,112, 56, 34,209,189,123, 86, 71,127,254,217,166,246,202, 2, 57, 57, 57, 24, 50,100, 8,
+135,203,229,246,108,164,156,107,135, 15, 31, 62, 38, 34, 34, 66, 90,109,213,185,125,251, 54,158, 60,121,130,244,244,116,148,151,
+151,163,223, 12, 5, 62, 94,253,146,251,227,213, 12, 6,204, 98,196,111,216,134,212, 64,216, 2, 14,214,230,236, 91, 83,127,104,
+ 55,235,163,173, 29,216, 18, 43, 14,126,251, 58, 9,197,105,218,163,245,112, 18,129,129,129,251, 66, 66, 66, 8,157, 78, 7,157,
+ 78,167, 3, 80,103, 86, 95, 39, 39, 39, 65,167, 78,157, 48, 99,198, 12,210,220,220,124, 83,125,229, 84, 42,149,218, 51,103,206,
+ 32, 52, 52, 20,115,230,204, 65,155, 54,109, 32,149, 74,193,225,112,176,103,223, 33,155,113, 83,103,182,125,167, 71, 47,159, 14,
+239,116,237, 84,169,101,249,115,132,210,233,245, 88, 67,234,172,187,194, 46, 26,113,105,119,176,121,104, 54,125,127,183, 74,241,
+213, 7,255, 74,124,118,173,224,233,130,144,237,113,204,157,110,197,251, 62,207, 68,129, 33, 1, 61,199,180,132,155,175,116,174,
+216, 5,158,111,122, 62, 77, 68,147, 56,189,189,189,123,220,191,127,159,223,171, 87, 47,100,100,100,128,195,169, 25, 79, 81,111,
+ 83,206,165, 75,151,242, 53, 26, 13, 30, 61,122,132, 73,147, 38,229,232,245,250,185,111, 83,206,166, 88,180,170,181,200,127, 25,
+182,191,182,229,213,103,209, 90, 10, 0, 6, 26,167, 38, 78,154,170,138,140,140, 20,241,120, 60,100,100,100, 32, 47, 47, 15,123,
+118,237,162,250,218,217, 85, 6, 59, 57,201,247,236,218,197,232,116, 58, 48, 12, 3, 79, 79, 79,140, 30, 61, 90, 56,106,204,248,
+ 66, 66,174, 62,100,130,155,199,177,218,191, 62,117,234,212, 63,124,255,213, 87, 95,193,220,220, 28, 4, 65, 56,152, 80,185,144,
+207,150, 14,119,150,186, 89, 22, 48,249,123, 74,193, 18, 0,108, 51,128,109, 14, 8, 44, 0,190, 25,192, 19, 65, 27, 29, 85, 74,
+ 50,193,233, 35,123,126,232, 4,160, 41,174, 30,200,100,178,197, 81, 81, 81,182,209,209,209,140, 92, 46, 71, 94, 94, 30,179,106,
+213, 42, 91,153, 76,182,248, 77,175, 72,110,110,238,242, 65,131, 6, 21, 76,154, 52,201,226,220,185,115, 46,147, 38, 77,178, 24,
+ 52,104, 80, 65,110,110,238,242,183,185,210, 92, 46,151,245,244,233, 83,171, 21, 43, 86,140, 3,240,176, 99,199,142, 37, 78, 78,
+ 78, 15,241, 50,104,178, 65,152,153,153,213,136,172,106,235, 26,155,205, 6,135,195,129, 76, 38,211,149,150,150, 82, 61,223,113,
+ 23,122, 90,144, 6, 25,159, 43,180, 18, 10,156,205,204, 45, 2, 74, 74, 74, 30, 19, 4,145, 98,162,139,207,183, 75,151, 46, 28,
+138,225,208, 31, 79,236, 43,155, 53, 37,200,238,167, 21,211, 91,252,176,252, 35,167,181, 75,166,121, 46,159, 63, 33,136,164,105,
+141,171,171,171, 67,117, 64,187, 9,230,115,191,206,157, 59,179,105,112,144,240, 60,189, 32, 35, 59,167,242,221, 62,129, 53,150,
+203, 14,190,126,193,182,182,182,189, 60, 61, 61, 59, 19, 4, 97,210,148,100,161, 80,232,219,174, 93, 59, 54,201,226, 16,214, 82,
+ 51, 23, 51,137,208,190,198,133, 98,105,217,205,202,214, 54,132,100,152, 10, 71, 71, 71, 59,161, 80,232,219,132,186,179,105,112,
+ 97,111,103,101, 97,107, 99, 41, 9, 14,234,222, 38,176, 91, 96, 91,239,128,174,129, 29,223,233, 60,138, 48, 26,229,238,238,238,
+118,213, 65,242,141, 88, 90, 5,251,247,239,199,138, 21, 43,208,169,101, 75, 56, 57, 57,193,206,206, 14,183,111,223,198,253,251,
+247, 33,149, 74, 81, 88, 88,136,117,235,214,225,248,241,227,208,235,245,102, 77,189,159, 76, 17, 91, 13,193,104, 52,146,175, 11,
+172,250,248,133, 66, 33, 93, 29, 36, 95, 31,206,156, 57,179,175,218,146,245,249,231,159,247,216,184,113,227,205,196,196, 68, 72,
+ 36, 18,220,191,127, 31, 83,167, 78,189,185,105,211,166, 30, 51,103,206,196,174, 93,187,144,154,154,186,163, 33,190,177, 99,199,
+ 46,153, 54,109,218, 15,215,174, 93, 35,237,237,237, 33,149, 74, 49,124,248,112,236,216,177,131,109, 52, 26,119,134,132,132,196,
+134,132,132,196, 82, 89, 23, 22, 30,249,117,213,237,184,199,177,248,244,179, 47,121, 58,163, 33,204,132,234, 51,106,137,164,210,
+216,171, 87,233, 97,131, 65, 53,150,203, 21, 89,196,198, 90,157,218,185,179, 70,108,133,135,135,195,194,194, 2,120, 25,192,140,
+ 6,172, 58, 31, 29, 63,126,188,166, 61,180,182,182, 6,143,199, 3,151,203, 5,135,195, 1,139,197,194,165,173, 98,252, 28,254,
+ 82, 95,252, 28, 78,224,194,143,132,242,109,174,157,200, 9, 94, 82,123, 94,236, 39,187, 59,250,120,245,179,198,237,131,249, 88,
+ 53, 40, 58,251,254,225,162,121,154, 66,124, 95,207, 97,239,124,245,213, 87, 29, 10, 11, 11,241,224,193, 3, 60,120,240,160, 62,
+ 11,144,230,228,201,147,223, 41, 20, 10,184,185,185, 97,216,176, 97,189, 0,248,215,243,220,160,115,231,206, 24, 50,100, 8,130,
+130,130,208,169, 83, 39,232,244, 70, 78,200,196,143,218, 61, 77, 45,114, 90,181,110,149, 40,234, 74, 4,121,243,230, 53,214,190,
+ 99, 23, 44, 2,131, 6,252,192, 53,115,188, 11,161,181,163, 41,245, 84, 81, 37,240,117,124, 31,219, 47,127, 70,110,190, 58, 73,
+178,231,212,102,119, 51, 51, 51, 34,230, 65,172, 97,207,150,195,153, 94,226, 97,133,119, 15,150, 64, 69,228,163,223, 20, 55,146,
+ 6, 70,255, 83,122,118,129, 64,176,241,218,181,107, 14,122,189, 30,113,113,113,152, 51,103,142,230, 45, 41,107, 12, 32, 46, 46,
+ 46,184,122,245, 42, 38, 76,152,160, 41, 40, 40,184,243,119,213,169,182, 22,249,255, 2,118, 45, 5, 89,131,172,172,172,114,169,
+ 84,234,212,174, 93, 59, 82,167,211,189,116, 73, 28, 61, 74,253,186,115,231,105,141, 70,243, 25, 0,238,143, 63,253,180,213,201,
+217, 57,104, 98,104, 40, 97, 48, 24, 48,104,208, 32, 94,100,100,164,117, 74, 97, 97,165, 9, 29,206, 43,191, 55,121,242,100,108,
+220,184, 17, 0, 48,123,246,236, 26,211, 58, 97, 66,192,146,196, 2, 3,131, 7,119, 54,207, 18,111, 54,215,119, 51, 40, 90,189,
+ 48,187, 43, 86, 8, 59,131,228,177, 33, 96,129,214, 27,140, 73,133, 35, 30,190, 72,106,223, 65, 88, 90,226,218,191, 99,111,252,
+122,113,239, 64, 21,165, 57,108,114,131, 35, 18,117,145, 72, 36,120,248,240, 97,105,231,206,157,203, 25,134,177, 88,190,124,185,
+141, 72, 36,234,242, 22,231, 62,237,249,243,231,189,186,119,239, 62,139, 36,201,254, 52, 77, 95, 42, 40, 40,248, 17, 64,154,137,
+199,127, 12,224, 91, 0, 53, 35, 75,157, 78, 7,146, 36,193, 48, 12,198,142, 29,139,240,240,240, 14, 79,158, 60, 65, 84, 84,148,
+ 85,255,254,253,239, 2, 40, 7,240, 33,128, 58,173,102,114,185, 92,125,255,254,125, 97, 84, 84, 20,104,154,134,149,149, 21,204,
+205,205,193,231,243, 49,124,248,112, 73, 88, 88, 88,191,243,231,207, 23,202, 91,181, 96, 9,242,114,148,124,137,196, 12, 14, 78,
+ 61,103,142,255, 32,145, 97,152,227, 77,104, 28,120, 66,182, 81, 67, 80, 90,114,237, 55,155, 72, 17,151, 75, 8,184,108,240,105,
+ 21, 22,126,183,146,224, 50, 20, 27, 77,244,207,115,185, 92,174, 25, 31, 58, 22,143,101, 16, 17, 96,254,140,135,131,197, 98,241,
+ 4,220,250,227, 49, 56, 36, 73,146, 36,201, 5, 96,242,162,125,124, 62,159,107,198,103,234,229, 20,178, 8, 22, 65, 16, 60,212,
+ 51, 19,205,215, 1, 76,181, 21,137,247, 89,138,182,182, 40,238,217,179, 39, 78, 71, 61,196,209, 83,151, 80,156,241, 24,139,190,
+254, 28,254,254,254,136,140,140,108,176, 76,213, 49, 90,245, 89,151,101, 50, 89,116,110,110,238, 59,245, 29,219,144,203,176, 30,
+ 43,213, 31,249,191,177,128,223,210, 68, 52, 18,163, 53,172,103,207,158,159,238,223,191, 95,247,222,123,239,241,198,142, 29, 11,
+ 47, 47,175, 30, 83,166, 76, 1, 0,244,239,223, 31, 27, 55,110,236, 49,101,202, 20, 28, 58,116, 8, 17, 17, 17,218, 62,125,250,
+124,125,245,234,213, 28,188,156,209,249, 7,208, 52, 61,100,219,182,109,175, 91, 10, 97, 52, 26, 97, 48, 24, 28,141, 70,163, 99,
+ 85, 91,132, 31,126,216, 84,124,225,124, 36,190, 94,176, 20,118,182, 14,190, 38,222, 67,196,228, 47,191, 44,222,189,110, 29,214,
+ 29, 58,132, 47, 93, 93, 69,123,227,227,113, 65,163,193,225,168,168,226,170,223,105, 52, 54, 83,169, 84,170,207,156, 57, 99,126,
+248,240, 97, 88, 90, 90,162, 77,155, 54,176,178,178, 2,135,195, 1,201, 18,130,197,149,162, 93,199, 46, 0,238, 3, 0, 92,101,
+ 80,122,186,225, 38, 65,160,156, 33,155, 30, 83,196,111,129, 86, 54,206,130,107,159,238,242,178, 52,183,227,226,220,143,153, 56,
+191, 57,235,184,166, 24,235, 97,196, 51,212, 31,243,213,217,205,205, 13,133,133,133, 56,115,230,140, 18,168, 87,144,129,166,233,
+239,126,250,233,167,175, 22, 44, 88,192,247,244,244, 4, 0, 95, 0, 15,234,218, 87, 44, 22,195,201,201,169, 70, 88,142,157, 52,
+211,125,198,188,153,194, 17, 3,130,192,102,219,160, 92,105, 64, 73,165, 1, 82, 27, 9,190,158, 23, 34,184,212,217,201,127,219,
+166,223, 78,170,213,240, 7,254,216, 30, 16, 4, 30,220,123,124,211, 91,224, 9, 16, 36,144, 69, 94, 1, 1, 2, 10,194, 0,130,
+197, 98, 40,138, 66,102,102, 38, 24,134,193,132, 17, 83,179, 62, 90, 21, 97,215, 99,130, 28, 46,237,100, 32, 24,244,254,167, 8,
+ 1,107,107,107,223,146,146, 18,164,165,165, 97,210,164, 73, 57,197,197,197, 23,149, 74,229,212,220,220, 92, 0, 40,125, 3,202,
+ 26, 49,239,235,235,139, 46, 93,186, 96,204,152, 49, 2,149, 74, 21,226,238,238,238, 84, 84, 84,212,237,175,172,207,235, 90,228,
+255,149,208,170,243, 65, 51, 24,218,105,183,110,133,242,210, 37,240, 46, 92,192, 97,153, 76,161,209,104,190, 0,144, 85,245,224,
+127,190,107,247,238, 91, 67,239,220, 49,215, 37, 38,194,253,201, 19,112, 44, 45,125,155, 90,128,157, 59,119, 66, 46,151,163,162,
+162, 2, 0,176,121,243,102,200,229,114, 24, 77, 92,112,150,205, 69, 15, 7, 59, 87,228, 35, 9, 52,155,148,164,183, 83,117,149,
+104,204,114,157, 50,237,149, 21,164, 19, 18, 51, 2,196,234, 18, 93, 87,130,165,131,166, 88, 5,167,238,109,192, 6,187, 71, 83,
+202, 88,237,247,103,179,217,165,207,159, 63, 31,210,182,109,219, 83, 0,108,222, 36, 30,224, 53, 36, 23, 20, 20,124,246, 38, 7,
+178, 88,172,111, 83, 83, 83,237,118,236,216, 49,107,249,242,229, 76,109,161, 85,253, 63,155,205, 6,195, 48,176,176,176, 0,135,
+195,177,191,125,251,182,125, 64, 64,192, 22,154,166,125,235,169, 39,227,229,229,133,212,212, 84,176,217,108, 88, 88, 88,128, 54,
+234,177,116,222, 76, 80, 44, 62,123,254,252,249,190, 35, 71,142,140,219,177, 99,135,193, 60,176,123,183,146,146,146,167,159, 78,
+152, 24,119,226,196, 9, 93, 85,138,135,198,135,248, 12, 19,155,148,148,196,114,150,217,179, 24,163,138, 22,115, 1,193,227, 31,
+ 24,158,196, 1, 2, 54,139,225, 18, 36,248, 2,161, 69, 90,118,118, 9, 77,211, 9,166,112,210, 52, 29,147,154,154, 42,180,183,
+179,102,171,212, 58,133,144,195,240,210, 99, 30,166,180,242,235,236, 14, 0,154,152,251, 87,249,237,218, 11,211, 11,138,196,174,
+174,174, 38,113,170,213,234,216,156,156, 28,150,189,189, 61, 59, 35, 43,251,164,165, 68,108,107,110,105,217, 21, 0,244,149, 21,
+247, 73,173,182,136,197, 97,219, 23,149,148,148,170,213,234, 84, 83,235,254,226,197, 11,182,163,163, 29,235,220,133,203,167,236,
+ 69,124, 59, 51, 30,219,156, 79, 16,132,136, 69,200,185, 70,186, 88, 32, 18,217,165,101,103,151, 50, 12, 83,175,133,112, 77,249,
+196, 17, 47,175,215,210, 67,181,184,241,248,241, 99,156,189,153, 0, 49,163, 3,161,169,192,133, 93,191, 96,194,252, 5,111, 29,
+247,215,152,216,122, 35,107,214,182,246,209,175,241, 35,175,145, 64,248, 9, 19, 38, 44,221,183,111, 95, 77, 0, 74, 66, 66, 2,
+250,246,237, 91,237,230, 64,112,112, 48, 2, 2, 2,144,144,144, 0, 15, 15, 15, 68, 69, 69,241, 89, 44, 22,127,226,196,137,171,
+126,251,237,183, 51,141,218,253,183,111,199,212,169, 83,235, 10,172,126, 1, 64, 67, 72, 61, 21,225,107,246,216,148,150, 20,163,
+176, 40, 63,214,212,243, 64, 16, 4, 38,127,249,101,241, 54,157, 14,251,239,221, 67,168, 88, 44,218,157,156,140, 65, 1, 1,240,
+238,219,183,216,148,182,174,218,170,163,209,104,192,225,112, 96,110,110, 14,107,107,107,112,185, 92,176, 56, 50,176,121, 62, 32,
+185, 92,248,245,244,193,186, 47,196,170, 73,239, 99, 19, 65,160,156,207, 67, 12, 87, 84,111,172, 14, 33,110,129,225, 12, 3,185,
+ 42, 11, 87,170, 5,137, 69, 75, 88,112,204, 56, 23,166,109,241,180, 52,183,227,226,236,166, 12, 92,216,146,125, 76,147,143, 69,
+ 85,231,130,110, 96, 32,225,109,105,105,137,172,172, 44,100,102,102,198,163,225, 0,127, 85, 66, 66, 66, 10,159,207,239, 96,107,
+107, 11, 0,110,245, 13,204,105,154,174,137,195,218,187,255,136,141,111, 47,119,193,187, 61, 58, 96,207,169,149,248, 36,100, 19,
+ 56, 44, 2, 20,165,199,250,141,131, 65,105, 21, 8, 25,250, 17,209,187,191,135,207,165, 83,186,105, 6,117,217, 47,127, 24, 8,
+176,177,226, 95,227,110, 91,242, 37,164, 55,104,194,210,198,198, 78,204,229,114, 97,109,238,168, 91, 48, 99,110, 30,195, 48, 53,
+207, 13,135,197, 53,144,149, 86,234,146,124,133,208,146,163, 6, 24,178,213,155,101,179,249,243,145,157,157,253, 89,175, 94,189,
+ 86, 85, 86, 86,150, 41,149,202, 9, 0,224,230,230,214,146, 36, 73, 62,128,134,188, 35, 45, 81,119, 90, 8,238,147, 39, 79, 96,
+102,102,134,156,156,156,218,198, 23,208, 52,253,143,153, 4,240, 15,133, 31,128, 24, 0,142, 0, 6,161, 86,122, 7,178,202, 84,
+215, 59, 50, 50,146,137,140,140,236, 93,211,121, 49, 12,109, 44, 45, 5,163,125,121,110, 57, 28, 14, 3,160,246,140, 38,145,165,
+165, 37,193,113,118, 6,193,127, 25,250,193,252,137, 83, 95, 13, 6,211, 82,203,208, 20, 88, 32,244, 96,106, 13, 90,148, 2, 2,
+ 43,109,250,225, 51,222, 98,228,243, 44,107,247,116,128,145, 1, 5,154,213,196,226, 48, 74,165, 18, 70,163, 81,218,186,117,235,
+211, 70,163, 81, 90,213,185, 49,255,169, 43, 74, 81, 84, 10,139,197,194,172, 89,179, 80,109,253,209,233,116,200,207,207,135, 86,
+171,133, 78,167, 67,106,106, 42, 42, 42, 42,160,211,233,240,244,233, 83,184,185,185,129,197, 98, 57, 54,208,152, 51, 12,195,192,
+197,197, 5,173, 90,181, 2,139, 96,240,235,218, 37, 88, 56,103, 38,198,185,209,216,249,227,122,244,233,211,167,189,171,171,107,
+ 32,155,205,166, 28, 28, 28,184, 17, 17, 17, 39, 41,138, 26, 14,211, 91,158, 51,225,225,225,173, 58,118,236,104,103,105,110,102,
+224,243, 88,224, 25,148, 12, 95, 91,194,176, 85,197,112,113,105,105,132, 80,228, 17, 26, 26, 74,213,103,133,168,139,243,139, 47,
+190,112,244,244,244,180,144, 90,154, 41,121, 28, 86, 33, 23, 76,113,197,227, 7,119, 1,128,103,107,167,129, 64,212, 97,210,164,
+ 73,198,166,112, 46, 94,188,216,205,214,214,214,146, 4, 83, 73,233,245,255,246,183,107,117, 37, 4,135,163, 6,151,215,121,246,
+236,217, 68, 83, 56,191,250,234, 43,215, 14, 29, 58, 88, 90,154,139, 21,108, 14, 43,143, 75,211,121, 2,208,249, 28,157,190, 76,
+ 96,107,163,130, 72,226, 23, 26, 26, 90, 47,103,181, 53, 43, 44, 44, 44,235, 53,225,141,210,210, 82,104,242,227,192,205, 73,132,
+143,132, 3,127, 91, 41,248,124,126,205,212,247,250,110,215,250, 98,180,234, 18, 91,166, 30,219,121, 89, 3, 46,192,109,237,163,
+ 95,207,155,149,155,155, 11, 71, 71,199, 6,159,167,223,126,251,109, 65, 80, 80, 80, 97,112,112,176,238,244,233,211, 32, 8, 2,
+ 81, 81, 81,200,201,201, 65,112,112, 48, 24,134,169,158,213,134,216,216, 88,244,239,223, 95,215,171, 87,175,156,170,252, 90,141,
+ 98,234,212,169, 48, 24, 12, 80, 40, 20, 40, 45, 45, 69,100,100, 36,124,124,124, 24,145, 72, 52,146,229, 50, 96,101,200,180, 5,
+221,188, 58,249, 98,203,166,117, 58, 30,155,179,166, 41,207, 43, 65, 16,152,244,197, 23,197, 21,126,126,165,123,149, 74,213,100,
+115,115, 81,235,172, 44,171,135,231,207,219,232,245,122,147, 56,170,173, 58,206,206,206, 53, 34,139,203,229,130,205,179, 5, 75,
+236, 13,158,117, 48, 68, 14, 35,113, 37,134,175,181, 16,227,184,153, 4,231,196,150,245,167,118, 16,185, 96,101,183,177,142, 17,
+221,199, 57, 94, 22,181,192,142,170,254,128,100,216, 68,196,148,245,109, 91,219,182, 18,226,206,145,124, 92,216,146,253,187, 38,
+ 31, 75, 0, 36, 55,246,156,235,245,122, 13, 69, 81, 32, 73, 18,108, 54,187,118, 76,224,173,223,127,255, 29, 15, 31, 62, 4,106,
+165,237,169,172,172,164, 88, 44, 22, 4, 2, 1, 0, 72, 26,104,239,192,225,112,192,225,112,112,245,238,117,235,113,163, 6, 19,
+183, 31, 93, 68,119,159,241, 40, 81,232, 81, 80,161, 71,185, 10,232,232,191, 8, 94,253,143,227,113,106, 37,124, 59,121,177, 88,
+ 60,241,164,186,248, 52,105,200, 82,102, 98,116, 73, 60,221, 70,151, 45, 60,123,231, 68, 66,252,245,163,143,159, 30,252,233, 84,
+114, 55,255, 94,202, 42, 99, 2, 20, 10, 5, 67, 16, 4, 51,119,250,130,148,189, 83,203,168, 77, 19, 30,211,108,173,224,197,223,
+216,212,183,180,181,181,189,109,109,109, 29, 85, 37,142, 90,154,153,153,221,114,116,116, 76,196,203,137, 30, 39,242,242,242, 60,
+149, 74,101,119,188,156,156,149, 81, 82, 82,210,183,202,242,148,209,128, 37,108,135, 92, 46,255,156,162,168,161, 85,219,251, 20,
+ 69,249, 38, 37, 37,117,240,245,245,141,119,119,119,143,117,119,119, 63,235,238,238,126,210,221,221,253,100, 80, 80,208,198,234,
+116, 15,127,177,219,240, 15, 90,228,191, 76,104,161, 74,100,109,175,122, 69,141,208, 2,112,245,245, 0, 52, 35,159,255,212,248,
+233,167,176, 60,121, 18,156,164, 36, 76,153, 52,201, 92, 36, 18,109,194,203, 28, 77,221, 37, 18,201,150, 37, 75,150,152,217,172,
+ 94, 13,217,245,235, 72,143,140,132,129,195,121,240, 38,165, 83,171,213, 96,179,217, 53,150, 24,177, 88, 12,138,162, 80,151,201,
+247, 15, 15,160, 17,119,114, 10, 18,193, 67, 43,208, 96, 20,231,228,189,238,141, 79, 89,100, 23, 41,119,243, 72, 86,114, 61,150,
+217,118,206, 99,233, 94, 0, 0, 32, 0, 73, 68, 65, 84,181,219,212,178,199, 61, 37,193, 86,240, 44, 5,200,204,204, 2, 5,186,
+ 73,254,102,141, 70, 83,161, 84, 42,225,235,235,107,253,240,225,195,214, 62, 62, 62, 86, 85,159,223,127,203, 11, 19, 40,147,201,
+142, 56, 57, 57,165,201,100,178, 35, 0, 2,155,112,236,142, 27, 55,110,128,197, 98, 97,201,146, 37,168,172,172,132, 94,175, 71,
+ 73, 73, 9, 50, 51, 51,161,211,233,144,157,157,141,103,207,158, 65,167,211, 33, 61, 61, 29, 90,109,227, 3, 18,154,166, 97,110,
+110, 14,141, 90,129,159, 87, 46,196,226,176,121,168,120, 17,141,236,220, 2, 88, 90,136,241,217,103,159,177,164, 82, 41, 77,211,
+116, 43,138,162,250,211, 52,189,213,148,235, 84,235,126,187,233,226,226,226,181,118,237,218, 14, 11, 87,110,229,154,179, 21, 12,
+223, 76, 64,243,204,248, 12,175,125, 87, 76, 93,180,137,251,195,134,239,159,223,185,115, 39, 7,166, 37,239, 36, 1,220,244,243,
+243,107,155,147,147,227,227,233,233,217,206,166,165, 43,159,239,232, 84,206,117,108, 33,103,180,154,123,132, 83,139,158, 91,183,
+110,141,187,117,235, 86,110, 83, 56,197, 98,113,251, 61,123,246,120,217,219,219,123,113,132, 66,129,170,162,226,176, 81,165, 60,
+194,178,148, 10, 72,115,203,247,143, 31, 63, 30,125,236,216,177,252,166,112,122,120,120,120,174, 92,185,178,163,183,183,119, 71,
+ 7,183,214,124,161,147, 75,137,192,185,101,137,208,219,135, 15,231, 86,239,109,217,178, 37,246,206,157, 59, 38,113,178, 88, 44,
+ 35, 73,146,224,112, 56, 16,137, 68, 56,119,238, 28, 62,157, 54, 30, 46, 78,214,104,231,233,137,126,159,124,142, 99,199,142,213,
+196,240,176, 88,172,122,123,244,221,171, 63, 59,229,231, 72, 68, 99, 91,251,104,108,107, 31,237,231, 72, 68,215, 43,182,170,190,
+175,107, 31,147, 90,163,122,220,141, 38,136,173, 51, 87,175, 94,253,110,242,228,201,188,129, 3, 7,226,222,189,123,152, 58,117,
+234,205,136,136, 8, 0,192,189,123,247, 48,119,238,220,155,151, 47, 95,198,204,153, 51,209,183,111, 95,222,141, 27, 55,182,192,
+132,220, 63, 70,163, 17, 59,119,238,132,209,104,132, 68, 34,129,149,149, 21, 6, 15, 30,140,184,184,184,153,187,118,237, 74,100,
+113, 56, 31, 12, 26, 58, 10,167, 79, 70,224,217,211,184,153,187, 87, 77,108,114, 82, 96,146, 36, 49,112,210,164,226,226,142, 29,
+ 75,119,203,229,170, 15,165, 82,145,103,126,190,213,149, 35, 71,108, 76, 16,106, 4, 69, 81, 53,226,170, 90,116, 84,111,108,158,
+ 45,216, 98, 47,176,205,252,241, 56,153,107,224, 6, 32,134,231,143,132,134,242,103,113,120,228,212,145, 11,221, 48,114,161, 27,
+134,205,119,157, 34,106,129, 95,197, 45,240,241,192, 57,173,130,220,253, 45, 32, 47,212, 35,114,125,122,134,166, 4,171, 1, 60,
+ 51,229, 57,167,105, 58, 62, 39, 39, 7, 60, 30, 15, 45, 90,180,104, 11,160, 58, 46,112,199,244,233,211,103, 47, 91,182,108, 30,
+128,101, 85,159, 73,130,130,130, 58, 42, 20, 10, 36, 37, 37, 1,192,195, 6,172,193, 53,179, 12, 75,229,233,124, 87,153, 55,124,
+218,207,128, 84,218, 9, 57,165, 58,228,150,234,240,235,207,195, 17,125, 99, 5, 30, 94, 8, 69, 70,126, 62,132, 14, 35, 64, 25,
+181, 94, 38, 12,234,101,143, 30, 61, 34,110,220,184, 65,208, 52, 13,131,193,192, 84,202,229, 76,204,205,155, 80, 95,187, 70,152,
+155,155, 19, 61,186,244, 82,236, 94,113,250,254,241, 31,111, 62,212,171,154, 60, 80,127, 27, 44, 78, 73, 73, 9, 60,114,228, 72,
+ 16,128,197,222,222,222,119, 50, 51, 51,187, 93,191,126,189,157,179,179,243,166, 55, 37,173, 78, 11,145,158,158,254,202, 86,149,
+ 22, 66, 87, 37, 26, 6, 86,137,185, 97, 0,230,226, 45,102,217, 55, 1, 87,255,139,131,225, 79,227,181,217,134,175, 11,173,218,
+137,194,224, 46,149,154, 25, 12,250,236,139, 23, 47,234, 73,146,132, 72, 36,194,228,169, 83,201,159,127,250,169,231,248,192,192,
+168,143,222,125,247,108,212,229,203,126, 1, 1, 1, 96, 24, 6, 36, 73,226,208,161, 67,106,141, 70, 93,226,226,226, 98,105, 74,
+163, 81,251, 1,146,203,229, 53, 66,171,162,162, 2,246,246,246, 38,187, 14,149,114, 92,186,124, 46,186,140,161, 62,201, 28,152,
+188, 65,191, 38,127,120, 64, 57, 77,177, 43, 40, 3, 42,212, 12, 42, 53, 96,223, 35,173, 2, 38,123,140,208,167,246, 15,120,118,
+ 45,241,118,137,134,210, 52,105,182, 68, 97, 97,225,194,144,144,144, 18, 71, 71, 71,194,220,220, 28, 78, 78, 78,228,176, 97,195,
+138,179,178,178,150,189,233, 21,177,182,182, 30, 23, 20, 20,116, 42, 39, 39,103,244,181,107,215, 90, 93,191,126,125,116, 80, 80,
+208, 41,107,107,235,113, 38, 82, 28, 94,176, 96,129,146,199,227,161,107,215,174,168,172,172, 68,213, 44,159, 6, 55, 83, 92,164,
+ 92, 46, 23,219,214,126,139,197, 97,243, 80,154,120, 15,143,111, 94,196,213,124, 2,139, 86,126, 15, 46,151,251, 70,185,190,218,
+216,138,188,189,101,102, 9,115,167,142,205, 13, 15, 11, 51,139,141,141,229,204,158, 51,151, 73,207, 43, 5,111,224, 58, 22,122,
+ 47, 36, 31, 41,109, 49,232,253,126, 88,178,248, 75,239,170,164,157, 13,162,189,173,200,219, 75,102, 22,255,229, 71,227, 83,230,
+204,153, 35, 92,179,102,141, 38, 48, 48, 80, 93, 80, 80, 32, 20, 75,173, 60,217, 22,150, 94,233,121,249,146,192,192,192,212, 79,
+ 62,249,164,188,169,156,139, 22, 45, 18,157, 63,127,158, 29, 18, 18, 98, 44, 43, 43,147,112,132, 66, 95,130, 47,232, 82, 84, 86,
+102, 49, 58, 36, 36,121,244,232,209,170,170,132,165, 38,115,126,243,205, 55,162,103,207,158,177, 3, 3, 3, 13,249,249,249,102,
+ 98,107, 27, 31,150,165,149,127, 90, 94,129,121,151,128,128, 23,179,103,207, 86, 54, 84,206,218, 34,197,204,204, 44,167,123,247,
+238, 88,191,126, 61,126,248,225, 7,188,247,222,123,136,123, 26,135, 65,179,231,161,195,199,115,113,242,246, 93,228,228,228, 96,
+249,242,229,240,241,241, 1,151,203,125, 86,231,243, 56, 51,145,136,205, 7, 17,155, 15,130,152,153, 72, 84,191,175,215,178,181,
+172, 2,181,247,175,107,191,135,223,212,109,233,242,115, 36,162, 27,138,195,106, 76,108,141, 30, 61,250,211,234, 20, 14, 31,126,
+248,225,205, 77,155, 54,245,248,240,195,151, 3,237,174, 93,187, 98,197,138, 21, 61, 22, 45, 90,116,115,229,202,149,232,215,175,
+ 31,220,221,221, 27,157,248, 66, 81, 20,140, 70, 35,198,143, 31, 15,163,209,136,162,162, 34, 60,127,254, 28,219,183,111, 7,195,
+ 48, 2, 0,112,148, 57,119,230,241,120,120, 20,243, 64,181,248,195,128,223,154, 96,201, 34,106, 15, 98, 20, 10, 5, 70,127,252,
+113,113,118,155, 54,165, 91,139,139, 85,211,164, 82,145,107, 70,134,149,153, 78,231,132, 6,226, 18, 9,130, 0, 77,211, 53,194,
+170, 90,112,189,190, 85,117,148, 38, 65,175,162,207, 92,223,151, 11, 0,232, 53, 81,134, 97,243, 93,167, 56,122,136, 54,247,156,
+240,210,232,125,108, 69, 10, 83,153, 75,173,129, 1,241, 77,176, 88,223,187,119,239, 30, 44, 45, 45, 17, 18, 18,194, 39, 73,114,
+117,245,120, 21, 47,115,103,109,168,230,226,243,249,235, 66, 67, 67,201,242,242,114, 60,126,252, 24, 0, 46,215,215, 46, 49, 12,
+ 83, 83,119, 69, 41, 1,138,230,225, 86,204, 57, 92,184,126, 20,105, 57, 69,200, 40,212, 0,108, 11,104,148,217,208,171,115,160,
+ 43,143,129, 92, 43, 50,169,192, 92, 46,183,200,219,219,155,241,247,247,103, 24,134,193,139, 23, 47,140,233, 25, 25,198, 7, 27,
+ 55, 50, 79,102,204, 32,204,158, 63,231, 10,133, 66,194,205,205, 13, 2,129,128, 22, 8, 4, 37,127, 99,231,253,151,164, 91,248,
+ 11,210, 66,252,153, 86, 45, 6,255,157,200,195,171,179, 13,107, 18,152,214,149,176, 20,140,185,112,236,209, 45, 63, 91,132,140,
+159,168,244,241,241,145, 58, 57, 57,129, 32, 8, 12, 31, 49,130, 8,186,118,205,140, 35,147,193,250,157,119,106,220, 17,151, 46,
+ 94,196,185,115,231,148,167,127, 63,238, 52,117,218,180, 33, 0,246, 52, 80, 24, 54,159,207,175,249,221,188,188, 60,240,249,252,
+154,152, 8,185, 92, 14, 91, 91, 91,228,229,229,193, 68,207,220,222,240,176,187, 97,133, 1, 11,221, 2,204, 56,196, 89,101, 62,
+ 40,134, 1,135,160, 0, 53, 3, 3, 5,104, 13, 12, 58,187,178,172, 46,168,141,210,200,123, 17,169, 0,246, 54,229,236,105,181,
+218, 43,177,177,177, 51,104,154, 62, 10,128,188,118,237, 26, 29, 31, 31,255, 41, 76, 15, 92,255,163,217, 94, 36,154, 31, 21, 21,
+101, 53,127,254,252,178,200,200,200,138,193,131, 7, 91,108,223,190,221,170,111,223,190,243, 75, 74, 74, 14,154, 98, 8,204,204,
+204,220,147,149,149,245,169,191,191, 63, 74, 75, 75,161,215,235, 17, 29, 29, 13, 15, 15, 15, 60,124,248, 16,109,219,182,197,131,
+ 7, 15,208,174, 93, 59, 80, 20, 5,141, 70, 3,154,166,169,198, 26,243,210,226, 34,160, 36, 19,185,247,206,226,249,147,104, 68,
+229, 18,248,241,224, 41,180,104,229,246, 70,121,106,218,218,137, 58, 58,218, 90, 95, 88,179,244, 27,187,244, 43,135, 16,177,243,
+ 71,250,234,217,179, 29,120,102,152,209,123,252,231,163,116, 6,180, 4,192,235, 22,224,143,129,210,103,148,168, 21,242,163,226,
+ 27, 78,176,216,214, 78,212,209,222,198,250,252,191, 86, 47, 51,123,113,110, 55, 14,111, 91,207, 28,219,119,192, 71, 3, 4,116,
+236,216,113, 32, 73,146,150, 0, 52, 85,113, 94, 38, 45,109, 83, 23,231,165, 83,167,252, 52, 64,192,137, 19, 39, 6,138, 68, 34,
+ 7, 0, 6,149, 74,149,242, 54,156,151, 35, 35,253,170,203, 73, 16,132, 29, 0, 61,195, 48, 47,208,196, 37,120,198,140, 25,179,
+ 98,238,220,185, 97, 20, 69,217,214, 26,157,179,214,173, 91,199,166,105,154,197, 48,140,158, 36, 73,253,249,243,231, 41,163,209,
+152,171,209,104, 62,126,155, 86,100,212,168, 81,184,123,247,238, 82,188,156,132, 97,170,181,250,149, 56,173,170, 37,123,222,152,
+255,218,181,107,203, 63,248,224,131,240,131, 7, 15, 62,223,180,105,211,208,153, 51,103,226,208,161, 67,104,211,166, 13, 30, 61,
+122,132,133, 11, 23, 2, 64,143, 69,139, 22,157,220,177, 99,135,123,122,122,250, 58, 19, 44, 26, 48, 26,141, 56,112,224, 0,134,
+ 15, 31, 14, 91, 91, 91,200,100, 50, 16, 4,113,101,218,180,105, 63, 1, 0,139, 96,113, 1, 64,171,209,106, 61, 61,253, 77,182,
+224,114,185,220,154,182, 46, 63, 63,191,102,166,224,128, 15, 62, 40,254,117,205, 26,252,166, 86, 99,154, 84, 42,202,118,118,118,
+ 60,249,226,197, 71, 79, 95, 54,206, 76, 67, 86,157,198, 68,150,169, 33, 13,234, 60, 44,248,125, 85,154, 3,128,247,122, 77,148,
+161,215, 68, 25,252,135,217, 17, 36,139,192,147, 11, 37,136,187, 84,122,204, 32,199, 21, 52,109,185,156,248,213,171, 87,159,236,
+221,187,247,208,246,237,219, 99,250,244,233,159,236,220,185,147,107, 48, 24,230,224,223,105, 30, 44, 72,146, 92,182,109,219,182,
+143,172,172,172,112,227,198, 13, 92,191,126,253, 10,128,204,250,218, 37, 0, 53, 57,179, 90,184,180,213, 60, 75, 87,136, 10,115,
+110,225,230,141,223,209,198,231,115, 8, 29,134,192,202,115, 37,244,137, 63, 64, 87,114, 1, 86, 46,131,145,157,254, 2, 44, 54,
+ 63,174,177, 32, 20,134, 97,158,102,103,103,187,187,187,187, 19,105,105,105, 70, 0, 12, 69, 81,140,190,103, 79, 67,135, 53,107,
+ 56,113,159,124, 66,116,123,246,140,197, 16, 4, 29, 29, 29, 13, 0, 9,255,137, 94,188, 58,221, 66, 92, 92, 92,125,233, 22,154,
+ 4,111,111,239, 30,215,175, 95,231,107, 52, 26, 92,189,122, 21, 93,186,212,204,237,250,143,102,191,175,173, 69,254,203,240, 81,
+ 29,159,109,127,197,162,245,202,141, 77, 19,156,118,109,219, 82, 92, 18,187,134, 15, 25,162,138,141,141,173, 25,245,105,238,223,
+135,242,220, 57, 80, 20, 5,134, 97,112,253,218, 53,132, 78,156,168,224,176,136, 95, 93, 93, 91, 49, 4,243, 74,238,150,254,117,
+140, 30, 66, 66, 66, 66,106, 26,159,172,172, 44,136,197, 98,240,120, 60,208, 52, 13,163,209, 8, 22,139, 5, 11, 11, 11, 24,141,
+198,186, 76, 48,175,115, 26,168, 82,229,232, 29,131, 38,228,201, 20,122,102,134,165, 43, 90,114,133, 53, 15,167,131, 57,129,161,
+ 62, 28,216,176, 11,153,203,235,222,205,165,181, 37,163,241,199, 25, 93,141, 77,249,111,219,169, 83,167,159, 66, 67, 67, 73, 0,
+232,223,191, 63,217,169, 83,167,205,104,120,169,156, 6, 57, 5, 2, 1, 31, 0, 78,157, 58, 85,250,252,249,243,247, 78,157, 58,
+ 85, 90,251,115, 19, 57,183,175, 93,187, 22, 34,145, 8, 70,163, 17, 58,157,174, 38, 62,171,246,171, 94,175,135,141,141, 13, 78,
+159, 62, 13,138,162, 78, 55, 86, 78,151,150,173, 64,216,182,198,158, 83, 81,184, 94,204,125, 19,145, 85,195,217,218, 65,220,206,
+193,198,250,226,191, 86, 45,183, 45, 75,142, 70,118,118, 54,115,254,220,233, 59, 26, 32,167,162, 18,139,203,149,104,167,214, 65,
+208,197, 29,153, 23,183,125,205, 44,234, 5, 3,234,158, 53, 88,195,217,193, 65,220,206,201,214,250,252,247,255, 90,101, 86,158,
+ 28,141,188,252,124,156, 57,125, 42, 86, 3, 84,187, 27,167,208, 52,237, 69,211,180, 23,128, 41, 13,136,151, 38,113,170, 84, 42,
+111,149, 74,229,253,103,114, 50, 12,227,205, 48,140,201,156,181, 99,162, 54,108,216,144,152,151,151, 23, 90, 88, 88, 24, 92,189,
+149,149,149,245, 87, 40, 20,125, 84, 42, 85, 79,245,134, 86, 22, 42,149,202, 78,161, 80, 56,106, 52,154,206, 0,162,155,112,207,
+215,160,118,214,233,188,188,188, 37,121,121,121, 68, 99,229,100,125,156, 72,236,255,254,203,223,183,109,219,230,248,150,252,175,
+148,179,184,184,248,232,193,131, 7,125,221,220,220,220,167, 76,153,130,173, 91,183, 98,211,166, 77, 90, 0,216,177, 99,135,182,
+150, 37,203, 37, 61, 61,221,191, 30,183, 97,255, 90,214,146,189, 3, 6, 12, 96,174, 95,191,142,225,195,135,215, 36, 18,253,229,
+151, 95, 96, 52, 26,229,253,250,245,163, 1, 64,173, 81,201, 25,154,129, 78, 95,175,255,253, 15,231,147,199,227,189, 95, 59, 95,
+ 96,117, 50,102, 30,143, 7,134, 97,208,174, 71,143,226,114, 31,159,210,157, 21, 21,170, 37,222,222,230, 31,121,122, 78,105, 15,
+ 76,172,139,147, 32,136, 87,172, 58,175,111, 77,176,100,213, 46,103,161, 58, 23,211,127, 95,149,118,174,218,178, 37,144,176,161,
+169, 52,226,248,154,180, 34, 77, 17,126,169, 79,252, 52, 84,247,210,210,210,217,107,214,172,209, 74,165, 82,140, 26, 53, 10, 43,
+ 87,174,156,214,163, 71,143, 10, 59, 59,187,187,109,218,180,121, 50,118,236,216,188,232,232,232,217, 65, 65, 65, 72, 74, 74,194,
+247,223,127, 95, 94, 86, 86, 54,161, 33, 78,130, 32,106, 44,121,195, 6,245, 47,253,121,243,122,186, 95,239, 79, 33, 18,154,195,
+192,113, 65,169,194,128, 50, 37, 3, 29, 63, 0, 60, 46, 31,193,129, 29,113,247,252,110, 21,165, 83,238,105,236,158, 87, 40, 20,
+199, 38, 79,158, 44,231,114,185,208,233,116, 12,135,195, 1,255,101,220, 49,205,121,239, 61,125,183,248,120, 35,197, 48, 52, 65,
+ 16,248,226,139, 47,148,101,101,101, 7,223,228, 57,106, 2,106,115,254, 89,233, 22,250,191,214,255,252, 25,105, 33,254,138,186,
+255, 55, 99,123, 29,219,191, 45, 90,213, 83, 42,171, 95, 9,130,166, 40,138,134,171,155,171, 89,122, 90,230,143, 99,198,132,124,
+ 56,112,224, 32,209,160, 65,131, 4, 29, 19, 95,142, 70, 79,157, 58,133,136,136, 8,213,133, 11, 23,228,124, 14,107,135, 75, 11,
+ 23,123,138,162, 65, 16,116,131,106,216,204,204,108,206,130, 5, 11,132, 21, 21, 21,216,180,105, 19,237,235,235, 75,138,197, 98,
+232,245,122,236,216,177,195,208,177, 99, 71, 14, 73,146,168,168,168, 0, 73,146,207, 76,172,224,227,138,204,156,224,159,130, 70,
+ 70,248,207,154,106,221, 33,168,155,180,143,139, 19, 12,239, 48,200,205, 74,195,243,203, 23,202,158,158,223, 88, 2, 77,193, 72,
+ 52,190, 60, 80, 93, 29,193,183, 23, 46, 92,176,155, 61,123, 54,163,209,104,136,204,204, 76,102,213,170, 85,118,211,167, 79,255,
+ 54, 55, 55,119,220, 27, 94, 20,162,188,188, 28, 4, 65,208, 85, 13, 73,245,168,191, 41,126,185,184, 61,123,246,156, 24, 49, 98,
+196,176,126,253,250, 33, 49, 49,177,198, 69, 88, 91,104, 85,207, 62, 92,189,122,117, 57,128,240,198, 72, 57, 28, 14, 54,237, 57,
+138,242,178, 98,216,219,203, 32, 16, 10,241,166, 51, 44,121, 36,185,228,187,229,223,216, 21, 39,220, 37,226,238, 68,209, 71, 30,
+ 23, 20, 26, 41,166,238,140,255,149,185, 76,149,250,111,120, 52, 67,178,150,124,183,106,153, 69,181, 91,243, 96, 76,158,156,160,
+152,217,111,245,136,252,183,112,254,205,144,201,100,200,203,203, 35,100, 50, 25, 83, 21,163,197, 52, 32,180, 94,189,193, 95,186,
+203,136,134,220,134,111,202,159,154,154,186,234,157,119,222,249, 50, 41, 41,233, 72,135, 14, 29,102, 2,104,161,213,106,203, 23,
+ 45, 90,244,175, 29, 59,118,124,104,138, 37, 11, 0, 14, 29, 58,180,113,234,212,169,231,134, 12, 25,242, 53, 77,211,157,106,117,
+236,169,118,118,118, 53, 46,220,162,130,252,176, 25, 31,142, 15, 83, 40,202, 76,206,115, 39,145, 72, 62, 90,180,104,145, 64,169,
+ 84, 98,203,150, 45,116,199,142, 29,201,234, 65,209,190,125,251,140,109,219,182,101,135,124,250,105,241,134,252,124,172,184,113,
+ 67, 25,230,229,229,187,243,249,243,206,160,233,189,245, 89,117,234,178,100, 85,135, 93,188, 33,114,171,196,214, 47, 0,222,235,
+ 54,198, 1, 39,214,166,161, 44, 93,247, 47, 24,241, 2, 38, 44, 11, 84, 7,178,143, 29, 59, 22, 92, 80, 80,112,226,155,111,190,
+177,232,220,185, 51,188,188,188, 56, 18,137, 36,160, 58, 93, 76, 69, 69, 5, 46, 93,186,132,173, 91,183,234,158, 62,125, 58,162,
+ 33,119, 21, 69, 81,133,109,219,182,173, 62, 15, 12, 65, 16, 37,114, 45, 97,113,184,125,128,100,202,140, 35,196,205, 7,183,145,
+171,167,161, 53,208,112,117,243, 67,159,247, 54,224,228,217, 39, 84,110,122,124,188, 65, 93,246,171, 9,229,125,145,156,156,124,
+124,249,242,229, 99,190,254,250,107, 97,113,113, 49,165,213,106,233,163, 71,143,178,166, 76,153, 66, 49,108, 54,205,101,179, 49,
+103,206, 28,117,121,121,249,239,192,223,186,192,244, 95,146,110,225, 47, 72, 11,241,167, 89,179,106,191,254,127, 65,157, 79, 40,
+205, 34,111,109,221,246,243,251,135, 14, 28,116, 96,177, 72,135, 23, 41, 41, 15,134,142, 28,157,115,241,226, 69, 43,174,133, 69,
+ 23, 0,180,110,230,204, 59,122,173,186, 52,242,196,137,150,174,174,173,124,170, 22,149,102,104, 22,121,171,161, 31, 84, 40, 20,
+202, 27, 55,110,168,194,195,195,137,172,172,172,253,246,246,246, 99,207,158, 61, 43, 25, 57,114,164, 58, 49, 49,241,152,131,131,
+195,176,160,160, 32,179, 47,191,252, 82,171, 80, 40,154,178,240,104, 60, 83, 84,214,254,254, 55,235, 62,184,191,246,231,119,193,
+102,117,135,150, 3,208,134, 91,208, 87, 94, 4,176, 31, 77,200,119, 84, 27, 98,177,216, 71, 36, 18, 33, 54, 54,182, 44, 32, 32,
+ 64,167,209,104,184, 43, 87,174,180, 22,139,197, 62,111,122,226, 25,134, 97,202,202,202, 64,211, 52, 27, 0, 81,245, 10,186,233,
+115,241,199, 13, 29, 58,244,196,225,195,135, 7, 12, 26, 52, 8,238,238,238, 48, 24, 12,104,219,182, 45,116, 58, 29, 60, 60, 60,
+160,213,106,177,116,233, 82, 84, 84, 84,204, 67, 3,107,158, 17, 4, 1,163,209, 88, 19,108,235,228,220,242,101,158,158,183, 72,
+ 99, 33,230,144,238,207, 34,119,162,176,164,152, 62,252,168,160, 64,165,167,130,147,139, 84, 79, 95,223, 79, 69, 65, 25, 52,229,
+179, 28, 0,208,210, 13,175, 56, 47,230,253, 31,123,215, 29,222, 84,217,190,239,115, 78,246,108,154,182,105, 83, 90, 90, 86, 1,
+ 41,171,236, 13,130,130,128,162,204, 15, 65,224, 3, 11,136, 34,160,224,192, 1,101, 9,226, 7, 10, 50, 42, 40, 67, 80, 89,178,
+ 81,134,148,150, 77,203, 44,101,143,238,145,166, 73,218, 52,205, 58, 57,191, 63,154,132,180,116, 36,165, 40,248,203,125, 93,231,
+ 74,206,200,157,247,172,247,189,223,231,125,222,231, 65,131,155,251,127, 64, 78,174, 10,191, 38,101,105,244,102, 91,191,155, 21,
+112,122, 84,206,231,132, 51,106,110, 10,134, 78,117,255,216, 39,129,187,130,170, 50, 92,204, 6,113, 65,248, 35,131,181, 63, 86,
+ 24, 35,235, 9,249,119,223,186,117,107, 55, 0, 36, 39, 39,167,141, 28, 57,242,227,251,247,239,207, 3,112,224,193,131, 7,107,
+ 61, 33,250,241,199, 31,111, 1,248,111, 85,199,252,178,244,191,187, 0,236,242,132,183,176,176,176, 36, 49, 49,177,228,195, 15,
+ 63, 36,210,210,210, 14, 6, 5, 5,189,124,232,208, 33,225,224,193,131,141, 87,175, 94, 61, 26, 28, 28,220,189, 79,159, 62,226,
+ 3,103,207,102, 20,223,185,179,111,223,253,251, 33, 22,155,109, 95, 85,239,103, 45,139,172, 50, 98,107,215,252,251,139,119, 47,
+190,223,199,102,196, 14, 83, 1, 78, 3, 72,127, 2,206, 19, 39, 79,158,108, 54,122,244,232,223, 6, 14, 28,216,185, 89,179,102,
+168, 91,183, 46,110,222,188,137,188,188, 60, 92,190,124, 25,123,247,238,221, 91, 82, 82, 82,109, 66,109,181, 90,253,120,122, 34,
+190, 60,120,195,247,115,246,158, 79,104,223,184,219,128,177,130,230,193, 54,152,204, 12,210, 30,222,193,220,207,215, 21,103, 61,
+188,149,108,182,154,223,128,155, 19,117, 12, 6, 67,236,183,223,126,203,222,183,111,223,128,149, 43, 87, 74,194,194,194, 40, 14,
+135, 67, 2, 96, 46, 92,184,192, 76,157, 58, 85,175, 82,169,246,235,116,186,216,191,185,141, 62,113,247,238,221, 40,138,162,106,
+ 53,220,194, 19,132,133,240,162, 54, 81,191,126, 72,179,134, 97,193,147, 26,212, 13,153, 82, 63, 44,116, 76, 69, 78,238, 13,124,
+125, 37,245,195,235, 68, 55,168, 27, 50,165, 97, 88,240,164,250,245, 67,154,185, 97, 90,108, 32,149, 74, 15, 42,149,202,214, 0,
+224,227,227, 51, 72, 38,147, 93,243,241,241, 25,100,239, 5, 14, 18,139,197,215, 35, 35, 35,223,254, 27,205,149, 85,114, 54,110,
+220,120,100, 81, 81,209, 59,141, 27, 55, 30,233, 88,191,115,231,142,115,189, 38,156,161,161,161,189, 47, 92,184,240,159,165, 75,
+151, 14,105,212,168,209,160,133, 11, 23, 14,249,253,247,223,255, 19, 18, 18,210,182, 6,156, 60, 0, 63,179,217,236, 28, 46,151,
+155,203,102,179,115, 28, 11,139,197,202,161, 40, 42, 7,192,218, 74,172,101,125, 92,122, 57, 9,129,129,129, 15, 2, 3, 3, 31,
+ 4, 5, 5, 61, 8, 10, 10,122,160, 84, 42, 31, 91,252,253,253, 19,220,189,158, 77,131,196, 93, 59,212,149,156,108,161, 20, 39,
+188, 16, 40,106, 90, 27,247,168,105,144,184,107,251,186, 62, 39, 91, 40, 37,241,255,223, 56, 91, 7,129, 97,214, 52,101,152, 53,
+ 77,153,214, 65, 96,170, 91,175, 77,179,191, 82,169,100,148, 74,229,156,167, 53,148, 80, 9,255,223,254,190,215, 34,103, 3,137,
+ 68,242, 75,221,186,117, 29,117,221,171, 82,169,244, 47,177, 88,252,170,189,174,123, 85, 36, 18,197, 69, 70, 70,142,173,142, 83,
+ 46,151, 95, 80, 40, 20,217,246, 37, 43, 48, 48, 48, 43, 48, 48, 48, 75,161, 80,100, 42, 20,138,204,128,128,128, 12,199, 34,147,
+201,206,212,240,220, 21, 0, 58, 2,104, 11, 64, 90,139,215,179, 62,128,137,246, 58,232, 43, 0,111, 3,104, 89, 11,247,136, 96,
+ 11,228,147,121,178,208,147,108,113, 64, 33, 91, 28, 80,200,243, 9, 57, 89, 69, 10, 30,119, 56,155,200,229,242, 5, 82,169,244,
+119,137, 68, 18, 47,145, 72,118,251,251,251, 47, 4,208,228, 31,122,150,196, 0,214,163, 52, 62,211, 1,148, 14,133,239, 70,233,
+164,130,176,103,240,153,255,255,140,232,127,234,143,251,120, 57,189,156, 94, 78, 47,167,151,211,203,249, 28,114,146,222,235,233,
+ 21, 90, 30, 10,173,242, 11,128, 42, 34,195,123,225,133, 23, 94,120,225,197,255, 99,216,188,151,192, 11, 15, 81,225,208, 50, 81,
+133, 42,245, 36,214, 84, 77,148,237, 17, 47,167,151,211,203,233,229,244,114,122, 57,189,156,255,239, 56,189,168, 69,120,205,170,
+ 94, 78, 47,167,151,211,203,233,229,244,114,122, 57,255,237,240, 14, 29,122,225,133, 23, 94,120,225,133, 23, 94, 60, 37,196,186,
+ 8,174, 50, 67,136, 94,161,229, 57, 72, 0,239, 0, 24, 10,160, 33, 74,179,217,111, 7,176, 10, 53, 27,211,151, 2,248, 24, 64,
+ 23,148,206,206,185, 7, 32, 30,165,179,115,138,188,151,187, 98,248,251,251,127,202,102,179,101, 64,105,106, 19,199,167,235,119,
+154,166, 53, 58,157,110,225, 83, 42, 2, 5, 55, 35, 40, 59,202,234, 90, 54,215, 79,139,197,242, 52,203,233,197,179,137,198,114,
+185,252,103,181, 90, 61, 10, 46, 73,150,189,240,226,223,128,128,128,128, 73,102,179,249, 51, 14,135,179, 32, 47, 47,111,245,255,
+163, 83,127, 76,100,149, 17, 90,251,246,237,139, 3,128,129, 3, 7,246, 0, 0,153, 76,118,138, 36,201,250,158,252,131,205,102,
+187,167,209,104, 42, 13,160, 38,147,201, 78, 81, 20,245, 24,167,197, 98,145,176, 88,172,194,138,126, 99,181, 90,211,117, 58, 93,
+219,103,228, 34, 18, 0,246,249,250,250,150,204,155, 55,111, 85,207,158, 61, 67, 51, 51, 51,173,179,102,205,234,126,233,210,165,
+ 1, 0, 94,241, 80,108,117, 34, 8, 98, 67,235,214,173,119,141, 25, 51,230,183, 14, 29, 58,112,243,243,243, 37,219,183,111,175,
+179,113,227,198, 68,155,205, 54, 10, 85, 36, 90,253,255, 12, 54,155, 45, 75, 79, 79,151, 0,165,169, 73,236,194, 10, 22,139, 5,
+ 22,139, 5,122,189, 30,173, 90,181,170,245,255, 13, 10, 10,138, 34, 8, 98,165, 88, 44,110, 91, 84, 84,116, 30,192,148,172,172,
+172, 75,158,148,213,106,181,130, 97, 24,103, 57,155, 53,107,230,189,161,158, 97, 2,151,203,237, 23, 17, 17,209,222,104, 52, 22,
+220,187,119,239, 28, 77,211, 95,160,246,114,180,249, 0,248,130,199,227,117,104,216,176, 97,232,173, 91,183,210,204,102,243, 89,
+148, 38, 67,214,214,134,200,234,209,163, 71,194,247,223,127,239, 55,121,242,228,132,248,248,248,174, 94,177,229,197, 63,133,208,
+208, 80,153, 94,175, 95, 7, 32,138,205,102, 7,241,249,124, 8, 4,130,108, 30,143,119, 81, 32, 16,140, 63,121,242,164,198, 83,
+ 78,154,166,191,120,240,224, 65, 80,199,142, 29,151, 40, 20,138,185, 42,149,170,196,108, 54, 31, 45, 40, 40,152, 1, 64, 87,213,
+111,203,107,145,231, 76,100,185,126,194, 33,186, 88,246, 19, 99, 0,244, 44,163,192, 88,172,144,135, 15, 31, 42,248,124, 62,108,
+ 54,155,179, 49, 43,191, 56,182,155, 76, 38, 52,111,222,220, 92, 77,131, 19,154,150,150,166,224,114,185,206,109, 38,147, 9,117,
+234,212,177,165,167,167, 43,236,105, 15,156, 48, 26,141, 8, 9, 9,121,150,114, 30,189, 35,151,203,181,169,169,105,173, 74,140,
+230,152,183,223,251,228,211, 81, 67, 95,242, 61,117,234,148,237,149, 87, 94, 49,198,197,197,189,131,210,196,169,110, 85,230, 4,
+ 65,108,156, 53,107,214, 92,190, 80,234,119,236, 84,178,113,227,246,253, 25,173, 27,215, 35,102,204,152, 65, 77,157, 58,245, 68,
+ 84, 84,212,207, 54,155,173, 13, 60,176,108,249,250,250, 30,226,241,120,225,246,235,151, 90, 80, 80,240,242, 51,248, 64,178,240,
+120,240,216,138,182, 85,139,252,252,124, 24, 12,134,199,150,102,205,154,185,155, 43,211,163,114,179,217,236,221,139, 22, 45,170,
+147,157,149,133,255, 45, 91,214, 17,165,150,204,142,238,252, 56, 55, 55,247,177,114, 54,109,218, 20, 94,120,132,143,231,206,157,
+187,232,205, 55,223, 4, 77,211, 48, 24, 12,193,183,111,223,142,252,236,179,207,222,184,115,231, 78,123, 0,119,159,180, 51, 30,
+ 17, 17,145, 50,109,218, 52,121,251,246,237, 97,207, 82, 17, 28, 31, 31,223,113,253,250,245,111,165,166,166, 54, 5,144,247, 36,
+127, 32,151,203,127,254,225,135, 31,252,132, 66, 33,246,236,217,227,215,187,119,239,248,164,164,164,110, 79, 32,182, 72, 63, 63,
+191,169, 0, 94,180,217,108, 92, 0,103, 11, 10, 10,230,195,243,168,238, 74,177, 88,188,131, 36,201,122,192,163,104,244, 36, 73,
+250, 19, 4,161,114,108, 35, 8, 66, 97,179,217, 78,171,213,234,206,222,199,241,249,134,159,159,223,132,156,156,156,239,121, 60,
+ 30,199,215,215, 23, 66,161, 16, 44, 22, 11, 44, 22,171, 46,143,199,171,203,227,241,250,247,234,213,107,202, 95,127,253, 85,101,
+132,253, 78,173, 3,199,129, 36, 98, 40,130,164, 0,128,100,139,164, 62, 62, 62,136,137,137, 17, 13, 26, 52, 72, 4, 0, 9, 9,
+ 9, 99,198,142, 29,219, 59, 61, 61,189,121,101, 98,171, 34, 45,242, 28, 33,182,170, 6, 15,118,245, 24, 87,230,205, 37, 73,112,
+185, 92,156, 57,115, 6,238, 4, 43,119,164, 72,168,178, 54,176, 71, 24,191,116,233,145, 1,192,209,208,112,185, 92,156, 60, 89,
+ 54,168,124,167, 78,157,156, 47,251,223,133,161,205, 74,131, 60,110,123,183,180, 92,195, 86,150, 70,215,222,246,110, 83,116,255,
+230, 33,134, 78,157, 51,162,184,196,220, 14,128, 94, 83, 80, 80,112,126,231,206,204,214,141, 27,115,126,254,249,231,246,117,234,
+212, 25,234,129,208,250,184, 77,155, 54, 59, 40,129,143,255,152,177,227,198,140,103,145,230,183, 38,126,184, 32, 45, 75,165,143,
+142,142,222,185,103,207,158, 49,139, 23, 47,190, 62,115,230,204,143, 1,204,118,183,252,124, 62, 63,252,198,141, 27, 17, 52, 77,
+163, 89,179,102,207, 98, 26,131,214, 40, 13,190,247, 38,128,173,246,109, 35, 81, 26,185, 63, 10,192, 69, 79,200, 28, 22,172,138,
+150,218, 70,157, 58,117,154,142, 30, 61,218, 95,173, 82,225,127,203,150, 57, 54,183, 69, 53,195,136,142,247,199,100, 50, 97,200,
+144, 33,163,105,154,102, 57, 68,160,209,104, 52,105,181,218, 18, 60,114, 44,205, 3,240,146, 27,197,169, 47, 18,137,190, 6, 16,
+101, 48, 24,234, 0,128, 72, 36,202,176,217,108,187,244,122,253,108, 60, 74,224,235,113, 7, 23, 64, 36, 42, 79, 5,197, 44, 90,
+180,232,214, 39,159,124,114,247, 31,224, 12, 15, 12, 12, 92, 56,108,216, 48,236,223,191, 31, 7, 14, 28,176, 8, 4, 2,214,216,
+177, 99,137, 41, 83,166,248, 78,155, 54,173, 63,128,111,159,240, 54,247,159, 59,119,174,252,133, 23, 94,192,246,237,219,113,249,
+242,101, 67, 68, 68,132,160,103,207,158, 96,177, 88,242, 79, 63,253,244, 21, 0, 27,158,228, 15,212,106,245,252, 15, 63,252,112,
+227,214,173, 91, 37,247,238,221,195,202,149, 43,253, 71,140, 24, 17,151,154,154,218,195, 3,177,197, 3, 48, 21, 64, 47,138,162,
+186,141, 29, 59,214,250,222,123,239,177, 73,146,180, 44, 91,182, 44, 96,253,250,245, 35,216,108,118, 84,126,126,190, 59,157, 52,
+ 18, 64,204,248,241,227,255,251,215, 95,127,249,158, 59,119,142,235,231,231, 7,154,166,157,150, 98,155,205,166,112, 60,179, 86,
+171, 21, 77,155, 54, 13,113,249,189,224,121, 21, 26, 36, 73,154,109, 54, 27, 27, 0, 31,128,177,186,245,127,147,200,146,203,229,
+147,213,106,245,170,160,160, 32, 4, 6, 6, 62,214,214, 26,141, 70,240,249,124, 78, 80, 80,208, 15,131, 6, 13, 98,239,222,189,
+187,210, 33, 64,130, 34,190,216,243,203,188, 58,114, 95, 9, 0, 96,249,154, 63,138, 1,224,247,223,127, 71,102,102, 38,124,125,
+125,209,188,121,115,106,222,188,121,202, 25, 51,102,252,175,160,160, 96,124,101, 92,229,181,200,115,102,209,138,173,104,189, 74,
+ 31, 45,134, 97,156,121,242,220,124,104,203,111, 58, 82,142,143, 48,153, 76, 40,111,209,114,188,188,108, 54,187,188,249, 17, 4,
+ 65, 48, 85,113, 86,128,177, 34,145,168,149, 94,175, 95,225, 65,239,214,201,185,237,221,166,216,200,155, 53,210,145,137,180,255,
+135,165,159, 27, 1,156,186, 63,126,229,247, 61,122,212,153,250,249,119,115, 12,249,153,170, 79, 71,191, 26, 30, 17,228, 39, 16,
+105,114,181,242, 38, 77,250,150,179,200, 84, 87,206,238, 99,198,140,217,244,231,153, 7, 4,159,207,225,176, 40,138,221,181, 69,
+ 99,191, 80, 31,202, 71, 2,248,164,221,189,117,106,220,184,113, 45,102,206,156,217,205, 3, 78,216, 27, 92,108,222,188, 25, 4,
+ 65,144,158,156,123, 45,226, 72, 85, 34,139, 97, 24, 16, 4,177,197,165, 81,217, 98,223,150,228, 34,182, 88, 85, 93, 79,135, 53,
+213, 33,170,198,142, 29, 59,218,106,181,178, 92, 42,137,242, 2,166, 34, 17,227,214,185, 43,149,202, 63, 1,188, 68, 16, 4, 76,
+ 37, 37,166,175,191,249,198,117,247,133,114, 34,235, 72,101,239,146,197, 98, 1, 77,211,172,164,164, 36,182,203,179,206, 6, 32,
+ 2,224,207, 48, 12, 72,146,188,226,198,245,108, 42, 20, 10, 79,237,221,187, 87,218,182,109, 91,130,203,229,194,106,181,226,234,
+213,171,161,139, 23, 47,158,120,228,200,145, 87,244,122,125, 51, 60,158, 60,221,157,123, 20, 25, 31, 31,175,111,208,160, 65,133,
+194, 81,167,211,177, 26, 55,110,220,163, 18, 81,244,180, 57,211,115,114,114, 94,127,233,165,151, 38,101,103,103,167, 88,173,214,
+143, 0, 52,247,247,247, 79, 26, 60,120, 48, 4, 2, 65, 47,131,193,240,237,147, 60,243, 10,133, 98, 80,231,206,157,177,114,229,
+ 74, 44, 94,188,184, 15,128,163, 0,122,235,116,186, 35,175,189,246, 26,100, 50,217,235, 26,141,102,195, 19,188, 71,141,187,119,
+239,254, 67, 76, 76,140,100,255,254,253,136,136,136, 64, 97, 97, 33, 62,248,224, 3,197,151, 95,126,121, 92,163,209,244,116,121,
+ 47, 42,227,108,198,227,241, 54,108,221,186, 85,220,160, 65,131, 6, 28, 14,135,108,208,160, 1,212,106, 53, 74, 74, 74,120, 11,
+ 22, 44,104, 33, 16, 8, 46,125,251,237,183, 27, 0, 12,174,166,156, 36,128,249,107,215,174,157, 20, 29, 29, 45, 27, 61,122, 52,
+109, 50,153,240,219,111,191,129,162, 40,176,217,108, 8,133, 66,103,242,106, 14,135,131, 38, 77, 30, 11,146,190,167,138,243,213,
+162,212, 15, 85, 6,207,134, 93,143, 84,193,231, 28,250, 96,179,217,224,243,249,224,243,249,224,241,120,184,113,227,198,231,124,
+ 62,127, 25, 65, 16, 86,119, 56,137, 71,234,162, 21,128,115,213,173,227,113,215,144,191,179,254,116, 32,132, 32,136,229, 0,122,
+149, 54,187,100,156,191,191,255,251, 57, 57, 57, 15,221,229, 84, 42,149,126,249,249,249,223, 42,149, 74, 4, 6, 6, 58,219,239,
+ 58,117,234,192, 98,177, 32, 39, 39, 7, 12,195, 64,163,209, 64, 40, 20, 34, 56, 56,248,219,232,232,232,237,177,177,177,249, 21,
+114,218,176,248,181, 17,159,125, 65, 81, 20, 9, 0, 20, 75, 44,158,246, 9, 16, 30, 30,142,174, 93,187,162,164,164, 4, 90,173,
+ 22,145,145,145, 44,130, 32,198, 16, 4, 33,101, 24,102, 53,128, 99,255, 66, 67, 97,165,206,240,115,203,143,139, 58,178,197,115,
+ 56, 28,183,132,150,253,248,234, 44, 40,164,197, 98, 1,135,195, 41, 99,145, 32, 8, 2, 52, 77,151,217,238, 16, 90, 53, 17,234,
+ 83,166, 76,177,253,240,195, 15,147, 10, 10, 10,214,160,134, 67, 9, 99,198,140,121,204,223, 99,198,140, 25,233,185,185,185,204,
+144,190,173, 68, 41, 7, 51,179, 26,250,138, 5, 1, 18, 73, 61,190,175, 92,150,159,159,127,218, 94,153,184,139, 70,109,218,180,
+ 17,108,220, 25,159,254,246,244, 69,243,218, 54,240,147,182, 12,241,247, 13,242, 17,112,197, 36,161,231, 91, 45,233,114,185, 60,
+194,211,114, 59,234, 5,161, 80, 8,146, 36,159, 37,139, 22,203, 33,178,212,106, 53,246,239,223,143, 1, 3, 6, 36, 57, 68,136,
+ 78,167, 67, 86, 86, 22,148, 74,101,146,221,242, 81,237, 48,162,205,102,131,217,108,134,217,108,118, 10, 24,151,103,200, 41, 96,
+ 28,199, 82, 20,117,165,134,101,159,231,235,235,219,189, 87,175, 94,220, 95,126,251,141,203, 48,140, 30,165, 57,212,138, 24,166,
+146, 4,217,229, 96,181, 90,157, 86, 54, 54,155,141,212,212, 84,103,195,229,200, 45,201,231,243,221, 51,101,240,120, 31,254,250,
+235,175,210,246,237,219, 19,249,249,249,176,217,108,206, 74,114,213,170, 85,252,161, 67,135,214, 73, 76, 76,252,212,104, 52,206,
+173,193,185, 18,149, 9, 34, 0,144, 74,165, 86,184, 23, 49,187, 90, 78,171,213, 74,116,233,210,101,166, 74,165,106, 97, 48, 24,
+ 22,184,115, 25, 1,236, 73, 79, 79,119,109,216, 47,165,164,164, 24,134, 15, 31, 46,168, 87,175, 94,135,228,228,228, 39,122, 72,
+ 27, 55,110,220,137,205,102,227,236,217,179, 70, 0,142,158,117,220,229,203,151,141,131, 7, 15,230,133,134,134,118,210,104,220,
+118, 89,105,220,180,105,211,195, 10,133, 66,224,168, 67, 3, 2, 2,216,177,177,177,146,140,140, 12,152,205,102,124,252,241,199,
+ 24, 56,112, 32,252,253,253, 49, 99,198,140,192, 37, 75,143,140,254,133, 0, 0, 32, 0, 73, 68, 65, 84,150,252, 92, 84, 84,212,
+166, 42,163, 53,151,203,221,116,251,246,237, 8,165, 82, 41, 56,115,230, 12, 90,182,108, 9,149, 74,133,236,236,108, 20, 21, 21,
+ 33, 59, 59, 27,227,199,143, 87,252,239,127,255, 11,118,195,146,229, 20, 89,177,177,177,154, 29, 59,118, 80,235,214,173,147,176,
+217,108,167,208, 98,177, 88, 78,161,229,200,173, 88,131,145, 6,141, 93,180,201,180, 90,237,147,248,185,241, 0,112, 93, 69, 22,
+143,199, 3,143,199, 3,159,207,127,162,188,172,207, 9,234, 16, 4,145,204,225,112,120, 66,161,144, 67,146, 36,120, 60, 94, 95,
+185, 92,126,173,121,243,230,205, 15, 31, 62,252,192, 29,146,146,146,146, 77, 60, 30,143,173, 80, 40, 0, 0, 17, 17, 17,104,217,
+178, 37,244,122,189, 77,171,213, 66, 38,147,145, 15, 31, 62,132,193, 96, 64, 86, 86, 22,194,194,194,216, 36, 73,110, 66,169, 31,
+242, 99, 56,149,148,189, 6,192, 26,199,186,191,191,127,142,171,165,147,207,231,163, 78,157, 58,200,200,200,128, 68, 34,161,190,
+252,242,203,193,191,253,246,219, 27,167, 78,157, 26, 3, 96,179, 11,213,220,231,216, 71,203, 33,178, 92, 63, 31, 9,173,129, 3,
+ 7,206,217,183,111, 95,143,138,122,225,108, 54,187,214,124, 93, 28,130, 74, 42,149,150,183, 90,193,102,179, 85,102,209,242,248,
+127,248,124,190, 96,242,228,201,133,171, 87,175,246, 88,108, 13, 91,153,226,180, 98, 61,214,141,108,214,236,212,167,159,126, 58,
+232,175,191,254,202,104,219,160, 30, 75,148,249,176,136, 47,149,201, 16, 82,119,192,216,215, 7, 95, 70,233,236, 67,119,113,187,
+176,176, 80,208, 48, 68,104, 34,201, 18,162, 46,143, 37, 81,138, 56,188, 32, 95,223, 58, 28,147, 49, 87,234,235,203, 53, 26,141,
+ 26, 84,145, 4, 26, 0, 2, 3, 3,255, 16, 8, 4, 97,142,117, 95, 95, 95, 31,134, 97, 32, 20, 10,161, 84, 42,197, 20, 69,221,
+116,121,185, 30,230,228,228,244,173,174, 96, 50,153,236, 15, 30,143, 23, 70,146, 36, 8,130, 0, 69, 81, 32, 73, 18, 36, 73, 58,
+191, 83, 20, 5,130, 32, 80, 92, 92,252,240,193,131, 7,125,221, 56, 95, 43,128, 40,130, 32,146,246,239,223,143, 14, 29, 58,224,
+224,193,131,232,215,175, 31,180, 90, 45,174, 94,189,138,238,221,187, 3,165, 67,138,110,193,213,249,221,209, 41,184,113,227,134,
+ 83,184,184, 46, 18,137,228, 73, 76,236, 9,195,134, 13,195, 15, 63,252,192,216, 59, 19, 34,130, 32, 90,250,248,248,220,184,126,
+253,186, 91,126, 48, 12,195,192,108,126,116,168,163,241,178,251, 67,120,148, 28,152,162,168,190,109,218,180, 33,180, 90,173, 67,
+ 64,130,197, 98,129,162, 40, 80, 20,133,239,191,255, 94,208,190,125,251,207,120, 60,222, 76, 14,135,163,179, 88, 44,191,148,148,
+148, 44, 0,160,121,150,106,164,110,221,186, 77, 79, 75, 75, 27, 24, 22, 22,182,247, 9,104, 24,139,197, 98, 2, 32,160, 40,138,
+ 93, 11,117, 20,101,127,182, 74, 92,196,190,213,190,206, 67,233, 48,177, 91,240,247,247,255,249,192,129, 3, 33, 97, 97, 97,176,
+ 88, 44,176, 90,173, 40, 42, 42, 66, 92, 92, 28,140, 70, 35,172, 86, 43, 34, 34, 34,240,197, 23, 95,148,188,255,254,251,252,181,
+107,215,230, 22, 21, 21,141,170,134,246,253,237,219,183,139,148, 74,165,192, 96, 48,224,238,221,187,104,211,166, 13, 10, 11, 11,
+161,215,235, 81, 92, 92, 12,179,217, 12,157, 78, 39,163,105,218, 84, 13,215,231,174, 34,107,226,196,137, 87,184, 92,110,155,247,
+222,123, 15,233,233,233,206,119,254,237,183,223, 70, 96, 96,160,243, 93,178,215,201, 30, 85,204, 44, 22, 11, 60, 30, 15, 28, 14,
+ 71, 83,183,110, 93, 16, 4,193,127,248,240, 97, 77,134,226,164, 0,116,108, 54,155,235, 42,176,120, 60, 30,206,158, 61,251, 41,
+151,203,173,204,154, 85,217,123,201,120,178,254, 79,131, 32,136,229, 28, 14,135, 39,151,203, 57, 46, 29, 78,142, 88, 44,134, 66,
+161, 88, 9,160,191,155,231,221, 90, 46,151, 59,235,247, 86,173, 90, 33, 45, 45,109,151, 86,171,125, 43, 55, 55, 23, 36, 73,110,
+ 34, 73,242, 13, 71, 39,181,160,160, 0,161,161,161,173, 43,227,235, 28, 21, 52, 9, 4, 83,198,162, 85,174,131, 6,169, 84,138,
+251,247,239, 67,175,215, 51,183,110,221, 34, 38, 79,158, 76,152, 76,166,159, 18, 19, 19, 79,163,116,182,125,165, 90,228, 57,129,
+231, 62, 90, 14,139,150,187, 13, 0, 65, 16,213,246, 38, 44, 22,139, 56, 50, 50,178, 34,135, 47,162, 34,161,101, 31, 78,170,209,
+131,206,102,179, 37, 53, 21, 91,229,177,119,199,214,192,197, 95,124,252,133, 60,184, 94,195,153, 51, 63,103,189,250,234,171,103,
+ 54,110,220, 72,203, 95,232,223,251,216, 31,155, 3,191,253, 96,214,193, 3, 7, 14, 0,165,142,209,238, 34, 97,223,190,125, 65,
+ 51,166, 78,193, 23, 31,190,127, 72, 26,225,207, 21, 19,114, 17,223,168,207, 19,131, 49,240, 26, 53, 29,184,115,239,222, 44, 0,
+137, 85,145, 8,133,194,176,228,228,228, 8,215,137, 4, 38,147, 9, 66,161, 16,199,142, 29, 11, 16, 8, 4, 1, 0, 96, 48, 24,
+208,188,121,115,119, 45, 38, 97, 55,111,222,140,144, 72, 36, 40, 46, 46,134,209,104,132,197, 98,129,205,102, 3, 65, 16, 96,179,
+217,224,114,185, 16,137, 68,158,206,236,187, 8,224,205, 1, 3, 6,108, 57,120,240, 32, 34, 35, 35, 81, 80, 80,128,148,148, 20,
+135,200,242,200, 71,203, 97, 37,114,245,199, 98,177, 88,248,185, 65, 3,188,157,153,233, 20, 48,203,125,124,240,133,173,102,217,
+ 52,154, 55,111,206, 36, 36, 36,224,208,161, 67,120,237,181,215,136,221,187,119,155,105,154,230,100,102,102, 94,201,204,204,116,
+139,195,102,179, 57,203,234,168,183, 93, 5,150,167, 66,203,106,181, 74,184, 92, 46, 74, 74, 74,224,176, 60,184, 46,245,235,215,
+135, 90,173,102,233,116, 58, 86,102,102,166,112,254,252,249,239, 29, 63,126, 92, 89, 88, 88, 56,242,159,172,133, 86,175, 94, 29,
+246,246,219,111,167,178, 88, 44,166, 95,191,126,163, 31, 62,124,248,186, 82,169, 60,250,215, 95,127,125, 3,160,177,167,124,254,
+254,254, 23, 88, 44, 86,136, 78,167,227,108,219,182,205, 82, 88, 88,200, 9, 8, 8,200,113,212, 29,142,107,109,177, 88,220,154,
+185,236,239,239,127, 65,165, 82,113, 86,172, 88, 97,201,207,207,231, 4, 6, 6,230, 56,120, 52, 26, 13,103,219,182,109, 22,157,
+ 78,199,241,241,241,185,160,213,106,171,229, 83,169, 84,163,198,140, 25, 19,127,244,232, 81,127,138,162,240,240,225, 67,228,231,
+231, 67, 38,147, 97,211,166, 77, 8, 11, 11,195,246,237,219,213,106,181,122,194,215, 95,127,253,153, 93,100, 85,231,163,213,189,
+ 67,135, 14, 97, 26,141, 6, 50,153, 12,122,189, 30, 23, 46, 92, 64,179,102,205,144,153,153, 9,146, 36, 33,147,201,176,106,213,
+170, 98,130, 32,212, 85, 17, 9, 4,130,215,163,163,163,101, 0, 16, 29, 29, 45,139,142,142,174,176,129,235,212,169, 19, 86,174,
+ 92, 89, 94,104,121,210, 49,112, 90,157, 92,196, 81, 73,199,142, 29,113,252,248,241, 89, 30,138, 35,147, 67,180,149,183,102,241,
+120, 60,143, 39,211,216,108, 54, 14, 74, 93, 26, 8,119,214,159, 1,244, 16, 8, 4,156,242, 27,139,139,139, 57, 74,165,178,155,
+ 7,194,215, 79, 32, 40, 53, 56,133,133,133, 65,171,213,210, 38,147,105,196,230,205,155, 45, 0, 16, 21, 21, 53,130,166,233, 18,
+171,213, 74,113,185, 92,232,245,122, 40, 20, 10,191, 42,108,163, 31,237,249,101,126, 80,121, 31, 45,165, 82,137,168,168, 40, 24,
+141, 70,100,101,101, 33, 46, 46,206, 66,211,244,150,213,171, 87,219, 2, 2, 2,254, 59,100,200, 16, 42, 49, 49,241, 93, 0,211,
+ 43,211, 34,207,153, 53, 43,182, 82,161,101, 87,144,199, 1,244, 44,127,146,229,197, 79, 85, 66,171,186,161, 67, 46,151,171, 73,
+ 77, 77, 21,185, 54, 42, 86,171, 21,193,193,193, 54,134, 97,136,138,132,214,147,152,130,217,108,182,228,147, 79, 62,209,172, 94,
+189,122,212,253,251,247,231,184,243,155,109,239, 54,197,198,114, 34,107,205,226,152,149, 43, 22,207,151,223, 57,244, 19,214,125,
+183,148,166,105, 36,182,104,209,162, 91, 81, 81, 17,203, 71,100,129, 74,131,131,118,145,229,174, 40, 36, 1,252,120,238,220,185,
+196,254,253,251,159,252,241,215,157,242,204,187,119, 79,243,116,170, 44,105,163, 8, 22,167, 78,216, 27,133, 37, 37,156, 17, 35,
+ 70, 4, 0, 24, 82, 93, 37,166,209,104,144,157,157, 93, 94,128,225,198,141, 27,143, 29,235, 86,225, 72, 18, 52, 77, 99,199,142,
+ 29, 16, 10,133, 16,137, 68,101, 22,135,200,170,225, 68,133,155, 0,208,175, 95, 63,168,213,106,136,197, 98,183,203, 85, 94,188,
+ 48, 12, 3,147,201, 4,147,201, 4,179,217, 76, 3, 96,179, 88, 44,140, 79, 79,119, 90,121, 60, 17, 48,229,209,162, 69, 11,230,
+212,169, 83, 56,121,242, 36,244,122, 61, 86,172, 88, 1,165, 82,249, 34,128,207, 61,229,114,113,210,167,117, 58, 29, 91,167,211,
+ 57,173,131,108, 54,219,105, 61,112,211,146,199, 97,177, 88,206,222,168, 99,113,181,106, 81, 20,133,192,192, 64, 4, 5, 5, 97,
+205,154, 53,156,122,245,234, 13,252, 39,107,160, 37, 75,150, 52, 90,190,124,249,250,141, 27, 55, 30, 28, 53,106,212,111, 87,175,
+ 94, 29,231,227,227,115,229,216,177, 99,243,121, 60,158,173,134,239,119, 72,102,102,166,194,117,147,205,102, 19, 90,173, 86,167,
+176, 45, 46, 46,118,187,131,193,102,179, 67,146,147,147,133, 0, 48,127,254,124, 54, 0,161,195, 25,220,193, 89, 92, 92,204,110,
+214,172, 89,136,187,207,122,124,124,124,183, 62,125,250,156, 58,124,248,176,111, 88, 88, 24, 50, 50, 50,144,145,145,129, 70,141,
+ 26, 97,225,194,133,122,157, 78,215, 5,192,205,162,162,162,221,110,114, 6,251,250,250,178, 83, 83, 83, 97,181, 90,209,186,117,
+107,172, 90,181, 10, 35, 70,140, 64,243,230,205,161,211,233,144,156,156,140, 13, 27, 54,248,114, 56,156, 42,235, 14,131,193,176,
+ 59, 54, 54, 54,180,188, 69,107,244,232,209,162,156,156, 28,231, 51, 25, 19, 19, 83,102, 8,209,147, 58,217, 62,180, 85,233, 82,
+ 19, 88,173, 86, 41,159,207,215,241,120, 60,174,195, 63, 43, 46, 46,206, 99,107, 86,185, 14,160, 39,235,255, 24, 28,162,181,130,
+182, 21, 65, 65, 65,110,243,240,120, 60,194, 81, 55, 90,173, 86,104,181, 90, 90,169, 84, 58,135,247,147,146,146,232,240,240,112,
+154,162, 40,138,203,229,130, 32, 8, 8,133,194, 74, 43,124,134,102, 98, 94, 29,241,121,153, 89,135,211, 62, 1,204,102, 51,146,
+146,146, 96, 54,155, 17, 23, 23,103,249,250,235,175, 51, 53, 26,205, 52, 0,172, 63,254,248, 99,204,172, 89,179, 40,133, 66,209,
+ 39, 55, 55, 23,213,105,145,231, 72,108, 61,102,229,114,180, 66,199, 7, 14, 28, 72,216,167, 86, 18, 14,225,228,137,208,178,191,
+124,213,182,188, 4, 65, 32, 43, 43,203,185,174, 80, 40, 60,254, 47,119,225,231,231,167,239,212,169,147, 68,165, 82,237, 94,178,
+100, 73,141, 44, 89,107, 22,199,172, 92, 52,239, 75,185,250,250, 25,164,103,102, 65,157,107, 73, 76,184,114,127, 23,128, 93, 0,
+128,181, 47, 28, 39, 38,165,124,239, 46,103, 83,127, 65, 43, 54,135,181,235,165,254, 3, 67,135, 71, 79, 39,223,121,231,157,174,
+ 99,198,140,209,142, 26, 53,106,170, 88, 44,110,108, 54,155, 11,118,238,223,255, 96,248,240,225,245,104,154, 30,131,106, 98,142,
+ 24, 12,134,135, 61,123,246,116,189,158,210, 35, 71,142, 4, 62,120,240, 0, 83,166, 76,201,203,200,200,208,184, 30,235, 78, 25,
+205,102,243,195, 86,173, 90, 85, 58, 92,232, 24, 82, 4,128,194,194,194,135, 30, 92,210,145,176, 59,190,231,231,231,227,198,141,
+ 27, 96,177, 88,232,216,177, 35, 18, 18, 18,208,181,107,215, 36, 79,172, 90, 37, 37, 37, 8, 11, 11, 67, 73, 73, 9,244,122,125,
+ 49, 0,222,166,122,245, 0, 0,239,230,231,227,194,215, 95,227,204,162, 69,112,125,158,221, 69,203,150, 45,153, 51,103,206,224,
+202,149, 43, 48, 26,141,152, 48, 97, 2, 0, 16,246,103,215,147,144, 25, 13, 40,138,234,215,191,127,255, 96, 0,208,235,245,196,
+185,115,231,192,231,243,157,239,194,222,189,123,145,145,145, 1,130, 32,224,235,235, 27, 82, 80, 80, 80, 15,192,253, 42,204,254,
+196,253,251,247,241,213, 87, 95,193,102,179, 97,214,172, 89,136,136,136,112, 10,172,135, 15, 31, 98,254,252,249,160,105, 26, 95,
+126,249, 37, 26, 53,106, 4,139,197,194, 71, 13, 67,104,212, 6,102,204,152,113,103,215,174, 93, 7,211,210,210, 94, 89,188,120,
+113, 15,130, 32,108, 51,103,206,252, 74, 42,149,210, 79,194, 91,160, 45,196,141,219, 15,157, 66,168,252, 18,224, 47,247,152,239,
+214,221, 52,231,239,105,218,149,143,134,159,220,215,211, 34, 22, 91, 44, 22,253, 27,111,188, 33,219,177, 99, 7,209,168, 81, 35,
+220,187,119,207, 97, 25, 42,134,231, 33, 29, 50,212,106,117, 4, 69, 81,156,219,183,111, 35, 60, 60, 28, 29, 58,116,192,130, 5,
+ 11,160, 82,169, 96,181, 90,161, 80, 40,108, 22,139, 37,201,108, 54,159,168,134, 43,102,226,196,137, 28, 0,147,236,150,173, 22,
+211,166, 77,179, 45, 93,186, 20, 73, 73, 73, 78, 11,150,171, 51,188,167, 67,135,174, 86, 39,215, 37, 46, 46,110, 22,151,203,101,
+ 0,156,133,231,129,158, 77,229, 45, 90, 53,177,102, 61, 45, 60,205,153,140, 74,165, 50, 78, 34,145, 12, 44, 40, 40, 40, 99,213,
+234,210,165,139, 57, 48, 48, 48,222, 93, 30,177, 88, 92, 64, 81,148, 31, 0,100,100,100, 64, 36, 18,113,238,222,189,187, 8,165,
+193,179, 81,175, 94,189, 69,106,181,154, 83,207, 94,159, 6, 5, 5,193,100, 50, 85,234,198,114,250, 98,206, 79, 0,126,114,172,
+203,229,242, 44,173, 86, 43, 88,186,116,105,209,162, 69,139, 12, 52, 77, 27, 1, 28,211,104, 52,206, 56, 90,217,217,217, 90, 54,
+155, 45,151,201,100,117, 28, 66,171, 34, 45,242,156,161,114,139,150, 93, 73, 50,229, 5, 17, 65, 16,143, 57,168, 87, 35,180,170,
+ 21, 89, 52, 77,151,177, 50, 56, 28,222, 43,250, 47,123,163, 94,163,161, 67,187,200,226,239,220,185,115,211,146, 37, 75,206,186,
+251, 59, 87, 31,173,181,223,204, 91,236, 16, 89,151, 79, 30,198,238, 20,173,106,214,162,101,203,107,122, 7, 94,240, 23,182, 12,
+ 12,244, 59,254,245,194, 24,233,157, 67, 27,240,219,218,255, 49,151,207,159,111,127,254,252,249,183,166, 76,153, 82,215,254, 96,
+169, 1, 92, 2, 48, 28,110,204,210,201,200,200,232, 91,174, 17,190,201,225,112, 2,133, 66, 33, 50, 50, 50,138,110,221,186,229,
+241,144,140, 74,165,234,251, 20, 30, 64,150, 67,100,169, 84, 42, 36, 39, 39,163, 87,175, 94, 0,128,132,132, 4,116,233,210, 5,
+137,137,137,104,211,166, 77, 18,128,118,168, 38, 80,171,197, 98,209,188,240,194, 11, 78,235,150, 86,171,181, 1, 64,116, 86, 22,
+ 98,149, 74,176, 88, 44,156, 89,180, 8,179, 45, 22, 44,240, 80,192,183,106,213,138, 57,119,238, 28, 30, 60,120, 0,171,213,138,
+ 65,131, 6,161,134, 47,125,243,166, 77,155, 30, 57,118,236, 88,128, 88, 44,134, 94,175, 71, 81, 81, 17,198,142, 29,139, 17, 35,
+ 70,192,104, 52, 98,219,182,109,216,179,103, 15, 36, 18, 9,244,122, 61,244,122,189,239,128, 1, 3, 78,221,188,121,179, 59,128,
+219,149, 8, 45,166,111,223,190,136,143,143, 7, 69, 81,104,223,190, 61,242,243, 31, 77, 6, 10, 12, 12,172,104, 31,245, 79, 10,
+ 45, 22,139,197,196,197,197, 45,238,209,163, 7,210,210,210, 94,105,211,166,205,138,113,227,198,101, 60, 41,175,175,143, 4,173,
+154, 53,128,209,104,132,209,104, 68,112,112, 48, 10, 11, 11,113,231,206, 29, 24,141, 70, 4, 42,100, 30,243, 69, 53,111,228,228,
+ 83, 40, 20,208,235,245,184,127,255, 62, 76, 38, 19,252,253, 61, 18, 90,161,125,251,246,253,107,203,150, 45,126, 27, 54,108, 48,
+245,236,217,147,187, 98,197, 10, 66, 42,149,194,165, 97,241, 20,113, 9, 9, 9, 97,125,250,244,105,114,253,250,117,196,197,197,
+193,100, 50, 33, 42, 42, 10,183,110,221, 66,167, 78,157, 80, 84, 84,116,246,252,249,243,123,220, 49, 12, 3,248,108,226,196,137,
+112,136,173,248,248,120,100,101,101, 65, 34,145, 60, 38,180, 28,190,143,246, 89,227,193,238, 20,214, 33,136, 92, 44, 79,179,101,
+ 50,153, 25,192,242, 26, 90,159, 0, 0,105,105,105,188, 22, 45, 90, 24,249,124, 62,215, 46,218,150, 61, 9, 95,109,162, 22,102,
+ 50, 86,138,160,160,160,105,254,254,254,125,234,215,175,143,156,156, 28, 14,151,203, 69,151, 46, 93,204,237,218,181, 51, 7, 5,
+ 5,189,235, 46, 15,143,199,187,206,225,112,186,151,118, 38,104,164,166,166,130, 97,152, 89,205,155, 55,127,191,176,176, 16,249,
+249,249, 92,169, 84,234,236, 84, 55,105,210, 4, 70,163,241,186, 7,150,183,152,240,240,240,207, 56, 28,206, 2,149, 74, 85, 81,
+ 88, 8,174, 76, 38,147,114, 56, 28,152,205,230, 50, 98,179,188, 22,121,222, 69, 86, 25,161,229,162, 34,203, 8, 29, 79, 44, 90,
+238, 88, 13, 28, 14,246,174,235, 14, 81, 87,254,191,106, 26, 67,203,199,199,199,232, 16, 89, 11, 22, 44, 56, 91, 19,142,237, 91,
+ 54, 43,125,108,197,161,153,103, 15,224,230,149, 68,236, 74,214,168,102, 45, 90, 54,245,213, 33, 35,115,202, 11, 51,119, 16, 17,
+ 32,108, 30,168,240, 59,254,205,146, 69, 82,245,245, 51,200,202,206,198,129,179,231, 19,205, 64, 50,128, 89,181,105, 90, 6, 74,
+135, 14, 41,138,122,150, 30, 88,167, 51,124, 86, 86,150, 67,100, 69, 1, 64,215,174, 93,147,236, 34, 11,238, 90,180, 52, 26, 77,
+249,148, 53,125, 0,248, 59,206,159,197, 98,161,203,103,159,121, 44,178, 0, 48,137,137,137, 80,171,213,142,158, 98, 77, 69, 22,
+130,130,130, 62, 60,118,236, 88,192,143, 63,254,168,219,184,113, 99,190,205,102, 99,183,106,213, 42,164,109,219,182,196,166, 77,
+155, 0, 0,195,135, 15,199,172, 89,179,112,237,218, 53,136, 68, 34,116,237,218,149,158, 51,103,142, 98,218,180,105,239,230,228,
+228, 76,173,176,117,180,217, 56,124, 62,255, 40,128, 23,175, 95,191, 14, 0,167, 80,154,194,201, 97, 69,168,116,159, 59,141,111,
+ 97, 97, 33, 91, 34,145, 84, 24, 26,130, 83,218, 27,242,212, 2,225,228, 60,121,242,228, 87,223,124,243,205,174, 15, 62,248,224,
+246, 19,114, 86,104,209, 26, 56,112, 32, 12, 70, 51,210,115,180,160,105, 43, 12,230, 92,143,249, 92, 45, 90, 3, 7, 14, 68,113,
+137, 9,169, 89,106, 88,173, 52, 10, 13,110,183,229,194,151, 94,122,233,143, 95,126,249, 37,232,244,233,211,160,105,218,118,235,
+214,173,251,111,188,241,134,116,230,204,153,126, 79, 48,201,232,187,145, 35, 71, 14, 61,121,242,164,186, 73,147, 38,242,179,103,
+207, 34, 55, 55, 23, 86,171, 21, 47,190,248, 34,184, 92,110,234,162, 69,139, 56, 0,190,115,247,222,216,197,150,249,252,249,243,
+111,159, 57,115, 70, 46,151,203,185,182,166, 77,145,117,248, 48,118,236,216,241,216, 15,214,174, 93, 11,184, 25,133,223, 97,113,
+ 58,119,238, 92,173, 8,172, 50, 45, 53,151, 91,227,225,199,231, 21,231,206,157,203,120,231,157,119,154, 73,165,210,229,221,186,
+117,235,229,231,231, 71,250,250,250,198,213,169, 83,231,253, 86,173, 90,185, 61,186,192,102,179,199,137, 68,162, 59, 86,171,149,
+ 42, 42, 42,130, 94,175, 47,173,164,173, 86, 46, 73,146,168, 87,175,158,179, 45,105,223,190, 61,130,130,130,232,148,148,148,113,
+238,242,231,229,229,149,153,133, 88, 1, 38,118,233,210,133,101, 52, 26,241,224,193,131, 4,215, 29, 21,105,145,231, 4,209, 85,
+138, 47,199, 73,185,158, 92,157, 58,117,210, 44, 22, 11,147, 12, 48,151, 46, 93, 98,162,163,163,171, 92, 74, 74, 74, 24,133, 66,
+145, 85, 65,227, 7, 87, 78,163,209, 88,230,119, 70,163,145, 9, 12, 12,164, 13, 6,195, 99,156, 6,131,129, 9, 9, 9,201,168,
+138,179, 2,140,189,120,241,226,234,217,179,103,119,240,224, 2, 57, 57,153, 53, 77,153, 13, 27, 54,252,135, 97,152, 30,221,154,
+133, 93, 25,214, 42,144,233, 18,161,200,220,179,125,203, 8,134, 97,122,148, 95, 28, 1, 78,171,226,108, 26, 40,122,161,119,100,
+221,130,203,135,182, 50,199,150,190,199,124, 51, 40,130,105, 19, 34,209, 52,245, 23,120,154, 35,166,218,108,233,145,145,145, 55,
+109, 54, 27, 99, 50,153,152,200,200,200, 91,181,193, 89, 3, 84,197,217, 26,165,190,108, 35, 43,216,214,250, 9,202,121,153, 97,
+ 24, 70,173, 86, 51, 69, 69, 69,140,209,104,100,104,154,102, 92, 1,224,178, 27,156,140,217,108,102, 10, 10, 10, 24,184,239,115,
+ 87, 33,167, 82,169,188,127,247,238, 93,166, 97,195,134,105,118,115,252, 52,189, 94,207,148,135, 94,175,103,122,245,234,197,220,
+186,117,139, 9, 15, 15, 47,185,117,235, 22,163, 84, 42,111, 84, 83,206,250,161,161,161, 71,253,253,253,227, 0, 68,120,176,175,
+202,235,185,109,219,182, 6, 12,195, 76, 96, 24, 38,186,146,101, 2,195, 48, 77,255,105, 78,251,245,205, 97, 24,134, 41, 46, 46,
+102,212,106, 53,147,153,153,201, 20, 23, 23, 51, 69, 69, 69,204,197,139, 23,153,211,167, 79, 51, 87,174, 92, 97,228,114,121,142,
+ 59,156, 14, 62,147,201,196,232,116, 58, 38, 55, 55,151, 49, 24, 12,140, 94,175,103,174, 94,189,202, 92,184,112,129,185,126,253,
+122, 69,124,143,113,250,249,249,173,205,206,206, 46, 58,117,234, 84,241,154, 53,107,138,131,130,130,174, 3, 8, 3,208,216,215,
+215, 55,251,189,247,222, 99,196, 98,241,195, 26,190, 71,205,216,108,246,197,197,139, 23,159,219,183,111, 95,206,158, 61,123, 76,
+235,215,175, 79,159, 50,101,202, 9, 22,139,117, 17, 64,179, 26,190, 71, 10,153, 76,118,234,236,217,179,214,130,130, 2, 70,163,
+209, 48, 58,157,142,209,235,245,140,193, 96, 96, 76, 38, 19, 99,177, 88,152, 19, 39, 78, 48,129,129,129,174,195,146, 31, 85,209,
+177,158,206, 48,204,135, 12,195,176,106,187,174,115,225,238, 86, 91,156,181, 81,215,145, 36,105,182,215, 29, 29, 75, 87,171, 94,
+255,167,202,217,187,119,239, 47, 71,140, 24,193,244,235,215,143,137,138,138,122,108,105,211,166, 13, 51,121,242,100,102,223,190,
+125,204,215, 95,127,253,101, 45,148,147,133,210, 73, 47, 11,123,247,238,109,137,143,143,103,134, 15, 31,206, 0,232, 91,149, 22,
+249, 55, 8, 46, 71,120, 7,194,245, 19, 0,204,102,115,218,205,155, 55,149, 77,172, 86, 10, 0,190,255,254,251,199, 44, 83,174,
+136,143,143,183, 18, 4,113,167,170,127, 55,155,205,105,199,142, 29, 11, 92,185,114, 37,219,197, 4, 12,171,213,106,203,204,204,
+ 36, 87,172, 88, 81,230,248,227,199,143, 91,173, 86,107,170,135, 39,185,161,117,235,214, 27,106,227,106,157,184,246,224,253, 63,
+ 14,252,238,223,177, 67, 55,141, 84, 46,175,176, 23,182,237,221,166, 32, 38, 85,109,213, 34, 88,228,130,197, 11, 99,100,142, 33,
+200, 95,147,178, 53, 37, 70,186, 87,138,202,112,185,182,239,112, 81, 81,209, 3,199, 76, 64,189, 94,159,250, 12, 62,132, 23, 81,
+ 26,227,202, 90,110, 91, 59, 60,161,211,169,205,102,131,143,143,143,211, 26, 90, 3,139, 40,227,176,176, 58,110,221,147,148,135,
+ 97,152,147, 87,175, 94, 13, 31, 59,118,172,100,227,198,141,119,105,154,102,143, 31, 63,222, 28, 20, 20,196, 73, 72, 72,176, 0,
+ 32,122,244,232,193,202,206,206,102, 50, 50, 50,212,175,189,246, 90,225,219,111,191,237,119,233,210, 37,174,205,102,171, 46,104,
+225,189,180,180,180,222, 53,216, 87, 37,134, 13, 27,118, 23, 79,158,198,230,169,115, 58,160,214,232,112,247, 65,134, 61,130,185,
+ 13,244,195, 28,167, 95,149,197, 98,133, 90,151,239,177, 69,235,206,253, 12,123,138, 49, 26, 52,157,105,231, 43,117,136,103, 10,
+138,171,111, 77, 88,172,174,115,230,204,233, 79,146, 36,121,230,204, 25,227,146, 37, 75,210,242,242,242, 6, 1, 72, 5,128,130,
+130,130,158, 27, 54,108,248,217,141, 80, 14,149, 33,217, 98,177,116,250,232,163,143,166, 2,232, 10,160,174,157, 59,193,110,201,
+170,105, 4,243, 92,141, 70,243,114,255,254,253, 15, 83, 20, 85,207,229, 61,242, 7,160,114,188, 23, 12,195, 40,114,114,114, 94,
+113,135,144, 32,136,101, 79,171, 34,121,154,220, 79, 88, 15, 61, 23, 51, 25,143, 30, 61, 58,119,208,160, 65,172,176,176,176, 79,
+195,194,194,200,130,130, 2, 20, 21, 21,129, 36, 73, 4, 5, 5, 33, 50, 50, 18, 65, 65, 65,182,235,215,175, 47,252,248,227,143,
+171,141,201,247,194, 11, 47, 52,176, 88, 44, 13, 73,146,108, 0,160, 1,195, 48, 13, 8,130,104, 0, 64, 14, 0, 82,169, 84, 26,
+ 30, 30,206,234,216,177, 35, 58,116,232,128,227,199,143, 99,251,246,237, 63, 1,248,195,213,154, 85, 94,139, 60, 11, 72,110, 13,
+166,217, 69, 16,215,218,160, 7, 97,195,113,134, 68,207,200, 68,103,156,189,242, 34,171,242,164,210, 21,152,254,250,190,248,226,
+139,206, 23,206,141, 70,229, 65,117, 47, 95, 94, 94, 94,223,113,227,198,149,225,164,105,218,152,159,159,255, 78,231,206,157, 87,
+ 81, 20,197, 43,247,192, 62,204,205,205,253, 91,115,245,149,143,163,213,183,255,235,170, 39,229, 20,115,200,134, 55,247,255,128,
+156, 92, 21,126, 77,202, 46, 40, 52,209, 61,111,169,138,175, 62,141,242, 63,124,248,176,223,115,160,248, 43, 18,173, 79,154, 60,
+ 59,207,141,128,164,213,229,168, 35,236,225, 68,106,229, 37,207,206,206, 94,250,217,103,159,189,188,112,225,194,128,131, 7, 15,
+ 74, 29, 29,148,193,131, 7,231, 94,189,122,181, 27, 0, 94, 73, 73,201,145,133, 11, 23, 6,196,196,196,248, 1,240, 3,128, 1,
+ 3, 6,228,228,228,228,172,132, 23, 85,194, 98,177,164, 71,190,208,196,217,241,115, 13,233,224,250,221,106,181,166,123,194, 87,
+ 17,143,235, 58, 77,211, 85,242, 81, 20,245, 65,135, 14, 29,168, 15, 62,248, 32,231,224,193,131,142, 68,186,174, 10,237,102, 53,
+ 65, 73,221,129, 17,192, 18,251, 82,155,208,171,213,234, 78, 30,254,134,246, 62,141, 21,118, 40, 61, 89,255, 71,176,123,247,238,
+207,135, 15, 31,190, 65, 46,151,111,110,208,160, 65,147,192,192, 64,169, 64, 32,128,209,104, 44, 52,153, 76, 55,110,222,188, 57,
+234,243,207, 63,191,231,150,133, 99,195, 6, 10, 0,199,102,179,241, 73,146, 20, 1,144, 18, 4,225,235, 16, 90, 4, 65,192,108,
+ 54,227,193,131, 7,152, 61,123, 54,125,244,232,209,175, 1,124,233, 65,199,181, 29,128, 0,151,122, 60, 0,128, 9,165, 1,108,
+243, 8,130, 56,255,180,175, 23, 97,195,241,102, 23, 65, 36,183, 70, 69,237, 68,213, 73,165, 43,123,225,242,242,242, 58,213,246,
+ 75, 92, 25,103, 94, 94, 94,216,179,242,134,140, 49, 46,217,138,181, 75,202,228, 57,116,136,176,138,214,171,131,214, 96,157,242,
+221, 31,215,150, 26,173,140,205,108,181,253,247, 86, 94,113,178,183, 30,170,117,188, 84, 91,239, 82, 45,150,233,106, 74, 74, 74,
+231, 41, 83,166,124, 46, 20, 10,219, 3, 64,113,113,241,153,204,204,204,121,176,207, 42,172,110,191, 23,149, 67,165, 82,181,125,
+ 22,249, 76, 38,211,251,157, 59,119,254,150,166,233,111,172, 86,107,194,255,131, 91, 81,226,125, 26,159, 95,252,246,219,111,247,
+ 0,116, 2,128,161, 67,135, 82, 0,176,125,251,118,143,197,243,216,177, 99,105,134, 97,204,246,231, 65,143,210,217,133, 5,142,
+ 58, 85,175,215, 23,100,102,102, 94,167,105,250, 58,128,159,225,249,140,219, 0,130, 32,246, 49, 12, 51,208, 46,220,246, 49, 12,
+ 51,208,117,219,211,182,106, 85,115, 72,245,206,240, 94,148, 98,123, 50,136,242, 67,129,213,173, 87,135,155, 57,250, 56, 0,109,
+188, 87,247,255, 37,238,102,102,102,142,121,130,253, 94, 60,127, 72, 53,153, 76,131,254, 31,157,175,214,123,203,255, 37,237, 95,
+ 13, 4,150, 3,215,175, 95,127,106, 46, 2,255, 52,154, 93, 44,219, 1, 47,191,238,130,232,138,132,151, 87,104,121,225,133, 23,
+ 94,120,241, 36,208,120, 47,129, 23,255,102, 56,124,179, 28,235,149,248,104,149,247,207,114,174, 19,168,124,230,128, 39, 89,201,
+107, 50, 75,226,136,151,211,203,233,229,244,114,122, 57,255,113, 78, 25,128,112, 0,139,171, 57,174,252,236,194, 28, 0, 42, 0,
+ 22,239,245,244,114, 62,129,126,112, 11, 12,195, 12,168,106,232,144, 32,136,253, 79, 75,104, 57,157,225, 91, 99, 78,228, 69,204,
+113,172,187, 43,180,158, 54,250,120, 57,189,156, 94, 78, 47,167,151,211,203,233,229,244,114, 62,161,208,234,245,241,199, 31,127,
+130,210,208, 24,204,199, 31,127,252, 9,195, 48, 3, 74,119, 49, 3,158,230,127, 95,107,131, 30,201,173,193, 56,150,107,109,208,
+163,146, 67,163, 93, 22, 39,188, 67,135, 94,120,225,133, 23, 94,120,225,197,179,142, 83,139, 22, 45, 42, 94,180,104,145,195,241,
+ 61, 15, 0, 97,183,112,229, 61,205, 63,182, 15, 19,186, 51, 81,170,234, 20, 60,255, 0,130, 73, 22,103, 52,155,195,235, 5,198,
+ 22, 9, 0, 32,169,107,180,169,228, 47,171,213,188, 25, 64,102, 77,137,155, 2, 47, 52,146, 9,246, 24,105,154,147, 86,104, 26,
+154, 82,154,230,192, 99, 12, 5,186,240,184,220, 63,121, 50,153,160,162,253, 70,141,198, 96, 52,153, 94,222, 14,156,244,190, 3,
+ 94,120,225,133, 23, 94, 60, 39, 16,249,250,250, 30, 37, 73, 50,204,177,193, 53,238, 96,249, 24,132, 52, 77,103,169,213,234,151,
+ 81, 58, 84,252,119,114,186,254,222,132, 26,182,229,181, 13, 79,135, 14, 89, 64,153, 40,172,127, 75,198,108,138,205,123, 91,226,
+ 35, 91,240,159,113,239,251, 69, 52,110, 66,132,134,214, 1, 24, 32, 53, 45, 61,240,206,237, 91,189,127,219,248,221, 12,157, 86,
+ 61,219, 98, 52,254,224, 41,247, 11,128,168,174,152,151,240,195,199,111,202, 88,176, 98,228,252, 45,135,136, 34,115,232,245,210,
+233,166, 30,137, 44,153,159,223, 31,139,142, 28, 17,248,182,108, 89,102, 31,195, 48,165,249,245, 46, 95, 22,124,250,242,203,127,
+ 12, 85,171,251,122,197,214,191, 18, 65, 82,169,116, 26,155,205,238,105, 54,155,195,184, 92,110, 26, 77,211,113, 5, 5, 5,203,
+ 1,100,120, 47,207,191, 27, 77,130, 68,221,154, 52, 8,219,146,153,157,147,164, 43, 49,141,191,153, 89,164,246, 94, 21,143, 81,
+ 85,126,205,127, 44,247, 38, 0,136,197,226, 11, 36, 73,134,184,138, 0, 71,206, 94,199,122,249, 79,155,205,118, 79,173, 86,119,
+174,130,182,129, 92, 46, 95, 5,160, 93,117, 1,147,237,177,217,206,171,213,234,119, 80,249,108, 61,137,175,175,239, 92,130, 32,
+134,145, 36, 73, 85,119, 78, 54,155,141,102, 24,102, 91, 65, 65,193,151, 0, 10, 43, 59,206,215,215,247, 72, 74, 74, 74, 59,133,
+ 66, 81,173,149,198,106,181, 34, 53, 53, 53,160,125,251,246, 39,212,106,117,211,167,201,249,119,107,145,154,162,138, 89,135,149,
+ 62,232, 0,202,228, 23,122,170, 17, 89, 57,124,241,158, 78,221,251,246,154, 60,245, 3,209,197,171, 55,240,231,241,211,208,233,
+141,160, 72, 18, 50,137, 16,141, 27, 55, 36,150,197,238,240,255,105,205,178,111,206,196, 31, 30, 80,162,215,190,230,145, 76, 23,
+178,102,207,122,163,189,200, 79, 78, 3, 54, 26, 31,246,111, 37,250,116, 95,210,108, 20, 91, 63,241, 88,100, 29, 61, 42,204,205,
+201, 65, 76,112, 48, 88, 86, 43,248, 36, 9, 62, 65,128, 79,146, 16,241,249,232,183,126, 61,230, 29, 60, 40,252,252,149, 87,188,
+ 98,235, 95, 6,177, 88, 60, 46, 56, 56,120,201,186,117,235,252,234,215,175, 15,145, 72, 4,181, 90,237,127,243,230,205,214,211,
+167, 79, 31,147,149,149,245,153, 78,167, 91,235,189, 82,255, 94,216,108, 24,253,227,130,119,234,100, 61,188, 93,103,226,194,173,
+141, 9, 63,186,231,141,124, 67,182,247,202,184,141,214, 0,146, 80,113,254,210,170,246, 85, 10, 62,159,159, 83, 82, 82,162,168,
+234, 24, 46,151,155,107, 50,153, 2,171,227, 34, 73, 50, 36, 35, 35, 67, 33, 20, 10, 65,211,180, 61, 27,128,205,217,145,118,205,
+126, 98, 15, 84,139,166, 77,155,154,171,226,148, 72, 36,223,231,230,230,246,113,228, 9,116, 17, 84, 21, 34, 35, 35,163, 79,179,
+102,205,190, 47, 44, 44,124,185, 18,241, 50,119,234,212,169,211,154, 55,111,238,176, 2,217,179, 32,148,126,170, 84, 42, 76,153,
+ 50,197,249, 31, 54,155, 13,135, 15, 31,158, 58,110,220, 56, 20, 20, 20, 76,175,226,220,195, 20, 10, 5, 97, 79, 40, 94, 41,230,
+204,153,131, 57,115,230,224,187,239,190, 35,216,108,182,172,154,235, 89, 43,156,127,151, 22,169,137, 5,171,154,200,240,251, 81,
+214, 55,107,255, 99, 66,235,239, 0,197,230,253,183, 93,231, 62, 61,167, 76,155, 37,218,250,251, 49,220,188,126, 25, 41, 9,191,
+148, 57,166,237,203,227,144,173, 42,196,184,201, 31,138, 9,138,213, 51,254,200,238,255, 90,140,134, 31,221,180,102, 5,134,241,
+184,239,117,108, 31,201,206, 16,220, 68,144,175, 0, 93,219, 52, 98,135,254,113,229, 61, 61,172,223, 94, 47,157, 37,227,145,200,
+ 90,247,230,155,232,102,177, 64, 65, 81,160, 8, 2, 20, 0,146, 32, 80, 98, 52,226,252,232,209,104,191,105, 19,190,220,187, 87,
+ 56,247,213, 87, 61, 18, 91, 34,145,232, 34, 65, 16,190, 69, 69, 69, 3, 80,154, 88,250,121, 64, 51,177, 88,188,159, 97,152, 2,
+189, 94,223,250, 25, 42,151, 18,165, 99,244,229,123,199, 28,148,206,168,242, 40,179, 48,143,199,123,123,232,208,161,203, 86,174,
+ 92, 41,204,201,201, 65,102,102, 38,104,154, 6,159,207, 71, 68, 68, 4,113,228,200, 17,191, 89,179,102, 45,221,191,127, 63,175,
+176,176,240, 91, 79, 58, 54,108, 54, 59, 86, 46,151,191, 18, 24, 24, 40,202,205,205, 45,214,104, 52,135,141, 70,227,219,168,121,
+218, 20,146,205,102,143, 10, 15, 15,127, 61, 56, 56, 56, 48, 35, 35, 67,149,158,158,190,199,104, 52,254,132, 26, 38,106,118,185,
+166, 45, 97,143, 86, 15, 32, 43, 60, 60,252,218,131, 7, 15,114,107,145, 51, 51, 60, 60, 60,185, 6,156, 34, 0,191, 1, 8,174,
+230,184, 76, 0,195,225,161, 53,219,121, 97, 25,219,129,249,203,215,141,143, 25,219,149,248,113,122,159,136, 73,223, 29, 57, 77,
+114,152,238,215,179, 74,210,188, 26,202, 61,145,101, 79,105, 85, 94, 80, 85,181,175, 74, 24,141,198, 0,179,217, 12,118, 37,201,
+226,245,122, 61, 36, 18, 73,128,187,133, 20, 8, 4,248,229,151, 95,192,102,179,193,102,179, 81, 80, 80,128,144,144, 16,231, 58,
+135,195,113,126,175, 91,183,110,181,124, 52, 77,183,167, 40, 10, 69, 69, 69,160,105,218,185,104, 52, 26, 48, 12, 3, 30,143, 7,
+154, 46, 77,231,228,178,191,125,101,124, 4, 65, 12, 11, 14, 14,198,214,173, 91, 97, 50,153, 30,219, 47,149, 74,113,245,234,163,
+ 36, 35, 20, 69,161, 67,135, 14, 36, 65, 16,195, 0, 76,175,130,151, 1,128,232,232,104, 80, 20, 5,138,162, 64,146,164,243,187,
+ 99,161,105, 26,115,230,204, 65,185,212,100,127, 27,231,179,134,106, 34,195,103,161, 18, 31, 45,242, 41,151,203,117,138,103,176,
+ 80, 36,253,234,157,247, 63, 20,239, 63,113, 5,169,105,169,143,137, 44, 0,184,240,231, 79,200,202,204, 64, 82, 74, 58, 70,253,
+247, 93,177, 84, 42,251,170, 92,133, 90,233,180, 81, 31, 9,231,235,143,135,119,229, 23, 89, 50, 81,232, 11, 80, 13,184, 96, 11,
+245,152, 53,176, 37, 79, 42,225, 44,113,167,156, 60, 46,247,207, 69, 71,142, 56, 69, 86, 23,163, 17, 60,154,134,149,166,157, 34,
+203,100,181,194, 96, 50, 65, 89, 84,132, 59,227,198,129,177, 88,240,217,174, 93, 66, 30,151,251,167, 59,229, 4, 0, 14,135,163,
+220,179,103, 79,221, 22, 45, 90, 28,135,251,193, 76,143, 60,229,123, 84, 21,218,180,106,213, 42,110,211,166, 77,117, 57, 28,142,
+178, 54, 56,249,124,254, 16,145, 72,148,199,231,243,135,212,176,156, 36,128,249,227,199,143, 79,108,216,176,225, 49,187,176,114,
+138,154,134, 13, 27, 30, 25, 63,126,252, 69, 0,115, 42,121,214, 43,226,172, 19, 28, 28,188, 96,229,202,149,194, 91,183,110, 33,
+ 35, 35, 3, 22,139, 5, 35, 71,142, 4, 77,211, 48, 24, 12, 48,153, 76, 88,188,120,177,200,207,207,111, 54, 74, 19, 5,187,115,
+238, 28, 31, 31,159, 91, 27, 55,110, 28,122,255,254,125,241,177, 99,199,136,171, 87,175,138,150, 46, 93, 58,200,207,207,239, 38,
+ 0, 94, 13,174, 39,169, 84, 42,127,220,189,123,247, 59, 87,175, 94, 13,217,185,115, 39,251,204,153, 51,202, 53,107,214, 76, 80,
+ 42,149,155, 0, 80, 53,188, 71,173,133, 66, 97,239,153, 51,103,218, 78,157, 58,149,113,234,212,169,140,101,203,150,161, 91,183,
+110, 93, 98, 98, 98,162,106,200,217, 70, 34,145,188, 56,115,230, 76, 91,124,124,124,230,217,179,103,211,151, 46, 93, 74,190,248,
+226,139, 93, 23, 44, 88,208,210, 67,206,223, 78,157, 58,213, 35, 45, 45,173,126,122,122,122,189,244,244,199,134,205, 2, 0, 0,
+ 27,138, 73, 68, 65, 84,244,240,244,244,244,240,140,140,140,176,172,172,172,186,217,217,217,161,185,185,185,161,113,113,113, 93,
+ 1,108,113,135,179, 73,160,232,157,233, 35,251, 20,207,254,111,127,230,147,183, 94, 98,102,141,236,193,188,210,189,197,239, 20,
+139, 69,156, 77, 78, 69,136, 15,240,211,148,118, 97,161,254,162,171,145,114,113,227,103,236,221,124,214, 56, 89, 14, 33,165, 86,
+171,177,127,255,126,216,173, 87,173, 93, 69,150, 78,167, 67, 86, 86,150, 99, 31,203,157,114, 74,165,210,163,235,214,173, 99, 74,
+ 74, 74,160,213,106,145,155,155,139,180,180, 52,220,185,115, 7,249,249,249,184,113,227, 6,132, 66,225, 81,119,202, 73, 16, 4,
+104,154,118, 10,169,195,135, 15, 99,252,248,241, 80,171,213,206,109, 44, 22,203,249,221,241,155,234, 56, 29,150, 39,154,166,113,
+246,236, 89, 76,156, 56, 17,203,150, 45,195,150, 45, 91,176,111,223, 62,168,213,106,167,216,178, 90,173,213,114,170, 84, 42,216,
+108,238,245,153, 24,134,129, 86,171,117,251,190,187, 10, 32, 22,139,245,152, 40,114, 44,158, 60, 75, 79,200,249,204,194,141,200,
+240,149,247,176, 29, 95,236,166,186,158, 79,171,144, 36,139, 51,106,216,216,169,126,233,185, 58,100,228,104, 65,145,143,218,189,
+168, 62, 99,193,162, 72,156,251,163,212,112, 69, 82, 20,180,122, 35, 52, 69,102, 12, 29, 59, 77,254,195,178, 47, 70, 89,205, 37,
+ 85,198,120,105, 14, 68, 68,138,197,111, 52,107, 86,151,188,206, 75, 65,212, 43, 9,160,109, 0, 19,255, 42, 90, 23, 40,168,166,
+127,114,223,208, 23,154, 23, 92, 5,110, 85,105,205,144,201, 4,190, 45, 91, 34, 38, 56, 24,221, 45, 22,112, 24, 6, 47,229,228,
+224,242,180,105, 48,238,216, 1, 18, 0,103,200, 16,244, 90,190, 28, 39,130,131, 17,100, 48, 64, 51, 99, 6, 2, 14, 29, 2, 71,
+ 42, 21, 32,207,189,201, 15, 4, 65,160,103,207,158, 56,114,228,136, 95,191,126,253,254,184,114,229,202, 96,171,213,122,162, 38,
+215,214,199,199,231, 2,139,197, 10,169,238, 56,171,213,154,174,213,106, 61, 78, 51,194, 98,177,186,119,232,208, 97,215,206,157,
+ 59,125,205,102,115,173,244, 66,184, 92,110,191, 65,131, 6,173, 91,189,122,181,116,194,132, 9,235,246,237,219, 87,108, 50,153,
+ 14,121,242, 72, 1,152,191,118,237,218, 73,209,209,209,178, 9, 19, 38, 48,119,238,220,113,181, 94, 5,116,235,214,173,225,186,
+117,235,130,218,181,107, 55,117,226,196,137, 28, 0,159, 85,103,229, 17,139,197,147,215,173, 91,231,175, 82,169, 80, 84, 84,228,
+172,100,211,211,211, 33, 16, 8, 64,146, 36, 72,146, 4,155,205,198, 87, 95,125,229, 55,121,242,228,105,106,181,122,154, 27, 86,
+178,216, 85,171, 86, 5,188,252,242,203,228,253,251,247, 65,146, 36,248,124, 62,222,124,243, 77,210, 96, 48,248,198,196,196,108,
+208,235,245, 35, 60,185,134,108, 54,123, 84,108,108,108,227, 46, 93,186,176, 82, 82, 82,208,169, 83, 39,156, 59,119, 14, 67,134,
+ 12, 97, 23, 22, 22,214,155, 53,107,214,120,163,209,232,105, 28, 23,165, 80, 40,108,254,215, 95,127,165,133,134,134, 58, 43,150,
+122,245,234,209, 3, 6, 12, 80,167,164,164, 52, 57,117,234, 84,126,231,206,157, 61, 73, 88, 94, 71, 40, 20, 54, 61,112,224, 64,
+ 86, 76, 76, 76,239,181,107,215, 14, 2,128,246,237,219,239,153, 55,111,222, 49,181, 90, 29,121,226,196, 9,117,247,238,221,211,
+221,228, 11, 86, 42,149,244,148, 41, 83,196, 85, 29,180,126,253,122, 13, 74, 19, 46,215, 7, 80,101,190,182, 38,225, 65,179,151,
+ 76, 27, 38, 0,109, 6, 99, 49, 0,230, 98,192, 92, 4,155,169, 24, 4, 71, 0, 88, 12, 8,224,169,241,219,228, 38,210,143,182,
+222,189, 78,223, 32, 6,164,168, 10, 15,193,139, 10,171, 26, 0, 81, 4, 65, 36,237,223,191, 31, 29, 58,116,192,254,253,251, 49,
+ 96,192,128, 36, 87, 49,112,245,234, 85,116,239,222, 29,118,139,150, 91,190, 90, 90,173,246,227, 57,115,230,196,143, 26, 53, 74,
+ 88,166, 50, 32, 73,200,100, 50,244,239,223,191, 68,175,215,127,236,110, 65,105,154, 6,139,197, 66,122,122, 58,214,175, 95,143,
+133, 11, 23, 34, 34, 34, 2, 22,139,229, 49,177,101,175,247,220,170,252,172, 86, 43,206,159, 63,143,205,155, 54,225,179,217,179,
+ 33,145, 72, 0, 0,102,179, 25,234,130, 2,240,249,124,167, 24,171, 70, 56,109,187,125,251,246,180,144,144,144, 50, 67,134,142,
+ 79,123,157, 5,155,205, 6,171,213,138,146,146, 18, 44, 91,182,204,202, 48,204,182,234,218, 31,135, 40,154, 54,109, 26,140,198,
+ 71, 6,245,150,118,159,228,240,240,112,180,106,213,202,185, 78,146, 36,227, 46,231, 15,157,155,195,224,114,116,147, 57, 75, 1,
+ 0, 33, 33, 33,104,210,164, 9,148, 74,101,165,156, 79, 91,139,212, 4, 30, 68,134,175, 92,104,253, 29,153,178,217, 28,126,175,
+ 6,141, 26, 19,169, 89,106,176, 88, 44,136,124,252,209,249,245,233,160, 40, 18, 98,153, 63, 8,218,240, 72, 17,147, 20, 88, 20,
+ 11,234, 66, 3,194,235, 55, 34,121,124, 65, 47,125, 53, 66, 75,234,195, 94, 53,115, 68,103,126,190, 53, 29,130,186,124,208,142,
+230, 52,152, 11,210,175, 16, 31,244,139, 16, 68,239,185,178, 10, 90,203,139,238,148,151,178, 90,161,160, 40,152, 25, 6,151,167,
+ 77, 67, 84,108, 44,146, 28,194, 48, 54, 22, 73,209,209,144,179,217,224,145, 36, 24,139,229,177, 49,125,119,132, 22, 0,164,165,
+165, 97,199,142, 29,242, 97,195,134,237,186,122,245,234, 40, 15,197,134,131,203,255,236,217,179,138,250,245,235, 87,122,204,189,
+123,247,208,182,109, 91,143,135,167,184, 92,110,191, 23, 95,124,113,235,142, 29, 59,124,146,147,147,161, 80, 40,158, 88,104,241,
+120,188,238,125,250,244,217,186,113,227, 70,105, 94, 94, 30, 98, 99, 99,165,175,190,250,234,150,196,196,196,215,141, 70,163, 59,
+ 98,179,140,200,138,141,141,213,172, 95,191,254, 7,148, 29, 34,204, 90,191,126,253,143,237,218,181,123, 39, 58, 58, 90, 6, 96,
+146,221,119,160, 74,177,197,227,241,122, 54,104,208,160, 76,175,150,199, 43, 53, 54,137, 68, 34,248,248,248,128,195,225,192,104,
+ 52, 34, 42, 42,138,224,114,185, 93,221, 57,103,137, 68,210,231,141, 55,222, 32, 19, 18, 18,144,157,157, 13,153, 76, 6,177, 88,
+ 12,154,166, 49, 97,194, 4,106,217,178,101, 61,245,122,207, 70,184, 66, 67, 67, 7,245,238,221,155,117,237,218, 53,220,191,127,
+ 31, 70,163, 17, 55,111,222,132, 84, 42,197, 91,111,189,197, 89,178,100,201,171, 25, 25, 25,158, 10,173,230,209,209,209, 57,174,
+ 34,203, 1,145, 72, 68, 52,110,220, 88,237,231,231,215, 6,128, 39, 66,171,249,187,239,190,155,187,104,209,162,238, 71,142, 28,
+113, 6,189, 60,114,228,200, 44, 0,248,246,219,111,227, 3, 2, 2,218, 0,112, 87,104,129, 97, 24,219,127,254,243,159,135, 92,
+ 46, 23,108, 54, 27, 92, 46,183,204,194,225,112, 64,146,164,196,241, 58, 87,199,119,253,126,246,226, 9,179,150, 46, 21,241, 41,
+246,251,175,183, 64, 93, 25, 7, 16,200,193,233,254, 17, 8, 89,169,209,146, 81,223, 3,254,252, 8,223,188,161, 38,163,127, 46,
+249,221, 76,251, 6,220, 45, 40, 40,252,135,219,128,118, 0,254,135,210,228,186,179, 1,156,125, 70,218,166,139, 0,162, 6, 12,
+ 24,224, 20, 91, 7, 15, 30, 68,191,126,253,160,209,104,112,237,218, 53, 87,145,229, 73,130,229,139, 22,139,229,210, 47,191,252,
+210,121,216,176, 97,132,203,251,133,228,228,100,220,184,113, 35,201, 93, 62,146, 36, 97,179,217,192,102,179,177,116,233, 82,152,
+205,102,252,252,243,207,216,190,125, 59, 72,146, 4, 65, 16, 32, 8, 2, 82,169, 20,223,125,247,157, 71,245, 30, 77,211,216,176,
+ 97, 3, 62,154, 53,203, 41,178,236, 35, 25, 8, 10, 12,132,159,191, 63,238,222,189, 91,173,208, 42, 40, 40,248,114,239,222,189,
+168,202, 25,126,239,222,189,206,239,229,156,225,171,111,231, 40, 10, 70,163, 17, 47,189,244, 40, 85,236,187,239,190,235,252,174,
+ 86,171, 65, 81,148,227, 90, 16,238,114, 26, 24,224,117,254,163,109,253, 63,248,160,140,133,174, 50,206,191, 67,139,212,150,117,
+171, 2,177, 21,101,183,206, 42, 1, 12, 64,169,143, 86, 22,240, 55,250,104, 49,140,173,105, 72,157, 96, 92,186,115, 21, 44,138,
+ 2,215,199, 31, 62,242, 64,216,172, 38,104,115,239,227,248,206,239, 1, 0,107, 55,108, 3, 73,146, 96,177, 40, 24, 77, 52, 34,
+234, 6,195,102,179, 53,173,138,251, 5,160,115,207, 64,255, 14,161, 97, 50,226,154,239,125, 52, 86,248,149, 27, 8,225, 33, 34,
+ 83, 76,116, 18, 11,218, 23,104,117,157,175, 3,167,170, 21, 3, 36, 9,146, 32, 32,228,112, 96,220,177,163,212,107, 51,182,180,
+205, 74,138,142, 6,249,251,239,144,240,120,160, 8, 2, 44,187, 9,186, 38,208,233,116, 32, 8, 2,155, 55,111,246,125,235,173,
+183,182, 92,187,118, 45,186,164,164,100,135, 39, 28, 26,141,102, 64,151, 46, 93,142,109,216,176, 33, 32, 40, 40,232,177,253,217,
+217,217, 24, 59,118,108,158, 70,163,241, 40,168, 27,159,207, 31, 50,104,208,160,117, 63,253,244,147,244,246,237,219, 40, 42, 42,
+ 66, 64, 64,192,147, 62, 10,109, 58,118,236,184,107,199,142, 29, 62,217,217,217,208,106,181, 48, 26,141,216,188,121,179,172,127,
+255,254, 59, 82, 82, 82,250, 1, 72,172,134,227,115, 87,145, 53,113,226,196, 43, 0, 20, 0, 86,149,215,160,246,125, 45, 92,196,
+150, 22,192,146, 42,122,162, 97, 34,145, 8,185,185,185, 24, 59,118, 44,110,221,122,100, 0, 13, 14, 14,118,246,244,238,222,189,
+139,128,128, 0, 16, 4,161,112,231,164, 3, 2, 2,196, 38,147, 9,227,199,143, 71, 90, 90, 90, 25,206,244,244,116, 16, 4, 33,
+244,244, 66, 6, 6, 6, 6, 26, 12, 6,116,235,214, 13, 37, 37,165,121,125,135, 15, 31, 14, 54,155,141,220,220, 92,176,217,108,
+255, 26,220, 31,255, 1, 3, 6, 84, 26, 90, 69, 42,149,154,125,125,125, 95,240,144,211,239,213, 87, 95,205,136,141,141,125,108,
+ 98,203,185,115,231, 94,147,203,229, 71,228,114,121, 99, 15, 57,109,174,162,138,195,225,148, 17, 90,108, 54, 27, 36, 73,186,237,
+163,118, 43, 87,191,146, 69,100,181, 90, 52,229,229,177,117, 21, 62, 96,138,114,192,121,241, 75, 92,202, 19, 96,233,178, 3, 0,
+128, 15,223,108,139,150,125,230,195,244,211,203,152,214,137,226,142, 78, 55,206, 4,240,249, 63, 92,231,127, 13,192, 49, 11,110,
+ 53,128, 86,207, 80,123,228, 20, 91, 7, 15, 30, 68,100,100, 36, 10, 10, 10,144,146,146, 82, 83,145,229,168,239, 62,154, 59,119,
+238,159,131, 7, 15, 22, 57, 58,173, 2,129, 0, 51,102,204, 48, 20, 21, 21,125,228,209, 67,100,179,129,197, 98, 57, 59,201,124,
+ 62, 31, 81, 81, 81, 78,145, 69, 16, 4,138,139,139,193, 98,177, 28, 51, 18, 9, 55,203, 8,101, 80, 16, 36, 18, 9, 26, 69, 68,
+224,182,189, 30,113,124,231,241,120, 32, 8, 2, 86,107,181,134,188, 66,187, 83,251,244,218,110,146, 29,162,168, 74,211,113,112,
+ 48,108, 54,155, 67,100, 50,181,193,233,239,239,143,162,162, 34,119, 57,159, 73, 84, 98,209,114, 8,173, 1, 40,245,213,122, 44,
+188, 67, 15, 0,199,241, 20,167, 84, 18, 96, 8, 27,195,128, 69,145,246,177, 91, 10, 20, 69, 66,157,151,133,229, 95, 78,178,139,
+172,237,216, 31,159,130,144, 6,145,143,198,113, 9, 2, 96,170,126,184, 3,124, 56,177,147, 7,119, 20,228, 16, 89,144, 5, 11,
+193,231,151,211,143,190, 28, 16,225, 36,166,244, 12, 17,158,223, 91, 18,123, 93,107,174,182,161,224,147,100,169,243, 59, 65, 84,
+232,220, 67,218,247, 81, 4, 1,134, 97,192,216, 60,243, 59,118, 8,121,129, 64, 0,179,217, 12,138,162,176, 98,197, 10, 89,159,
+ 62,125, 86,121, 42,180, 0, 36,231,228,228,244,159, 48, 97,194,193,109,219,182,249,251,251,251,151,233, 61, 76,152, 48, 65,149,
+147,147,211, 31, 30, 58,221,179,217,236, 85,171, 87,175,150, 62,120,240, 0,197,197,197, 16, 8, 4,206,202,167,166,207,103,251,
+246,237,255, 56,116,232,144,175, 86,171,133,217,108,134, 64, 32, 0,195, 48,160, 40, 10,191,254,250,171,223,192,129, 3, 15,164,
+166,166,190, 88, 85, 89, 5, 2,193,235,118,225,132,232,232,104, 89,116,116,116, 15,160,210, 72,189, 78, 68, 71, 71,203,166, 79,
+159,254,170,193, 96, 88, 82,197, 57,167,169,213,234, 32,129, 64,128,157, 59,119, 66, 44, 22, 67, 40, 20, 34, 56, 56, 24,106,181,
+ 26, 66,161, 16, 12,195,192, 98,177, 56, 42,139,124,119, 78, 60, 47, 47,175,200,106,181,250, 28, 60,120, 16,249,249,143,126, 82,
+183,110, 93,104, 52, 26,216,108,182, 98, 79, 47,102,102,102,102, 14, 65, 16,161,151, 46, 93,194,131, 7, 15,208,175, 95, 63,252,
+254,251,239,104,219,182,116,116,216,100, 50,213, 36,136, 31, 77, 81, 20, 83,197,115, 75, 0,240,173, 77, 78,123,227,229, 17,167,
+205,102,179, 57, 68,150,235,167,171,248,170,230, 63,203,188,206, 47, 4,138,215, 47,154,220,123,236,203,145,254, 48,228,221, 7,
+ 95,226, 15, 66, 22,142,165,203, 14,224,218,189,210,251,181,116,203, 5,108,141,233, 15, 8,228,104,226,163, 66,144,132,245,198,
+141,220,127, 92,104,249,184,246, 19,158,213,134,169, 95,191,126, 80,171,213, 16,139,197,181,225,159,115,218, 96, 48,220,220,189,
+123,119,155, 1, 3, 6,128,203,229,226,230,205,155, 72, 76, 76, 76, 1,112,218, 83,161,197,102,179, 49,119,238, 92, 76,154, 52,
+ 9,129,129,129,248,232,163,143,192, 98,177,156, 11, 65, 16, 78, 11,151, 39, 80, 4, 86, 61,241,209,225, 16, 95,157, 49,220,199,
+199,103, 46, 73,146,195, 40, 55, 46, 28, 77,211,180,205,102,219,166,213,106,171, 12,239,224,112, 92,119,231, 94,184, 94,131,106,
+218,180, 39,230,252, 59,180, 72, 77, 80,126,182, 97, 37, 22, 45,199,172,195,199, 82, 1, 57,206,242,184,221,100,119,252,105, 21,
+148, 32,169, 27,233, 25,153,240,243, 21,219, 69,150,125, 33, 73,180,140, 44,237,204,238,143, 79, 65, 72,253, 72,176, 40, 10, 44,
+138,130, 88,192, 67, 78,118, 22, 88, 44,242, 70,101,188,205, 41, 12, 30,220, 56, 52,220,215,143, 13, 85,128, 9,202,192, 74, 12,
+ 3,109, 36, 8, 81,114,209,215,143, 31,214,156,194,224,170,173,111,140, 83,104,153,173, 86,112,134, 12,113, 14, 23, 38, 69, 71,
+ 35, 42, 54, 22,244,160, 65,208,155,205,101, 76,197, 53, 21, 90, 2,129, 0,133,133,133, 24, 53,106,148,218, 98,177,188, 83,195,
+ 75,156,152,159,159, 63,116,244,232,209,249, 14, 1, 99, 54,155, 49,122,244,232,252,252,252,252,161,110, 88,137, 30,131,197, 98,
+121,167,109,219,182,106,149, 74,229, 44,103, 77, 42, 28, 7,228,114,249,254,245,235,215,203,141, 70, 35,172, 86,171,147, 83, 32,
+ 16,128,162, 40, 4, 4, 4, 96,235,214,173, 1,114,185,188,202,156, 85, 6,131, 97,119,108,108,172, 6, 0, 98, 99, 99, 53, 4,
+ 65,196, 17, 4,177,134, 32,136,213,229,150, 53, 4, 65,196,185, 30,107, 48, 24,118, 85,197,109, 50,153,226, 82, 82, 82, 24,161,
+ 80, 8,138,162, 96, 54,155,193,231,243,157, 38,113,157, 78, 7,131,161,116,152, 59, 49, 49, 17, 22,139, 37,193,157,115, 47, 44,
+ 44, 60,186, 97,195, 6, 91,221,186,117, 17, 25, 25,137,168,168, 40,116,236,216, 17, 97, 97, 97,152, 55,111, 30,173,215,235, 61,
+126,247, 50, 51, 51,247,255,246,219,111,150,208,208, 80,180,105,211, 6, 60, 30, 15, 45, 91,182, 68,112,112, 48, 22, 46, 92,104,
+210,106,181, 7,107,112,155, 82,175, 94,189, 74, 85, 33,114,165,112, 99,246,110, 57,164,157, 63,127,158,234,216,177,227,158,242,
+ 59,218,183,111,191, 71, 44, 22,251, 56, 76,236,158,244,200, 93,197, 21,143,199,115, 46,142,237, 44, 22,203,157,222, 15,249, 66,
+160,120,253, 87,147,122,141,125, 57,210, 23,123,142,158, 5,199,172, 1, 76, 85,140, 8,210, 22, 16, 28, 17, 2,125,216, 33,207,
+ 64, 27, 48, 13,192, 21,148,198, 97,250, 8,207, 22,156,142,239,249,249,249, 72, 73, 73, 65, 98, 98, 34, 58,118,236,136,132,132,
+ 4,224,145,131,188,199,208,106,181, 31,197,196,196,232, 29, 51,249,102,207,158,109, 40, 44, 44,252,200,211, 58,152, 97, 24,176,
+217,108, 52,105,210, 4,211,167, 79,199,129, 3, 7,112,243,230, 77, 88, 44, 22,167, 16,114,248,100,122, 98,209,226,112, 56, 8,
+ 12, 12,132,197, 98,113, 90,179, 0,224,246,173, 91, 96,177, 88,176,217,108, 48,153, 76,213, 90,180,124,124,124,230,174, 91,183,
+110,170, 74,165, 82,230,229,229, 41, 92,151,156,156, 28, 69, 86, 86,150, 34, 35, 35, 67,145,150,150,166,120,248,240,161,226,254,
+253,251,202,197,139, 23, 79,245,241,241,153,235, 78, 57, 41,138, 66,203,150, 45,241,238,187,239, 58,151,149, 43, 87, 58,151,227,
+199,143,123,236,188, 78, 81, 20,154,204, 89,138,254,121,140,115, 57, 16, 64, 56,151,107, 31, 78,172,138,243,169,107,145, 26,233,
+ 23,251,108, 67,215,196,210, 21,192, 49,235,208, 81,151, 57,221, 54,202, 59,195, 63, 53, 88, 77, 37,199,238,221,185,213,171, 73,
+243,118,100,182,170,168,204,244,207,168,158, 67, 65, 16, 4,234,212,143, 4,197, 98,129,162, 72,176, 40, 10, 50, 41, 31, 41,151,
+ 46,217,140, 6,195,177,138, 56,123, 0, 44,174,128,187,242,205,190, 45,249,153,220, 92, 4, 40, 69,224,176, 75,181, 35,115,111,
+104,185, 22,130, 5, 52,151, 96, 92,134,159,224, 88, 78,201, 74, 95,189,121, 79, 92, 37, 61, 64,155,205, 6, 49,143,135, 18,163,
+ 17, 6,171, 21, 61,151, 47,119, 14, 23,146, 4,129,139, 0, 90, 44, 95,142, 83, 59,118, 64,202,229, 2, 60,158,219,179, 66, 42,
+ 18, 90, 42,149, 10, 99,198,140,201,207,202,202,122,171, 38, 62, 90, 14, 24,141,198, 19,217,217,217,111, 13, 29, 58,116,243,206,
+157, 59,229, 67,135, 14, 85,103,103,103,191,229,166,223,211, 99, 40, 41, 41,217,145,150,150, 86, 60,102,204,152, 77, 91,182,108,
+241,243,247,247,119,246, 68,106,244,176, 18,132,170,119,239,222, 60,119,142,171,230,144, 24,187,115,251, 36,187,101,171,197,196,
+137, 19, 79,161,212,255,202, 21,115,214,174, 93, 59,220,101,136,113, 13,128,229, 85, 17,235,116,186,213,211,167, 79,255,239,137,
+ 19, 39,252,249,124, 62, 8,130, 0,135,195, 65,163, 70,141,156,179,104,216,108, 54, 24,134,193, 7, 31,124,160,202,205,205,253,
+214,205,123, 51, 49, 38, 38,166,123, 73, 73,137,239,152, 49, 99, 40, 62,159,143,156,156, 28, 44, 91,182,140,254,233,167,159, 52,
+122,189,126,108, 13,132,240,134, 47,190,248,162,103, 81, 81, 81,253, 9, 19, 38,112,180, 90, 45, 12, 6, 3,102,206,156,105,250,
+241,199, 31,211, 13, 6,131,199, 1,127, 59,117,234,116,231,225,195,135, 93,139,139,139, 11,132, 66, 97,121,107, 31, 33, 18,137,
+218, 1,216,228, 9,103, 84, 84,212,221,212,212,212,142,243,231,207,143,179, 88, 44,236,115,231,206, 57,157,225, 87,172, 88,113,
+156,207,231,247,134,135,201, 87, 9,130,176,241,120,188, 50, 22,172,242,223, 89, 44, 86,181,117, 90,211, 32,225,252,175,222,238,
+ 62,246,165, 23,124,176,251,232, 5,196,236,186,119, 35, 98,108, 64,147,134,190,121,176,229,165,224,195, 55,219, 98,233,150, 11,
+ 0, 74,135, 14,109,185,215,192, 20,220, 5, 35, 9,197,125,181, 42,243, 25,104, 3,142,163, 52,100,198,179,134, 50, 34,235,218,
+181,107,232,213,171, 23, 0, 32, 33, 33, 1, 93,186,116, 65, 66, 66, 2,186,118,237,234,113, 44, 45, 59,254,210,233,116, 15,143,
+ 31, 63,222, 44, 52, 52, 20,167, 79,159,190, 15,224, 47, 79, 11,233, 16, 90, 44, 22, 11, 35, 71,142, 68,159, 62,125, 80,183,110,
+221, 50,179, 13, 29,223, 61, 17, 27, 86,171, 21,205,155, 55,135,209,100, 2,135,195,113, 14, 77,178, 88, 44, 4, 40, 20,184,115,
+231,142, 91, 22, 45,146, 36,135,189,254,250,235,100,114,114, 50, 70,140, 24,129,205,155, 55, 87,122,236,232,209,163,241,203, 47,
+191,224,245,215, 95, 39, 63,249,228,147, 42,195, 59, 56,156,208,221, 57, 39, 71, 59, 93, 93,189, 95, 91,156, 79, 91,139, 60, 9,
+ 92, 66, 59, 84, 56,104, 82,193,182,216, 50, 66,203, 37, 72,216,211, 17, 90, 86,243,230,223,127,254,126,122,199, 85, 93, 3,148,
+ 10, 31,168,181, 6,167,216, 74, 58,190, 29, 0, 48,120,226, 2,176,168,210, 33, 69,169,152, 15, 1,135,194,142,141,223,170,204,
+230,146, 10,159,174, 66, 54, 57,233,147,206,141,124,184, 34, 11,116, 65, 12, 34, 3, 30,101,202, 33,234,111,127, 92,112,181,246,
+133,255,181, 2,188,217, 80, 44,253, 54, 89, 51, 9, 22,219,202,199, 26, 68,141,198,160,185,116, 73,208,111,221, 58,156,123,235,
+ 45,212,161,105,196, 5, 7, 67,206,102,195,135,199, 3, 73, 16, 48,236,219,135, 83, 59,119, 34,144,199, 3, 36, 18, 88,231,205,
+131, 49, 37, 5,150,194, 66, 67, 13,122,102, 24, 62,124,184, 74,165, 82, 13, 53,153, 76, 39,158,244, 58, 27, 12,134, 67,105,105,
+105,147, 58,117,234,180,202, 98,177,188, 99, 48, 24,158,104,102,148,201,100, 58,148,157,157, 61,100,248,240,225,219,119,237,218,
+229, 47,147,201,106,204,149,159,159,223,182,150, 30, 39, 27,128,207,236,206,237,147,162,163,163,101,231,207,159,255,239,250,245,
+235, 87,185,244, 38, 20,227,199,143,127,187,156,200,170,118,214, 33,128,212,220,220,220,121, 51,102,204, 88,240,205, 55,223,136,
+ 29,142,239,151, 47, 95,134,213,106, 5,155,205, 6, 77,211, 24, 63,126,124, 81,126,126,254, 82, 84, 30,209,249,177, 71, 75,167,
+211, 53,154, 63,127,254,250,229,203,151,247,161, 40, 74, 68,211,180,190,184,184, 56,174,164,164,100, 44,106, 22, 71,203,150,151,
+151, 55,230,243,207, 63, 31,179,108,217,178,215, 73,146, 84, 88,173, 86, 85, 97, 97,225, 94,131,193,240, 35,106, 48,148,116,250,
+244,233,188, 55,223,124,243, 94, 94, 94, 94,211,144,144, 16,173, 88, 44, 54,153, 76, 38, 74, 32, 16, 72, 69, 34, 81, 20,128,211,
+ 4, 65, 92,247,132, 51, 41, 41, 41,123,194,132, 9, 15,140, 70, 99,147, 53,107,214,196, 75,165,210,163, 4, 65, 16, 28, 14,199,
+ 87, 32, 16,244, 2, 16, 71, 16,196,109, 79, 56, 73,146,180,185, 90,175,202,251,103,113,185, 92,183,124,180,234, 7, 8,199,245,
+105,196,194,238, 99, 23, 16,179, 59,117, 3,205, 48, 59,119, 38, 21,236,251,168, 11, 96,222,246, 38, 90, 14,221, 84, 58, 92, 8,
+192,150,123, 13,230,109,163, 65, 8,253, 17,159,193,134,214, 96,222, 15, 47, 42,130, 51,188,131, 74,165, 66,114,114,178, 67,100,
+ 69, 1, 64,215,174, 93,147, 28, 98, 43, 49, 49, 17,109,218,180, 73, 2,192,246,244,121,213,233,116, 51, 70,141, 26,117,200,222,
+ 57,158, 81,131,142,159, 83,104, 57, 4, 85,221,186,117,157,235,174,139,139,143,150, 91,160,105, 26, 28, 14, 7, 44, 22, 11,202,
+224, 96,231,127, 49, 12,131, 59,119,238, 64,173, 86,187, 37,180, 40,138,162, 8,130,192,136, 17,238, 77, 72,254,207,127,254,131,
+184,184, 56, 80,110,170, 66,138,162, 16, 30, 30, 94,237, 49, 14, 93,234, 46,103, 72, 72, 72,141, 57,159,182, 22,169,169,192,170,
+232,123, 69,162,170,178, 23,226,239, 66,102, 81,145,246,179,141,235, 86,124, 51,126,242, 7,226,107,119,115,160, 45, 50,130,162,
+ 72,215,202, 19, 44, 22, 5,169,136,143,208, 32, 31,108,249,225,127,133,133, 58,205,231,168, 36,239, 97, 93, 9,103, 98,239,118,
+ 13,121, 28,165, 30, 77, 90, 12, 7,197,127, 36, 2,152,236, 74, 70, 7,187,252,137, 87, 82,245,252,223, 83,245, 19, 47, 22,152,
+ 30, 23, 90, 38,211,203,179,251,246,253, 35,230,192, 1, 97,251, 13, 27,112,119,252,120, 4, 27, 12,224,217,135, 18, 73,130,128,
+152,195,129,152,195, 41, 21, 89,203,150,193, 96,181, 98,249, 91,111, 21, 27, 77,166,190,158,188,228,249,249,249, 24, 52,104, 80,
+ 94,102,102,102,127,212, 96,104,175, 50,232,245,250, 29, 0,118,212, 22,159,209,104, 60,145,158,158,254,202,160, 65,131, 14, 28,
+ 58,116, 40,224, 25, 9, 50,231, 16, 91,230,243,231,207,191, 29, 31, 31,127, 23,101, 19,139,106,226,227,227,239, 78,152, 48,129,
+ 88,191,126,253,143, 0,190,128,155, 1, 60,245,122,253,138,195,135, 15,163,123,247,238, 95, 44, 90,180,200,175,109,219,182, 80,
+ 40, 20, 40, 44, 44, 68, 98, 98, 34,166, 77,155,166,214,233,116,139, 52, 26,205, 55, 30,150,217,108, 52, 26, 71,187, 78,165,174,
+141,235, 96, 52, 26,127,202,202,202,250,169,182, 8,167, 76,153,114,249,206,157, 59,249, 1, 1, 1, 29, 56, 28, 78, 11,148,250,
+ 1,101, 3,248,209, 83, 65,228,192,228,201,147, 47,221,185,115, 71, 85,167, 78,157,142,118, 78, 25, 74,211, 24,173,171, 1,103,
+230,133, 11, 23, 66,218,181,107, 71,178,217,108,134,162, 40,176,217,108,134,197, 98, 49,118,191, 26, 6, 0,246,238,221,203, 3,
+ 80,101,218,156,187,185,134,249,163,255,119,242,147,235,217, 37, 59, 83,114,138,167, 3, 96,182, 93, 19,254,217, 50,128,122,249,
+229,198,233, 48,198,118, 5, 33, 45, 13, 84,201, 20,101,129, 16, 5, 34,221, 86, 7,115,246,220,200,182,130, 88,226,213, 84, 21,
+247,171, 97, 15,239,144,149,149,229, 42,178, 28, 86,171,168,174, 93,187, 38,217, 69,150, 99, 95, 77,252,203,142,216,108,182, 39,
+106,195, 24,134, 65, 76, 76, 12,214,174, 93,139,234, 34,154,219,103,247, 17,213,241, 57, 44, 90, 52, 77,195,108, 54,227,218,181,
+107,206,152, 93,142,225, 66, 71,104, 7,171,213, 90,229,108,117,154,166,105,147,201,132, 95,127,253,213, 45,177,181,117,235, 86,
+148,148,148,128,174, 70,193,185,134, 98,104,213,170, 21,212,106,181,115,178, 79, 84,212,163, 80,121,102,179,217, 35,225,234,224,
+108,210,164, 9, 84, 42, 21, 28,254,194,161,111, 61, 50,246, 88,245,250,127,235,115, 95,169, 69,235,111,111, 49,121, 66,233,161,
+182,157,251,116,121,235,237,105,162, 34, 35,141, 7, 15, 30, 34, 47, 55, 11, 36, 65, 66, 89, 39, 4, 97, 97,225, 16,112, 73,108,
+142,253, 70,159,116,234,232,201,162,194,130,126,149,113, 13,240,225,156, 90, 54,164, 75,199, 6, 13, 36, 4,172, 22,128,182, 0,
+ 86, 11, 96,179,127, 58,182,217,202, 62,115,201,201, 26,230,147,139,234, 51,251,181,230, 10,115, 86, 13, 5,186,200,228,242, 63,
+230,236,221, 43,180,153,205,200,159, 49, 3, 66,171, 21,124,123,175,164,244, 68,120,176,206,155, 87, 42,178, 70,143, 46,214,106,
+ 52, 30,165,224,241,247,247,191, 64, 16,132,127, 94, 94,222,115, 21, 25, 62, 32, 32, 96, 63,195, 48, 42,149, 74,213,246, 25, 42,
+151, 2,128, 6,128,185,130,142, 68, 0, 60,247,255,113, 32, 60, 32, 32,224, 19,146, 36, 59, 49, 12,227, 71,146,100,129,205,102,
+ 59,157,155,155,187, 24,192, 29,111,123,250,143,193, 17, 25,190, 94, 53,199,229, 2,120, 31,165, 78,193, 15,220, 37,111,233,227,
+227, 99,228, 90,118,189, 22,201,235, 57, 44,202, 7,245,131, 36, 96,115,248,200,212, 89,113,228,186, 14,235,142,103,167, 25, 44,
+244,192, 91,121,197, 87,189,183,162, 74,212,122, 10,158,218,132, 92, 46, 63,251,199, 31,127,180,173, 95,191, 62,233,234,240,238,
+136,149,231, 24,222, 98,177, 74,181,220,137, 19, 39,172, 35, 70,140, 56,157,147,147,211,189, 50, 78,137, 68,242,231,149, 43, 87,
+ 94,210,106,181,143, 9, 42,215, 72,241,142,117,189, 94,143,201,147, 39, 31,174, 44, 5,143,143,143,207,178,111,190,249,102,234,
+224,193,131, 73, 71, 56,138,255,107,239,124, 94,155, 8,162, 56,254,221,164,219,212,180, 77,193, 4,148, 84,193,104,192, 20,193,
+ 67, 17,188,120,216,160, 69, 60,139,246, 34,245,230,165,254, 9, 66,227,127, 96,132,122,232,205,226,201, 67,207, 22, 20,189,122,
+240,100,109,107, 69,186,136,105, 66, 80,168,177,166,205,207,245,224, 46,172,211,221,184,211,125,179,217,141,251, 96,161, 61,244,
+211,239,204,123,143,188,125,147,153, 49, 63,198,117, 65,198,211,108, 54,177,188,188,220, 45, 22,139,143,119,119,119,109,151, 14,
+211,233,244,151, 82,169,116,218, 56,106,193,201,161,162,153, 76,102, 71, 85,213, 73, 47,153, 1, 46,184,254,234,110,245,165, 53,
+ 33,199,227,243,137,241,227, 11, 55,239,220, 79,101,178,231,165,147,233, 83,144, 16, 65,165,252, 21,234,231,143,218,202,179,197,
+111,123, 63,190, 63,172,215,247, 22,123,113, 46, 0,217,179, 19,195,207, 99, 29,228, 96, 20, 64,204,253, 84,135,222, 56, 0, 52,
+229,200,198,118,173, 53,251,161,199,178,143, 81,108, 61, 88, 89, 25,141,229,114,135, 14,138,235,118,187, 56, 88, 95,199,163,185,
+ 57,238, 34, 43,180,208, 66, 35,177,115,248,247, 25, 89, 45,252, 57,159,139,183, 99, 34, 77,157, 24,155,213,128,219, 17,116, 47,
+ 70, 36, 41,214,214,176, 9, 13,171,163, 67,191,158,188,219, 65, 61,156,126, 71,230,219, 75,165, 1,140, 37,147,201,151,209,104,
+244,140,209,145, 49,119,235, 45, 46,148,222,174, 84, 42,215, 0,244,218, 33,156, 77, 36, 18,139,157, 78,231,178,147, 75,165,163,
+209,232,219, 90,173, 54,143, 30,151, 74,139,216,117,152, 74,165, 62,169,170,154, 53,118, 81,155, 63, 43,173,118,150,111,109,109,
+ 65, 81, 20,181, 92, 46,103,188,100,250,213,108,118, 29,250,167,163,101,178,201,225,145,241,187,177,248,177,171,221, 86,123, 10,
+ 18, 48, 36,203, 27,141,253,250,171,131,250,207,167,176, 89, 46,244,210,110, 1, 87, 70, 98,177,213,225,137,137,184, 85,209,214,
+170,213,234, 7,141,198,245,176,200, 10, 45,180,208, 66, 11, 45, 64,150, 75, 38,147, 47,100, 89, 30, 49, 23,147,236,207,134,181,
+219,237,253,106,181,122, 3,192,166,199,204,255,211, 56,191,164, 54,227,148,169, 63,138,223,153, 2,199,174, 17, 50, 21,157, 89,
+ 8,136, 78,197,175, 76, 99,188, 28,220, 25,158, 56,162,154, 79,147, 78,141, 90,167, 40, 38, 85, 30, 89,232,212, 4,248,189, 16,
+ 16,157,138,223,152,108,252, 56,228,114, 49, 29,198, 20,175, 78,141, 90,167, 40,166,219, 60,234,161, 83,115, 27, 75, 54,190, 47,
+ 32,128,182, 54, 13,109,109, 26,218,251, 75,150,231, 54,222,179,251, 59,174, 47, 18,138,218, 9, 96, 28,187,175,243, 37,191, 50,
+205,243, 64,121, 85,128,128,107, 7, 94, 83, 51,153,249,164,178,130,190,195,228, 13, 28, 28, 56,202, 51,118, 10,191, 51, 99, 37,
+225, 30,161,200,226, 98, 82,197,189,104, 38, 85, 46,177, 76,138,184,183,242,187, 64, 31, 81,233, 36,201, 37, 17, 49,111, 17, 63,
+174,185, 44,147, 34,151, 88, 38, 69,220,123,193,164,200, 37, 43, 38, 69,220,219,249, 62,168,141, 38, 99,185, 80, 63,226, 65,114,
+ 80,108, 45, 1, 64,228, 40,147, 38,176, 83,150,167,102, 82,107, 22, 81,108,114,116, 96,250,206, 36,246, 81, 65,103, 82,190,221,
+228,169,124, 36, 34,222,205, 76, 42, 62,203,161,240,147, 21,211,173, 94, 27,157,228, 99,119, 27,247, 94, 49,137,125, 68,146, 75,
+ 12, 51, 79,252, 50,144, 55,253, 94,160,100, 82,229,146,133, 78,215,126,178, 98,186,213,107,163,147,124,236, 20,159, 33,162,184,
+253,236,104,105, 17,219,152, 88, 98, 30, 79, 10,141,190, 45,201,113,178, 7,138,201,185, 60, 51, 35,192,247,125,213, 73,201,100,
+ 53, 82, 46,247,136,212, 73,201,228,208, 58,112,204,160,249,221,143,243,105,199,115,179, 44,101,215, 29, 21,161,147,146,233,144,
+ 61, 16, 76, 23,190, 31, 56, 27,242,139, 16, 99,226,137,223, 76, 64,220,129, 17, 54,110, 98,157,121, 17, 29, 66, 1, 70,174, 83,
+127, 83, 94, 16, 48,246,160,204,105,152, 75, 97, 46,249, 46,151,152,152,204, 19,118,138, 72, 59,207, 44,147,226,127,152, 25, 84,
+ 49, 42,122,236,148,185, 36,194,247, 65,179,223,196,219, 78,253, 18,230,201,232, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
0};
diff --git a/source/blender/editors/gpencil/CMakeLists.txt b/source/blender/editors/gpencil/CMakeLists.txt
index 278a185eebd..db4e00dd907 100644
--- a/source/blender/editors/gpencil/CMakeLists.txt
+++ b/source/blender/editors/gpencil/CMakeLists.txt
@@ -43,6 +43,7 @@ set(SRC
gpencil_edit.c
gpencil_ops.c
gpencil_paint.c
+ gpencil_undo.c
gpencil_intern.h
)
diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c
index 440d5ee7c4d..cfa9585868e 100644
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@ -644,7 +644,7 @@ static void gp_draw_data (bGPdata *gpd, int offsx, int offsy, int winx, int winy
/* Check if may need to draw the active stroke cache, only if this layer is the active layer
* that is being edited. (Stroke buffer is currently stored in gp-data)
*/
- if ((G.f & G_GREASEPENCIL) && (gpl->flag & GP_LAYER_ACTIVE) &&
+ if (ED_gpencil_session_active() && (gpl->flag & GP_LAYER_ACTIVE) &&
(gpf->flag & GP_FRAME_PAINT))
{
/* Buffer stroke needs to be drawn with a different linestyle to help differentiate them from normal strokes. */
diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c
index 9dc764b7aac..1cd8b1f05db 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -511,8 +511,8 @@ static void gp_stroke_to_bezier (bContext *C, bGPDlayer *gpl, bGPDstroke *gps, C
copy_v3_v3(p3d_prev, p3d_cur);
copy_v3_v3(p3d_cur, p3d_next);
- if (i + 1 < tot) {
- gp_strokepoint_convertcoords(C, gps, pt+1, p3d_next, subrect);
+ if (i + 2 < tot) {
+ gp_strokepoint_convertcoords(C, gps, pt + 2, p3d_next, subrect);
}
}
diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h
index c31de8d30a7..8000af54f53 100644
--- a/source/blender/editors/gpencil/gpencil_intern.h
+++ b/source/blender/editors/gpencil/gpencil_intern.h
@@ -37,6 +37,7 @@
/* ***************************************************** */
/* Operator Defines */
+struct bGPdata;
struct wmOperatorType;
/* drawing ---------- */
@@ -48,6 +49,7 @@ typedef enum eGPencil_PaintModes {
GP_PAINTMODE_DRAW = 0,
GP_PAINTMODE_ERASER,
GP_PAINTMODE_DRAW_STRAIGHT,
+ GP_PAINTMODE_DRAW_POLY
} eGPencil_PaintModes;
/* buttons editing --- */
@@ -61,6 +63,11 @@ void GPENCIL_OT_active_frame_delete(struct wmOperatorType *ot);
void GPENCIL_OT_convert(struct wmOperatorType *ot);
+/* undo stack ---------- */
+
+void gpencil_undo_init(struct bGPdata *gpd);
+void gpencil_undo_push(struct bGPdata *gpd);
+void gpencil_undo_finish(void);
/******************************************************* */
/* FILTERED ACTION DATA - TYPES ---> XXX DEPRECEATED OLD ANIM SYSTEM CODE! */
diff --git a/source/blender/editors/gpencil/gpencil_ops.c b/source/blender/editors/gpencil/gpencil_ops.c
index e1e4c8d5457..150e0ba90e4 100644
--- a/source/blender/editors/gpencil/gpencil_ops.c
+++ b/source/blender/editors/gpencil/gpencil_ops.c
@@ -59,6 +59,9 @@ void ED_keymap_gpencil(wmKeyConfig *keyconf)
/* draw - straight lines */
kmi=WM_keymap_add_item(keymap, "GPENCIL_OT_draw", LEFTMOUSE, KM_PRESS, KM_CTRL, DKEY);
RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_DRAW_STRAIGHT);
+ /* draw - poly lines */
+ kmi=WM_keymap_add_item(keymap, "GPENCIL_OT_draw", RIGHTMOUSE, KM_PRESS, KM_CTRL, DKEY);
+ RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_DRAW_POLY);
/* erase */
kmi=WM_keymap_add_item(keymap, "GPENCIL_OT_draw", RIGHTMOUSE, KM_PRESS, 0, DKEY);
RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_ERASER);
diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c
index 0ca30866f0d..52e50b1b5b0 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -126,6 +126,7 @@ enum {
/* Runtime flags */
enum {
GP_PAINTFLAG_FIRSTRUN = (1<<0), /* operator just started */
+ GP_PAINTFLAG_STROKEADDED = (1<<1) /* stroke was already added during draw session */
};
/* ------ */
@@ -154,7 +155,7 @@ static int gpencil_draw_poll (bContext *C)
/* check if current context can support GPencil data */
if (gpencil_data_get_pointers(C, NULL) != NULL) {
/* check if Grease Pencil isn't already running */
- if ((G.f & G_GREASEPENCIL) == 0)
+ if (ED_gpencil_session_active() == 0)
return 1;
else
CTX_wm_operator_poll_msg_set(C, "Grease Pencil operator is already active");
@@ -377,6 +378,52 @@ static short gp_stroke_addpoint (tGPsdata *p, const int mval[2], float pressure)
else
return GP_STROKEADD_NORMAL;
}
+ else if (p->paintmode == GP_PAINTMODE_DRAW_POLY) {
+ /* get pointer to destination point */
+ pt= (tGPspoint *)(gpd->sbuffer);
+
+ /* store settings */
+ pt->x= mval[0];
+ pt->y= mval[1];
+ pt->pressure= pressure;
+
+ /* if there's stroke fir this poly line session add (or replace last) point
+ to stroke. This allows to draw lines more interactively (see new segment
+ during mouse slide, i.e.) */
+ if (p->flags & GP_PAINTFLAG_STROKEADDED) {
+ bGPDstroke *gps= p->gpf->strokes.last;
+ bGPDspoint *pts;
+
+ /* first time point is adding to temporary buffer -- need to allocate new point in stroke */
+ if (gpd->sbuffer_size == 0) {
+ gps->points = MEM_reallocN(gps->points, sizeof(bGPDspoint)*(gps->totpoints+1));
+ gps->totpoints++;
+ }
+
+ pts = &gps->points[gps->totpoints-1];
+
+ /* special case for poly lines: normally, depth is needed only when creating new stroke from buffer,
+ but poly lines are converting to stroke instantly, so initialize depth buffer before converting coordinates */
+ if (gpencil_project_check(p)) {
+ View3D *v3d= p->sa->spacedata.first;
+
+ view3d_region_operator_needs_opengl(p->win, p->ar);
+ ED_view3d_autodist_init(p->scene, p->ar, v3d, (p->gpd->flag & GP_DATA_DEPTH_STROKE) ? 1:0);
+ }
+
+ /* convert screen-coordinates to appropriate coordinates (and store them) */
+ gp_stroke_convertcoords(p, &pt->x, &pts->x, NULL);
+
+ /* copy pressure */
+ pts->pressure= pt->pressure;
+ }
+
+ /* increment counters */
+ if (gpd->sbuffer_size == 0)
+ gpd->sbuffer_size++;
+
+ return GP_STROKEADD_NORMAL;
+ }
/* return invalid state for now... */
return GP_STROKEADD_INVALID;
@@ -397,7 +444,7 @@ static void gp_stroke_smooth (tGPsdata *p)
int i=0, cmx=gpd->sbuffer_size;
/* only smooth if smoothing is enabled, and we're not doing a straight line */
- if (!(U.gp_settings & GP_PAINT_DOSMOOTH) || (p->paintmode == GP_PAINTMODE_DRAW_STRAIGHT))
+ if (!(U.gp_settings & GP_PAINT_DOSMOOTH) || ELEM(p->paintmode, GP_PAINTMODE_DRAW_STRAIGHT, GP_PAINTMODE_DRAW_POLY))
return;
/* don't try if less than 2 points in buffer */
@@ -529,17 +576,28 @@ static void gp_stroke_newfrombuffer (tGPsdata *p)
return;
}
+ /* special case for poly line -- for already added stroke during session
+ coordinates are getting added to stroke immediatelly to allow more
+ interactive behavior */
+ if (p->paintmode == GP_PAINTMODE_DRAW_POLY) {
+ if (p->flags & GP_PAINTFLAG_STROKEADDED)
+ return;
+ }
+
/* allocate memory for a new stroke */
gps= MEM_callocN(sizeof(bGPDstroke), "gp_stroke");
- /* allocate enough memory for a continuous array for storage points */
- pt= gps->points= MEM_callocN(sizeof(bGPDspoint)*totelem, "gp_stroke_points");
-
/* copy appropriate settings for stroke */
gps->totpoints= totelem;
gps->thickness= p->gpl->thickness;
gps->flag= gpd->sbuffer_sflag;
+ /* allocate enough memory for a continuous array for storage points */
+ gps->points= MEM_callocN(sizeof(bGPDspoint)*gps->totpoints, "gp_stroke_points");
+
+ /* set pointer to first non-initialized point */
+ pt= gps->points + (gps->totpoints - totelem);
+
/* copy points from the buffer to the stroke */
if (p->paintmode == GP_PAINTMODE_DRAW_STRAIGHT) {
/* straight lines only -> only endpoints */
@@ -567,6 +625,16 @@ static void gp_stroke_newfrombuffer (tGPsdata *p)
pt->pressure= ptc->pressure;
}
}
+ else if (p->paintmode == GP_PAINTMODE_DRAW_POLY) {
+ /* first point */
+ ptc= gpd->sbuffer;
+
+ /* convert screen-coordinates to appropriate coordinates (and store them) */
+ gp_stroke_convertcoords(p, &ptc->x, &pt->x, NULL);
+
+ /* copy pressure */
+ pt->pressure= ptc->pressure;
+ }
else {
float *depth_arr= NULL;
@@ -645,6 +713,8 @@ static void gp_stroke_newfrombuffer (tGPsdata *p)
MEM_freeN(depth_arr);
}
+ p->flags |= GP_PAINTFLAG_STROKEADDED;
+
/* add stroke to frame */
BLI_addtail(&p->gpf->strokes, gps);
}
@@ -893,10 +963,14 @@ static void gp_session_validatebuffer (tGPsdata *p)
bGPdata *gpd= p->gpd;
/* clear memory of buffer (or allocate it if starting a new session) */
- if (gpd->sbuffer)
+ if (gpd->sbuffer) {
+ //printf("\t\tGP - reset sbuffer\n");
memset(gpd->sbuffer, 0, sizeof(tGPspoint)*GP_STROKE_BUFFER_MAX);
- else
+ }
+ else {
+ //printf("\t\tGP - allocate sbuffer\n");
gpd->sbuffer= MEM_callocN(sizeof(tGPspoint)*GP_STROKE_BUFFER_MAX, "gp_session_strokebuffer");
+ }
/* reset indices */
gpd->sbuffer_size = 0;
@@ -905,24 +979,21 @@ static void gp_session_validatebuffer (tGPsdata *p)
gpd->sbuffer_sflag= 0;
}
-/* init new painting session */
-static tGPsdata *gp_session_initpaint (bContext *C)
+/* (re)init new painting data */
+static int gp_session_initdata (bContext *C, tGPsdata *p)
{
- tGPsdata *p = NULL;
bGPdata **gpd_ptr = NULL;
ScrArea *curarea= CTX_wm_area(C);
ARegion *ar= CTX_wm_region(C);
/* make sure the active view (at the starting time) is a 3d-view */
if (curarea == NULL) {
+ p->status= GP_STATUS_ERROR;
if (G.f & G_DEBUG)
printf("Error: No active view for painting \n");
- return NULL;
+ return 0;
}
- /* create new context data */
- p= MEM_callocN(sizeof(tGPsdata), "GPencil Drawing Data");
-
/* pass on current scene and window */
p->scene= CTX_data_scene(C);
p->win= CTX_wm_window(C);
@@ -944,7 +1015,7 @@ static tGPsdata *gp_session_initpaint (bContext *C)
p->status= GP_STATUS_ERROR;
if (G.f & G_DEBUG)
printf("Error: 3D-View active region doesn't have any region data, so cannot be drawable \n");
- return p;
+ return 0;
}
#if 0 // XXX will this sort of antiquated stuff be restored?
@@ -953,7 +1024,7 @@ static tGPsdata *gp_session_initpaint (bContext *C)
p->status= GP_STATUS_ERROR;
if (G.f & G_DEBUG)
printf("Error: In active view, Grease Pencil not shown \n");
- return p;
+ return 0;
}
#endif
}
@@ -974,7 +1045,7 @@ static tGPsdata *gp_session_initpaint (bContext *C)
p->status= GP_STATUS_ERROR;
if (G.f & G_DEBUG)
printf("Error: In active view, Grease Pencil not shown \n");
- return;
+ return 0;
}
#endif
}
@@ -994,13 +1065,13 @@ static tGPsdata *gp_session_initpaint (bContext *C)
p->status= GP_STATUS_ERROR;
if (G.f & G_DEBUG)
printf("Error: In active view (sequencer), active mode doesn't support Grease Pencil \n");
- return;
+ return 0;
}
if ((sseq->flag & SEQ_DRAW_GPENCIL)==0) {
p->status= GP_STATUS_ERROR;
if (G.f & G_DEBUG)
printf("Error: In active view, Grease Pencil not shown \n");
- return;
+ return 0;
}
}
break;
@@ -1021,7 +1092,7 @@ static tGPsdata *gp_session_initpaint (bContext *C)
p->status= GP_STATUS_ERROR;
if (G.f & G_DEBUG)
printf("Error: In active view, Grease Pencil not shown \n");
- return p;
+ return 0;
}
#endif
}
@@ -1033,7 +1104,7 @@ static tGPsdata *gp_session_initpaint (bContext *C)
p->status= GP_STATUS_ERROR;
if (G.f & G_DEBUG)
printf("Error: Active view not appropriate for Grease Pencil drawing \n");
- return p;
+ return 0;
}
break;
}
@@ -1044,7 +1115,7 @@ static tGPsdata *gp_session_initpaint (bContext *C)
p->status= GP_STATUS_ERROR;
if (G.f & G_DEBUG)
printf("Error: Current context doesn't allow for any Grease Pencil data \n");
- return p;
+ return 0;
}
else {
/* if no existing GPencil block exists, add one */
@@ -1053,8 +1124,11 @@ static tGPsdata *gp_session_initpaint (bContext *C)
p->gpd= *gpd_ptr;
}
- /* set edit flags - so that buffer will get drawn */
- G.f |= G_GREASEPENCIL;
+ if(ED_gpencil_session_active()==0) {
+ /* initialize undo stack,
+ also, existing undo stack would make buffer drawn */
+ gpencil_undo_init(p->gpd);
+ }
/* clear out buffer (stored in gp-data), in case something contaminated it */
gp_session_validatebuffer(p);
@@ -1064,6 +1138,19 @@ static tGPsdata *gp_session_initpaint (bContext *C)
p->im2d_settings.sizex= 1;
p->im2d_settings.sizey= 1;
#endif
+
+ return 1;
+}
+
+/* init new painting session */
+static tGPsdata *gp_session_initpaint (bContext *C)
+{
+ tGPsdata *p = NULL;
+
+ /* create new context data */
+ p= MEM_callocN(sizeof(tGPsdata), "GPencil Drawing Data");
+
+ gp_session_initdata(C, p);
/* return context data for running paint operator */
return p;
@@ -1080,6 +1167,7 @@ static void gp_session_cleanup (tGPsdata *p)
/* free stroke buffer */
if (gpd->sbuffer) {
+ //printf("\t\tGP - free sbuffer\n");
MEM_freeN(gpd->sbuffer);
gpd->sbuffer= NULL;
}
@@ -1249,7 +1337,8 @@ static void gp_paint_strokeend (tGPsdata *p)
static void gp_paint_cleanup (tGPsdata *p)
{
/* finish off a stroke */
- gp_paint_strokeend(p);
+ if(p->gpd)
+ gp_paint_strokeend(p);
/* "unlock" frame */
if (p->gpf)
@@ -1262,8 +1351,8 @@ static void gpencil_draw_exit (bContext *C, wmOperator *op)
{
tGPsdata *p= op->customdata;
- /* clear edit flags */
- G.f &= ~G_GREASEPENCIL;
+ /* clear undo stack */
+ gpencil_undo_finish();
/* restore cursor to indicate end of drawing */
WM_cursor_restore(CTX_wm_window(C));
@@ -1594,6 +1683,7 @@ static int gpencil_draw_invoke (bContext *C, wmOperator *op, wmEvent *event)
//printf("\tGP - hotkey invoked... waiting for click-drag\n");
}
+ WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL, NULL);
/* add a modal handler for this operator, so that we can then draw continuous strokes */
WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
@@ -1611,16 +1701,57 @@ static int gpencil_area_exists(bContext *C, ScrArea *satest)
return 0;
}
+static tGPsdata *gpencil_stroke_begin(bContext *C, wmOperator *op)
+{
+ tGPsdata *p= op->customdata;
+
+ /* we must check that we're still within the area that we're set up to work from
+ * otherwise we could crash (see bug #20586)
+ */
+ if (CTX_wm_area(C) != p->sa) {
+ printf("\t\t\tGP - wrong area execution abort! \n");
+ p->status= GP_STATUS_ERROR;
+ }
+
+ //printf("\t\tGP - start stroke \n");
+
+ /* we may need to set up paint env again if we're resuming */
+ // XXX: watch it with the paintmode! in future, it'd be nice to allow changing paint-mode when in sketching-sessions
+ // XXX: with tablet events, we may event want to check for eraser here, for nicer tablet support
+
+ if (gp_session_initdata(C, p))
+ gp_paint_initstroke(p, p->paintmode);
+
+ p= op->customdata;
+
+ if(p->status != GP_STATUS_ERROR)
+ p->status= GP_STATUS_PAINTING;
+
+ return op->customdata;
+}
+
+static void gpencil_stroke_end(wmOperator *op)
+{
+ tGPsdata *p= op->customdata;
+
+ gp_paint_cleanup(p);
+
+ gpencil_undo_push(p->gpd);
+
+ gp_session_cleanup(p);
+
+ p->status= GP_STATUS_IDLING;
+
+ p->gpd= NULL;
+ p->gpl= NULL;
+ p->gpf= NULL;
+}
+
/* events handling during interactive drawing part of operator */
static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
{
tGPsdata *p= op->customdata;
- //int estate = OPERATOR_PASS_THROUGH; /* default exit state - not handled, so let others have a share of the pie */
- /* currently, grease pencil conflicts with such operators as undo and set object mode
- which makes behavior of operator totally unpredictable and crash for some cases.
- the only way to solve this proper is to ger rid of pointers to data which can
- chage stored in operator custom data (sergey) */
- int estate = OPERATOR_RUNNING_MODAL;
+ int estate = OPERATOR_PASS_THROUGH; /* default exit state - not handled, so let others have a share of the pie */
// if (event->type == NDOF_MOTION)
// return OPERATOR_PASS_THROUGH;
@@ -1648,17 +1779,24 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
if (ELEM(event->type, LEFTMOUSE, RIGHTMOUSE)) {
/* if painting, end stroke */
if (p->status == GP_STATUS_PAINTING) {
+ int sketch= 0;
/* basically, this should be mouse-button up = end stroke
* BUT what happens next depends on whether we 'painting sessions' is enabled
*/
- if (GPENCIL_SKETCH_SESSIONS_ON(p->scene)) {
+ sketch|= GPENCIL_SKETCH_SESSIONS_ON(p->scene);
+ /* polyline drawig is also 'sketching' -- all knots should be added during one session */
+ sketch|= p->paintmode == GP_PAINTMODE_DRAW_POLY;
+
+ if (sketch) {
/* end stroke only, and then wait to resume painting soon */
//printf("\t\tGP - end stroke only\n");
- gp_paint_cleanup(p);
- p->status= GP_STATUS_IDLING;
+ gpencil_stroke_end(op);
/* we've just entered idling state, so this event was processed (but no others yet) */
estate = OPERATOR_RUNNING_MODAL;
+
+ /* stroke could be smoothed, send notifier to refresh screen */
+ WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL);
}
else {
//printf("\t\tGP - end of stroke + op\n");
@@ -1666,35 +1804,19 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
estate = OPERATOR_FINISHED;
}
}
- else {
+ else if (event->val == KM_PRESS) {
/* not painting, so start stroke (this should be mouse-button down) */
- /* we must check that we're still within the area that we're set up to work from
- * otherwise we could crash (see bug #20586)
- */
- if (CTX_wm_area(C) != p->sa) {
- //printf("\t\t\tGP - wrong area execution abort! \n");
- p->status= GP_STATUS_ERROR;
+ p= gpencil_stroke_begin(C, op);
+
+ if (p->status == GP_STATUS_ERROR) {
estate = OPERATOR_CANCELLED;
}
- else {
- //printf("\t\tGP - start stroke \n");
- p->status= GP_STATUS_PAINTING;
-
- /* we may need to set up paint env again if we're resuming */
- // XXX: watch it with the paintmode! in future, it'd be nice to allow changing paint-mode when in sketching-sessions
- // XXX: with tablet events, we may event want to check for eraser here, for nicer tablet support
- gp_paint_initstroke(p, p->paintmode);
-
- if (p->status == GP_STATUS_ERROR) {
- estate = OPERATOR_CANCELLED;
- }
- }
+ } else {
+ p->status = GP_STATUS_IDLING;
}
}
-
-
/* handle mode-specific events */
if (p->status == GP_STATUS_PAINTING) {
/* handle painting mouse-movements? */
@@ -1706,7 +1828,7 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
/* finish painting operation if anything went wrong just now */
if (p->status == GP_STATUS_ERROR) {
- //printf("\t\t\t\tGP - add error done! \n");
+ printf("\t\t\t\tGP - add error done! \n");
estate = OPERATOR_CANCELLED;
}
else {
@@ -1723,28 +1845,6 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
estate = OPERATOR_RUNNING_MODAL;
}
}
- else if (p->status == GP_STATUS_IDLING) {
- /* standard undo/redo shouldn't be allowed to execute or else it causes crashes, so catch it here */
- // FIXME: this is a hardcoded hotkey that can't be changed
- // TODO: catch redo as well, but how?
- if (event->type == ZKEY && event->val == KM_RELEASE) {
- /* oskey = cmd key on macs as they seem to use cmd-z for undo as well? */
- if ((event->ctrl) || (event->oskey)) {
- /* just delete last stroke, which will look like undo to the end user */
- //printf("caught attempted undo event... deleting last stroke \n");
- gpencil_frame_delete_laststroke(p->gpl, p->gpf);
- /* undoing the last line can free p->gpf
- * note, could do this in a bit more of an elegant way then a search but it at least prevents a crash */
- if(BLI_findindex(&p->gpl->frames, p->gpf) == -1) {
- p->gpf= NULL;
- }
-
- /* event handled, so force refresh */
- ED_region_tag_redraw(p->ar); /* just active area for now, since doing whole screen is too slow */
- estate = OPERATOR_RUNNING_MODAL;
- }
- }
- }
/* gpencil modal operator stores area, which can be removed while using it (like fullscreen) */
if(0==gpencil_area_exists(C, p->sa))
@@ -1780,6 +1880,7 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
static EnumPropertyItem prop_gpencil_drawmodes[] = {
{GP_PAINTMODE_DRAW, "DRAW", 0, N_("Draw Freehand"), ""},
{GP_PAINTMODE_DRAW_STRAIGHT, "DRAW_STRAIGHT", 0, N_("Draw Straight Lines"), ""},
+ {GP_PAINTMODE_DRAW_POLY, "DRAW_POLY", 0, N_("Dtaw Poly Line"), ""},
{GP_PAINTMODE_ERASER, "ERASER", 0, N_("Eraser"), ""},
{0, NULL, 0, NULL, NULL}
};
diff --git a/source/blender/editors/gpencil/gpencil_undo.c b/source/blender/editors/gpencil/gpencil_undo.c
new file mode 100644
index 00000000000..1154975e3cc
--- /dev/null
+++ b/source/blender/editors/gpencil/gpencil_undo.c
@@ -0,0 +1,168 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2011 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation,
+ * Sergey Sharybin
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_gpencil_types.h"
+#include "DNA_listBase.h"
+#include "DNA_windowmanager_types.h"
+
+#include "BKE_context.h"
+#include "BKE_gpencil.h"
+
+#include "BLI_listbase.h"
+
+#include "ED_gpencil.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "gpencil_intern.h"
+
+#define MAXUNDONAME 64
+
+typedef struct bGPundonode {
+ struct bGPundonode *next, *prev;
+
+ char name[MAXUNDONAME];
+ struct bGPdata *gpd;
+} bGPundonode;
+
+static ListBase undo_nodes = {NULL, NULL};
+static bGPundonode *cur_node = NULL;
+
+int ED_gpencil_session_active(void)
+{
+ return undo_nodes.first != NULL;
+}
+
+int ED_undo_gpencil_step(bContext *C, int step, const char *name)
+{
+ bGPdata **gpd_ptr= NULL, *new_gpd= NULL;
+
+ gpd_ptr= gpencil_data_get_pointers(C, NULL);
+
+ if(step==1) { /* undo */
+ //printf("\t\tGP - undo step\n");
+ if(cur_node->prev) {
+ if(!name || strcmp(cur_node->name, name) == 0) {
+ cur_node= cur_node->prev;
+ new_gpd= cur_node->gpd;
+ }
+ }
+ }
+ else if (step==-1) {
+ //printf("\t\tGP - redo step\n");
+ if(cur_node->next) {
+ if(!name || strcmp(cur_node->name, name) == 0) {
+ cur_node= cur_node->next;
+ new_gpd= cur_node->gpd;
+ }
+ }
+ }
+
+ if(new_gpd) {
+ if(gpd_ptr) {
+ if(*gpd_ptr) {
+ bGPdata *gpd= *gpd_ptr;
+ bGPDlayer *gpl, *gpld;
+
+ free_gpencil_layers(&gpd->layers);
+
+ /* copy layers */
+ gpd->layers.first= gpd->layers.last= NULL;
+
+ for (gpl= new_gpd->layers.first; gpl; gpl= gpl->next) {
+ /* make a copy of source layer and its data */
+ gpld= gpencil_layer_duplicate(gpl);
+ BLI_addtail(&gpd->layers, gpld);
+ }
+ }
+ }
+ }
+
+ WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void gpencil_undo_init(bGPdata *gpd)
+{
+ gpencil_undo_push(gpd);
+}
+
+void gpencil_undo_push(bGPdata *gpd)
+{
+ bGPundonode *undo_node;
+
+ //printf("\t\tGP - undo push\n");
+
+ if(cur_node) {
+ /* remove all un-done nodes from stack */
+ undo_node= cur_node->next;
+
+ while(undo_node) {
+ bGPundonode *next_node= undo_node->next;
+
+ free_gpencil_data(undo_node->gpd);
+ MEM_freeN(undo_node->gpd);
+
+ BLI_freelinkN(&undo_nodes, undo_node);
+
+ undo_node= next_node;
+ }
+ }
+
+ /* create new undo node */
+ undo_node= MEM_callocN(sizeof(bGPundonode), "gpencil undo node");
+ undo_node->gpd= gpencil_data_duplicate(gpd);
+
+ cur_node= undo_node;
+
+ BLI_addtail(&undo_nodes, undo_node);
+}
+
+void gpencil_undo_finish(void)
+{
+ bGPundonode *undo_node= undo_nodes.first;
+
+ while(undo_node) {
+ free_gpencil_data(undo_node->gpd);
+ MEM_freeN(undo_node->gpd);
+
+ undo_node= undo_node->next;
+ }
+
+ BLI_freelistN(&undo_nodes);
+
+ cur_node= NULL;
+}
diff --git a/source/blender/editors/include/ED_armature.h b/source/blender/editors/include/ED_armature.h
index a029c5c1f12..b73684d43d8 100644
--- a/source/blender/editors/include/ED_armature.h
+++ b/source/blender/editors/include/ED_armature.h
@@ -148,7 +148,6 @@ void ED_armature_bone_rename(struct bArmature *arm, char *oldnamep, char *newnam
void undo_push_armature(struct bContext *C, const char *name);
/* poseobject.c */
-struct Object *ED_object_pose_armature(struct Object *ob);
void ED_armature_exit_posemode(struct bContext *C, struct Base *base);
void ED_armature_enter_posemode(struct bContext *C, struct Base *base);
int ED_pose_channel_in_IK_chain(struct Object *ob, struct bPoseChannel *pchan);
diff --git a/source/blender/editors/include/ED_curve.h b/source/blender/editors/include/ED_curve.h
index d78d2846572..b4782a5919b 100644
--- a/source/blender/editors/include/ED_curve.h
+++ b/source/blender/editors/include/ED_curve.h
@@ -58,7 +58,7 @@ void CU_select_swap(struct Object *obedit);
void undo_push_curve (struct bContext *C, const char *name);
-ListBase *curve_get_editcurve(struct Object *ob);
+ListBase *object_editcurve_get(struct Object *ob);
void load_editNurb (struct Object *obedit);
void make_editNurb (struct Object *obedit);
diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h
index 07dcc959e32..bfd16487ae5 100644
--- a/source/blender/editors/include/ED_gpencil.h
+++ b/source/blender/editors/include/ED_gpencil.h
@@ -106,4 +106,8 @@ void paste_gpdata(void);
void snap_gplayer_frames(struct bGPDlayer *gpl, short mode);
void mirror_gplayer_frames(struct bGPDlayer *gpl, short mode);
+/* ------------ Grease-Pencil Undo System ------------------ */
+int ED_gpencil_session_active(void);
+int ED_undo_gpencil_step(struct bContext *C, int step, const char *name);
+
#endif /* ED_GPENCIL_H */
diff --git a/source/blender/editors/include/ED_node.h b/source/blender/editors/include/ED_node.h
index cc4dd6330fb..1cbf45960d3 100644
--- a/source/blender/editors/include/ED_node.h
+++ b/source/blender/editors/include/ED_node.h
@@ -39,6 +39,7 @@ struct Material;
struct Scene;
struct Tex;
struct bContext;
+struct bNodeTree;
struct bNode;
struct bNodeTree;
struct ScrArea;
@@ -47,6 +48,7 @@ struct ScrArea;
void ED_init_node_butfuncs(void);
/* node_draw.c */
+void ED_node_tree_update(struct SpaceNode *snode, struct Scene *scene);
void ED_node_changed_update(struct ID *id, struct bNode *node);
void ED_node_generic_update(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node);
@@ -57,8 +59,9 @@ void ED_node_texture_default(struct Tex *tex);
void ED_node_link_intersect_test(struct ScrArea *sa, int test);
void ED_node_link_insert(struct ScrArea *sa);
-void ED_node_set_active(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node);
+void ED_node_update_hierarchy(struct bContext *C, struct bNodeTree *ntree);
+void ED_node_set_active(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node);
/* node ops.c */
void ED_operatormacros_node(void);
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index c646ec55506..b451e278d47 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -136,8 +136,8 @@ void ED_setflagsLatt(struct Object *obedit, int flag);
/* object_modifier.c */
enum {
MODIFIER_APPLY_DATA=1,
- MODIFIER_APPLY_SHAPE,
-} eModifier_Apply_Mode;
+ MODIFIER_APPLY_SHAPE
+};
struct ModifierData *ED_object_modifier_add(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, const char *name, int type);
int ED_object_modifier_remove(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, struct ModifierData *md);
diff --git a/source/blender/editors/include/ED_sculpt.h b/source/blender/editors/include/ED_sculpt.h
index 33d2dfcf4c5..85a8d8945bb 100644
--- a/source/blender/editors/include/ED_sculpt.h
+++ b/source/blender/editors/include/ED_sculpt.h
@@ -44,7 +44,6 @@ void ED_operatortypes_sculpt(void);
void sculpt_get_redraw_planes(float planes[4][4], struct ARegion *ar,
struct RegionView3D *rv3d, struct Object *ob);
void ED_sculpt_force_update(struct bContext *C);
-void ED_sculpt_modifiers_changed(struct Object *ob);
/* paint_ops.c */
void ED_operatortypes_paint(void);
diff --git a/source/blender/editors/include/ED_sequencer.h b/source/blender/editors/include/ED_sequencer.h
index cd22a5c6ca4..5be1403c97b 100644
--- a/source/blender/editors/include/ED_sequencer.h
+++ b/source/blender/editors/include/ED_sequencer.h
@@ -31,8 +31,4 @@
#define SEQ_ZOOM_FAC(szoom) ((szoom) > 0.0f)? (szoom) : ((szoom) == 0.0f)? (1.0f) : (-1.0f/(szoom))
-
-/* in space_sequencer.c, for rna update function */
-void ED_sequencer_update_view(bContext *C, int view);
-
#endif /* ED_SEQUENCER_H */
diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h
index b4263935407..f8d0b819ac1 100644
--- a/source/blender/editors/include/UI_icons.h
+++ b/source/blender/editors/include/UI_icons.h
@@ -589,8 +589,8 @@ DEF_ICON(MOD_MULTIRES)
DEF_ICON(MOD_SMOKE)
DEF_ICON(MOD_SOLIDIFY)
DEF_ICON(MOD_SCREW)
+DEF_ICON(MOD_VERTEX_WEIGHT)
#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK160)
DEF_ICON(BLANK161)
DEF_ICON(BLANK162)
DEF_ICON(BLANK163)
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 7ee65eb5410..48ec75d0853 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -653,6 +653,25 @@ void UI_exit(void);
#define UI_LAYOUT_OP_SHOW_TITLE 1
#define UI_LAYOUT_OP_SHOW_EMPTY 2
+/* flags to set which corners will become rounded:
+ *
+ * 1------2
+ * | |
+ * 8------4 */
+
+enum {
+ UI_CNR_TOP_LEFT= 1,
+ UI_CNR_TOP_RIGHT= 2,
+ UI_CNR_BOTTOM_RIGHT= 4,
+ UI_CNR_BOTTOM_LEFT= 8,
+ /* just for convenience */
+ UI_CNR_NONE= 0,
+ UI_CNR_ALL= (UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_RIGHT | UI_CNR_BOTTOM_LEFT)
+};
+
+/* not apart of the corner flags but mixed in some functions */
+#define UI_RB_ALPHA (UI_CNR_ALL + 1)
+
uiLayout *uiBlockLayout(uiBlock *block, int dir, int type, int x, int y, int size, int em, struct uiStyle *style);
void uiBlockSetCurLayout(uiBlock *block, uiLayout *layout);
void uiBlockLayoutResolve(uiBlock *block, int *x, int *y);
diff --git a/source/blender/editors/include/UI_resources.h b/source/blender/editors/include/UI_resources.h
index d383bc0ab78..ab5b8e8aff3 100644
--- a/source/blender/editors/include/UI_resources.h
+++ b/source/blender/editors/include/UI_resources.h
@@ -296,6 +296,9 @@ void UI_GetThemeColorType4ubv(int colorid, int spacetype, char col[4]);
// blends and shades between two color pointers
void UI_ColorPtrBlendShade3ubv(const unsigned char cp1[3], const unsigned char cp2[3], float fac, int offset);
+// shade a 3 byte color (same as UI_GetColorPtrBlendShade3ubv with 0.0 factor)
+void UI_GetColorPtrShade3ubv(const unsigned char cp1[3], unsigned char col[3], int offset);
+
// get a 3 byte color, blended and shaded between two other char color pointers
void UI_GetColorPtrBlendShade3ubv(const unsigned char cp1[3], const unsigned char cp2[3], unsigned char col[3], float fac, int offset);
diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c
index 76ed9891b8e..33aeb2df926 100644
--- a/source/blender/editors/interface/interface_draw.c
+++ b/source/blender/editors/interface/interface_draw.c
@@ -58,10 +58,9 @@
/* own include */
#include "interface_intern.h"
-#define UI_RB_ALPHA 16
#define UI_DISABLED_ALPHA_OFFS -160
-static int roundboxtype= 15;
+static int roundboxtype= UI_CNR_ALL;
void uiSetRoundBox(int type)
{
@@ -69,13 +68,6 @@ void uiSetRoundBox(int type)
* if this is undone, its not that big a deal, only makes curves edges
* square for the */
roundboxtype= type;
-
- /* flags to set which corners will become rounded:
-
- 1------2
- | |
- 8------4
- */
}
@@ -98,7 +90,7 @@ void uiDrawBox(int mode, float minx, float miny, float maxx, float maxy, float r
glBegin(mode);
/* start with corner right-bottom */
- if(roundboxtype & 4) {
+ if(roundboxtype & UI_CNR_BOTTOM_RIGHT) {
glVertex2f(maxx-rad, miny);
for(a=0; a<7; a++) {
glVertex2f(maxx-rad+vec[a][0], miny+vec[a][1]);
@@ -108,7 +100,7 @@ void uiDrawBox(int mode, float minx, float miny, float maxx, float maxy, float r
else glVertex2f(maxx, miny);
/* corner right-top */
- if(roundboxtype & 2) {
+ if(roundboxtype & UI_CNR_TOP_RIGHT) {
glVertex2f(maxx, maxy-rad);
for(a=0; a<7; a++) {
glVertex2f(maxx-vec[a][1], maxy-rad+vec[a][0]);
@@ -118,7 +110,7 @@ void uiDrawBox(int mode, float minx, float miny, float maxx, float maxy, float r
else glVertex2f(maxx, maxy);
/* corner left-top */
- if(roundboxtype & 1) {
+ if(roundboxtype & UI_CNR_TOP_LEFT) {
glVertex2f(minx+rad, maxy);
for(a=0; a<7; a++) {
glVertex2f(minx+rad-vec[a][0], maxy-vec[a][1]);
@@ -128,7 +120,7 @@ void uiDrawBox(int mode, float minx, float miny, float maxx, float maxy, float r
else glVertex2f(minx, maxy);
/* corner left-bottom */
- if(roundboxtype & 8) {
+ if(roundboxtype & UI_CNR_BOTTOM_LEFT) {
glVertex2f(minx, miny+rad);
for(a=0; a<7; a++) {
glVertex2f(minx+vec[a][1], miny+rad-vec[a][0]);
@@ -180,7 +172,7 @@ void uiDrawBoxShade(int mode, float minx, float miny, float maxx, float maxy, fl
glBegin(mode);
/* start with corner right-bottom */
- if(roundboxtype & 4) {
+ if(roundboxtype & UI_CNR_BOTTOM_RIGHT) {
round_box_shade_col(coltop, coldown, 0.0);
glVertex2f(maxx-rad, miny);
@@ -199,7 +191,7 @@ void uiDrawBoxShade(int mode, float minx, float miny, float maxx, float maxy, fl
}
/* corner right-top */
- if(roundboxtype & 2) {
+ if(roundboxtype & UI_CNR_TOP_RIGHT) {
round_box_shade_col(coltop, coldown, (div-rad)*idiv);
glVertex2f(maxx, maxy-rad);
@@ -217,7 +209,7 @@ void uiDrawBoxShade(int mode, float minx, float miny, float maxx, float maxy, fl
}
/* corner left-top */
- if(roundboxtype & 1) {
+ if(roundboxtype & UI_CNR_TOP_LEFT) {
round_box_shade_col(coltop, coldown, 1.0);
glVertex2f(minx+rad, maxy);
@@ -236,7 +228,7 @@ void uiDrawBoxShade(int mode, float minx, float miny, float maxx, float maxy, fl
}
/* corner left-bottom */
- if(roundboxtype & 8) {
+ if(roundboxtype & UI_CNR_BOTTOM_LEFT) {
round_box_shade_col(coltop, coldown, rad*idiv);
glVertex2f(minx, miny+rad);
@@ -288,7 +280,7 @@ void uiDrawBoxVerticalShade(int mode, float minx, float miny, float maxx, float
glBegin(mode);
/* start with corner right-bottom */
- if(roundboxtype & 4) {
+ if(roundboxtype & UI_CNR_BOTTOM_RIGHT) {
round_box_shade_col(colLeft, colRight, 0.0);
glVertex2f(maxx-rad, miny);
@@ -306,7 +298,7 @@ void uiDrawBoxVerticalShade(int mode, float minx, float miny, float maxx, float
}
/* corner right-top */
- if(roundboxtype & 2) {
+ if(roundboxtype & UI_CNR_TOP_RIGHT) {
round_box_shade_col(colLeft, colRight, 0.0);
glVertex2f(maxx, maxy-rad);
@@ -324,7 +316,7 @@ void uiDrawBoxVerticalShade(int mode, float minx, float miny, float maxx, float
}
/* corner left-top */
- if(roundboxtype & 1) {
+ if(roundboxtype & UI_CNR_TOP_LEFT) {
round_box_shade_col(colLeft, colRight, (div-rad)*idiv);
glVertex2f(minx+rad, maxy);
@@ -342,7 +334,7 @@ void uiDrawBoxVerticalShade(int mode, float minx, float miny, float maxx, float
}
/* corner left-bottom */
- if(roundboxtype & 8) {
+ if(roundboxtype & UI_CNR_BOTTOM_LEFT) {
round_box_shade_col(colLeft, colRight, 1.0);
glVertex2f(minx, miny+rad);
@@ -709,7 +701,7 @@ static void draw_scope_end(rctf *rect, GLint *scissor)
/* outline */
glColor4f(0.f, 0.f, 0.f, 0.5f);
- uiSetRoundBox(15);
+ uiSetRoundBox(UI_CNR_ALL);
uiDrawBox(GL_LINE_LOOP, rect->xmin-1, rect->ymin, rect->xmax+1, rect->ymax+1, 3.0f);
}
@@ -768,9 +760,13 @@ void ui_draw_but_HISTOGRAM(ARegion *ar, uiBut *but, uiWidgetColors *UNUSED(wcol)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glColor4f(0.f, 0.f, 0.f, 0.3f);
- uiSetRoundBox(15);
+ uiSetRoundBox(UI_CNR_ALL);
uiDrawBox(GL_POLYGON, rect.xmin-1, rect.ymin-1, rect.xmax+1, rect.ymax+1, 3.0f);
-
+
+ /* need scissor test, histogram can draw outside of boundary */
+ glGetIntegerv(GL_VIEWPORT, scissor);
+ glScissor(ar->winrct.xmin + (rect.xmin-1), ar->winrct.ymin+(rect.ymin-1), (rect.xmax+1)-(rect.xmin-1), (rect.ymax+1)-(rect.ymin-1));
+
glColor4f(1.f, 1.f, 1.f, 0.08f);
/* draw grid lines here */
for (i=1; i<4; i++) {
@@ -778,10 +774,6 @@ void ui_draw_but_HISTOGRAM(ARegion *ar, uiBut *but, uiWidgetColors *UNUSED(wcol)
fdrawline(rect.xmin+(i/4.f)*w, rect.ymin, rect.xmin+(i/4.f)*w, rect.ymax);
}
- /* need scissor test, histogram can draw outside of boundary */
- glGetIntegerv(GL_VIEWPORT, scissor);
- glScissor(ar->winrct.xmin + (rect.xmin-1), ar->winrct.ymin+(rect.ymin-1), (rect.xmax+1)-(rect.xmin-1), (rect.ymax+1)-(rect.ymin-1));
-
if (hist->mode == HISTO_MODE_LUMA)
histogram_draw_one(1.0, 1.0, 1.0, 0.75, rect.xmin, rect.ymin, w, h, hist->data_luma, res);
else {
@@ -837,7 +829,7 @@ void ui_draw_but_WAVEFORM(ARegion *ar, uiBut *but, uiWidgetColors *UNUSED(wcol),
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glColor4f(0.f, 0.f, 0.f, 0.3f);
- uiSetRoundBox(15);
+ uiSetRoundBox(UI_CNR_ALL);
uiDrawBox(GL_POLYGON, rect.xmin-1, rect.ymin-1, rect.xmax+1, rect.ymax+1, 3.0f);
@@ -1048,7 +1040,7 @@ void ui_draw_but_VECTORSCOPE(ARegion *ar, uiBut *but, uiWidgetColors *UNUSED(wco
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glColor4f(0.f, 0.f, 0.f, 0.3f);
- uiSetRoundBox(15);
+ uiSetRoundBox(UI_CNR_ALL);
uiDrawBox(GL_POLYGON, rect.xmin-1, rect.ymin-1, rect.xmax+1, rect.ymax+1, 3.0f);
/* need scissor test, hvectorscope can draw outside of boundary */
@@ -1233,7 +1225,7 @@ void ui_draw_but_NORMAL(uiBut *but, uiWidgetColors *wcol, rcti *rect)
/* backdrop */
glColor3ubv((unsigned char*)wcol->inner);
- uiSetRoundBox(15);
+ uiSetRoundBox(UI_CNR_ALL);
uiDrawBox(GL_POLYGON, rect->xmin, rect->ymin, rect->xmax, rect->ymax, 5.0f);
/* sphere color */
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index f4e53e2aa52..5f15cf7e5f7 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -336,7 +336,7 @@ static void ui_layer_but_cb(bContext *C, void *arg_but, void *arg_index)
}
/* create buttons for an item with an RNA array */
-static void ui_item_array(uiLayout *layout, uiBlock *block, const char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int len, int x, int y, int w, int h, int expand, int slider, int toggle, int icon_only)
+static void ui_item_array(uiLayout *layout, uiBlock *block, const char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int len, int x, int y, int w, int UNUSED(h), int expand, int slider, int toggle, int icon_only)
{
uiStyle *style= layout->root->style;
uiBut *but;
@@ -409,7 +409,7 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, const char *name, in
if (totdim != 2) return; /* only 2D matrices supported in UI so far */
w /= dim_size[0];
- h /= dim_size[1];
+ /* h /= dim_size[1]; */ /* UNUSED */
for(a=0; a<len; a++) {
col= a % dim_size[0];
@@ -632,7 +632,7 @@ PointerRNA uiItemFullO(uiLayout *layout, const char *opname, const char *name, i
if(!ot) {
ui_item_disabled(layout, opname);
- RNA_warning("uiItemFullO: unknown operator '%s'\n", opname);
+ RNA_warning("unknown operator '%s'", opname);
return PointerRNA_NULL;
}
@@ -739,7 +739,7 @@ void uiItemsFullEnumO(uiLayout *layout, const char *opname, const char *propname
if(!ot || !ot->srna) {
ui_item_disabled(layout, opname);
- RNA_warning("uiItemsFullEnumO: %s '%s'\n", ot ? "unknown operator" : "operator missing srna", opname);
+ RNA_warning("%s '%s'", ot ? "unknown operator" : "operator missing srna", opname);
return;
}
@@ -817,7 +817,7 @@ void uiItemEnumO_value(uiLayout *layout, const char *name, int icon, const char
/* pass */
}
else {
- RNA_warning("uiItemEnumO_value: %s.%s not found.\n", RNA_struct_identifier(ptr.type), propname);
+ RNA_warning("%s.%s not found.", RNA_struct_identifier(ptr.type), propname);
return;
}
@@ -846,7 +846,7 @@ void uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char
RNA_property_enum_items(layout->root->block->evil_C, &ptr, prop, &item, NULL, &free);
if(item==NULL || RNA_enum_value_from_id(item, value_str, &value)==0) {
if(free) MEM_freeN(item);
- RNA_warning("uiItemEnumO_string: %s.%s, enum %s not found.\n", RNA_struct_identifier(ptr.type), propname, value_str);
+ RNA_warning("%s.%s, enum %s not found.", RNA_struct_identifier(ptr.type), propname, value_str);
return;
}
@@ -854,7 +854,7 @@ void uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char
MEM_freeN(item);
}
else {
- RNA_warning("uiItemEnumO_string: %s.%s not found.\n", RNA_struct_identifier(ptr.type), propname);
+ RNA_warning("%s.%s not found.", RNA_struct_identifier(ptr.type), propname);
return;
}
@@ -1061,7 +1061,7 @@ void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, int flag,
if(!prop) {
ui_item_disabled(layout, propname);
- RNA_warning("uiItemR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1074,7 +1074,7 @@ void uiItemEnumR(uiLayout *layout, const char *name, int icon, struct PointerRNA
if(!prop || RNA_property_type(prop) != PROP_ENUM) {
ui_item_disabled(layout, propname);
- RNA_warning("uiItemEnumR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1089,7 +1089,7 @@ void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *pr
if(!prop || RNA_property_type(prop) != PROP_ENUM) {
ui_item_disabled(layout, propname);
- RNA_warning("uiItemEnumR_string: enum property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("enum property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1098,7 +1098,7 @@ void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *pr
if(!RNA_enum_value_from_id(item, value, &ivalue)) {
if(free) MEM_freeN(item);
ui_item_disabled(layout, propname);
- RNA_warning("uiItemEnumR: enum property value not found: %s\n", value);
+ RNA_warning("enum property value not found: %s", value);
return;
}
@@ -1123,12 +1123,12 @@ void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname
if(!prop) {
ui_item_disabled(layout, propname);
- RNA_warning("uiItemsEnumR: enum property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("enum property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
if(RNA_property_type(prop) != PROP_ENUM) {
- RNA_warning("uiItemsEnumR: not an enum property: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("not an enum property: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
else {
@@ -1316,13 +1316,13 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propna
prop= RNA_struct_find_property(ptr, propname);
if(!prop) {
- RNA_warning("uiItemPointerR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
type= RNA_property_type(prop);
if(!ELEM(type, PROP_POINTER, PROP_STRING)) {
- RNA_warning("uiItemPointerR: property %s must be a pointer or string.\n", propname);
+ RNA_warning("property %s must be a pointer or string.", propname);
return;
}
@@ -1330,11 +1330,11 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propna
if(!searchprop) {
- RNA_warning("uiItemPointerR: search collection property not found: %s.%s\n", RNA_struct_identifier(ptr->type), searchpropname);
+ RNA_warning("search collection property not found: %s.%s", RNA_struct_identifier(ptr->type), searchpropname);
return;
}
else if (RNA_property_type(searchprop) != PROP_COLLECTION) {
- RNA_warning("uiItemPointerR: search collection property is not a collection type: %s.%s\n", RNA_struct_identifier(ptr->type), searchpropname);
+ RNA_warning("search collection property is not a collection type: %s.%s", RNA_struct_identifier(ptr->type), searchpropname);
return;
}
@@ -1406,7 +1406,7 @@ static void ui_item_menu(uiLayout *layout, const char *name, int icon, uiMenuCre
if(layout->root->type == UI_LAYOUT_HEADER)
uiBlockSetEmboss(block, UI_EMBOSS);
- else if(layout->root->type == UI_LAYOUT_PANEL) {
+ else if(ELEM(layout->root->type, UI_LAYOUT_PANEL, UI_LAYOUT_TOOLBAR)) {
but->type= MENU;
but->flag |= UI_TEXT_LEFT;
}
@@ -1419,7 +1419,7 @@ void uiItemM(uiLayout *layout, bContext *UNUSED(C), const char *menuname, const
mt= WM_menutype_find(menuname, FALSE);
if(mt==NULL) {
- RNA_warning("uiItemM: not found %s\n", menuname);
+ RNA_warning("not found %s", menuname);
return;
}
@@ -1528,7 +1528,7 @@ static void menu_item_enum_opname_menu(bContext *UNUSED(C), uiLayout *layout, vo
{
MenuItemLevel *lvl= (MenuItemLevel*)(((uiBut*)arg)->func_argN);
- uiLayoutSetOperatorContext(layout, WM_OP_EXEC_REGION_WIN);
+ uiLayoutSetOperatorContext(layout, lvl->opcontext);
uiItemsEnumO(layout, lvl->opname, lvl->propname);
}
@@ -1539,12 +1539,12 @@ void uiItemMenuEnumO(uiLayout *layout, const char *opname, const char *propname,
if(!ot) {
ui_item_disabled(layout, opname);
- RNA_warning("uiItemMenuEnumO: unknown operator '%s'\n", opname);
+ RNA_warning("unknown operator '%s'", opname);
return;
}
if(!ot->srna) {
ui_item_disabled(layout, opname);
- RNA_warning("uiItemMenuEnumO: operator missing srna '%s'\n", opname);
+ RNA_warning("operator missing srna '%s'", opname);
return;
}
@@ -1577,7 +1577,7 @@ void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propn
prop= RNA_struct_find_property(ptr, propname);
if(!prop) {
ui_item_disabled(layout, propname);
- RNA_warning("uiItemMenuEnumR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c
index 01dcdda97a1..d4f49d750ac 100644
--- a/source/blender/editors/interface/interface_panel.c
+++ b/source/blender/editors/interface/interface_panel.c
@@ -537,8 +537,8 @@ void ui_draw_aligned_panel(uiStyle *style, uiBlock *block, rcti *rect)
/* in some occasions, draw a border */
if(panel->flag & PNL_SELECT) {
- if(panel->control & UI_PNL_SOLID) uiSetRoundBox(15);
- else uiSetRoundBox(3);
+ if(panel->control & UI_PNL_SOLID) uiSetRoundBox(UI_CNR_ALL);
+ else uiSetRoundBox(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT);
UI_ThemeColorShade(TH_BACK, -120);
uiRoundRect(0.5f + rect->xmin, 0.5f + rect->ymin, 0.5f + rect->xmax, 0.5f + headrect.ymax+1, 8);
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index e510d6bb38d..ec3173a42b2 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -245,7 +245,7 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
switch(event) {
case UI_ID_BROWSE:
case UI_ID_PIN:
- RNA_warning("warning, id event %d shouldnt come here\n", event);
+ RNA_warning("warning, id event %d shouldnt come here", event);
break;
case UI_ID_OPEN:
case UI_ID_ADD_NEW:
@@ -488,7 +488,7 @@ static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, const
prop= RNA_struct_find_property(ptr, propname);
if(!prop || RNA_property_type(prop) != PROP_POINTER) {
- RNA_warning("uiTemplateID: pointer property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("pointer property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -549,11 +549,11 @@ void uiTemplateAnyID(uiLayout *layout, PointerRNA *ptr, const char *propname, co
propType= RNA_struct_find_property(ptr, proptypename);
if (!propID || RNA_property_type(propID) != PROP_POINTER) {
- RNA_warning("uiTemplateAnyID: pointer property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("pointer property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
if (!propType || RNA_property_type(propType) != PROP_ENUM) {
- RNA_warning("uiTemplateAnyID: pointer-type property not found: %s.%s\n", RNA_struct_identifier(ptr->type), proptypename);
+ RNA_warning("pointer-type property not found: %s.%s", RNA_struct_identifier(ptr->type), proptypename);
return;
}
@@ -592,7 +592,7 @@ void uiTemplatePathBuilder(uiLayout *layout, PointerRNA *ptr, const char *propna
/* check that properties are valid */
propPath= RNA_struct_find_property(ptr, propname);
if (!propPath || RNA_property_type(propPath) != PROP_STRING) {
- RNA_warning("uiTemplatePathBuilder: path property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("path property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -855,7 +855,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
/* verify we have valid data */
if(!RNA_struct_is_a(ptr->type, &RNA_Modifier)) {
- RNA_warning("uiTemplateModifier: Expected modifier on object.\n");
+ RNA_warning("Expected modifier on object.");
return NULL;
}
@@ -863,7 +863,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
md= ptr->data;
if(!ob || !(GS(ob->id.name) == ID_OB)) {
- RNA_warning("uiTemplateModifier: Expected modifier on object.\n");
+ RNA_warning("expected modifier on object.");
return NULL;
}
@@ -1084,7 +1084,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr)
/* verify we have valid data */
if(!RNA_struct_is_a(ptr->type, &RNA_Constraint)) {
- RNA_warning("uiTemplateConstraint: Expected constraint on object.\n");
+ RNA_warning("Expected constraint on object.");
return NULL;
}
@@ -1092,7 +1092,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr)
con= ptr->data;
if(!ob || !(GS(ob->id.name) == ID_OB)) {
- RNA_warning("uiTemplateConstraint: Expected constraint on object.\n");
+ RNA_warning("Expected constraint on object.");
return NULL;
}
@@ -1138,7 +1138,7 @@ void uiTemplatePreview(uiLayout *layout, ID *id, int show_buttons, ID *parent, M
PointerRNA texture_ptr;
if(id && !ELEM4(GS(id->name), ID_MA, ID_TE, ID_WO, ID_LA)) {
- RNA_warning("uiTemplatePreview: Expected ID of type material, texture, lamp or world.\n");
+ RNA_warning("expected ID of type material, texture, lamp or world.");
return;
}
@@ -1844,12 +1844,14 @@ void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, const char *propn
PointerRNA cptr;
if(!prop) {
- RNA_warning("uiTemplateCurveMapping: curve property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("curve property not found: %s.%s",
+ RNA_struct_identifier(ptr->type), propname);
return;
}
if(RNA_property_type(prop) != PROP_POINTER) {
- RNA_warning("uiTemplateCurveMapping: curve is not a pointer: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("curve is not a pointer: %s.%s",
+ RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1879,7 +1881,7 @@ void uiTemplateColorWheel(uiLayout *layout, PointerRNA *ptr, const char *propnam
float softmin, softmax, step, precision;
if (!prop) {
- RNA_warning("uiTemplateColorWheel: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1949,7 +1951,7 @@ void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, const char *propname,
prop= RNA_struct_find_property(ptr, propname);
if (!prop) {
- RNA_warning("uiTemplateLayer: layers property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("layers property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1966,7 +1968,7 @@ void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, const char *propname,
if(used_ptr && used_propname) {
used_prop= RNA_struct_find_property(used_ptr, used_propname);
if (!used_prop) {
- RNA_warning("uiTemplateLayer: used layers property not found: %s.%s\n", RNA_struct_identifier(ptr->type), used_propname);
+ RNA_warning("used layers property not found: %s.%s", RNA_struct_identifier(ptr->type), used_propname);
return;
}
@@ -2157,7 +2159,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
pa= block->panel;
if(!pa) {
- RNA_warning("uiTemplateList: only works inside a panel.\n");
+ RNA_warning("only works inside a panel.");
return;
}
@@ -2167,28 +2169,28 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
if(ptr->data) {
prop= RNA_struct_find_property(ptr, propname);
if(!prop) {
- RNA_warning("uiTemplateList: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
}
activeprop= RNA_struct_find_property(activeptr, activepropname);
if(!activeprop) {
- RNA_warning("uiTemplateList: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), activepropname);
+ RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), activepropname);
return;
}
if(prop) {
type= RNA_property_type(prop);
if(type != PROP_COLLECTION) {
- RNA_warning("uiTemplateList: Expected collection property.\n");
+ RNA_warning("uiExpected collection property.");
return;
}
}
activetype= RNA_property_type(activeprop);
if(activetype != PROP_INT) {
- RNA_warning("uiTemplateList: Expected integer property.\n");
+ RNA_warning("expected integer property.");
return;
}
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index 5da875356ea..45829646145 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -79,19 +79,23 @@
/* it has outline, back, and two optional tria meshes */
typedef struct uiWidgetTrias {
- int tot;
+ unsigned int tot;
float vec[32][2];
- int (*index)[3];
+ unsigned int (*index)[3];
} uiWidgetTrias;
+/* max as used by round_box__edges */
+#define WIDGET_CURVE_RESOLU 9
+#define WIDGET_SIZE_MAX (WIDGET_CURVE_RESOLU*4)
+
typedef struct uiWidgetBase {
int totvert, halfwayvert;
- float outer_v[64][2];
- float inner_v[64][2];
- float inner_uv[64][2];
+ float outer_v[WIDGET_SIZE_MAX][2];
+ float inner_v[WIDGET_SIZE_MAX][2];
+ float inner_uv[WIDGET_SIZE_MAX][2];
short inner, outline, emboss; /* set on/off */
short shadedir;
@@ -123,7 +127,7 @@ typedef struct uiWidgetType {
/* *********************** draw data ************************** */
-static float cornervec[9][2]= {{0.0, 0.0}, {0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169},
+static float cornervec[WIDGET_CURVE_RESOLU][2]= {{0.0, 0.0}, {0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169},
{0.707, 0.293}, {0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}, {1.0, 1.0}};
static float jit[8][2]= {{0.468813 , -0.481430}, {-0.155755 , -0.352820},
@@ -133,7 +137,7 @@ static float jit[8][2]= {{0.468813 , -0.481430}, {-0.155755 , -0.352820},
static float num_tria_vert[3][2]= {
{-0.352077, 0.532607}, {-0.352077, -0.549313}, {0.330000, -0.008353}};
-static int num_tria_face[1][3]= {
+static unsigned int num_tria_face[1][3]= {
{0, 1, 2}};
static float scroll_circle_vert[16][2]= {
@@ -142,7 +146,7 @@ static float scroll_circle_vert[16][2]= {
{-0.382683, -0.923880}, {0.000000, -1.000000}, {0.382684, -0.923880}, {0.707107, -0.707107},
{0.923880, -0.382684}, {1.000000, -0.000000}, {0.923880, 0.382683}, {0.707107, 0.707107}};
-static int scroll_circle_face[14][3]= {
+static unsigned int scroll_circle_face[14][3]= {
{0, 1, 2}, {2, 0, 3}, {3, 0, 15}, {3, 15, 4}, {4, 15, 14}, {4, 14, 5}, {5, 14, 13}, {5, 13, 6},
{6, 13, 12}, {6, 12, 7}, {7, 12, 11}, {7, 11, 8}, {8, 11, 10}, {8, 10, 9}};
@@ -150,13 +154,13 @@ static float menu_tria_vert[6][2]= {
{-0.41, 0.16}, {0.41, 0.16}, {0, 0.82},
{0, -0.82}, {-0.41, -0.16}, {0.41, -0.16}};
-static int menu_tria_face[2][3]= {{2, 0, 1}, {3, 5, 4}};
+static unsigned int menu_tria_face[2][3]= {{2, 0, 1}, {3, 5, 4}};
static float check_tria_vert[6][2]= {
{-0.578579, 0.253369}, {-0.392773, 0.412794}, {-0.004241, -0.328551},
{-0.003001, 0.034320}, {1.055313, 0.864744}, {0.866408, 1.026895}};
-static int check_tria_face[4][3]= {
+static unsigned int check_tria_face[4][3]= {
{3, 2, 4}, {3, 4, 5}, {1, 0, 3}, {0, 2, 3}};
GLubyte checker_stipple_sml[32*32/8] =
@@ -175,6 +179,7 @@ GLubyte checker_stipple_sml[32*32/8] =
void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y3)
{
+ float tri_arr[3][2]= {{x1, y1}, {x2, y2}, {x3, y3}};
float color[4];
int j;
@@ -182,20 +187,18 @@ void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y
glGetFloatv(GL_CURRENT_COLOR, color);
color[3] *= 0.125f;
glColor4fv(color);
-
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, tri_arr);
+
/* for each AA step */
for(j=0; j<8; j++) {
glTranslatef(1.0f * jit[j][0], 1.0f * jit[j][1], 0.0f);
-
- glBegin(GL_POLYGON);
- glVertex2f(x1, y1);
- glVertex2f(x2, y2);
- glVertex2f(x3, y3);
- glEnd();
-
+ glDrawArrays(GL_TRIANGLES, 0, 3);
glTranslatef(-1.0f * jit[j][0], -1.0f * jit[j][1], 0.0f);
}
+ glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_BLEND);
}
@@ -216,7 +219,7 @@ static void widget_init(uiWidgetBase *wtb)
/* return tot */
static int round_box_shadow_edges(float (*vert)[2], rcti *rect, float rad, int roundboxalign, float step)
{
- float vec[9][2];
+ float vec[WIDGET_CURVE_RESOLU][2];
float minx, miny, maxx, maxy;
int a, tot= 0;
@@ -231,59 +234,59 @@ static int round_box_shadow_edges(float (*vert)[2], rcti *rect, float rad, int r
maxy= rect->ymax+step;
/* mult */
- for(a=0; a<9; a++) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++) {
vec[a][0]= rad*cornervec[a][0];
vec[a][1]= rad*cornervec[a][1];
}
/* start with left-top, anti clockwise */
- if(roundboxalign & 1) {
- for(a=0; a<9; a++, tot++) {
+ if(roundboxalign & UI_CNR_TOP_LEFT) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
vert[tot][0]= minx+rad-vec[a][0];
vert[tot][1]= maxy-vec[a][1];
}
}
else {
- for(a=0; a<9; a++, tot++) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
vert[tot][0]= minx;
vert[tot][1]= maxy;
}
}
- if(roundboxalign & 8) {
- for(a=0; a<9; a++, tot++) {
+ if(roundboxalign & UI_CNR_BOTTOM_LEFT) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
vert[tot][0]= minx+vec[a][1];
vert[tot][1]= miny+rad-vec[a][0];
}
}
else {
- for(a=0; a<9; a++, tot++) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
vert[tot][0]= minx;
vert[tot][1]= miny;
}
}
- if(roundboxalign & 4) {
- for(a=0; a<9; a++, tot++) {
+ if(roundboxalign & UI_CNR_BOTTOM_RIGHT) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
vert[tot][0]= maxx-rad+vec[a][0];
vert[tot][1]= miny+vec[a][1];
}
}
else {
- for(a=0; a<9; a++, tot++) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
vert[tot][0]= maxx;
vert[tot][1]= miny;
}
}
- if(roundboxalign & 2) {
- for(a=0; a<9; a++, tot++) {
+ if(roundboxalign & UI_CNR_TOP_RIGHT) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
vert[tot][0]= maxx-vec[a][1];
vert[tot][1]= maxy-rad+vec[a][0];
}
}
else {
- for(a=0; a<9; a++, tot++) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
vert[tot][0]= maxx;
vert[tot][1]= maxy;
}
@@ -294,7 +297,7 @@ static int round_box_shadow_edges(float (*vert)[2], rcti *rect, float rad, int r
/* this call has 1 extra arg to allow mask outline */
static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, float rad, float radi)
{
- float vec[9][2], veci[9][2];
+ float vec[WIDGET_CURVE_RESOLU][2], veci[WIDGET_CURVE_RESOLU][2];
float minx= rect->xmin, miny= rect->ymin, maxx= rect->xmax, maxy= rect->ymax;
float minxi= minx + 1.0f; /* boundbox inner */
float maxxi= maxx - 1.0f;
@@ -303,8 +306,10 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
float facxi= (maxxi!=minxi) ? 1.0f/(maxxi-minxi) : 0.0f; /* for uv, can divide by zero */
float facyi= (maxyi!=minyi) ? 1.0f/(maxyi-minyi) : 0.0f;
int a, tot= 0, minsize;
- const int hnum= ((roundboxalign & (1|2))==(1|2) || (roundboxalign & (4|8))==(4|8)) ? 1 : 2;
- const int vnum= ((roundboxalign & (1|8))==(1|8) || (roundboxalign & (2|4))==(2|4)) ? 1 : 2;
+ const int hnum= ((roundboxalign & (UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT))==(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT) ||
+ (roundboxalign & (UI_CNR_BOTTOM_RIGHT | UI_CNR_BOTTOM_LEFT))==(UI_CNR_BOTTOM_RIGHT | UI_CNR_BOTTOM_LEFT)) ? 1 : 2;
+ const int vnum= ((roundboxalign & (UI_CNR_TOP_LEFT | UI_CNR_BOTTOM_LEFT))==(UI_CNR_TOP_LEFT | UI_CNR_BOTTOM_LEFT) ||
+ (roundboxalign & (UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_RIGHT))==(UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_RIGHT)) ? 1 : 2;
minsize= MIN2((rect->xmax-rect->xmin)*hnum, (rect->ymax-rect->ymin)*vnum);
@@ -315,7 +320,7 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
radi= 0.5f*minsize - 1.0f;
/* mult */
- for(a=0; a<9; a++) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++) {
veci[a][0]= radi*cornervec[a][0];
veci[a][1]= radi*cornervec[a][1];
vec[a][0]= rad*cornervec[a][0];
@@ -323,9 +328,9 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
}
/* corner left-bottom */
- if(roundboxalign & 8) {
+ if(roundboxalign & UI_CNR_BOTTOM_LEFT) {
- for(a=0; a<9; a++, tot++) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
wt->inner_v[tot][0]= minxi+veci[a][1];
wt->inner_v[tot][1]= minyi+radi-veci[a][0];
@@ -350,9 +355,9 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
}
/* corner right-bottom */
- if(roundboxalign & 4) {
+ if(roundboxalign & UI_CNR_BOTTOM_RIGHT) {
- for(a=0; a<9; a++, tot++) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
wt->inner_v[tot][0]= maxxi-radi+veci[a][0];
wt->inner_v[tot][1]= minyi+veci[a][1];
@@ -379,9 +384,9 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
wt->halfwayvert= tot;
/* corner right-top */
- if(roundboxalign & 2) {
+ if(roundboxalign & UI_CNR_TOP_RIGHT) {
- for(a=0; a<9; a++, tot++) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
wt->inner_v[tot][0]= maxxi-veci[a][1];
wt->inner_v[tot][1]= maxyi-radi+veci[a][0];
@@ -406,9 +411,9 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
}
/* corner left-top */
- if(roundboxalign & 1) {
+ if(roundboxalign & UI_CNR_TOP_LEFT) {
- for(a=0; a<9; a++, tot++) {
+ for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) {
wt->inner_v[tot][0]= minxi+radi-veci[a][0];
wt->inner_v[tot][1]= maxyi-veci[a][1];
@@ -433,7 +438,9 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
tot++;
}
-
+
+ BLI_assert(tot <= WIDGET_SIZE_MAX);
+
wt->totvert= tot;
}
@@ -516,16 +523,10 @@ static void widget_scroll_circle(uiWidgetTrias *tria, rcti *rect, float triasize
static void widget_trias_draw(uiWidgetTrias *tria)
{
- int a;
-
- glBegin(GL_TRIANGLES);
- for(a=0; a<tria->tot; a++) {
- glVertex2fv(tria->vec[ tria->index[a][0] ]);
- glVertex2fv(tria->vec[ tria->index[a][1] ]);
- glVertex2fv(tria->vec[ tria->index[a][2] ]);
- }
- glEnd();
-
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, tria->vec);
+ glDrawElements(GL_TRIANGLES, tria->tot*3, GL_UNSIGNED_INT, tria->index);
+ glDisableClientState(GL_VERTEX_ARRAY);
}
static void widget_menu_trias(uiWidgetTrias *tria, rcti *rect)
@@ -587,33 +588,48 @@ static void shadecolors4(char *coltop, char *coldown, const char *color, short s
coldown[3]= color[3];
}
-static void round_box_shade_col4(const char col1[4], const char col2[4], const float fac)
+static void round_box_shade_col4_r(unsigned char col_r[4], const char col1[4], const char col2[4], const float fac)
{
- unsigned char col[4];
const int faci= FTOCHAR(fac);
const int facm= 255-faci;
- col[0]= (faci*col1[0] + facm*col2[0])>>8;
- col[1]= (faci*col1[1] + facm*col2[1])>>8;
- col[2]= (faci*col1[2] + facm*col2[2])>>8;
- col[3]= (faci*col1[3] + facm*col2[3])>>8;
+ col_r[0]= (faci*col1[0] + facm*col2[0])>>8;
+ col_r[1]= (faci*col1[1] + facm*col2[1])>>8;
+ col_r[2]= (faci*col1[2] + facm*col2[2])>>8;
+ col_r[3]= (faci*col1[3] + facm*col2[3])>>8;
+}
- glColor4ubv(col);
+static void widget_verts_to_quad_strip(uiWidgetBase *wtb, const int totvert, float quad_strip[WIDGET_SIZE_MAX*2+2][2])
+{
+ int a;
+ for(a=0; a<totvert; a++) {
+ copy_v2_v2(quad_strip[a*2], wtb->outer_v[a]);
+ copy_v2_v2(quad_strip[a*2+1], wtb->inner_v[a]);
+ }
+ copy_v2_v2(quad_strip[a*2], wtb->outer_v[0]);
+ copy_v2_v2(quad_strip[a*2+1], wtb->inner_v[0]);
}
-static void widgetbase_outline(uiWidgetBase *wtb)
+static void widget_verts_to_quad_strip_open(uiWidgetBase *wtb, const int totvert, float quad_strip[WIDGET_SIZE_MAX*2][2])
{
int a;
-
- /* outline */
- glBegin(GL_QUAD_STRIP);
- for(a=0; a<wtb->totvert; a++) {
- glVertex2fv(wtb->outer_v[a]);
- glVertex2fv(wtb->inner_v[a]);
+ for(a=0; a<totvert; a++) {
+ quad_strip[a*2][0]= wtb->outer_v[a][0];
+ quad_strip[a*2][1]= wtb->outer_v[a][1];
+ quad_strip[a*2+1][0]= wtb->outer_v[a][0];
+ quad_strip[a*2+1][1]= wtb->outer_v[a][1] - 1.0f;
}
- glVertex2fv(wtb->outer_v[0]);
- glVertex2fv(wtb->inner_v[0]);
- glEnd();
+}
+
+static void widgetbase_outline(uiWidgetBase *wtb)
+{
+ float quad_strip[WIDGET_SIZE_MAX*2+2][2]; /* + 2 because the last pair is wrapped */
+ widget_verts_to_quad_strip(wtb, wtb->totvert, quad_strip);
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, quad_strip);
+ glDrawArrays(GL_QUAD_STRIP, 0, wtb->totvert*2 + 2);
+ glDisableClientState(GL_VERTEX_ARRAY);
}
static void widgetbase_draw(uiWidgetBase *wtb, uiWidgetColors *wcol)
@@ -626,100 +642,124 @@ static void widgetbase_draw(uiWidgetBase *wtb, uiWidgetColors *wcol)
if(wtb->inner) {
if(wcol->shaded==0) {
if (wcol->alpha_check) {
+ float inner_v_half[WIDGET_SIZE_MAX][2];
float x_mid= 0.0f; /* used for dumb clamping of values */
/* dark checkers */
glColor4ub(UI_TRANSP_DARK, UI_TRANSP_DARK, UI_TRANSP_DARK, 255);
- glBegin(GL_POLYGON);
- for(a=0; a<wtb->totvert; a++) {
- glVertex2fv(wtb->inner_v[a]);
- }
- glEnd();
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, wtb->inner_v);
+ glDrawArrays(GL_POLYGON, 0, wtb->totvert);
+ glDisableClientState(GL_VERTEX_ARRAY);
/* light checkers */
glEnable(GL_POLYGON_STIPPLE);
glColor4ub(UI_TRANSP_LIGHT, UI_TRANSP_LIGHT, UI_TRANSP_LIGHT, 255);
glPolygonStipple(checker_stipple_sml);
- glBegin(GL_POLYGON);
- for(a=0; a<wtb->totvert; a++) {
- glVertex2fv(wtb->inner_v[a]);
- }
- glEnd();
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, wtb->inner_v);
+ glDrawArrays(GL_POLYGON, 0, wtb->totvert);
+ glDisableClientState(GL_VERTEX_ARRAY);
+
glDisable(GL_POLYGON_STIPPLE);
/* alpha fill */
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor4ubv((unsigned char*)wcol->inner);
- glBegin(GL_POLYGON);
+ glEnableClientState(GL_VERTEX_ARRAY);
+
for(a=0; a<wtb->totvert; a++) {
- glVertex2fv(wtb->inner_v[a]);
x_mid += wtb->inner_v[a][0];
}
x_mid /= wtb->totvert;
- glEnd();
+
+ glVertexPointer(2, GL_FLOAT, 0, wtb->inner_v);
+ glDrawArrays(GL_POLYGON, 0, wtb->totvert);
+ glDisableClientState(GL_VERTEX_ARRAY);
/* 1/2 solid color */
glColor4ub(wcol->inner[0], wcol->inner[1], wcol->inner[2], 255);
- glBegin(GL_POLYGON);
- for(a=0; a<wtb->totvert; a++)
- glVertex2f(MIN2(wtb->inner_v[a][0], x_mid), wtb->inner_v[a][1]);
- glEnd();
+
+ for(a=0; a<wtb->totvert; a++) {
+ inner_v_half[a][0]= MIN2(wtb->inner_v[a][0], x_mid);
+ inner_v_half[a][1]= wtb->inner_v[a][1];
+ }
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, inner_v_half);
+ glDrawArrays(GL_POLYGON, 0, wtb->totvert);
+ glDisableClientState(GL_VERTEX_ARRAY);
}
else {
/* simple fill */
glColor4ubv((unsigned char*)wcol->inner);
- glBegin(GL_POLYGON);
- for(a=0; a<wtb->totvert; a++)
- glVertex2fv(wtb->inner_v[a]);
- glEnd();
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, wtb->inner_v);
+ glDrawArrays(GL_POLYGON, 0, wtb->totvert);
+ glDisableClientState(GL_VERTEX_ARRAY);
}
}
else {
char col1[4], col2[4];
+ unsigned char col_array[WIDGET_SIZE_MAX * 4];
+ unsigned char *col_pt= col_array;
shadecolors4(col1, col2, wcol->inner, wcol->shadetop, wcol->shadedown);
glShadeModel(GL_SMOOTH);
- glBegin(GL_POLYGON);
- for(a=0; a<wtb->totvert; a++) {
- round_box_shade_col4(col1, col2, wtb->inner_uv[a][wtb->shadedir]);
- glVertex2fv(wtb->inner_v[a]);
+ for(a=0; a<wtb->totvert; a++, col_pt += 4) {
+ round_box_shade_col4_r(col_pt, col1, col2, wtb->inner_uv[a][wtb->shadedir]);
}
- glEnd();
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_COLOR_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, wtb->inner_v);
+ glColorPointer(4, GL_UNSIGNED_BYTE, 0, col_array);
+ glDrawArrays(GL_POLYGON, 0, wtb->totvert);
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_COLOR_ARRAY);
+
glShadeModel(GL_FLAT);
}
}
/* for each AA step */
if(wtb->outline) {
+ float quad_strip[WIDGET_SIZE_MAX*2+2][2]; /* + 2 because the last pair is wrapped */
+ float quad_strip_emboss[WIDGET_SIZE_MAX*2][2]; /* only for emboss */
+
+ widget_verts_to_quad_strip(wtb, wtb->totvert, quad_strip);
+
+ if(wtb->emboss) {
+ widget_verts_to_quad_strip_open(wtb, wtb->halfwayvert, quad_strip_emboss);
+ }
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+
for(j=0; j<8; j++) {
glTranslatef(1.0f * jit[j][0], 1.0f * jit[j][1], 0.0f);
/* outline */
glColor4ub(wcol->outline[0], wcol->outline[1], wcol->outline[2], 32);
- glBegin(GL_QUAD_STRIP);
- for(a=0; a<wtb->totvert; a++) {
- glVertex2fv(wtb->outer_v[a]);
- glVertex2fv(wtb->inner_v[a]);
- }
- glVertex2fv(wtb->outer_v[0]);
- glVertex2fv(wtb->inner_v[0]);
- glEnd();
+
+ glVertexPointer(2, GL_FLOAT, 0, quad_strip);
+ glDrawArrays(GL_QUAD_STRIP, 0, wtb->totvert*2 + 2);
/* emboss bottom shadow */
if(wtb->emboss) {
glColor4f(1.0f, 1.0f, 1.0f, 0.02f);
- glBegin(GL_QUAD_STRIP);
- for(a=0; a<wtb->halfwayvert; a++) {
- glVertex2fv(wtb->outer_v[a]);
- glVertex2f(wtb->outer_v[a][0], wtb->outer_v[a][1]-1.0f);
- }
- glEnd();
+
+ glVertexPointer(2, GL_FLOAT, 0, quad_strip_emboss);
+ glDrawArrays(GL_QUAD_STRIP, 0, wtb->halfwayvert*2);
}
glTranslatef(-1.0f * jit[j][0], -1.0f * jit[j][1], 0.0f);
}
+
+ glDisableClientState(GL_VERTEX_ARRAY);
}
/* decoration */
@@ -1611,7 +1651,8 @@ static void widget_softshadow(rcti *rect, int roundboxalign, float radin, float
uiWidgetBase wtb;
rcti rect1= *rect;
float alpha, alphastep;
- int step, tot, a;
+ int step, totvert;
+ float quad_strip[WIDGET_SIZE_MAX*2][2];
/* prevent tooltips to not show round shadow */
if( 2.0f*radout > 0.2f*(rect1.ymax-rect1.ymin) )
@@ -1620,31 +1661,32 @@ static void widget_softshadow(rcti *rect, int roundboxalign, float radin, float
rect1.ymax -= 2.0f*radout;
/* inner part */
- tot= round_box_shadow_edges(wtb.inner_v, &rect1, radin, roundboxalign & 12, 0.0f);
-
+ totvert= round_box_shadow_edges(wtb.inner_v, &rect1, radin, roundboxalign & (UI_CNR_BOTTOM_RIGHT | UI_CNR_BOTTOM_LEFT), 0.0f);
+
/* inverse linear shadow alpha */
alpha= 0.15;
alphastep= 0.67;
+ glEnableClientState(GL_VERTEX_ARRAY);
+
for(step= 1; step<=radout; step++, alpha*=alphastep) {
- round_box_shadow_edges(wtb.outer_v, &rect1, radin, 15, (float)step);
+ round_box_shadow_edges(wtb.outer_v, &rect1, radin, UI_CNR_ALL, (float)step);
glColor4f(0.0f, 0.0f, 0.0f, alpha);
-
- glBegin(GL_QUAD_STRIP);
- for(a=0; a<tot; a++) {
- glVertex2fv(wtb.outer_v[a]);
- glVertex2fv(wtb.inner_v[a]);
- }
- glEnd();
+
+ widget_verts_to_quad_strip_open(&wtb, totvert, quad_strip);
+
+ glVertexPointer(2, GL_FLOAT, 0, quad_strip);
+ glDrawArrays(GL_QUAD_STRIP, 0, totvert*2);
}
-
+
+ glDisableClientState(GL_VERTEX_ARRAY);
}
static void widget_menu_back(uiWidgetColors *wcol, rcti *rect, int flag, int direction)
{
uiWidgetBase wtb;
- int roundboxalign= 15;
+ int roundboxalign= UI_CNR_ALL;
widget_init(&wtb);
@@ -1654,11 +1696,11 @@ static void widget_menu_back(uiWidgetColors *wcol, rcti *rect, int flag, int dir
//rect->ymax += 4.0;
}
else if (direction == UI_DOWN) {
- roundboxalign= 12;
+ roundboxalign= (UI_CNR_BOTTOM_RIGHT | UI_CNR_BOTTOM_LEFT);
rect->ymin -= 4.0;
}
else if (direction == UI_TOP) {
- roundboxalign= 3;
+ roundboxalign= UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT;
rect->ymax += 4.0;
}
@@ -2008,7 +2050,7 @@ static void ui_draw_but_HSV_v(uiBut *but, rcti *rect)
widget_init(&wtb);
/* fully rounded */
- round_box_edges(&wtb, 15, rect, rad);
+ round_box_edges(&wtb, UI_CNR_ALL, rect, rad);
/* setup temp colors */
wcol_tmp.outline[0]= wcol_tmp.outline[1]= wcol_tmp.outline[2]= 0;
@@ -2107,17 +2149,15 @@ void ui_draw_link_bezier(rcti *rect)
if(ui_link_bezier_points(rect, coord_array, LINK_RESOL)) {
/* we can reuse the dist variable here to increment the GL curve eval amount*/
// const float dist= 1.0f/(float)LINK_RESOL; // UNUSED
- int i;
glEnable(GL_BLEND);
glEnable(GL_LINE_SMOOTH);
-
- glBegin(GL_LINE_STRIP);
- for(i=0; i<=LINK_RESOL; i++) {
- glVertex2fv(coord_array[i]);
- }
- glEnd();
-
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, coord_array);
+ glDrawArrays(GL_LINE_STRIP, 0, LINK_RESOL);
+ glDisableClientState(GL_VERTEX_ARRAY);
+
glDisable(GL_BLEND);
glDisable(GL_LINE_SMOOTH);
@@ -2148,7 +2188,7 @@ void uiWidgetScrollDraw(uiWidgetColors *wcol, rcti *rect, rcti *slider, int stat
if(horizontal)
SWAP(short, wcol->shadetop, wcol->shadedown);
- round_box_edges(&wtb, 15, rect, rad);
+ round_box_edges(&wtb, UI_CNR_ALL, rect, rad);
widgetbase_draw(&wtb, wcol);
/* slider */
@@ -2176,7 +2216,7 @@ void uiWidgetScrollDraw(uiWidgetColors *wcol, rcti *rect, rcti *slider, int stat
if (state & UI_SCROLL_NO_OUTLINE)
SWAP(short, outline, wtb.outline);
- round_box_edges(&wtb, 15, slider, rad);
+ round_box_edges(&wtb, UI_CNR_ALL, slider, rad);
if(state & UI_SCROLL_ARROWS) {
if(wcol->item[0] > 48) wcol->item[0]-= 48;
@@ -2343,7 +2383,7 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s
/* left part of slider, always rounded */
rect1.xmax= rect1.xmin + ceil(offs+1.0f);
- round_box_edges(&wtb1, roundboxalign & ~6, &rect1, offs);
+ round_box_edges(&wtb1, roundboxalign & ~(UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_RIGHT), &rect1, offs);
wtb1.outline= 0;
widgetbase_draw(&wtb1, wcol);
@@ -2354,7 +2394,7 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s
offs*= (rect1.xmax + offs - rect->xmax)/offs;
else
offs= 0.0f;
- round_box_edges(&wtb1, roundboxalign & ~9, &rect1, offs);
+ round_box_edges(&wtb1, roundboxalign & ~(UI_CNR_TOP_LEFT | UI_CNR_BOTTOM_LEFT), &rect1, offs);
widgetbase_draw(&wtb1, wcol);
VECCOPY(wcol->outline, outline);
@@ -2436,7 +2476,7 @@ static void widget_icon_has_anim(uiBut *UNUSED(but), uiWidgetColors *wcol, rcti
wtb.outline= 0;
/* rounded */
- round_box_edges(&wtb, 15, rect, 10.0f);
+ round_box_edges(&wtb, UI_CNR_ALL, rect, 10.0f);
widgetbase_draw(&wtb, wcol);
}
}
@@ -2499,7 +2539,7 @@ static void widget_pulldownbut(uiWidgetColors *wcol, rcti *rect, int state, int
widget_init(&wtb);
/* half rounded */
- round_box_edges(&wtb, 15, rect, rad);
+ round_box_edges(&wtb, UI_CNR_ALL, rect, rad);
widgetbase_draw(&wtb, wcol);
}
@@ -2526,7 +2566,7 @@ static void widget_list_itembut(uiWidgetColors *wcol, rcti *rect, int UNUSED(sta
/* rounded, but no outline */
wtb.outline= 0;
- round_box_edges(&wtb, 15, rect, 4.0f);
+ round_box_edges(&wtb, UI_CNR_ALL, rect, 4.0f);
widgetbase_draw(&wtb, wcol);
}
@@ -2550,7 +2590,7 @@ static void widget_optionbut(uiWidgetColors *wcol, rcti *rect, int state, int UN
recttemp.ymax-= delta;
/* half rounded */
- round_box_edges(&wtb, 15, &recttemp, 4.0f);
+ round_box_edges(&wtb, UI_CNR_ALL, &recttemp, 4.0f);
/* decoration */
if(state & UI_SELECT) {
@@ -2650,12 +2690,12 @@ static void widget_draw_extra_mask(const bContext *C, uiBut *but, uiWidgetType *
UI_GetThemeColor3ubv(TH_BACK, col);
glColor3ubv(col);
- round_box__edges(&wtb, 15, rect, 0.0f, 4.0);
+ round_box__edges(&wtb, UI_CNR_ALL, rect, 0.0f, 4.0);
widgetbase_outline(&wtb);
}
/* outline */
- round_box_edges(&wtb, 15, rect, 5.0f);
+ round_box_edges(&wtb, UI_CNR_ALL, rect, 5.0f);
wtb.outline= 1;
wtb.inner= 0;
widgetbase_draw(&wtb, &wt->wcol);
@@ -2836,37 +2876,27 @@ static int widget_roundbox_set(uiBut *but, rcti *rect)
switch(but->flag & UI_BUT_ALIGN) {
case UI_BUT_ALIGN_TOP:
- return (12);
- break;
+ return UI_CNR_BOTTOM_LEFT | UI_CNR_BOTTOM_RIGHT;
case UI_BUT_ALIGN_DOWN:
- return (3);
- break;
+ return UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT;
case UI_BUT_ALIGN_LEFT:
- return (6);
- break;
+ return UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_RIGHT;
case UI_BUT_ALIGN_RIGHT:
- return (9);
- break;
-
- case UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_RIGHT:
- return (1);
- break;
- case UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_LEFT:
- return (2);
- break;
- case UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_RIGHT:
- return (8);
- break;
- case UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_LEFT:
- return (4);
- break;
-
+ return UI_CNR_TOP_LEFT | UI_CNR_BOTTOM_LEFT;
+ case UI_BUT_ALIGN_DOWN | UI_BUT_ALIGN_RIGHT:
+ return UI_CNR_TOP_LEFT;
+ case UI_BUT_ALIGN_DOWN | UI_BUT_ALIGN_LEFT:
+ return UI_CNR_TOP_RIGHT;
+ case UI_BUT_ALIGN_TOP | UI_BUT_ALIGN_RIGHT:
+ return UI_CNR_BOTTOM_LEFT;
+ case UI_BUT_ALIGN_TOP | UI_BUT_ALIGN_LEFT:
+ return UI_CNR_BOTTOM_RIGHT;
default:
- return (0);
- break;
+ return 0;
}
- }
- return 15;
+ }
+
+ return UI_CNR_ALL;
}
/* conversion from old to new buttons, so still messy */
@@ -3104,14 +3134,14 @@ void ui_draw_search_back(uiStyle *UNUSED(style), uiBlock *block, rcti *rect)
uiWidgetType *wt= widget_type(UI_WTYPE_BOX);
glEnable(GL_BLEND);
- widget_softshadow(rect, 15, 5.0f, 8.0f);
+ widget_softshadow(rect, UI_CNR_ALL, 5.0f, 8.0f);
glDisable(GL_BLEND);
wt->state(wt, 0);
if(block)
- wt->draw(&wt->wcol, rect, block->flag, 15);
+ wt->draw(&wt->wcol, rect, block->flag, UI_CNR_ALL);
else
- wt->draw(&wt->wcol, rect, 0, 15);
+ wt->draw(&wt->wcol, rect, 0, UI_CNR_ALL);
}
diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c
index 692c8940a21..9b9237f70cf 100644
--- a/source/blender/editors/interface/resources.c
+++ b/source/blender/editors/interface/resources.c
@@ -1039,6 +1039,23 @@ void UI_ColorPtrBlendShade3ubv(const unsigned char cp1[3], const unsigned char c
glColor3ub(r, g, b);
}
+void UI_GetColorPtrShade3ubv(const unsigned char cp[3], unsigned char col[3], int offset)
+{
+ int r, g, b;
+
+ r= offset+(int)cp[0];
+ g= offset+(int)cp[1];
+ b= offset+(int)cp[2];
+
+ CLAMP(r, 0, 255);
+ CLAMP(g, 0, 255);
+ CLAMP(b, 0, 255);
+
+ col[0] = r;
+ col[1] = g;
+ col[2] = b;
+}
+
// get a 3 byte color, blended and shaded between two other char color pointers
void UI_GetColorPtrBlendShade3ubv(const unsigned char cp1[3], const unsigned char cp2[3], unsigned char col[3], float fac, int offset)
{
diff --git a/source/blender/editors/mesh/editmesh.c b/source/blender/editors/mesh/editmesh.c
index 0abd758460c..d6e451a8625 100644
--- a/source/blender/editors/mesh/editmesh.c
+++ b/source/blender/editors/mesh/editmesh.c
@@ -1101,7 +1101,7 @@ void load_editMesh(Scene *scene, Object *obedit)
int j;
for (ob=G.main->object.first; ob; ob=ob->id.next) {
- if (ob->parent==ob && ELEM(ob->partype, PARVERT1,PARVERT3)) {
+ if (ob->parent==obedit && ELEM(ob->partype, PARVERT1,PARVERT3)) {
/* duplicate code from below, make it function later...? */
if (!vertMap) {
@@ -1661,8 +1661,8 @@ static void *editMesh_to_undoMesh(void *emv)
/* now copy vertices */
a = 0;
for(eve=em->verts.first; eve; eve= eve->next, evec++, a++) {
- VECCOPY(evec->co, eve->co);
- VECCOPY(evec->no, eve->no);
+ copy_v3_v3(evec->co, eve->co);
+ copy_v3_v3(evec->no, eve->no);
evec->f= eve->f;
evec->h= eve->h;
@@ -1763,7 +1763,7 @@ static void undoMesh_to_editMesh(void *umv, void *emv)
eve= addvertlist(em, evec->co, NULL);
evar[a]= eve;
- VECCOPY(eve->no, evec->no);
+ copy_v3_v3(eve->no, evec->no);
eve->f= evec->f;
eve->h= evec->h;
eve->keyindex= evec->keyindex;
diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c
index d81a7cd8233..f29c0857dc1 100644
--- a/source/blender/editors/mesh/editmesh_add.c
+++ b/source/blender/editors/mesh/editmesh_add.c
@@ -212,7 +212,7 @@ static int dupli_extrude_cursor(bContext *C, wmOperator *op, wmEvent *event)
copy_v3_v3(vec, min);
normalize_v3(vec);
- dot= INPR(vec, nor);
+ dot= dot_v3v3(vec, nor);
if( fabs(dot)<0.999) {
float cross[3], si, q1[4];
@@ -1488,9 +1488,9 @@ void MESH_OT_primitive_circle_add(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */
- RNA_def_int(ot->srna, "vertices", 32, INT_MIN, INT_MAX, _("Vertices"), "", 3, 500);
+ RNA_def_int(ot->srna, "vertices", 32, 3, INT_MAX, _("Vertices"), "", 3, 500);
RNA_def_float(ot->srna, "radius", 1.0f, 0.0, FLT_MAX, _("Radius"), "", 0.001, 100.00);
- RNA_def_boolean(ot->srna, "fill", 0, _("Fill"), "");
+ RNA_def_boolean(ot->srna, "fill", 0, "Fill", "");
ED_object_add_generic_props(ot, TRUE);
}
@@ -1529,7 +1529,7 @@ void MESH_OT_primitive_cylinder_add(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */
- RNA_def_int(ot->srna, "vertices", 32, INT_MIN, INT_MAX, _("Vertices"), "", 2, 500);
+ RNA_def_int(ot->srna, "vertices", 32, 2, INT_MAX, _("Vertices"), "", 2, 500);
RNA_def_float(ot->srna, "radius", 1.0f, 0.0, FLT_MAX, _("Radius"), "", 0.001, 100.00);
RNA_def_float(ot->srna, "depth", 2.0f, 0.0, FLT_MAX, _("Depth"), "", 0.001, 100.00);
RNA_def_boolean(ot->srna, "cap_ends", 1, _("Cap Ends"), "");
@@ -1570,7 +1570,7 @@ void MESH_OT_primitive_cone_add(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */
- RNA_def_int(ot->srna, "vertices", 32, INT_MIN, INT_MAX, _("Vertices"), "", 2, 500);
+ RNA_def_int(ot->srna, "vertices", 32, 2, INT_MAX, _("Vertices"), "", 2, 500);
RNA_def_float(ot->srna, "radius", 1.0f, 0.0, FLT_MAX, _("Radius"), "", 0.001, 100.00);
RNA_def_float(ot->srna, "depth", 2.0f, 0.0, FLT_MAX, _("Depth"), "", 0.001, 100.00);
RNA_def_boolean(ot->srna, "cap_end", 1, _("Cap End"), "");
@@ -1611,8 +1611,8 @@ void MESH_OT_primitive_grid_add(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */
- RNA_def_int(ot->srna, "x_subdivisions", 10, INT_MIN, INT_MAX, _("X Subdivisions"), "", 3, 1000);
- RNA_def_int(ot->srna, "y_subdivisions", 10, INT_MIN, INT_MAX, _("Y Subdivisions"), "", 3, 1000);
+ RNA_def_int(ot->srna, "x_subdivisions", 10, 3, INT_MAX, _("X Subdivisions"), "", 3, 1000);
+ RNA_def_int(ot->srna, "y_subdivisions", 10, 3, INT_MAX, _("Y Subdivisions"), "", 3, 1000);
RNA_def_float(ot->srna, "size", 1.0f, 0.0, FLT_MAX, _("Size"), "", 0.001, FLT_MAX);
ED_object_add_generic_props(ot, TRUE);
@@ -1684,8 +1684,8 @@ void MESH_OT_primitive_uv_sphere_add(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */
- RNA_def_int(ot->srna, "segments", 32, INT_MIN, INT_MAX, _("Segments"), "", 3, 500);
- RNA_def_int(ot->srna, "ring_count", 16, INT_MIN, INT_MAX, _("Rings"), "", 3, 500);
+ RNA_def_int(ot->srna, "segments", 32, 3, INT_MAX, _("Segments"), "", 3, 500);
+ RNA_def_int(ot->srna, "ring_count", 16, 3, INT_MAX, _("Rings"), "", 3, 500);
RNA_def_float(ot->srna, "size", 1.0f, 0.0, FLT_MAX, _("Size"), "", 0.001, 100.00);
ED_object_add_generic_props(ot, TRUE);
@@ -1723,7 +1723,7 @@ void MESH_OT_primitive_ico_sphere_add(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */
- RNA_def_int(ot->srna, "subdivisions", 2, 0, INT_MAX, _("Subdivisions"), "", 0, 8);
+ RNA_def_int(ot->srna, "subdivisions", 2, 1, INT_MAX, _("Subdivisions"), "", 1, 8);
RNA_def_float(ot->srna, "size", 1.0f, 0.0f, FLT_MAX, _("Size"), "", 0.001f, 100.00);
ED_object_add_generic_props(ot, TRUE);
diff --git a/source/blender/editors/mesh/editmesh_lib.c b/source/blender/editors/mesh/editmesh_lib.c
index 0afa2d01702..02b5250f67a 100644
--- a/source/blender/editors/mesh/editmesh_lib.c
+++ b/source/blender/editors/mesh/editmesh_lib.c
@@ -1002,7 +1002,7 @@ void EM_free_data_layer(EditMesh *em, CustomData *data, int type)
static void add_normal_aligned(float *nor, float *add)
{
- if( INPR(nor, add) < -0.9999f)
+ if(dot_v3v3(nor, add) < -0.9999f)
sub_v3_v3(nor, add);
else
add_v3_v3(nor, add);
@@ -1096,13 +1096,13 @@ short extrudeflag_face_indiv(EditMesh *em, short UNUSED(flag), float *UNUSED(nor
v3= addvertlist(em, efa->v3->co, efa->v3);
v1->f1= v2->f1= v3->f1= 1;
- VECCOPY(v1->no, efa->n);
- VECCOPY(v2->no, efa->n);
- VECCOPY(v3->no, efa->n);
+ copy_v3_v3(v1->no, efa->n);
+ copy_v3_v3(v2->no, efa->n);
+ copy_v3_v3(v3->no, efa->n);
if(efa->v4) {
v4= addvertlist(em, efa->v4->co, efa->v4);
v4->f1= 1;
- VECCOPY(v4->no, efa->n);
+ copy_v3_v3(v4->no, efa->n);
}
else v4= NULL;
@@ -1310,7 +1310,7 @@ static short extrudeflag_edge(Object *obedit, EditMesh *em, short UNUSED(flag),
* of the cases above to handle edges on the line of symmetry.
*/
for (; md; md=md->next) {
- if (md->type==eModifierType_Mirror) {
+ if ((md->type==eModifierType_Mirror) && (md->mode & eModifierMode_Realtime)) {
MirrorModifierData *mmd = (MirrorModifierData*) md;
if(mmd->flag & MOD_MIR_CLIPPING) {
@@ -1597,7 +1597,7 @@ short extrudeflag_vert(Object *obedit, EditMesh *em, short flag, float *nor, int
* of the cases above to handle edges on the line of symmetry.
*/
for (; md; md=md->next) {
- if (md->type==eModifierType_Mirror) {
+ if ((md->type==eModifierType_Mirror) && (md->mode & eModifierMode_Realtime)) {
MirrorModifierData *mmd = (MirrorModifierData*) md;
if(mmd->flag & MOD_MIR_CLIPPING) {
@@ -1648,8 +1648,8 @@ short extrudeflag_vert(Object *obedit, EditMesh *em, short flag, float *nor, int
sel= 1;
v1= addvertlist(em, 0, NULL);
- VECCOPY(v1->co, eve->co);
- VECCOPY(v1->no, eve->no);
+ copy_v3_v3(v1->co, eve->co);
+ copy_v3_v3(v1->no, eve->no);
v1->f= eve->f;
eve->f &= ~flag;
eve->tmp.v = v1;
@@ -2482,7 +2482,7 @@ void EM_make_hq_normals(EditMesh *em)
/* only one face attached to that edge */
/* an edge without another attached- the weight on this is
* undefined, M_PI/2 is 90d in radians and that seems good enough */
- VECCOPY(edge_normal, EM_get_face_for_index(edge_ref->f1)->n)
+ copy_v3_v3(edge_normal, EM_get_face_for_index(edge_ref->f1)->n);
mul_v3_fl(edge_normal, M_PI/2);
}
add_v3_v3(EM_get_vert_for_index(ed_v1)->no, edge_normal );
@@ -2499,7 +2499,7 @@ void EM_make_hq_normals(EditMesh *em)
if(normalize_v3(eve->no) == 0.0f && eve->tmp.l < 0) {
/* exceptional case, totally flat */
efa= EM_get_face_for_index(-(eve->tmp.l) - 1);
- VECCOPY(eve->no, efa->n);
+ copy_v3_v3(eve->no, efa->n);
}
}
diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c
index ccb476514de..945907073cf 100644
--- a/source/blender/editors/mesh/editmesh_mods.c
+++ b/source/blender/editors/mesh/editmesh_mods.c
@@ -829,7 +829,7 @@ static int similar_face_select__internal(EditMesh *em, int mode, float thresh)
float angle;
for(efa= em->faces.first; efa; efa= efa->next) {
if (!(efa->f & SELECT) && !efa->h) {
- angle= RAD2DEGF(angle_v2v2(base_efa->n, efa->n));
+ angle= RAD2DEGF(angle_v3v3(base_efa->n, efa->n));
if (angle/180.0f<=thresh) {
EM_select_face(efa, 1);
selcount++;
@@ -844,7 +844,7 @@ static int similar_face_select__internal(EditMesh *em, int mode, float thresh)
base_dot= dot_v3v3(base_efa->cent, base_efa->n);
for(efa= em->faces.first; efa; efa= efa->next) {
if (!(efa->f & SELECT) && !efa->h) {
- angle= RAD2DEGF(angle_v2v2(base_efa->n, efa->n));
+ angle= RAD2DEGF(angle_v3v3(base_efa->n, efa->n));
if (angle/180.0f<=thresh) {
dot=dot_v3v3(efa->cent, base_efa->n);
if (fabsf(base_dot-dot) <= thresh) {
@@ -961,7 +961,7 @@ static int similar_edge_select__internal(EditMesh *em, int mode, float thresh)
else if (eed->f2==0) /* first access, assign the face */
eed->tmp.f= efa;
else if (eed->f2==1) /* second, we assign the angle*/
- eed->tmp.fp= RAD2DEGF(angle_v2v2(eed->tmp.f->n, efa->n))/180;
+ eed->tmp.fp= RAD2DEGF(angle_v3v3(eed->tmp.f->n, efa->n))/180;
eed->f2++; /* f2==0 no face assigned. f2==1 one face found. f2==2 angle calculated.*/
}
j++;
@@ -991,7 +991,7 @@ static int similar_edge_select__internal(EditMesh *em, int mode, float thresh)
for(eed= em->edges.first; eed; eed= eed->next) {
if (!(eed->f & SELECT) && !eed->h) {
sub_v3_v3v3(dir, eed->v1->co, eed->v2->co);
- angle= RAD2DEGF(angle_v2v2(base_dir, dir));
+ angle= RAD2DEGF(angle_v3v3(base_dir, dir));
if (angle>90.0f) /* use the smallest angle between the edges */
angle= fabsf(angle-180.0f);
@@ -1088,7 +1088,7 @@ static int similar_edge_select_exec(bContext *C, wmOperator *op)
Mesh *me= obedit->data;
EditMesh *em= BKE_mesh_get_editmesh(me);
- int selcount = similar_edge_select__internal(em, RNA_int_get(op->ptr, "type"), RNA_float_get(op->ptr, "threshold"));
+ int selcount = similar_edge_select__internal(em, RNA_enum_get(op->ptr, "type"), RNA_float_get(op->ptr, "threshold"));
if (selcount) {
/* here was an edge-mode only select flush case, has to be generalized */
@@ -1161,7 +1161,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
float angle;
for(eve= em->verts.first; eve; eve= eve->next) {
if (!(eve->f & SELECT) && !eve->h) {
- angle= RAD2DEGF(angle_v2v2(base_eve->no, eve->no));
+ angle= RAD2DEGF(angle_v3v3(base_eve->no, eve->no));
if (angle/180.0f<=thresh) {
eve->f |= SELECT;
selcount++;
@@ -4150,7 +4150,7 @@ static int smooth_vertex(bContext *C, wmOperator *op)
* are within tolerance of the plane(s) of reflection
*/
for(md=obedit->modifiers.first; md; md=md->next) {
- if(md->type==eModifierType_Mirror) {
+ if((md->type==eModifierType_Mirror) && (md->mode & eModifierMode_Realtime)) {
MirrorModifierData *mmd = (MirrorModifierData*) md;
if(mmd->flag & MOD_MIR_CLIPPING) {
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index bc2ea4fea13..44412062be3 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -1469,8 +1469,8 @@ static void alter_co(float *co, EditEdge *edge, float smooth, float fractal, int
sub_v3_v3v3(nor, edge->v1->co, edge->v2->co);
len= 0.5f*normalize_v3(nor);
- VECCOPY(nor1, edge->v1->no);
- VECCOPY(nor2, edge->v2->no);
+ copy_v3_v3(nor1, edge->v1->no);
+ copy_v3_v3(nor2, edge->v2->no);
/* cosine angle */
fac= nor[0]*nor1[0] + nor[1]*nor1[1] + nor[2]*nor1[2] ;
@@ -2678,7 +2678,7 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float smooth, float
}
for (; md; md=md->next) {
- if (md->type==eModifierType_Mirror) {
+ if ((md->type==eModifierType_Mirror) && (md->mode & eModifierMode_Realtime)) {
MirrorModifierData *mmd = (MirrorModifierData*) md;
if(mmd->flag & MOD_MIR_CLIPPING) {
@@ -3237,13 +3237,13 @@ static float measure_facepair(EditVert *v1, EditVert *v2, EditVert *v3, EditVert
normal_tri_v3( noA2,v1->co, v3->co, v4->co);
if(noA1[0] == noA2[0] && noA1[1] == noA2[1] && noA1[2] == noA2[2]) normalADiff = 0.0;
- else normalADiff = RAD2DEGF(angle_v2v2(noA1, noA2));
+ else normalADiff = RAD2DEGF(angle_v3v3(noA1, noA2));
//if(!normalADiff) normalADiff = 179;
normal_tri_v3( noB1,v2->co, v3->co, v4->co);
normal_tri_v3( noB2,v4->co, v1->co, v2->co);
if(noB1[0] == noB2[0] && noB1[1] == noB2[1] && noB1[2] == noB2[2]) normalBDiff = 0.0;
- else normalBDiff = RAD2DEGF(angle_v2v2(noB1, noB2));
+ else normalBDiff = RAD2DEGF(angle_v3v3(noB1, noB2));
//if(!normalBDiff) normalBDiff = 179;
measure += (normalADiff/360) + (normalBDiff/360);
@@ -3258,10 +3258,10 @@ static float measure_facepair(EditVert *v1, EditVert *v2, EditVert *v3, EditVert
diff = 0.0;
diff = (
- fabsf(RAD2DEGF(angle_v2v2(edgeVec1, edgeVec2)) - 90) +
- fabsf(RAD2DEGF(angle_v2v2(edgeVec2, edgeVec3)) - 90) +
- fabsf(RAD2DEGF(angle_v2v2(edgeVec3, edgeVec4)) - 90) +
- fabsf(RAD2DEGF(angle_v2v2(edgeVec4, edgeVec1)) - 90)) / 360;
+ fabsf(RAD2DEGF(angle_v3v3(edgeVec1, edgeVec2)) - 90) +
+ fabsf(RAD2DEGF(angle_v3v3(edgeVec2, edgeVec3)) - 90) +
+ fabsf(RAD2DEGF(angle_v3v3(edgeVec3, edgeVec4)) - 90) +
+ fabsf(RAD2DEGF(angle_v3v3(edgeVec4, edgeVec1)) - 90)) / 360;
if(!diff) return 0.0;
measure += diff;
@@ -4872,7 +4872,7 @@ void mesh_set_face_flags(EditMesh *em, short mode)
/* helper to find edge for edge_rip */
static float mesh_rip_edgedist(ARegion *ar, float mat[][4], float *co1, float *co2, const int mval[2])
{
- float vec1[3], vec2[3], mvalf[2];
+ float vec1[2], vec2[2], mvalf[2];
ED_view3d_project_float(ar, co1, vec1, mat);
ED_view3d_project_float(ar, co2, vec2, mat);
diff --git a/source/blender/editors/object/CMakeLists.txt b/source/blender/editors/object/CMakeLists.txt
index ff542701a68..da6b8d997d4 100644
--- a/source/blender/editors/object/CMakeLists.txt
+++ b/source/blender/editors/object/CMakeLists.txt
@@ -59,8 +59,22 @@ set(SRC
object_intern.h
)
+if(WITH_GAMEENGINE)
+ list(APPEND INC
+ ../../../../extern/recastnavigation/Recast/Include
+ )
+
+ list(APPEND SRC
+ object_navmesh.cpp
+ )
+endif()
+
if(WITH_PYTHON)
add_definitions(-DWITH_PYTHON)
endif()
+if(WITH_GAMEENGINE)
+ add_definitions(-DWITH_GAMEENGINE)
+endif()
+
blender_add_lib(bf_editor_object "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/blender/editors/object/SConscript b/source/blender/editors/object/SConscript
index 57b5249312f..ba52d1a0edd 100644
--- a/source/blender/editors/object/SConscript
+++ b/source/blender/editors/object/SConscript
@@ -1,12 +1,13 @@
#!/usr/bin/python
Import ('env')
-sources = env.Glob('*.c')
+sources = env.Glob('*.c') + env.Glob('*.cpp')
incs = '../include ../../blenfont ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc ../../blenloader'
incs += ' ../../makesrna ../../python ../../ikplugin'
incs += ' ../../render/extern/include ../../gpu' # for object_bake.c
+incs += ' #extern/recastnavigation/Recast/Include'
defs = []
@@ -19,5 +20,8 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
if env['WITH_BF_PYTHON']:
defs.append('WITH_PYTHON')
+
+if env['WITH_BF_GAMEENGINE']:
+ defs.append('WITH_GAMEENGINE')
env.BlenderLib ( 'bf_editors_object', sources, Split(incs), defs, libtype=['core'], priority=[35] )
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index 0c01ca6632f..a520536f452 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -402,7 +402,7 @@ static Object *effector_add_type(bContext *C, wmOperator *op, int type)
((Curve*)ob->data)->flag |= CU_PATH|CU_3D;
ED_object_enter_editmode(C, 0);
ED_object_new_primitive_matrix(C, ob, loc, rot, mat);
- BLI_addtail(curve_get_editcurve(ob), add_nurbs_primitive(C, mat, CU_NURBS|CU_PRIM_PATH, 1));
+ BLI_addtail(object_editcurve_get(ob), add_nurbs_primitive(C, mat, CU_NURBS|CU_PRIM_PATH, 1));
if(!enter_editmode)
ED_object_exit_editmode(C, EM_FREEDATA);
diff --git a/source/blender/editors/object/object_constraint.c b/source/blender/editors/object/object_constraint.c
index 0b336709e20..5a30c099592 100644
--- a/source/blender/editors/object/object_constraint.c
+++ b/source/blender/editors/object/object_constraint.c
@@ -989,7 +989,7 @@ static int pose_constraints_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
/* free constraints for all selected bones */
CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones)
@@ -1425,7 +1425,7 @@ static int object_constraint_add_exec(bContext *C, wmOperator *op)
/* dummy operator callback */
static int pose_constraint_add_exec(bContext *C, wmOperator *op)
{
- Object *ob= ED_object_pose_armature(ED_object_active_context(C));
+ Object *ob= object_pose_armature_get(ED_object_active_context(C));
int type= RNA_enum_get(op->ptr, "type");
short with_targets= 0;
@@ -1528,7 +1528,7 @@ void POSE_OT_constraint_add_with_targets(wmOperatorType *ot)
/* present menu with options + validation for targets to use */
static int pose_ik_add_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(evt))
{
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
bPoseChannel *pchan= get_active_posechannel(ob);
bConstraint *con= NULL;
@@ -1612,7 +1612,7 @@ void POSE_OT_ik_add(wmOperatorType *ot)
/* remove IK constraints from selected bones */
static int pose_ik_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ Object *ob= object_pose_armature_get(CTX_data_active_object(C));
/* only remove IK Constraints */
CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones)
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index d47b4ce7d28..355f55e3546 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -1413,6 +1413,8 @@ static int forcefield_toggle_exec(bContext *C, wmOperator *UNUSED(op))
else
ob->pd->forcefield = 0;
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, NULL);
+
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c
index bb32869469a..fd4581af194 100644
--- a/source/blender/editors/object/object_hook.c
+++ b/source/blender/editors/object/object_hook.c
@@ -217,7 +217,7 @@ static void select_editlattice_hook(Object *obedit, HookModifierData *hmd)
static int return_editcurve_indexar(Object *obedit, int *tot, int **indexar, float *cent)
{
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
Nurb *nu;
BPoint *bp;
BezTriple *bezt;
@@ -329,7 +329,7 @@ static int object_hook_index_array(Object *obedit, int *tot, int **indexar, char
static void select_editcurve_hook(Object *obedit, HookModifierData *hmd)
{
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
Nurb *nu;
BPoint *bp;
BezTriple *bezt;
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index c308d36f838..3da0723ec18 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -223,5 +223,10 @@ void OBJECT_OT_group_remove(struct wmOperatorType *ot);
/* object_bake.c */
void OBJECT_OT_bake_image(wmOperatorType *ot);
+/* object_navmesh.cpp */
+void OBJECT_OT_create_navmesh(struct wmOperatorType *ot);
+void OBJECT_OT_assign_navpolygon(struct wmOperatorType *ot);
+void OBJECT_OT_assign_new_navpolygon(struct wmOperatorType *ot);
+
#endif /* ED_OBJECT_INTERN_H */
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 9840f0f306d..2daf4a542c4 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -1068,7 +1068,12 @@ static int multires_reshape_exec(bContext *C, wmOperator *op)
if (!mmd)
return OPERATOR_CANCELLED;
-
+
+ if(mmd->lvl==0) {
+ BKE_report(op->reports, RPT_ERROR, "Reshape can work only with higher levels of subdivisions.");
+ return OPERATOR_CANCELLED;
+ }
+
CTX_DATA_BEGIN(C, Object*, selob, selected_editable_objects) {
if(selob->type == OB_MESH && selob != ob) {
secondob= selob;
diff --git a/source/blender/editors/object/object_navmesh.cpp b/source/blender/editors/object/object_navmesh.cpp
new file mode 100644
index 00000000000..d0768d30236
--- /dev/null
+++ b/source/blender/editors/object/object_navmesh.cpp
@@ -0,0 +1,628 @@
+/**
+* $Id$
+*
+* ***** BEGIN GPL LICENSE BLOCK *****
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+* The Original Code is Copyright (C) 2004 by Blender Foundation
+* All rights reserved.
+*
+* The Original Code is: all of this file.
+*
+* Contributor(s): none yet.
+*
+* ***** END GPL LICENSE BLOCK *****
+*/
+
+#include <math.h>
+#include "Recast.h"
+
+extern "C"
+{
+#include "MEM_guardedalloc.h"
+
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_ID.h"
+
+#include "BKE_library.h"
+#include "BKE_depsgraph.h"
+#include "BKE_context.h"
+#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_scene.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_cdderivedmesh.h"
+#include "BLI_editVert.h"
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
+#include "ED_object.h"
+#include "BLI_math_vector.h"
+
+#include "RNA_access.h"
+
+#include "ED_mesh.h"
+
+/*mesh/mesh_intern.h */
+extern struct EditVert *addvertlist(EditMesh *em, float *vec, struct EditVert *example);
+extern struct EditFace *addfacelist(EditMesh *em, struct EditVert *v1, struct EditVert *v2, struct EditVert *v3, struct EditVert *v4, struct EditFace *example, struct EditFace *exampleEdges);
+extern void free_vertlist(EditMesh *em, ListBase *edve);
+extern void free_edgelist(EditMesh *em, ListBase *lb);
+extern void free_facelist(EditMesh *em, ListBase *lb);
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+static void createVertsTrisData(bContext *C, LinkNode* obs, int& nverts, float*& verts, int &ntris, int*& tris)
+{
+ MVert *mvert;
+ int nfaces = 0, *tri, i, curnverts, basenverts, curnfaces;
+ MFace *mface;
+ float co[3], wco[3];
+ Object *ob;
+ LinkNode *oblink, *dmlink;
+ DerivedMesh *dm;
+ Scene* scene = CTX_data_scene(C);
+ LinkNode* dms = NULL;
+
+ nverts = 0;
+ ntris = 0;
+ //calculate number of verts and tris
+ for (oblink = obs; oblink; oblink = oblink->next)
+ {
+ ob = (Object*) oblink->link;
+ DerivedMesh *dm = mesh_create_derived_no_virtual(scene, ob, NULL, CD_MASK_MESH);
+ BLI_linklist_append(&dms, (void*)dm);
+
+ nverts += dm->getNumVerts(dm);
+ nfaces = dm->getNumFaces(dm);
+ ntris += nfaces;
+
+ //resolve quad faces
+ mface = dm->getFaceArray(dm);
+ for (i=0; i<nfaces; i++)
+ {
+ MFace* mf = &mface[i];
+ if (mf->v4)
+ ntris+=1;
+ }
+ }
+
+ //create data
+ verts = (float*) MEM_mallocN(sizeof(float)*3*nverts, "verts");
+ tris = (int*) MEM_mallocN(sizeof(int)*3*ntris, "faces");
+
+ basenverts = 0;
+ tri = tris;
+ for (oblink = obs, dmlink = dms; oblink && dmlink;
+ oblink = oblink->next, dmlink = dmlink->next)
+ {
+ ob = (Object*) oblink->link;
+ dm = (DerivedMesh*) dmlink->link;
+
+ curnverts = dm->getNumVerts(dm);
+ mvert = dm->getVertArray(dm);
+ //copy verts
+ for (i=0; i<curnverts; i++)
+ {
+ MVert *v = &mvert[i];
+ copy_v3_v3(co, v->co);
+ mul_v3_m4v3(wco, ob->obmat, co);
+ verts[3*(basenverts+i)+0] = wco[0];
+ verts[3*(basenverts+i)+1] = wco[2];
+ verts[3*(basenverts+i)+2] = wco[1];
+ }
+
+ //create tris
+ curnfaces = dm->getNumFaces(dm);
+ mface = dm->getFaceArray(dm);
+ for (i=0; i<curnfaces; i++)
+ {
+ MFace* mf = &mface[i];
+ tri[0]= basenverts + mf->v1; tri[1]= basenverts + mf->v3; tri[2]= basenverts + mf->v2;
+ tri += 3;
+ if (mf->v4)
+ {
+ tri[0]= basenverts + mf->v1; tri[1]= basenverts + mf->v4; tri[2]= basenverts + mf->v3;
+ tri += 3;
+ }
+ }
+ basenverts += curnverts;
+ }
+
+ //release derived mesh
+ for (dmlink = dms; dmlink; dmlink = dmlink->next)
+ {
+ dm = (DerivedMesh*) dmlink->link;
+ dm->release(dm);
+ }
+ BLI_linklist_free(dms, NULL);
+}
+
+static bool buildNavMesh(const RecastData& recastParams, int nverts, float* verts, int ntris, int* tris,
+ rcPolyMesh*& pmesh, rcPolyMeshDetail*& dmesh)
+{
+ float bmin[3], bmax[3];
+ rcHeightfield* solid;
+ unsigned char *triflags;
+ rcCompactHeightfield* chf;
+ rcContourSet *cset;
+
+ rcCalcBounds(verts, nverts, bmin, bmax);
+
+ //
+ // Step 1. Initialize build config.
+ //
+ rcConfig cfg;
+ memset(&cfg, 0, sizeof(cfg));
+ {
+/*
+ float cellsize = 0.3f;
+ float cellheight = 0.2f;
+ float agentmaxslope = M_PI/4;
+ float agentmaxclimb = 0.9f;
+ float agentheight = 2.0f;
+ float agentradius = 0.6f;
+ float edgemaxlen = 12.0f;
+ float edgemaxerror = 1.3f;
+ float regionminsize = 50.f;
+ float regionmergesize = 20.f;
+ int vertsperpoly = 6;
+ float detailsampledist = 6.0f;
+ float detailsamplemaxerror = 1.0f;
+ cfg.cs = cellsize;
+ cfg.ch = cellheight;
+ cfg.walkableSlopeAngle = agentmaxslope/M_PI*180.f;
+ cfg.walkableHeight = (int)ceilf(agentheight/ cfg.ch);
+ cfg.walkableClimb = (int)floorf(agentmaxclimb / cfg.ch);
+ cfg.walkableRadius = (int)ceilf(agentradius / cfg.cs);
+ cfg.maxEdgeLen = (int)(edgemaxlen/cellsize);
+ cfg.maxSimplificationError = edgemaxerror;
+ cfg.minRegionSize = (int)rcSqr(regionminsize);
+ cfg.mergeRegionSize = (int)rcSqr(regionmergesize);
+ cfg.maxVertsPerPoly = vertsperpoly;
+ cfg.detailSampleDist = detailsampledist< 0.9f ? 0 : cellsize * detailsampledist;
+ cfg.detailSampleMaxError = cellheight * detailsamplemaxerror;
+*/
+ cfg.cs = recastParams.cellsize;
+ cfg.ch = recastParams.cellheight;
+ cfg.walkableSlopeAngle = recastParams.agentmaxslope/((float)M_PI)*180.f;
+ cfg.walkableHeight = (int)ceilf(recastParams.agentheight/ cfg.ch);
+ cfg.walkableClimb = (int)floorf(recastParams.agentmaxclimb / cfg.ch);
+ cfg.walkableRadius = (int)ceilf(recastParams.agentradius / cfg.cs);
+ cfg.maxEdgeLen = (int)(recastParams.edgemaxlen/recastParams.cellsize);
+ cfg.maxSimplificationError = recastParams.edgemaxerror;
+ cfg.minRegionSize = (int)rcSqr(recastParams.regionminsize);
+ cfg.mergeRegionSize = (int)rcSqr(recastParams.regionmergesize);
+ cfg.maxVertsPerPoly = recastParams.vertsperpoly;
+ cfg.detailSampleDist = recastParams.detailsampledist< 0.9f ? 0 :
+ recastParams.cellsize * recastParams.detailsampledist;
+ cfg.detailSampleMaxError = recastParams.cellheight * recastParams.detailsamplemaxerror;
+
+ }
+
+ // Set the area where the navigation will be build.
+ vcopy(cfg.bmin, bmin);
+ vcopy(cfg.bmax, bmax);
+ rcCalcGridSize(cfg.bmin, cfg.bmax, cfg.cs, &cfg.width, &cfg.height);
+
+ //
+ // Step 2. Rasterize input polygon soup.
+ //
+ // Allocate voxel heightfield where we rasterize our input data to.
+ solid = new rcHeightfield;
+ if (!solid)
+ return false;
+
+ if (!rcCreateHeightfield(*solid, cfg.width, cfg.height, cfg.bmin, cfg.bmax, cfg.cs, cfg.ch))
+ return false;
+
+ // Allocate array that can hold triangle flags.
+ triflags = (unsigned char*) MEM_mallocN(sizeof(unsigned char)*ntris, "triflags");
+ if (!triflags)
+ return false;
+ // Find triangles which are walkable based on their slope and rasterize them.
+ memset(triflags, 0, ntris*sizeof(unsigned char));
+ rcMarkWalkableTriangles(cfg.walkableSlopeAngle, verts, nverts, tris, ntris, triflags);
+ rcRasterizeTriangles(verts, nverts, tris, triflags, ntris, *solid);
+ MEM_freeN(triflags);
+ MEM_freeN(verts);
+ MEM_freeN(tris);
+
+ //
+ // Step 3. Filter walkables surfaces.
+ //
+ rcFilterLedgeSpans(cfg.walkableHeight, cfg.walkableClimb, *solid);
+ rcFilterWalkableLowHeightSpans(cfg.walkableHeight, *solid);
+
+ //
+ // Step 4. Partition walkable surface to simple regions.
+ //
+
+ chf = new rcCompactHeightfield;
+ if (!chf)
+ return false;
+ if (!rcBuildCompactHeightfield(cfg.walkableHeight, cfg.walkableClimb, RC_WALKABLE, *solid, *chf))
+ return false;
+
+ delete solid;
+
+ // Prepare for region partitioning, by calculating distance field along the walkable surface.
+ if (!rcBuildDistanceField(*chf))
+ return false;
+
+ // Partition the walkable surface into simple regions without holes.
+ if (!rcBuildRegions(*chf, cfg.walkableRadius, cfg.borderSize, cfg.minRegionSize, cfg.mergeRegionSize))
+ return false;
+
+ //
+ // Step 5. Trace and simplify region contours.
+ //
+ // Create contours.
+ cset = new rcContourSet;
+ if (!cset)
+ return false;
+
+ if (!rcBuildContours(*chf, cfg.maxSimplificationError, cfg.maxEdgeLen, *cset))
+ return false;
+
+ //
+ // Step 6. Build polygons mesh from contours.
+ //
+ pmesh = new rcPolyMesh;
+ if (!pmesh)
+ return false;
+ if (!rcBuildPolyMesh(*cset, cfg.maxVertsPerPoly, *pmesh))
+ return false;
+
+
+ //
+ // Step 7. Create detail mesh which allows to access approximate height on each polygon.
+ //
+
+ dmesh = new rcPolyMeshDetail;
+ if (!dmesh)
+ return false;
+
+ if (!rcBuildPolyMeshDetail(*pmesh, *chf, cfg.detailSampleDist, cfg.detailSampleMaxError, *dmesh))
+ return false;
+
+ delete chf;
+ delete cset;
+
+ return true;
+}
+
+static Object* createRepresentation(bContext *C, rcPolyMesh*& pmesh, rcPolyMeshDetail*& dmesh, Base* base)
+{
+ float co[3], rot[3];
+ EditMesh *em;
+ int i,j, k;
+ unsigned short* v;
+ int face[3];
+ Main *bmain = CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
+ Object* obedit;
+ int createob = base==NULL;
+ zero_v3(co);
+ zero_v3(rot);
+ if (createob)
+ {
+ //create new object
+ obedit = ED_object_add_type(C, OB_MESH, co, rot, FALSE, 1);
+ }
+ else
+ {
+ obedit = base->object;
+ scene_select_base(scene, base);
+ copy_v3_v3(obedit->loc, co);
+ copy_v3_v3(obedit->rot, rot);
+ }
+
+ ED_object_enter_editmode(C, EM_DO_UNDO|EM_IGNORE_LAYER);
+ em = BKE_mesh_get_editmesh(((Mesh *)obedit->data));
+
+ if (!createob)
+ {
+ //clear
+ if(em->verts.first) free_vertlist(em, &em->verts);
+ if(em->edges.first) free_edgelist(em, &em->edges);
+ if(em->faces.first) free_facelist(em, &em->faces);
+ if(em->selected.first) BLI_freelistN(&(em->selected));
+ }
+
+ //create verts for polygon mesh
+ for(i = 0; i < pmesh->nverts; i++) {
+ v = &pmesh->verts[3*i];
+ co[0] = pmesh->bmin[0] + v[0]*pmesh->cs;
+ co[1] = pmesh->bmin[1] + v[1]*pmesh->ch;
+ co[2] = pmesh->bmin[2] + v[2]*pmesh->cs;
+ SWAP(float, co[1], co[2]);
+ addvertlist(em, co, NULL);
+ }
+
+ //create custom data layer to save polygon idx
+ CustomData_add_layer_named(&em->fdata, CD_RECAST, CD_CALLOC, NULL, 0, "recastData");
+
+ //create verts and faces for detailed mesh
+ for (i=0; i<dmesh->nmeshes; i++)
+ {
+ int uniquevbase = em->totvert;
+ unsigned short vbase = dmesh->meshes[4*i+0];
+ unsigned short ndv = dmesh->meshes[4*i+1];
+ unsigned short tribase = dmesh->meshes[4*i+2];
+ unsigned short trinum = dmesh->meshes[4*i+3];
+ const unsigned short* p = &pmesh->polys[i*pmesh->nvp*2];
+ int nv = 0;
+ for (j = 0; j < pmesh->nvp; ++j)
+ {
+ if (p[j] == 0xffff) break;
+ nv++;
+ }
+ //create unique verts
+ for (j=nv; j<ndv; j++)
+ {
+ copy_v3_v3(co, &dmesh->verts[3*(vbase + j)]);
+ SWAP(float, co[1], co[2]);
+ addvertlist(em, co, NULL);
+ }
+
+ EM_init_index_arrays(em, 1, 0, 0);
+
+ //create faces
+ for (j=0; j<trinum; j++)
+ {
+ unsigned char* tri = &dmesh->tris[4*(tribase+j)];
+ EditFace* newFace;
+ for (k=0; k<3; k++)
+ {
+ if (tri[k]<nv)
+ face[k] = p[tri[k]]; //shared vertex
+ else
+ face[k] = uniquevbase+tri[k]-nv; //unique vertex
+ }
+ newFace = addfacelist(em, EM_get_vert_for_index(face[0]), EM_get_vert_for_index(face[2]),
+ EM_get_vert_for_index(face[1]), NULL, NULL, NULL);
+
+ //set navigation polygon idx to the custom layer
+ int* polygonIdx = (int*)CustomData_em_get(&em->fdata, newFace->data, CD_RECAST);
+ *polygonIdx = i+1; //add 1 to avoid zero idx
+ }
+
+ EM_free_index_arrays();
+ }
+
+ delete pmesh; pmesh = NULL;
+ delete dmesh; dmesh = NULL;
+
+ BKE_mesh_end_editmesh((Mesh*)obedit->data, em);
+
+ DAG_id_tag_update((ID*)obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
+
+ ED_object_exit_editmode(C, EM_FREEDATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit);
+
+ if (createob)
+ {
+ obedit->gameflag &= ~OB_COLLISION;
+ obedit->gameflag |= OB_NAVMESH;
+ obedit->body_type = OB_BODY_TYPE_NAVMESH;
+ rename_id((ID *)obedit, "Navmesh");
+ }
+
+ ModifierData *md= modifiers_findByType(obedit, eModifierType_NavMesh);
+ if (!md)
+ {
+ ED_object_modifier_add(NULL, bmain, scene, obedit, NULL, eModifierType_NavMesh);
+ }
+
+ return obedit;
+}
+
+static int create_navmesh_exec(bContext *C, wmOperator *op)
+{
+ Scene* scene = CTX_data_scene(C);
+ int nverts, ntris;
+ float* verts;
+ int* tris;
+ rcPolyMesh* pmesh;
+ rcPolyMeshDetail* dmesh;
+ LinkNode* obs = NULL;
+ Base* navmeshBase = NULL;
+ //CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) //expand macros to avoid error in convertion from void*
+ {
+ ListBase ctx_data_list;
+ CollectionPointerLink *ctx_link;
+ CTX_data_selected_editable_bases(C, &ctx_data_list);
+ for(ctx_link = (CollectionPointerLink *)ctx_data_list.first;
+ ctx_link; ctx_link = (CollectionPointerLink *)ctx_link->next) {
+ Base* base= (Base*)ctx_link->ptr.data;
+ {
+ if (base->object->body_type==OB_BODY_TYPE_NAVMESH)
+ {
+ if (!navmeshBase || base==CTX_data_active_base(C))
+ navmeshBase = base;
+ }
+ else
+ BLI_linklist_append(&obs, (void*)base->object);
+ }
+ CTX_DATA_END;
+ createVertsTrisData(C, obs, nverts, verts, ntris, tris);
+ BLI_linklist_free(obs, NULL);
+ buildNavMesh(scene->gm.recastData, nverts, verts, ntris, tris, pmesh, dmesh);
+ createRepresentation(C, pmesh, dmesh, navmeshBase);
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_create_navmesh(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Create navigation mesh";
+ ot->description= "Create navigation mesh for selected objects";
+ ot->idname= "OBJECT_OT_create_navmesh";
+
+ /* api callbacks */
+ ot->exec= create_navmesh_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int assign_navpolygon_poll(bContext *C)
+{
+ Object *ob= (Object *)CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ if (!ob || !ob->data)
+ return 0;
+ return (((Mesh*)ob->data)->edit_mesh != NULL);
+}
+
+static int assign_navpolygon_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
+
+ //do work here
+ int targetPolyIdx = -1;
+ EditFace *ef, *efa;
+ efa = EM_get_actFace(em, 0);
+ if (efa)
+ {
+ if (CustomData_has_layer(&em->fdata, CD_RECAST))
+ {
+ targetPolyIdx = *(int*)CustomData_em_get(&em->fdata, efa->data, CD_RECAST);
+ targetPolyIdx = targetPolyIdx>=0? targetPolyIdx : -targetPolyIdx;
+ if (targetPolyIdx>0)
+ {
+ //set target poly idx to other selected faces
+ ef = (EditFace*)em->faces.last;
+ while(ef)
+ {
+ if((ef->f & SELECT )&& ef!=efa)
+ {
+ int* recastDataBlock = (int*)CustomData_em_get(&em->fdata, ef->data, CD_RECAST);
+ *recastDataBlock = targetPolyIdx;
+ }
+ ef = ef->prev;
+ }
+ }
+ }
+ }
+
+ DAG_id_tag_update((ID*)obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
+ BKE_mesh_end_editmesh((Mesh*)obedit->data, em);
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_assign_navpolygon(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Assign polygon index";
+ ot->description= "Assign polygon index to face by active face";
+ ot->idname= "OBJECT_OT_assign_navpolygon";
+
+ /* api callbacks */
+ ot->poll = assign_navpolygon_poll;
+ ot->exec= assign_navpolygon_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int compare(const void * a, const void * b){
+ return ( *(int*)a - *(int*)b );
+}
+static int findFreeNavPolyIndex(EditMesh* em)
+{
+ //construct vector of indices
+ int numfaces = em->totface;
+ int* indices = new int[numfaces];
+ EditFace* ef = (EditFace*)em->faces.last;
+ int idx = 0;
+ while(ef)
+ {
+ int polyIdx = *(int*)CustomData_em_get(&em->fdata, ef->data, CD_RECAST);
+ indices[idx] = polyIdx;
+ idx++;
+ ef = ef->prev;
+ }
+ qsort(indices, numfaces, sizeof(int), compare);
+ //search first free index
+ int freeIdx = 1;
+ for (int i=0; i<numfaces; i++)
+ {
+ if (indices[i]==freeIdx)
+ freeIdx++;
+ else if (indices[i]>freeIdx)
+ break;
+ }
+ delete indices;
+ return freeIdx;
+}
+
+static int assign_new_navpolygon_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
+
+ EditFace *ef;
+ if (CustomData_has_layer(&em->fdata, CD_RECAST))
+ {
+ int targetPolyIdx = findFreeNavPolyIndex(em);
+ if (targetPolyIdx>0)
+ {
+ //set target poly idx to selected faces
+ ef = (EditFace*)em->faces.last;
+ while(ef)
+ {
+ if(ef->f & SELECT )
+ {
+ int* recastDataBlock = (int*)CustomData_em_get(&em->fdata, ef->data, CD_RECAST);
+ *recastDataBlock = targetPolyIdx;
+ }
+ ef = ef->prev;
+ }
+ }
+ }
+
+ DAG_id_tag_update((ID*)obedit->data, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
+ BKE_mesh_end_editmesh((Mesh*)obedit->data, em);
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_assign_new_navpolygon(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Assign new polygon index";
+ ot->description= "Assign new polygon index to face";
+ ot->idname= "OBJECT_OT_assign_new_navpolygon";
+
+ /* api callbacks */
+ ot->poll = assign_navpolygon_poll;
+ ot->exec= assign_new_navpolygon_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+}
diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c
index ab51509b9e0..931be10a2a1 100644
--- a/source/blender/editors/object/object_ops.c
+++ b/source/blender/editors/object/object_ops.c
@@ -214,8 +214,15 @@ void ED_operatortypes_object(void)
WM_operatortype_append(OBJECT_OT_bake_image);
WM_operatortype_append(OBJECT_OT_drop_named_material);
+
+#ifdef WITH_GAMEENGINE
+ WM_operatortype_append(OBJECT_OT_create_navmesh);
+ WM_operatortype_append(OBJECT_OT_assign_navpolygon);
+ WM_operatortype_append(OBJECT_OT_assign_new_navpolygon);
+#endif
}
+
void ED_operatormacros_object(void)
{
wmOperatorType *ot;
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index 48c0a9b68c5..944124beb17 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -142,7 +142,7 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op)
BKE_mesh_end_editmesh(me, em);
}
else if(ELEM(obedit->type, OB_SURF, OB_CURVE)) {
- ListBase *editnurb= curve_get_editcurve(obedit);
+ ListBase *editnurb= object_editcurve_get(obedit);
cu= obedit->data;
diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c
index 8a9504be6f4..1052fd0cf38 100644
--- a/source/blender/editors/object/object_select.c
+++ b/source/blender/editors/object/object_select.c
@@ -123,6 +123,20 @@ void ED_base_object_activate(bContext *C, Base *base)
/********************** Selection Operators **********************/
+static int objects_selectable_poll(bContext *C)
+{
+ /* we don't check for linked scenes here, selection is
+ still allowed then for inspection of scene */
+ Object *obact= CTX_data_active_object(C);
+
+ if(CTX_data_edit_object(C))
+ return 0;
+ if(obact && obact->mode)
+ return 0;
+
+ return 1;
+}
+
/************************ Select by Type *************************/
static int object_select_by_type_exec(bContext *C, wmOperator *op)
@@ -161,7 +175,7 @@ void OBJECT_OT_select_by_type(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= object_select_by_type_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= objects_selectable_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -343,7 +357,7 @@ void OBJECT_OT_select_linked(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= object_select_linked_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= objects_selectable_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -669,7 +683,7 @@ void OBJECT_OT_select_grouped(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= object_select_grouped_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= objects_selectable_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -718,7 +732,7 @@ void OBJECT_OT_select_by_layer(wmOperatorType *ot)
/* api callbacks */
/*ot->invoke = XXX - need a int grid popup*/
ot->exec= object_select_by_layer_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= objects_selectable_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -756,7 +770,7 @@ void OBJECT_OT_select_inverse(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_select_inverse_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= objects_selectable_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -817,7 +831,7 @@ void OBJECT_OT_select_all(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_select_all_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= objects_selectable_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -866,7 +880,7 @@ void OBJECT_OT_select_same_group(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_select_same_group_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= objects_selectable_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -919,7 +933,7 @@ void OBJECT_OT_select_mirror(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_select_mirror_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= objects_selectable_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -976,7 +990,7 @@ void OBJECT_OT_select_name(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_select_name_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= objects_selectable_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1024,7 +1038,7 @@ void OBJECT_OT_select_random(wmOperatorType *ot)
/* api callbacks */
/*ot->invoke= object_select_random_invoke XXX - need a number popup ;*/
ot->exec = object_select_random_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= objects_selectable_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c
index 67e19e38310..6935928c643 100644
--- a/source/blender/editors/render/render_shading.c
+++ b/source/blender/editors/render/render_shading.c
@@ -54,6 +54,7 @@
#include "BKE_animsys.h"
#include "BKE_context.h"
+#include "BKE_curve.h"
#include "BKE_depsgraph.h"
#include "BKE_font.h"
#include "BKE_global.h"
@@ -178,7 +179,7 @@ static int material_slot_assign_exec(bContext *C, wmOperator *UNUSED(op))
}
else if(ELEM(ob->type, OB_CURVE, OB_SURF)) {
Nurb *nu;
- ListBase *nurbs= ED_curve_editnurbs((Curve*)ob->data);
+ ListBase *nurbs= curve_editnurbs((Curve*)ob->data);
if(nurbs) {
for(nu= nurbs->first; nu; nu= nu->next)
@@ -236,7 +237,7 @@ static int material_slot_de_select(bContext *C, int select)
}
}
else if ELEM(ob->type, OB_CURVE, OB_SURF) {
- ListBase *nurbs= ED_curve_editnurbs((Curve*)ob->data);
+ ListBase *nurbs= curve_editnurbs((Curve*)ob->data);
Nurb *nu;
BPoint *bp;
BezTriple *bezt;
@@ -531,7 +532,7 @@ void SCENE_OT_render_layer_add(wmOperatorType *ot)
static int render_layer_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
- Scene *scene= CTX_data_scene(C);
+ Scene *scene = CTX_data_scene(C), *sce;
SceneRenderLayer *rl;
int act= scene->r.actlay;
@@ -543,15 +544,17 @@ static int render_layer_remove_exec(bContext *C, wmOperator *UNUSED(op))
MEM_freeN(rl);
scene->r.actlay= 0;
-
- if(scene->nodetree) {
- bNode *node;
- for(node= scene->nodetree->nodes.first; node; node= node->next) {
- if(node->type==CMP_NODE_R_LAYERS && node->id==NULL) {
- if(node->custom1==act)
- node->custom1= 0;
- else if(node->custom1>act)
- node->custom1--;
+
+ for(sce = CTX_data_main(C)->scene.first; sce; sce = sce->id.next) {
+ if(sce->nodetree) {
+ bNode *node;
+ for(node = sce->nodetree->nodes.first; node; node = node->next) {
+ if(node->type==CMP_NODE_R_LAYERS && (Scene*)node->id==scene) {
+ if(node->custom1==act)
+ node->custom1= 0;
+ else if(node->custom1>act)
+ node->custom1--;
+ }
}
}
}
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index e766510b9f5..bfd299f9551 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -235,28 +235,28 @@ static void region_draw_azone_tab(AZone *az)
/* add code to draw region hidden as 'too small' */
switch(az->edge) {
case AE_TOP_TO_BOTTOMRIGHT:
- uiSetRoundBox(3 + 16);
+ uiSetRoundBox(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT | UI_RB_ALPHA);
uiDrawBoxShade(GL_POLYGON, (float)az->x1, (float)az->y1, (float)az->x2, (float)az->y2, 4.0f, -0.3f, 0.05f);
glColor4ub(0, 0, 0, 255);
uiRoundRect((float)az->x1, 0.3f+(float)az->y1, (float)az->x2, 0.3f+(float)az->y2, 4.0f);
break;
case AE_BOTTOM_TO_TOPLEFT:
- uiSetRoundBox(12 + 16);
+ uiSetRoundBox(UI_CNR_BOTTOM_RIGHT | UI_CNR_BOTTOM_LEFT | UI_RB_ALPHA);
uiDrawBoxShade(GL_POLYGON, (float)az->x1, (float)az->y1, (float)az->x2, (float)az->y2, 4.0f, -0.3f, 0.05f);
glColor4ub(0, 0, 0, 255);
uiRoundRect((float)az->x1, 0.3f+(float)az->y1, (float)az->x2, 0.3f+(float)az->y2, 4.0f);
break;
case AE_LEFT_TO_TOPRIGHT:
- uiSetRoundBox(9 + 16);
+ uiSetRoundBox(UI_CNR_TOP_LEFT | UI_CNR_BOTTOM_LEFT | UI_RB_ALPHA);
uiDrawBoxShade(GL_POLYGON, (float)az->x1, (float)az->y1, (float)az->x2, (float)az->y2, 4.0f, -0.3f, 0.05f);
glColor4ub(0, 0, 0, 255);
uiRoundRect((float)az->x1, (float)az->y1, (float)az->x2, (float)az->y2, 4.0f);
break;
case AE_RIGHT_TO_TOPLEFT:
- uiSetRoundBox(6 + 16);
+ uiSetRoundBox(UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_RIGHT | UI_RB_ALPHA);
uiDrawBoxShade(GL_POLYGON, (float)az->x1, (float)az->y1, (float)az->x2, (float)az->y2, 4.0f, -0.3f, 0.05f);
glColor4ub(0, 0, 0, 255);
diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c
index f73ede19724..2e8dc32ad6d 100644
--- a/source/blender/editors/screen/screen_context.c
+++ b/source/blender/editors/screen/screen_context.c
@@ -238,7 +238,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
}
}
else if(CTX_data_equals(member, "visible_pose_bones")) {
- Object *obpose= ED_object_pose_armature(obact);
+ Object *obpose= object_pose_armature_get(obact);
bArmature *arm= (obpose) ? obpose->data : NULL;
bPoseChannel *pchan;
@@ -254,7 +254,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
}
}
else if(CTX_data_equals(member, "selected_pose_bones")) {
- Object *obpose= ED_object_pose_armature(obact);
+ Object *obpose= object_pose_armature_get(obact);
bArmature *arm= (obpose) ? obpose->data : NULL;
bPoseChannel *pchan;
@@ -289,7 +289,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
}
else if(CTX_data_equals(member, "active_pose_bone")) {
bPoseChannel *pchan;
- Object *obpose= ED_object_pose_armature(obact);
+ Object *obpose= object_pose_armature_get(obact);
pchan= get_active_posechannel(obpose);
if (pchan) {
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 73f491f600e..9f6aba9fc7b 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -54,6 +54,7 @@
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
+#include "BKE_object.h"
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
@@ -348,7 +349,7 @@ int ED_operator_posemode(bContext *C)
if (obact && !(obact->mode & OB_MODE_EDIT)) {
Object *obpose;
- if((obpose= ED_object_pose_armature(obact))) {
+ if((obpose= object_pose_armature_get(obact))) {
if((obact == obpose) || (obact->mode & OB_MODE_WEIGHT_PAINT)) {
return 1;
}
@@ -1734,14 +1735,16 @@ static void SCREEN_OT_region_scale(wmOperatorType *ot)
/* function to be called outside UI context, or for redo */
static int frame_offset_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
int delta;
delta = RNA_int_get(op->ptr, "delta");
- CTX_data_scene(C)->r.cfra += delta;
- CTX_data_scene(C)->r.subframe = 0.f;
+ scene->r.cfra += delta;
+ scene->r.subframe = 0.f;
- sound_seek_scene(C);
+ sound_seek_scene(bmain, scene);
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, CTX_data_scene(C));
@@ -1766,6 +1769,7 @@ static void SCREEN_OT_frame_offset(wmOperatorType *ot)
/* function to be called outside UI context, or for redo */
static int frame_jump_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
wmTimer *animtimer= CTX_wm_screen(C)->animtimer;
@@ -1789,7 +1793,7 @@ static int frame_jump_exec(bContext *C, wmOperator *op)
else
CFRA= PSFRA;
- sound_seek_scene(C);
+ sound_seek_scene(bmain, scene);
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
}
@@ -1818,6 +1822,7 @@ static void SCREEN_OT_frame_jump(wmOperatorType *ot)
/* function to be called outside UI context, or for redo */
static int keyframe_jump_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
bDopeSheet ads= {NULL};
@@ -1872,7 +1877,7 @@ static int keyframe_jump_exec(bContext *C, wmOperator *op)
/* free temp stuff */
BLI_dlrbTree_free(&keys);
- sound_seek_scene(C);
+ sound_seek_scene(bmain, scene);
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
@@ -2798,6 +2803,7 @@ static int screen_animation_step(bContext *C, wmOperator *UNUSED(op), wmEvent *e
bScreen *screen= CTX_wm_screen(C);
if(screen->animtimer && screen->animtimer==event->customdata) {
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
wmTimer *wt= screen->animtimer;
ScreenAnimData *sad= wt->customdata;
@@ -2874,7 +2880,7 @@ static int screen_animation_step(bContext *C, wmOperator *UNUSED(op), wmEvent *e
}
if (sad->flag & ANIMPLAY_FLAG_JUMPED)
- sound_seek_scene(C);
+ sound_seek_scene(bmain, scene);
/* since we follow drawflags, we can't send notifier but tag regions ourselves */
ED_update_for_newframe(CTX_data_main(C), scene, screen, 1);
@@ -3482,8 +3488,8 @@ void ED_keymap_screen(wmKeyConfig *keyconf)
RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", UPARROWKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "end", 1);
RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", DOWNARROWKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "end", 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", RIGHTARROWKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "end", 1);
- RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", LEFTARROWKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "end", 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", RIGHTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", 1);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", LEFTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", 0);
WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", UPARROWKEY, KM_PRESS, 0, 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", DOWNARROWKEY, KM_PRESS, 0, 0)->ptr, "next", 0);
diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c
index 2f41f6149d9..bd4f7b79660 100644
--- a/source/blender/editors/sculpt_paint/paint_image.c
+++ b/source/blender/editors/sculpt_paint/paint_image.c
@@ -62,6 +62,7 @@
#include "DNA_brush_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_node_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_texture_types.h"
@@ -4665,7 +4666,7 @@ static void paint_brush_init_tex(Brush *brush)
if(brush) {
MTex *mtex= &brush->mtex;
if(mtex->tex && mtex->tex->nodetree)
- ntreeBeginExecTree(mtex->tex->nodetree); /* has internal flag to detect it only does it once */
+ ntreeTexBeginExecTree(mtex->tex->nodetree, 1); /* has internal flag to detect it only does it once */
}
}
@@ -4807,7 +4808,7 @@ static void paint_brush_exit_tex(Brush *brush)
if(brush) {
MTex *mtex= &brush->mtex;
if(mtex->tex && mtex->tex->nodetree)
- ntreeEndExecTree(mtex->tex->nodetree);
+ ntreeTexEndExecTree(mtex->tex->nodetree->execdata, 1);
}
}
diff --git a/source/blender/editors/sculpt_paint/paint_stroke.c b/source/blender/editors/sculpt_paint/paint_stroke.c
index 09873566d4a..9500c7f663c 100644
--- a/source/blender/editors/sculpt_paint/paint_stroke.c
+++ b/source/blender/editors/sculpt_paint/paint_stroke.c
@@ -322,8 +322,8 @@ static int load_tex(Sculpt *sd, Brush* br, ViewContext* vc)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
if (br->mtex.brush_map_mode == MTEX_MAP_MODE_FIXED) {
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
}
return 1;
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index e2d93db1d84..170924c400d 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -50,6 +50,7 @@
#include "BLF_api.h"
#include "DNA_meshdata_types.h"
+#include "DNA_node_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_brush_types.h"
@@ -103,33 +104,6 @@ void ED_sculpt_force_update(bContext *C)
multires_force_update(ob);
}
-void ED_sculpt_modifiers_changed(Object *ob)
-{
- SculptSession *ss= ob->sculpt;
-
- if(!ss->cache) {
- /* we free pbvh on changes, except during sculpt since it can't deal with
- changing PVBH node organization, we hope topology does not change in
- the meantime .. weak */
- if(ss->pbvh) {
- BLI_pbvh_free(ss->pbvh);
- ss->pbvh= NULL;
- }
-
- sculpt_free_deformMats(ob->sculpt);
- } else {
- PBVHNode **nodes;
- int n, totnode;
-
- BLI_pbvh_search_gather(ss->pbvh, NULL, NULL, &nodes, &totnode);
-
- for(n = 0; n < totnode; n++)
- BLI_pbvh_node_mark_update(nodes[n]);
-
- MEM_freeN(nodes);
- }
-}
-
/* Sculpt mode handles multires differently from regular meshes, but only if
it's the last modifier on the stack and it is not on the first level */
struct MultiresModifierData *sculpt_multires_active(Scene *scene, Object *ob)
@@ -2695,17 +2669,6 @@ static void sculpt_update_tex(Sculpt *sd, SculptSession *ss)
}
}
-void sculpt_free_deformMats(SculptSession *ss)
-{
- if(ss->orig_cos) MEM_freeN(ss->orig_cos);
- if(ss->deform_cos) MEM_freeN(ss->deform_cos);
- if(ss->deform_imats) MEM_freeN(ss->deform_imats);
-
- ss->orig_cos = NULL;
- ss->deform_cos = NULL;
- ss->deform_imats = NULL;
-}
-
void sculpt_update_mesh_elements(Scene *scene, Sculpt *sd, Object *ob, int need_fmap)
{
DerivedMesh *dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
@@ -2742,7 +2705,7 @@ void sculpt_update_mesh_elements(Scene *scene, Sculpt *sd, Object *ob, int need_
if(!ss->orig_cos) {
int a;
- sculpt_free_deformMats(ss);
+ free_sculptsession_deformMats(ss);
if(ss->kb) ss->orig_cos = key_to_vertcos(ob, ss->kb);
else ss->orig_cos = mesh_getVertexCos(ob->data, NULL);
@@ -2753,7 +2716,7 @@ void sculpt_update_mesh_elements(Scene *scene, Sculpt *sd, Object *ob, int need_
for(a = 0; a < ((Mesh*)ob->data)->totvert; ++a)
invert_m3(ss->deform_imats[a]);
}
- } else sculpt_free_deformMats(ss);
+ } else free_sculptsession_deformMats(ss);
/* if pbvh is deformed, key block is already applied to it */
if (ss->kb && !BLI_pbvh_isDeformed(ss->pbvh)) {
@@ -3275,7 +3238,7 @@ static void sculpt_brush_init_tex(Sculpt *sd, SculptSession *ss)
/* init mtex nodes */
if(mtex->tex && mtex->tex->nodetree)
- ntreeBeginExecTree(mtex->tex->nodetree); /* has internal flag to detect it only does it once */
+ ntreeTexBeginExecTree(mtex->tex->nodetree, 1); /* has internal flag to detect it only does it once */
/* TODO: Shouldn't really have to do this at the start of every
stroke, but sculpt would need some sort of notification when
@@ -3331,7 +3294,7 @@ static void sculpt_restore_mesh(Sculpt *sd, SculptSession *ss)
BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
copy_v3_v3(vd.co, unode->co[vd.i]);
- if(vd.no) VECCOPY(vd.no, unode->no[vd.i])
+ if(vd.no) copy_v3_v3_short(vd.no, unode->no[vd.i]);
else normal_short_to_float_v3(vd.fno, unode->no[vd.i]);
if(vd.mvert) vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
@@ -3456,7 +3419,7 @@ static void sculpt_brush_exit_tex(Sculpt *sd)
MTex *mtex= &brush->mtex;
if(mtex->tex && mtex->tex->nodetree)
- ntreeEndExecTree(mtex->tex->nodetree);
+ ntreeTexEndExecTree(mtex->tex->nodetree->execdata, 1);
}
static void sculpt_stroke_done(bContext *C, struct PaintStroke *UNUSED(stroke))
diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h
index 33970ea0179..c1da29aeb27 100644
--- a/source/blender/editors/sculpt_paint/sculpt_intern.h
+++ b/source/blender/editors/sculpt_paint/sculpt_intern.h
@@ -67,7 +67,7 @@ int sculpt_poll(struct bContext *C);
void sculpt_update_mesh_elements(struct Scene *scene, struct Sculpt *sd, struct Object *ob, int need_fmap);
/* Deformed mesh sculpt */
-void sculpt_free_deformMats(struct SculptSession *ss);
+void free_sculptsession_deformMats(struct SculptSession *ss);
/* Stroke */
struct SculptStroke *sculpt_stroke_new(const int max);
diff --git a/source/blender/editors/sculpt_paint/sculpt_undo.c b/source/blender/editors/sculpt_paint/sculpt_undo.c
index c4ea5c9478c..13b6fef3004 100644
--- a/source/blender/editors/sculpt_paint/sculpt_undo.c
+++ b/source/blender/editors/sculpt_paint/sculpt_undo.c
@@ -199,7 +199,7 @@ static void sculpt_undo_restore(bContext *C, ListBase *lb)
Mesh *me= ob->data;
mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
- sculpt_free_deformMats(ss);
+ free_sculptsession_deformMats(ss);
tag_update|= 1;
}
@@ -300,7 +300,7 @@ SculptUndoNode *sculpt_undo_push_node(Object *ob, PBVHNode *node)
BLI_pbvh_vertex_iter_begin(ss->pbvh, node, vd, PBVH_ITER_ALL) {
copy_v3_v3(unode->co[vd.i], vd.co);
- if(vd.no) VECCOPY(unode->no[vd.i], vd.no)
+ if(vd.no) copy_v3_v3_short(unode->no[vd.i], vd.no);
else normal_float_to_short_v3(unode->no[vd.i], vd.fno);
if(vd.vert_indices) unode->index[vd.i]= vd.vert_indices[vd.i];
diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c
index 3eebfac029a..85ae788bcdf 100644
--- a/source/blender/editors/sound/sound_ops.c
+++ b/source/blender/editors/sound/sound_ops.c
@@ -121,7 +121,7 @@ static int open_exec(bContext *C, wmOperator *op)
info = AUD_getInfo(sound->playback_handle);
if (info.specs.channels == AUD_CHANNELS_INVALID) {
- sound_delete(C, sound);
+ sound_delete(bmain, sound);
if(op->customdata) MEM_freeN(op->customdata);
BKE_report(op->reports, RPT_ERROR, "Unsupported audio format");
return OPERATOR_CANCELLED;
@@ -223,6 +223,7 @@ void SOUND_OT_open_mono(wmOperatorType *ot)
static int mixdown_exec(bContext *C, wmOperator *op)
{
+#ifdef WITH_AUDASPACE
char path[FILE_MAX];
char filename[FILE_MAX];
Scene *scene;
@@ -256,7 +257,10 @@ static int mixdown_exec(bContext *C, wmOperator *op)
BKE_report(op->reports, RPT_ERROR, result);
return OPERATOR_CANCELLED;
}
-
+#else // WITH_AUDASPACE
+ (void)C;
+ (void)op;
+#endif // WITH_AUDASPACE
return OPERATOR_FINISHED;
}
@@ -280,6 +284,7 @@ static int mixdown_draw_check_prop(PropertyRNA *prop)
);
}
+#ifdef WITH_AUDASPACE
static void mixdown_draw(bContext *C, wmOperator *op)
{
static EnumPropertyItem pcm_format_items[] = {
@@ -431,9 +436,11 @@ static void mixdown_draw(bContext *C, wmOperator *op)
/* main draw call */
uiDefAutoButsRNA(layout, &ptr, mixdown_draw_check_prop, '\0');
}
+#endif // WITH_AUDASPACE
void SOUND_OT_mixdown(wmOperatorType *ot)
{
+#ifdef WITH_AUDASPACE
static EnumPropertyItem format_items[] = {
{AUD_FORMAT_U8, "U8", 0, "U8", "8 bit unsigned"},
{AUD_FORMAT_S16, "S16", 0, "S16", "16 bit signed"},
@@ -471,6 +478,8 @@ void SOUND_OT_mixdown(wmOperatorType *ot)
{AUD_CODEC_VORBIS, "VORBIS", 0, "Vorbis", "Xiph.Org Vorbis Codec"},
{0, NULL, 0, NULL, NULL}};
+#endif // WITH_AUDASPACE
+
/* identifiers */
ot->name= "Mixdown";
ot->description= "Mixes the scene's audio to a sound file";
@@ -479,18 +488,22 @@ void SOUND_OT_mixdown(wmOperatorType *ot)
/* api callbacks */
ot->exec= mixdown_exec;
ot->invoke= mixdown_invoke;
- ot->ui= mixdown_draw;
+#ifdef WITH_AUDASPACE
+ ot->ui= mixdown_draw;
+#endif
/* flags */
ot->flag= OPTYPE_REGISTER;
/* properties */
WM_operator_properties_filesel(ot, FOLDERFILE|SOUNDFILE, FILE_SPECIAL, FILE_SAVE, WM_FILESEL_FILEPATH);
+#ifdef WITH_AUDASPACE
RNA_def_int(ot->srna, "accuracy", 1024, 1, 16777216, "Accuracy", "Sample accuracy. Important for animation data. The lower the value, the more accurate.", 1, 16777216);
RNA_def_enum(ot->srna, "container", container_items, AUD_CONTAINER_FLAC, "Container", "File format");
RNA_def_enum(ot->srna, "codec", codec_items, AUD_CODEC_FLAC, "Codec", "Audio Codec");
RNA_def_enum(ot->srna, "format", format_items, AUD_FORMAT_S16, "Format", "Sample format");
RNA_def_int(ot->srna, "bitrate", 192, 32, 512, "Bitrate", "Bitrate in kbit/s", 32, 512);
+#endif // WITH_AUDASPACE
}
/* ******************************************************* */
@@ -680,7 +693,7 @@ static int bake_animation_exec(bContext *C, wmOperator *UNUSED(op))
update_animation_flags_exec(C, NULL);
- for(cfra = scene->r.sfra; cfra <= scene->r.efra; cfra++)
+ for(cfra = scene->r.sfra > 0 ? scene->r.sfra - 1 : 0; cfra <= scene->r.efra + 1; cfra++)
{
scene->r.cfra = cfra;
scene_update_for_newframe(bmain, scene, scene->lay);
diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c
index 2f4d6de0f9f..a09f59fb27c 100644
--- a/source/blender/editors/space_file/file_draw.c
+++ b/source/blender/editors/space_file/file_draw.c
@@ -239,7 +239,7 @@ void file_draw_buttons(const bContext *C, ARegion *ar)
static void draw_tile(int sx, int sy, int width, int height, int colorid, int shade)
{
UI_ThemeColorShade(colorid, shade);
- uiSetRoundBox(15);
+ uiSetRoundBox(UI_CNR_ALL);
uiRoundBox((float)sx, (float)(sy - height), (float)(sx + width), (float)sy, 5.0f);
}
@@ -507,7 +507,7 @@ void file_draw_list(const bContext *C, ARegion *ar)
draw_tile(sx, sy-1, layout->tile_w+4, sfile->layout->tile_h+layout->tile_border_y, colorid, shade);
}
}
- uiSetRoundBox(0);
+ uiSetRoundBox(UI_CNR_NONE);
if ( FILE_IMGDISPLAY == params->display ) {
is_icon = 0;
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index 7382188d62a..c7ada4a5801 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -1158,8 +1158,8 @@ void filelist_from_main(struct FileList *filelist)
/* XXXXX TODO: if databrowse F4 or append/link filelist->hide_parent has to be set */
if (!filelist->hide_parent) filelist->numfiles+= 1;
- filelist->filelist= (struct direntry *)malloc(filelist->numfiles * sizeof(struct direntry));
-
+ filelist->filelist= filelist->numfiles > 0 ? (struct direntry *)malloc(filelist->numfiles * sizeof(struct direntry)) : NULL;
+
files = filelist->filelist;
if (!filelist->hide_parent) {
diff --git a/source/blender/editors/space_graph/graph_ops.c b/source/blender/editors/space_graph/graph_ops.c
index 16ff76f2331..00b111f49aa 100644
--- a/source/blender/editors/space_graph/graph_ops.c
+++ b/source/blender/editors/space_graph/graph_ops.c
@@ -43,6 +43,7 @@
#include "BLF_api.h"
#include "BKE_context.h"
+#include "BKE_main.h"
#include "BKE_sound.h"
#include "UI_view2d.h"
@@ -72,6 +73,7 @@
/* Set the new frame number */
static void graphview_cursor_apply(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
SpaceIpo *sipo= CTX_wm_space_graph(C);
@@ -80,7 +82,7 @@ static void graphview_cursor_apply(bContext *C, wmOperator *op)
*/
CFRA= RNA_int_get(op->ptr, "frame");
SUBFRA=0.f;
- sound_seek_scene(C);
+ sound_seek_scene(bmain, scene);
/* set the cursor value */
sipo->cursorVal= RNA_float_get(op->ptr, "value");
diff --git a/source/blender/editors/space_info/info_stats.c b/source/blender/editors/space_info/info_stats.c
index 0abfd4b71a1..182e5242a1d 100644
--- a/source/blender/editors/space_info/info_stats.c
+++ b/source/blender/editors/space_info/info_stats.c
@@ -42,6 +42,7 @@
#include "BLI_utildefines.h"
#include "BKE_anim.h"
+#include "BKE_curve.h"
#include "BKE_displist.h"
#include "BKE_DerivedMesh.h"
#include "BKE_key.h"
@@ -51,7 +52,6 @@
#include "ED_info.h"
#include "ED_armature.h"
#include "ED_mesh.h"
-#include "ED_curve.h" /* for ED_curve_editnurbs */
#include "BLI_editVert.h"
@@ -193,7 +193,7 @@ static void stats_object_edit(Object *obedit, SceneStats *stats)
BezTriple *bezt;
BPoint *bp;
int a;
- ListBase *nurbs= ED_curve_editnurbs(cu);
+ ListBase *nurbs= curve_editnurbs(cu);
for(nu=nurbs->first; nu; nu=nu->next) {
if(nu->type == CU_BEZIER) {
diff --git a/source/blender/editors/space_logic/logic_ops.c b/source/blender/editors/space_logic/logic_ops.c
index 638bfe57608..60e9595b77a 100644
--- a/source/blender/editors/space_logic/logic_ops.c
+++ b/source/blender/editors/space_logic/logic_ops.c
@@ -322,7 +322,7 @@ static void LOGIC_OT_sensor_add(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- prop= RNA_def_enum(ot->srna, "type", DummyRNA_NULL_items, SENS_ALWAYS, "Type", "Type of sensor to add");
+ ot->prop= prop= RNA_def_enum(ot->srna, "type", DummyRNA_NULL_items, SENS_ALWAYS, "Type", "Type of sensor to add");
RNA_def_enum_funcs(prop, rna_Sensor_type_itemf);
RNA_def_string(ot->srna, "name", "", 32, "Name", "Name of the Sensor to add");
RNA_def_string(ot->srna, "object", "", 32, "Object", "Name of the Object to add the Sensor to");
@@ -437,7 +437,7 @@ static void LOGIC_OT_controller_add(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_enum(ot->srna, "type", controller_type_items, CONT_LOGIC_AND, "Type", "Type of controller to add");
+ ot->prop= RNA_def_enum(ot->srna, "type", controller_type_items, CONT_LOGIC_AND, "Type", "Type of controller to add");
RNA_def_string(ot->srna, "name", "", 32, "Name", "Name of the Controller to add");
RNA_def_string(ot->srna, "object", "", 32, "Object", "Name of the Object to add the Controller to");
}
@@ -539,7 +539,7 @@ static void LOGIC_OT_actuator_add(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- prop= RNA_def_enum(ot->srna, "type", DummyRNA_NULL_items, CONT_LOGIC_AND, "Type", "Type of actuator to add");
+ ot->prop= prop= RNA_def_enum(ot->srna, "type", DummyRNA_NULL_items, CONT_LOGIC_AND, "Type", "Type of actuator to add");
RNA_def_enum_funcs(prop, rna_Actuator_type_itemf);
RNA_def_string(ot->srna, "name", "", 32, "Name", "Name of the Actuator to add");
RNA_def_string(ot->srna, "object", "", 32, "Object", "Name of the Object to add the Actuator to");
diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c
index 9f3323a512d..c9508f268a0 100644
--- a/source/blender/editors/space_logic/logic_window.c
+++ b/source/blender/editors/space_logic/logic_window.c
@@ -718,6 +718,8 @@ static const char *actuator_name(int type)
return "State";
case ACT_ARMATURE:
return "Armature";
+ case ACT_STEERING:
+ return "Steering";
}
return "unknown";
}
@@ -3989,40 +3991,6 @@ static void draw_actuator_game(uiLayout *layout, PointerRNA *ptr)
uiItemR(layout, ptr, "filename", 0, NULL, ICON_NONE);
}
-/* The IPO/Fcurve actuator has been deprecated, so this is no longer used */
-static void draw_actuator_ipo(uiLayout *layout, PointerRNA *ptr)
-{
- Object *ob;
- PointerRNA settings_ptr;
- uiLayout *row, *subrow, *col;
-
- ob = (Object *)ptr->id.data;
- RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
-
- row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "play_type", 0, "", ICON_NONE);
- subrow= uiLayoutRow(row, 1);
- uiItemR(subrow, ptr, "use_force", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
- uiItemR(subrow, ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
-
- col = uiLayoutColumn(subrow, 0);
- uiLayoutSetActive(col, (RNA_boolean_get(ptr, "use_additive") || RNA_boolean_get(ptr, "use_force")));
- uiItemR(col, ptr, "use_local", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
-
- row= uiLayoutRow(layout, 0);
- if((RNA_enum_get(ptr, "play_type") == ACT_IPO_FROM_PROP))
- uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, ICON_NONE);
-
- else {
- uiItemR(row, ptr, "frame_start", 0, NULL, ICON_NONE);
- uiItemR(row, ptr, "frame_end", 0, NULL, ICON_NONE);
- }
- uiItemR(row, ptr, "apply_to_children", 0, NULL, ICON_NONE);
-
- row= uiLayoutRow(layout, 0);
- uiItemPointerR(row, ptr, "frame_property", &settings_ptr, "properties", NULL, ICON_NONE);
-}
-
static void draw_actuator_message(uiLayout *layout, PointerRNA *ptr, bContext *C)
{
Object *ob;
@@ -4379,6 +4347,48 @@ static void draw_actuator_visibility(uiLayout *layout, PointerRNA *ptr)
uiItemR(row, ptr, "apply_to_children", 0, NULL, ICON_NONE);
}
+static void draw_actuator_steering(uiLayout *layout, PointerRNA *ptr)
+{
+ uiLayout *row;
+ uiLayout *col;
+
+ uiItemR(layout, ptr, "mode", 0, NULL, 0);
+ uiItemR(layout, ptr, "target", 0, NULL, 0);
+ uiItemR(layout, ptr, "navmesh", 0, NULL, 0);
+
+ row = uiLayoutRow(layout, 0);
+ uiItemR(row, ptr, "distance", 0, NULL, 0);
+ uiItemR(row, ptr, "velocity", 0, NULL, 0);
+ row = uiLayoutRow(layout, 0);
+ uiItemR(row, ptr, "acceleration", 0, NULL, 0);
+ uiItemR(row, ptr, "turn_speed", 0, NULL, 0);
+
+ row = uiLayoutRow(layout, 0);
+ col = uiLayoutColumn(row, 0);
+ uiItemR(col, ptr, "facing", 0, NULL, 0);
+ col = uiLayoutColumn(row, 0);
+ uiItemR(col, ptr, "facing_axis", 0, NULL, 0);
+ if (!RNA_boolean_get(ptr, "facing"))
+ {
+ uiLayoutSetActive(col, 0);
+ }
+ col = uiLayoutColumn(row, 0);
+ uiItemR(col, ptr, "normal_up", 0, NULL, 0);
+ if (!RNA_pointer_get(ptr, "navmesh").data)
+ {
+ uiLayoutSetActive(col, 0);
+ }
+
+ row = uiLayoutRow(layout, 0);
+ uiItemR(row, ptr, "self_terminated", 0, NULL, 0);
+ if (RNA_enum_get(ptr, "mode")==ACT_STEERING_PATHFOLLOWING)
+ {
+ uiItemR(row, ptr, "update_period", 0, NULL, 0);
+ row = uiLayoutRow(layout, 0);
+ }
+ uiItemR(row, ptr, "show_visualization", 0, NULL, 0);
+}
+
static void draw_brick_actuator(uiLayout *layout, PointerRNA *ptr, bContext *C)
{
uiLayout *box;
@@ -4440,6 +4450,8 @@ static void draw_brick_actuator(uiLayout *layout, PointerRNA *ptr, bContext *C)
case ACT_VISIBILITY:
draw_actuator_visibility(box, ptr);
break;
+ case ACT_STEERING:
+ draw_actuator_steering(box, ptr);
}
}
diff --git a/source/blender/editors/space_nla/nla_draw.c b/source/blender/editors/space_nla/nla_draw.c
index 0c9c7877ddc..6af43e7618d 100644
--- a/source/blender/editors/space_nla/nla_draw.c
+++ b/source/blender/editors/space_nla/nla_draw.c
@@ -376,7 +376,7 @@ static void nla_draw_strip (SpaceNla *snla, AnimData *adt, NlaTrack *nlt, NlaStr
if (nonSolo == 0) {
/* strip is in normal track */
glColor3fv(color);
- uiSetRoundBox(15); /* all corners rounded */
+ uiSetRoundBox(UI_CNR_ALL); /* all corners rounded */
uiDrawBoxShade(GL_POLYGON, strip->start, yminc, strip->end, ymaxc, 0.0, 0.5, 0.1);
}
@@ -811,7 +811,7 @@ static void draw_nla_channel_list_gl (bAnimContext *ac, ListBase *anim_data, Vie
offset += 7 * indent;
/* only on top two corners, to show that this channel sits on top of the preceding ones */
- uiSetRoundBox((1|2));
+ uiSetRoundBox(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT);
/* draw slightly shifted up vertically to look like it has more separtion from other channels,
* but we then need to slightly shorten it so that it doesn't look like it overlaps
diff --git a/source/blender/editors/space_nla/nla_select.c b/source/blender/editors/space_nla/nla_select.c
index 2de762f28bc..a613f924b89 100644
--- a/source/blender/editors/space_nla/nla_select.c
+++ b/source/blender/editors/space_nla/nla_select.c
@@ -228,7 +228,7 @@ static void borderselect_nla_strips (bAnimContext *ac, rcti rect, short mode, sh
SpaceNla *snla = (SpaceNla *)ac->sl;
View2D *v2d= &ac->ar->v2d;
rctf rectf;
- float ymin=(float)(-NLACHANNEL_HEIGHT(snla)), ymax=0;
+ float ymin /* =(float)(-NLACHANNEL_HEIGHT(snla)) */ /* UNUSED */, ymax=0;
/* convert border-region to view coordinates */
UI_view2d_region_to_view(v2d, rect.xmin, rect.ymin+2, &rectf.xmin, &rectf.ymin);
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 0474d1f3bb1..9ea1e8ee877 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -53,9 +53,10 @@
#include "BKE_image.h"
#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_node.h"
-#include "CMP_node.h"
-#include "SHD_node.h"
+#include "NOD_composite.h"
+#include "NOD_shader.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -81,6 +82,141 @@
#include "node_intern.h"
+// XXX interface.h
+extern void ui_dropshadow(rctf *rct, float radius, float aspect, int select);
+
+/* ****************** SOCKET BUTTON DRAW FUNCTIONS ***************** */
+
+static void node_sync_cb(bContext *UNUSED(C), void *snode_v, void *node_v)
+{
+ SpaceNode *snode= snode_v;
+
+ if(snode->treetype==NTREE_SHADER) {
+ nodeShaderSynchronizeID(node_v, 1);
+ // allqueue(REDRAWBUTSSHADING, 0);
+ }
+}
+
+void node_socket_button_default(const bContext *C, uiBlock *block,
+ bNodeTree *ntree, bNode *node, bNodeSocket *sock,
+ const char *name, int x, int y, int width)
+{
+ PointerRNA ptr;
+ uiBut *bt;
+
+ RNA_pointer_create(&ntree->id, &RNA_NodeSocket, sock, &ptr);
+
+ bt = uiDefButR(block, NUM, B_NODE_EXEC, name,
+ x, y+1, width, NODE_DY-2,
+ &ptr, "default_value", 0, 0, 0, -1, -1, NULL);
+ if (node)
+ uiButSetFunc(bt, node_sync_cb, CTX_wm_space_node(C), node);
+}
+
+typedef struct SocketComponentMenuArgs {
+ PointerRNA ptr;
+ int x, y, width;
+ uiButHandleFunc cb;
+ void *arg1, *arg2;
+} SocketComponentMenuArgs;
+/* NOTE: this is a block-menu, needs 0 events, otherwise the menu closes */
+static uiBlock *socket_component_menu(bContext *C, ARegion *ar, void *args_v)
+{
+ SocketComponentMenuArgs *args= (SocketComponentMenuArgs*)args_v;
+ uiBlock *block;
+ uiLayout *layout;
+
+ block= uiBeginBlock(C, ar, "socket menu", UI_EMBOSS);
+ uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN);
+
+ layout= uiLayoutColumn(uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, args->x, args->y+2, args->width, NODE_DY, U.uistyles.first), 0);
+
+ uiItemR(layout, &args->ptr, "default_value", UI_ITEM_R_EXPAND, "", ICON_NONE);
+
+ return block;
+}
+void node_socket_button_components(const bContext *C, uiBlock *block,
+ bNodeTree *ntree, bNode *node, bNodeSocket *sock,
+ const char *name, int x, int y, int width)
+{
+ PointerRNA ptr;
+ SocketComponentMenuArgs *args;
+
+ RNA_pointer_create(&ntree->id, &RNA_NodeSocket, sock, &ptr);
+
+ args= MEM_callocN(sizeof(SocketComponentMenuArgs), "SocketComponentMenuArgs");
+
+ args->ptr = ptr;
+ args->x = x;
+ args->y = y;
+ args->width = width;
+ args->cb = node_sync_cb;
+ args->arg1 = CTX_wm_space_node(C);
+ args->arg2 = node;
+
+ uiDefBlockButN(block, socket_component_menu, args, name, x, y+1, width, NODE_DY-2, "");
+}
+
+void node_socket_button_color(const bContext *C, uiBlock *block,
+ bNodeTree *ntree, bNode *node, bNodeSocket *sock,
+ const char *name, int x, int y, int width)
+{
+ PointerRNA ptr;
+ uiBut *bt;
+ int labelw= width - 40;
+
+ RNA_pointer_create(&ntree->id, &RNA_NodeSocket, sock, &ptr);
+
+ bt=uiDefButR(block, COL, B_NODE_EXEC, "",
+ x, y+2, (labelw>0 ? 40 : width), NODE_DY-2,
+ &ptr, "default_value", 0, 0, 0, -1, -1, NULL);
+ if (node)
+ uiButSetFunc(bt, node_sync_cb, CTX_wm_space_node(C), node);
+
+ if (name[0]!='\0' && labelw>0)
+ uiDefBut(block, LABEL, 0, name, x + 40, y+2, labelw, NODE_DY-2, NULL, 0, 0, 0, 0, "");
+}
+
+/* ****************** BASE DRAW FUNCTIONS FOR NEW OPERATOR NODES ***************** */
+
+void node_draw_socket_new(bNodeSocket *sock, float size)
+{
+ float x=sock->locx, y=sock->locy;
+
+ /* 16 values of sin function */
+ static float si[16] = {
+ 0.00000000f, 0.39435585f,0.72479278f,0.93775213f,
+ 0.99871650f,0.89780453f,0.65137248f,0.29936312f,
+ -0.10116832f,-0.48530196f,-0.79077573f,-0.96807711f,
+ -0.98846832f,-0.84864425f,-0.57126821f,-0.20129852f
+ };
+ /* 16 values of cos function */
+ static float co[16] ={
+ 1.00000000f,0.91895781f,0.68896691f,0.34730525f,
+ -0.05064916f,-0.44039415f,-0.75875812f,-0.95413925f,
+ -0.99486932f,-0.87434661f,-0.61210598f,-0.25065253f,
+ 0.15142777f,0.52896401f,0.82076344f,0.97952994f,
+ };
+ int a;
+
+ glColor3ub(180, 180, 180);
+
+ glBegin(GL_POLYGON);
+ for(a=0; a<16; a++)
+ glVertex2f(x+size*si[a], y+size*co[a]);
+ glEnd();
+
+ glColor4ub(0, 0, 0, 150);
+ glEnable(GL_BLEND);
+ glEnable( GL_LINE_SMOOTH );
+ glBegin(GL_LINE_LOOP);
+ for(a=0; a<16; a++)
+ glVertex2f(x+size*si[a], y+size*co[a]);
+ glEnd();
+ glDisable( GL_LINE_SMOOTH );
+ glDisable(GL_BLEND);
+}
+
/* ****************** BUTTON CALLBACKS FOR ALL TREES ***************** */
static void node_buts_value(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -169,7 +305,7 @@ static void node_buts_curvecol(uiLayout *layout, bContext *UNUSED(C), PointerRNA
if(_sample_col) {
cumap->flag |= CUMA_DRAW_SAMPLE;
- VECCOPY(cumap->sample, _sample_col);
+ copy_v3_v3(cumap->sample, _sample_col);
}
else
cumap->flag &= ~CUMA_DRAW_SAMPLE;
@@ -192,11 +328,12 @@ static void node_buts_normal(uiLayout *layout, bContext *UNUSED(C), PointerRNA *
bNode *node= ptr->data;
rctf *butr= &node->butr;
bNodeSocket *sock= node->outputs.first; /* first socket stores normal */
+ float *nor= ((bNodeSocketValueVector*)sock->default_value)->value;
uiBut *bt;
bt= uiDefButF(block, BUT_NORMAL, B_NODE_EXEC, "",
(short)butr->xmin, (short)butr->xmin, butr->xmax-butr->xmin, butr->xmax-butr->xmin,
- sock->ns.vec, 0.0f, 1.0f, 0, 0, "");
+ nor, 0.0f, 1.0f, 0, 0, "");
uiButSetFunc(bt, node_normal_cb, ntree, node);
}
#if 0 // not used in 2.5x yet
@@ -287,6 +424,469 @@ static void node_buts_math(uiLayout *layout, bContext *UNUSED(C), PointerRNA *pt
uiItemR(layout, ptr, "operation", 0, "", ICON_NONE);
}
+static int node_resize_area_default(bNode *node, int x, int y)
+{
+ if (node->flag & NODE_HIDDEN) {
+ rctf totr= node->totr;
+ /* right part of node */
+ totr.xmin= node->totr.xmax-20.0f;
+ return BLI_in_rctf(&totr, x, y);
+ }
+ else {
+ /* rect we're interested in is just the bottom right corner */
+ rctf totr= node->totr;
+ /* bottom right corner */
+ totr.xmin= totr.xmax-10.0f;
+ totr.ymax= totr.ymin+10.0f;
+ return BLI_in_rctf(&totr, x, y);
+ }
+}
+
+/* ****************** BUTTON CALLBACKS FOR COMMON NODES ***************** */
+
+/* width of socket columns in group display */
+#define NODE_GROUP_FRAME 120
+
+/* based on settings in node, sets drawing rect info. each redraw! */
+/* note: this assumes only 1 group at a time is drawn (linked data) */
+/* in node->totr the entire boundbox for the group is stored */
+static void node_update_group(const bContext *C, bNodeTree *ntree, bNode *gnode)
+{
+ if (!(gnode->flag & NODE_GROUP_EDIT)) {
+ node_update_default(C, ntree, gnode);
+ }
+ else {
+ bNodeTree *ngroup= (bNodeTree *)gnode->id;
+ bNode *node;
+ bNodeSocket *sock, *gsock;
+ float locx, locy;
+ rctf *rect= &gnode->totr;
+ float node_group_frame= U.dpi*NODE_GROUP_FRAME/72;
+ int counter;
+ int dy;
+
+ /* get "global" coords */
+ nodeSpaceCoords(gnode, &locx, &locy);
+
+ /* center them, is a bit of abuse of locx and locy though */
+ node_update_nodetree(C, ngroup, locx, locy);
+
+ rect->xmin = rect->xmax = locx;
+ rect->ymin = rect->ymax = locy;
+
+ counter= 1;
+ for(node= ngroup->nodes.first; node; node= node->next) {
+ if(counter) {
+ *rect= node->totr;
+ counter= 0;
+ }
+ else
+ BLI_union_rctf(rect, &node->totr);
+ }
+
+ /* add some room for links to group sockets */
+ rect->xmin -= 4*NODE_DY;
+ rect->xmax += 4*NODE_DY;
+ rect->ymin-= NODE_DY;
+ rect->ymax+= NODE_DY;
+
+ /* input sockets */
+ dy = 0.5f*(rect->ymin+rect->ymax) + NODE_DY*(BLI_countlist(&gnode->inputs)-1);
+ gsock=ngroup->inputs.first;
+ sock=gnode->inputs.first;
+ while (gsock || sock) {
+ while (sock && !sock->groupsock) {
+ sock->locx = rect->xmin - node_group_frame;
+ sock->locy = dy;
+
+ /* prevent long socket lists from growing out of the group box */
+ if (dy-3*NODE_DYS < rect->ymin)
+ rect->ymin = dy-3*NODE_DYS;
+ if (dy+3*NODE_DYS > rect->ymax)
+ rect->ymax = dy+3*NODE_DYS;
+ dy -= 2*NODE_DY;
+
+ sock = sock->next;
+ }
+ while (gsock && (!sock || sock->groupsock!=gsock)) {
+ gsock->locx = rect->xmin;
+ gsock->locy = dy;
+
+ /* prevent long socket lists from growing out of the group box */
+ if (dy-3*NODE_DYS < rect->ymin)
+ rect->ymin = dy-3*NODE_DYS;
+ if (dy+3*NODE_DYS > rect->ymax)
+ rect->ymax = dy+3*NODE_DYS;
+ dy -= 2*NODE_DY;
+
+ gsock = gsock->next;
+ }
+ while (sock && gsock && sock->groupsock==gsock) {
+ gsock->locx = rect->xmin;
+ sock->locx = rect->xmin - node_group_frame;
+ sock->locy = gsock->locy = dy;
+
+ /* prevent long socket lists from growing out of the group box */
+ if (dy-3*NODE_DYS < rect->ymin)
+ rect->ymin = dy-3*NODE_DYS;
+ if (dy+3*NODE_DYS > rect->ymax)
+ rect->ymax = dy+3*NODE_DYS;
+ dy -= 2*NODE_DY;
+
+ sock = sock->next;
+ gsock = gsock->next;
+ }
+ }
+
+ /* output sockets */
+ dy = 0.5f*(rect->ymin+rect->ymax) + NODE_DY*(BLI_countlist(&gnode->outputs)-1);
+ gsock=ngroup->outputs.first;
+ sock=gnode->outputs.first;
+ while (gsock || sock) {
+ while (sock && !sock->groupsock) {
+ sock->locx = rect->xmax + node_group_frame;
+ sock->locy = dy - NODE_DYS;
+
+ /* prevent long socket lists from growing out of the group box */
+ if (dy-3*NODE_DYS < rect->ymin)
+ rect->ymin = dy-3*NODE_DYS;
+ if (dy+3*NODE_DYS > rect->ymax)
+ rect->ymax = dy+3*NODE_DYS;
+ dy -= 2*NODE_DY;
+
+ sock = sock->next;
+ }
+ while (gsock && (!sock || sock->groupsock!=gsock)) {
+ gsock->locx = rect->xmax;
+ gsock->locy = dy - NODE_DYS;
+
+ /* prevent long socket lists from growing out of the group box */
+ if (dy-3*NODE_DYS < rect->ymin)
+ rect->ymin = dy-3*NODE_DYS;
+ if (dy+3*NODE_DYS > rect->ymax)
+ rect->ymax = dy+3*NODE_DYS;
+ dy -= 2*NODE_DY;
+
+ gsock = gsock->next;
+ }
+ while (sock && gsock && sock->groupsock==gsock) {
+ gsock->locx = rect->xmax;
+ sock->locx = rect->xmax + node_group_frame;
+ sock->locy = gsock->locy = dy - NODE_DYS;
+
+ /* prevent long socket lists from growing out of the group box */
+ if (dy-3*NODE_DYS < rect->ymin)
+ rect->ymin = dy-3*NODE_DYS;
+ if (dy+3*NODE_DYS > rect->ymax)
+ rect->ymax = dy+3*NODE_DYS;
+ dy -= 2*NODE_DY;
+
+ sock = sock->next;
+ gsock = gsock->next;
+ }
+ }
+ }
+}
+
+static void update_group_input_cb(bContext *UNUSED(C), void *UNUSED(snode_v), void *ngroup_v)
+{
+ bNodeTree *ngroup= (bNodeTree*)ngroup_v;
+
+ ngroup->update |= NTREE_UPDATE_GROUP_IN;
+ ntreeUpdateTree(ngroup);
+}
+
+static void update_group_output_cb(bContext *UNUSED(C), void *UNUSED(snode_v), void *ngroup_v)
+{
+ bNodeTree *ngroup= (bNodeTree*)ngroup_v;
+
+ ngroup->update |= NTREE_UPDATE_GROUP_OUT;
+ ntreeUpdateTree(ngroup);
+}
+
+static void draw_group_socket_name(SpaceNode *snode, bNode *gnode, bNodeSocket *sock, int in_out, float xoffset, float yoffset)
+{
+ bNodeTree *ngroup= (bNodeTree*)gnode->id;
+ uiBut *bt;
+
+ if (sock->flag & SOCK_DYNAMIC) {
+ bt = uiDefBut(gnode->block, TEX, 0, "",
+ sock->locx+xoffset, sock->locy+1+yoffset, 72, NODE_DY,
+ sock->name, 0, 31, 0, 0, "");
+ if (in_out==SOCK_IN)
+ uiButSetFunc(bt, update_group_input_cb, snode, ngroup);
+ else
+ uiButSetFunc(bt, update_group_output_cb, snode, ngroup);
+ }
+ else {
+ uiDefBut(gnode->block, LABEL, 0, sock->name,
+ sock->locx+xoffset, sock->locy+1+yoffset, 72, NODE_DY,
+ NULL, 0, 31, 0, 0, "");
+ }
+}
+
+static void draw_group_socket(const bContext *C, SpaceNode *snode, bNodeTree *ntree, bNode *gnode, bNodeSocket *sock, bNodeSocket *gsock, int index, int in_out)
+{
+ bNodeTree *ngroup= (bNodeTree*)gnode->id;
+ bNodeSocketType *stype= ntreeGetSocketType(gsock ? gsock->type : sock->type);
+ uiBut *bt;
+ float offset;
+ int draw_value;
+ float node_group_frame= U.dpi*NODE_GROUP_FRAME/72;
+ float socket_size= NODE_SOCKSIZE*U.dpi/72;
+ float arrowbutw= 0.8f*UI_UNIT_X;
+ /* layout stuff for buttons on group left frame */
+ float colw= 0.6f*node_group_frame;
+ float col1= 6 - node_group_frame;
+ float col2= col1 + colw+6;
+ float col3= - arrowbutw - 6;
+ /* layout stuff for buttons on group right frame */
+ float cor1= 6;
+ float cor2= cor1 + arrowbutw + 6;
+ float cor3= cor2 + arrowbutw + 6;
+
+ /* node and group socket circles */
+ if (sock)
+ node_socket_circle_draw(ntree, sock, socket_size);
+ if (gsock)
+ node_socket_circle_draw(ngroup, gsock, socket_size);
+
+ /* socket name */
+ offset = (in_out==SOCK_IN ? col1 : cor3);
+ if (!gsock)
+ offset += (in_out==SOCK_IN ? node_group_frame : -node_group_frame);
+
+ /* draw both name and value button if:
+ * 1) input: not internal
+ * 2) output: (node type uses const outputs) and (group output is unlinked)
+ */
+ draw_value = 0;
+ switch (in_out) {
+ case SOCK_IN:
+ draw_value = !(gsock && (gsock->flag & SOCK_INTERNAL));
+ break;
+ case SOCK_OUT:
+ if (gnode->typeinfo->flag & NODE_CONST_OUTPUT)
+ draw_value = !(gsock && gsock->link);
+ break;
+ }
+ if (draw_value) {
+ /* both name and value buttons */
+ if (gsock) {
+ draw_group_socket_name(snode, gnode, gsock, in_out, offset, 0);
+ if (stype->buttonfunc)
+ stype->buttonfunc(C, gnode->block, ngroup, NULL, gsock, "", gsock->locx+offset, gsock->locy-NODE_DY, colw);
+ }
+ else {
+ draw_group_socket_name(snode, gnode, sock, in_out, offset, 0);
+ if (stype->buttonfunc)
+ stype->buttonfunc(C, gnode->block, ngroup, NULL, sock, "", sock->locx+offset, sock->locy-NODE_DY, colw);
+ }
+ }
+ else {
+ /* only name, no value button */
+ if (gsock)
+ draw_group_socket_name(snode, gnode, gsock, in_out, offset, -NODE_DYS);
+ else
+ draw_group_socket_name(snode, gnode, sock, in_out, offset, -NODE_DYS);
+ }
+
+ if (gsock && (gsock->flag & SOCK_DYNAMIC)) {
+ /* up/down buttons */
+ offset = (in_out==SOCK_IN ? col2 : cor2);
+ uiBlockSetDirection(gnode->block, UI_TOP);
+ uiBlockBeginAlign(gnode->block);
+ bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_up", 0, ICON_TRIA_UP,
+ gsock->locx+offset, gsock->locy, arrowbutw, arrowbutw, "");
+ if (!gsock->prev || !(gsock->prev->flag & SOCK_DYNAMIC))
+ uiButSetFlag(bt, UI_BUT_DISABLED);
+ RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
+ RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", in_out);
+ bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_down", 0, ICON_TRIA_DOWN,
+ gsock->locx+offset, gsock->locy-arrowbutw, arrowbutw, arrowbutw, "");
+ if (!gsock->next || !(gsock->next->flag & SOCK_DYNAMIC))
+ uiButSetFlag(bt, UI_BUT_DISABLED);
+ RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
+ RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", in_out);
+ uiBlockEndAlign(gnode->block);
+ uiBlockSetDirection(gnode->block, 0);
+
+ /* remove button */
+ offset = (in_out==SOCK_IN ? col3 : cor1);
+ uiBlockSetEmboss(gnode->block, UI_EMBOSSN);
+ bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_remove", 0, ICON_X,
+ gsock->locx+offset, gsock->locy-0.5f*arrowbutw, arrowbutw, arrowbutw, "");
+ RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
+ RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", in_out);
+ uiBlockSetEmboss(gnode->block, UI_EMBOSS);
+ }
+}
+
+/* groups are, on creation, centered around 0,0 */
+static void node_draw_group(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *gnode)
+{
+ if (!(gnode->flag & NODE_GROUP_EDIT)) {
+ node_draw_default(C, ar, snode, ntree, gnode);
+ }
+ else {
+ bNodeTree *ngroup= (bNodeTree *)gnode->id;
+ bNodeSocket *sock, *gsock;
+ uiLayout *layout;
+ PointerRNA ptr;
+ rctf rect= gnode->totr;
+ float node_group_frame= U.dpi*NODE_GROUP_FRAME/72;
+ float group_header= 26*U.dpi/72;
+
+ int index;
+
+ /* backdrop header */
+ glEnable(GL_BLEND);
+ uiSetRoundBox(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT);
+ UI_ThemeColorShadeAlpha(TH_NODE_GROUP, 0, -70);
+ uiDrawBox(GL_POLYGON, rect.xmin-node_group_frame, rect.ymax, rect.xmax+node_group_frame, rect.ymax+group_header, BASIS_RAD);
+
+ /* backdrop body */
+ UI_ThemeColorShadeAlpha(TH_BACK, -8, -70);
+ uiSetRoundBox(UI_CNR_NONE);
+ uiDrawBox(GL_POLYGON, rect.xmin, rect.ymin, rect.xmax, rect.ymax, BASIS_RAD);
+
+ /* input column */
+ UI_ThemeColorShadeAlpha(TH_BACK, 10, -50);
+ uiSetRoundBox(UI_CNR_BOTTOM_LEFT);
+ uiDrawBox(GL_POLYGON, rect.xmin-node_group_frame, rect.ymin, rect.xmin, rect.ymax, BASIS_RAD);
+
+ /* output column */
+ UI_ThemeColorShadeAlpha(TH_BACK, 10, -50);
+ uiSetRoundBox(UI_CNR_BOTTOM_RIGHT);
+ uiDrawBox(GL_POLYGON, rect.xmax, rect.ymin, rect.xmax+node_group_frame, rect.ymax, BASIS_RAD);
+
+ /* input column separator */
+ glColor4ub(200, 200, 200, 140);
+ glBegin(GL_LINES);
+ glVertex2f(rect.xmin, rect.ymin);
+ glVertex2f(rect.xmin, rect.ymax);
+ glEnd();
+
+ /* output column separator */
+ glColor4ub(200, 200, 200, 140);
+ glBegin(GL_LINES);
+ glVertex2f(rect.xmax, rect.ymin);
+ glVertex2f(rect.xmax, rect.ymax);
+ glEnd();
+
+ /* group node outline */
+ uiSetRoundBox(UI_CNR_ALL);
+ glColor4ub(200, 200, 200, 140);
+ glEnable( GL_LINE_SMOOTH );
+ uiDrawBox(GL_LINE_LOOP, rect.xmin-node_group_frame, rect.ymin, rect.xmax+node_group_frame, rect.ymax+group_header, BASIS_RAD);
+ glDisable( GL_LINE_SMOOTH );
+ glDisable(GL_BLEND);
+
+ /* backdrop title */
+ UI_ThemeColor(TH_TEXT_HI);
+
+ layout = uiBlockLayout(gnode->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, (short)(rect.xmin+15), (short)(rect.ymax+group_header),
+ MIN2((int)(rect.xmax - rect.xmin-18.0f), node_group_frame+20), group_header, U.uistyles.first);
+ RNA_pointer_create(&ntree->id, &RNA_Node, gnode, &ptr);
+ uiTemplateIDBrowse(layout, (bContext*)C, &ptr, "node_tree", NULL, NULL, NULL);
+ uiBlockLayoutResolve(gnode->block, NULL, NULL);
+
+ /* draw the internal tree nodes and links */
+ node_draw_nodetree(C, ar, snode, ngroup);
+
+ /* group sockets */
+ gsock=ngroup->inputs.first;
+ sock=gnode->inputs.first;
+ index = 0;
+ while (gsock || sock) {
+ while (sock && !sock->groupsock) {
+ draw_group_socket(C, snode, ntree, gnode, sock, NULL, index, SOCK_IN);
+ sock = sock->next;
+ }
+ while (gsock && (!sock || sock->groupsock!=gsock)) {
+ draw_group_socket(C, snode, ntree, gnode, NULL, gsock, index, SOCK_IN);
+ gsock = gsock->next;
+ ++index;
+ }
+ while (sock && gsock && sock->groupsock==gsock) {
+ draw_group_socket(C, snode, ntree, gnode, sock, gsock, index, SOCK_IN);
+ sock = sock->next;
+ gsock = gsock->next;
+ ++index;
+ }
+ }
+ gsock=ngroup->outputs.first;
+ sock=gnode->outputs.first;
+ index = 0;
+ while (gsock || sock) {
+ while (sock && !sock->groupsock) {
+ draw_group_socket(C, snode, ntree, gnode, sock, NULL, index, SOCK_OUT);
+ sock = sock->next;
+ }
+ while (gsock && (!sock || sock->groupsock!=gsock)) {
+ draw_group_socket(C, snode, ntree, gnode, NULL, gsock, index, SOCK_OUT);
+ gsock = gsock->next;
+ ++index;
+ }
+ while (sock && gsock && sock->groupsock==gsock) {
+ draw_group_socket(C, snode, ntree, gnode, sock, gsock, index, SOCK_OUT);
+ sock = sock->next;
+ gsock = gsock->next;
+ ++index;
+ }
+ }
+
+ uiEndBlock(C, gnode->block);
+ uiDrawBlock(C, gnode->block);
+ gnode->block= NULL;
+ }
+}
+
+static void node_common_buts_whileloop(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "max_iterations", 0, NULL, 0);
+}
+
+static void node_update_frame(const bContext *UNUSED(C), bNodeTree *UNUSED(ntree), bNode *node)
+{
+ float locx, locy;
+
+ /* get "global" coords */
+ nodeSpaceCoords(node, &locx, &locy);
+
+ node->prvr.xmin= locx + NODE_DYS;
+ node->prvr.xmax= locx + node->width- NODE_DYS;
+
+ node->totr.xmin= locx;
+ node->totr.xmax= locx + node->width;
+ node->totr.ymax= locy;
+ node->totr.ymin= locy - node->height;
+}
+
+static void node_common_set_butfunc(bNodeType *ntype)
+{
+ switch(ntype->type) {
+ case NODE_GROUP:
+// ntype->uifunc= node_common_buts_group;
+ ntype->drawfunc= node_draw_group;
+ ntype->drawupdatefunc= node_update_group;
+ break;
+ case NODE_FORLOOP:
+// ntype->uifunc= node_common_buts_group;
+ ntype->drawfunc= node_draw_group;
+ ntype->drawupdatefunc= node_update_group;
+ break;
+ case NODE_WHILELOOP:
+ ntype->uifunc= node_common_buts_whileloop;
+ ntype->drawfunc= node_draw_group;
+ ntype->drawupdatefunc= node_update_group;
+ break;
+ case NODE_FRAME:
+ ntype->drawupdatefunc= node_update_frame;
+ break;
+ }
+}
+
/* ****************** BUTTON CALLBACKS FOR SHADER NODES ***************** */
static void node_browse_text_cb(bContext *C, void *ntree_v, void *node_v)
@@ -470,8 +1070,6 @@ static void node_shader_set_butfunc(bNodeType *ntype)
case NODE_DYNAMIC:
ntype->uifunc= node_shader_buts_dynamic;
break;
- default:
- ntype->uifunc= NULL;
}
if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc;
}
@@ -1225,8 +1823,6 @@ static void node_composit_set_butfunc(bNodeType *ntype)
case CMP_NODE_SEPYCCA:
ntype->uifunc=node_composit_buts_ycc;
break;
- default:
- ntype->uifunc= NULL;
}
if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc;
@@ -1381,9 +1977,6 @@ static void node_texture_set_butfunc(bNodeType *ntype)
case TEX_NODE_OUTPUT:
ntype->uifunc = node_texture_buts_output;
break;
-
- default:
- ntype->uifunc= NULL;
}
if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc;
}
@@ -1392,24 +1985,60 @@ static void node_texture_set_butfunc(bNodeType *ntype)
void ED_init_node_butfuncs(void)
{
+ bNodeTreeType *treetype;
bNodeType *ntype;
-
- /* shader nodes */
- ntype= node_all_shaders.first;
- while(ntype) {
- node_shader_set_butfunc(ntype);
- ntype= ntype->next;
- }
- /* composit nodes */
- ntype= node_all_composit.first;
- while(ntype) {
- node_composit_set_butfunc(ntype);
- ntype= ntype->next;
+ bNodeSocketType *stype;
+ int i;
+
+ /* node type ui functions */
+ for (i=0; i < NUM_NTREE_TYPES; ++i) {
+ treetype = ntreeGetType(i);
+ if (treetype) {
+ for (ntype= treetype->node_types.first; ntype; ntype= ntype->next) {
+ /* default ui functions */
+ ntype->drawfunc = node_draw_default;
+ ntype->drawupdatefunc = node_update_default;
+ ntype->uifunc = NULL;
+ ntype->uifuncbut = NULL;
+ ntype->resize_area_func = node_resize_area_default;
+
+ node_common_set_butfunc(ntype);
+
+ switch (i) {
+ case NTREE_COMPOSIT:
+ node_composit_set_butfunc(ntype);
+ break;
+ case NTREE_SHADER:
+ node_shader_set_butfunc(ntype);
+ break;
+ case NTREE_TEXTURE:
+ node_texture_set_butfunc(ntype);
+ break;
+ }
+ }
+ }
}
- ntype = node_all_textures.first;
- while(ntype) {
- node_texture_set_butfunc(ntype);
- ntype= ntype->next;
+
+ /* socket type ui functions */
+ for (i=0; i < NUM_SOCKET_TYPES; ++i) {
+ stype = ntreeGetSocketType(i);
+ if (stype) {
+ switch(stype->type) {
+ case SOCK_FLOAT:
+ case SOCK_INT:
+ case SOCK_BOOLEAN:
+ stype->buttonfunc = node_socket_button_default;
+ break;
+ case SOCK_VECTOR:
+ stype->buttonfunc = node_socket_button_components;
+ break;
+ case SOCK_RGBA:
+ stype->buttonfunc = node_socket_button_color;
+ break;
+ default:
+ stype->buttonfunc = NULL;
+ }
+ }
}
}
@@ -1840,6 +2469,69 @@ void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int t
}
}
+static void node_link_straight_points(View2D *UNUSED(v2d), SpaceNode *snode, bNodeLink *link, float coord_array[][2])
+{
+ if(link->fromsock) {
+ coord_array[0][0]= link->fromsock->locx;
+ coord_array[0][1]= link->fromsock->locy;
+ }
+ else {
+ if(snode==NULL) return;
+ coord_array[0][0]= snode->mx;
+ coord_array[0][1]= snode->my;
+ }
+ if(link->tosock) {
+ coord_array[1][0]= link->tosock->locx;
+ coord_array[1][1]= link->tosock->locy;
+ }
+ else {
+ if(snode==NULL) return;
+ coord_array[1][0]= snode->mx;
+ coord_array[1][1]= snode->my;
+ }
+}
+
+void node_draw_link_straight(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3 )
+{
+ float coord_array[2][2];
+ float linew;
+ int i;
+
+ node_link_straight_points(v2d, snode, link, coord_array);
+
+ /* store current linewidth */
+ glGetFloatv(GL_LINE_WIDTH, &linew);
+
+ glEnable(GL_LINE_SMOOTH);
+
+ if(do_triple) {
+ UI_ThemeColorShadeAlpha(th_col3, -80, -120);
+ glLineWidth(4.0f);
+
+ glBegin(GL_LINES);
+ glVertex2fv(coord_array[0]);
+ glVertex2fv(coord_array[1]);
+ glEnd();
+ }
+
+ UI_ThemeColor(th_col1);
+ glLineWidth(1.5f);
+
+ glBegin(GL_LINE_STRIP);
+ for (i=0; i < LINK_RESOL; ++i) {
+ float t= (float)i/(float)(LINK_RESOL-1);
+ if(do_shaded)
+ UI_ThemeColorBlend(th_col1, th_col2, t);
+ glVertex2f((1.0f-t)*coord_array[0][0]+t*coord_array[1][0], (1.0f-t)*coord_array[0][1]+t*coord_array[1][1]);
+ }
+ glEnd();
+
+ glDisable(GL_LINE_SMOOTH);
+
+ /* restore previuos linewidth */
+ glLineWidth(linew);
+}
+
/* note; this is used for fake links in groups too */
void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
{
@@ -1868,7 +2560,7 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
}
else {
/* check cyclic */
- if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF) {
+ if((link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF) && (link->flag & NODE_LINK_VALID)) {
/* special indicated link, on drop-node */
if(link->flag & NODE_LINKFLAG_HILITE) {
th_col1= th_col2= TH_ACTIVE;
@@ -1890,6 +2582,5 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
}
node_draw_link_bezier(v2d, snode, link, th_col1, do_shaded, th_col2, do_triple, th_col3);
+// node_draw_link_straight(v2d, snode, link, th_col1, do_shaded, th_col2, do_triple, th_col3);
}
-
-
diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c
index 8c4787f3526..95a58402b0a 100644
--- a/source/blender/editors/space_node/node_buttons.c
+++ b/source/blender/editors/space_node/node_buttons.c
@@ -118,10 +118,12 @@ static void active_node_panel(const bContext *C, Panel *pa)
uiItemS(layout);
uiItemR(layout, &ptr, "name", 0, NULL, ICON_NODE);
uiItemS(layout);
-
+
/* draw this node's settings */
if (node->typeinfo && node->typeinfo->uifuncbut)
node->typeinfo->uifuncbut(layout, (bContext *)C, &ptr);
+ else if (node->typeinfo && node->typeinfo->uifunc)
+ node->typeinfo->uifunc(layout, (bContext *)C, &ptr);
}
/* ******************* node buttons registration ************** */
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c
index 0cd7d19a658..e713ed5a678 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -70,8 +70,8 @@
#include "RNA_access.h"
-#include "CMP_node.h"
-#include "SHD_node.h"
+#include "NOD_composite.h"
+#include "NOD_shader.h"
#include "node_intern.h"
@@ -81,6 +81,15 @@
// XXX interface.h
extern void ui_dropshadow(rctf *rct, float radius, float aspect, int select);
+/* XXX update functions for node editor are a mess, needs a clear concept */
+void ED_node_tree_update(SpaceNode *snode, Scene *scene)
+{
+ snode_set_context(snode, scene);
+
+ if(snode->nodetree && snode->nodetree->id.us==0)
+ snode->nodetree->id.us= 1;
+}
+
void ED_node_changed_update(ID *id, bNode *node)
{
bNodeTree *nodetree, *edittree;
@@ -123,24 +132,25 @@ static int has_nodetree(bNodeTree *ntree, bNodeTree *lookup)
return 0;
}
+typedef struct NodeUpdateCalldata {
+ bNodeTree *ntree;
+ bNode *node;
+} NodeUpdateCalldata;
+static void node_generic_update_cb(void *calldata, ID *owner_id, bNodeTree *ntree)
+{
+ NodeUpdateCalldata *cd= (NodeUpdateCalldata*)calldata;
+ /* check if nodetree uses the group stored in calldata */
+ if (has_nodetree(ntree, cd->ntree))
+ ED_node_changed_update(owner_id, cd->node);
+}
void ED_node_generic_update(Main *bmain, bNodeTree *ntree, bNode *node)
{
- Material *ma;
- Tex *tex;
- Scene *sce;
-
+ bNodeTreeType *tti= ntreeGetType(ntree->type);
+ NodeUpdateCalldata cd;
+ cd.ntree = ntree;
+ cd.node = node;
/* look through all datablocks, to support groups */
- for(ma=bmain->mat.first; ma; ma=ma->id.next)
- if(ma->nodetree && ma->use_nodes && has_nodetree(ma->nodetree, ntree))
- ED_node_changed_update(&ma->id, node);
-
- for(tex=bmain->tex.first; tex; tex=tex->id.next)
- if(tex->nodetree && tex->use_nodes && has_nodetree(tex->nodetree, ntree))
- ED_node_changed_update(&tex->id, node);
-
- for(sce=bmain->scene.first; sce; sce=sce->id.next)
- if(sce->nodetree && sce->use_nodes && has_nodetree(sce->nodetree, ntree))
- ED_node_changed_update(&sce->id, node);
+ tti->foreach_nodetree(bmain, &cd, node_generic_update_cb);
if(ntree->type == NTREE_TEXTURE)
ntreeTexCheckCyclics(ntree);
@@ -204,14 +214,19 @@ static void node_uiblocks_init(const bContext *C, bNodeTree *ntree)
}
/* based on settings in node, sets drawing rect info. each redraw! */
-static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
+static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
{
uiLayout *layout;
PointerRNA ptr;
bNodeSocket *nsock;
- float dy= node->locy;
+ float locx, locy;
+ float dy;
int buty;
+ /* get "global" coords */
+ nodeSpaceCoords(node, &locx, &locy);
+ dy= locy;
+
/* header */
dy-= NODE_DY;
@@ -222,14 +237,14 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
/* output sockets */
for(nsock= node->outputs.first; nsock; nsock= nsock->next) {
if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
- nsock->locx= node->locx + node->width;
+ nsock->locx= locx + node->width;
nsock->locy= dy - NODE_DYS;
dy-= NODE_DY;
}
}
- node->prvr.xmin= node->locx + NODE_DYS;
- node->prvr.xmax= node->locx + node->width- NODE_DYS;
+ node->prvr.xmin= locx + NODE_DYS;
+ node->prvr.xmax= locx + node->width- NODE_DYS;
/* preview rect? */
if(node->flag & NODE_PREVIEW) {
@@ -286,21 +301,22 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
node->butr.ymax= 0;
RNA_pointer_create(&ntree->id, &RNA_Node, node, &ptr);
-
+
layout= uiBlockLayout(node->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL,
- node->locx+NODE_DYS, dy, node->butr.xmax, NODE_DY, UI_GetStyle());
-
+ locx+NODE_DYS, dy, node->butr.xmax, NODE_DY, UI_GetStyle());
+
node->typeinfo->uifunc(layout, (bContext *)C, &ptr);
+
uiBlockEndAlign(node->block);
uiBlockLayoutResolve(node->block, NULL, &buty);
-
+
dy= buty - NODE_DYS/2;
}
/* input sockets */
for(nsock= node->inputs.first; nsock; nsock= nsock->next) {
if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
- nsock->locx= node->locx;
+ nsock->locx= locx;
nsock->locy= dy - NODE_DYS;
dy-= NODE_DY;
}
@@ -310,19 +326,23 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
if(node->inputs.first || (node->flag & (NODE_OPTIONS|NODE_PREVIEW))==0 )
dy-= NODE_DYS/2;
- node->totr.xmin= node->locx;
- node->totr.xmax= node->locx + node->width;
- node->totr.ymax= node->locy;
- node->totr.ymin= MIN2(dy, node->locy-2*NODE_DY);
+ node->totr.xmin= locx;
+ node->totr.xmax= locx + node->width;
+ node->totr.ymax= locy;
+ node->totr.ymin= MIN2(dy, locy-2*NODE_DY);
}
/* based on settings in node, sets drawing rect info. each redraw! */
static void node_update_hidden(bNode *node)
{
bNodeSocket *nsock;
+ float locx, locy;
float rad, drad, hiddenrad= HIDDEN_RAD;
int totin=0, totout=0, tot;
+ /* get "global" coords */
+ nodeSpaceCoords(node, &locx, &locy);
+
/* calculate minimal radius */
for(nsock= node->inputs.first; nsock; nsock= nsock->next)
if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
@@ -336,9 +356,9 @@ static void node_update_hidden(bNode *node)
hiddenrad += 5.0f*(float)(tot-4);
}
- node->totr.xmin= node->locx;
- node->totr.xmax= node->locx + 3*hiddenrad + node->miniwidth;
- node->totr.ymax= node->locy + (hiddenrad - 0.5f*NODE_DY);
+ node->totr.xmin= locx;
+ node->totr.xmax= locx + 3*hiddenrad + node->miniwidth;
+ node->totr.ymax= locy + (hiddenrad - 0.5f*NODE_DY);
node->totr.ymin= node->totr.ymax - 2*hiddenrad;
/* output sockets */
@@ -364,6 +384,14 @@ static void node_update_hidden(bNode *node)
}
}
+void node_update_default(const bContext *C, bNodeTree *ntree, bNode *node)
+{
+ if(node->flag & NODE_HIDDEN)
+ node_update_hidden(node);
+ else
+ node_update_basis(C, ntree, node);
+}
+
static int node_get_colorid(bNode *node)
{
if(node->typeinfo->nclass==NODE_CLASS_INPUT)
@@ -383,138 +411,42 @@ static int node_get_colorid(bNode *node)
return TH_NODE;
}
-/* based on settings in node, sets drawing rect info. each redraw! */
-/* note: this assumes only 1 group at a time is drawn (linked data) */
-/* in node->totr the entire boundbox for the group is stored */
-static void node_update_group(const bContext *C, bNodeTree *UNUSED(ntree), bNode *gnode)
-{
- bNodeTree *ngroup= (bNodeTree *)gnode->id;
- bNode *node;
- bNodeSocket *sock, *gsock;
- rctf *rect= &gnode->totr;
- float node_group_frame= U.dpi*NODE_GROUP_FRAME/72;
- int counter;
- int dy;
-
- rect->xmin = rect->xmax = gnode->locx;
- rect->ymin = rect->ymax = gnode->locy;
-
- /* center them, is a bit of abuse of locx and locy though */
- for(node= ngroup->nodes.first; node; node= node->next) {
- node->locx+= gnode->locx;
- node->locy+= gnode->locy;
-
- if(node->flag & NODE_HIDDEN)
- node_update_hidden(node);
- else
- node_update(C, ngroup, node);
- node->locx-= gnode->locx;
- node->locy-= gnode->locy;
- }
- counter= 1;
- for(node= ngroup->nodes.first; node; node= node->next) {
- if(counter) {
- *rect= node->totr;
- counter= 0;
- }
- else
- BLI_union_rctf(rect, &node->totr);
- }
-
- /* add some room for links to group sockets */
- rect->xmin -= 4*NODE_DY;
- rect->xmax += 4*NODE_DY;
- rect->ymin-= NODE_DY;
- rect->ymax+= NODE_DY;
-
- /* input sockets */
- dy = 0.5f*(rect->ymin+rect->ymax) + NODE_DY*(BLI_countlist(&gnode->inputs)-1);
- for(gsock=ngroup->inputs.first, sock=gnode->inputs.first; gsock; gsock=gsock->next, sock=sock->next) {
- gsock->locx = rect->xmin;
- sock->locx = rect->xmin - node_group_frame;
- sock->locy = gsock->locy = dy;
-
- /* prevent long socket lists from growing out of the group box */
- if (dy-3*NODE_DYS < rect->ymin)
- rect->ymin = dy-3*NODE_DYS;
- if (dy+3*NODE_DYS > rect->ymax)
- rect->ymax = dy+3*NODE_DYS;
-
- dy -= 2*NODE_DY;
- }
-
- /* output sockets */
- dy = 0.5f*(rect->ymin+rect->ymax) + NODE_DY*(BLI_countlist(&gnode->outputs)-1);
- for(gsock=ngroup->outputs.first, sock=gnode->outputs.first; gsock; gsock=gsock->next, sock=sock->next) {
- gsock->locx = rect->xmax;
- sock->locx = rect->xmax + node_group_frame;
- sock->locy = gsock->locy = dy - NODE_DYS;
-
- /* prevent long socket lists from growing out of the group box */
- if (dy-3*NODE_DYS < rect->ymin)
- rect->ymin = dy-3*NODE_DYS;
- if (dy+3*NODE_DYS > rect->ymax)
- rect->ymax = dy+3*NODE_DYS;
-
- dy -= 2*NODE_DY;
- }
-}
-
/* note: in cmp_util.c is similar code, for node_compo_pass_on() */
/* note: in node_edit.c is similar code, for untangle node */
static void node_draw_mute_line(View2D *v2d, SpaceNode *snode, bNode *node)
{
- bNodeSocket *valsock= NULL, *colsock= NULL, *vecsock= NULL;
- bNodeSocket *sock;
+ static int types[]= { SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA };
bNodeLink link= {NULL};
- int a;
-
- /* connect the first value buffer in with first value out */
- /* connect the first RGBA buffer in with first RGBA out */
+ int i;
- /* test the inputs */
- for(a=0, sock= node->inputs.first; sock; sock= sock->next, a++) {
- if(nodeCountSocketLinks(snode->edittree, sock)) {
- if(sock->type==SOCK_VALUE && valsock==NULL) valsock= sock;
- if(sock->type==SOCK_VECTOR && vecsock==NULL) vecsock= sock;
- if(sock->type==SOCK_RGBA && colsock==NULL) colsock= sock;
- }
- }
+ /* connect the first input of each type with first output of the same type */
- /* outputs, draw lines */
glEnable(GL_BLEND);
glEnable( GL_LINE_SMOOTH );
- if(valsock || colsock || vecsock) {
- for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) {
- if(nodeCountSocketLinks(snode->edittree, sock)) {
- link.tosock= sock;
-
- if(sock->type==SOCK_VALUE && valsock) {
- link.fromsock= valsock;
- node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE);
- valsock= NULL;
- }
- if(sock->type==SOCK_VECTOR && vecsock) {
- link.fromsock= vecsock;
- node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE);
- vecsock= NULL;
- }
- if(sock->type==SOCK_RGBA && colsock) {
- link.fromsock= colsock;
- node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE);
- colsock= NULL;
- }
+ link.fromnode = link.tonode = node;
+ for (i=0; i < 3; ++i) {
+ /* find input socket */
+ for (link.fromsock=node->inputs.first; link.fromsock; link.fromsock=link.fromsock->next)
+ if (link.fromsock->type==types[i] && nodeCountSocketLinks(snode->edittree, link.fromsock))
+ break;
+ if (link.fromsock) {
+ for (link.tosock=node->outputs.first; link.tosock; link.tosock=link.tosock->next)
+ if (link.tosock->type==types[i] && nodeCountSocketLinks(snode->edittree, link.tosock))
+ break;
+
+ if (link.tosock) {
+ node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE);
}
}
}
+
glDisable(GL_BLEND);
glDisable( GL_LINE_SMOOTH );
}
-/* nice AA filled circle */
/* this might have some more generic use */
-static void circle_draw(float x, float y, float size, int col[3])
+static void node_circle_draw(float x, float y, float size, char *col)
{
/* 16 values of sin function */
static float si[16] = {
@@ -550,37 +482,10 @@ static void circle_draw(float x, float y, float size, int col[3])
glDisable(GL_BLEND);
}
-static void socket_circle_draw(bNodeSocket *sock, float size)
-{
- int col[3];
-
- if(sock->type==-1) {
- col[0]= 0; col[1]= 0; col[2]= 0;
- }
- else if(sock->type==SOCK_VALUE) {
- col[0]= 160; col[1]= 160; col[2]= 160;
- }
- else if(sock->type==SOCK_VECTOR) {
- col[0]= 100; col[1]= 100; col[2]= 200;
- }
- else if(sock->type==SOCK_RGBA) {
- col[0]= 200; col[1]= 200; col[2]= 40;
- }
- else {
- col[0]= 100; col[1]= 200; col[2]= 100;
- }
-
- circle_draw(sock->locx, sock->locy, size, col);
-}
-
-static void node_sync_cb(bContext *UNUSED(C), void *snode_v, void *node_v)
+void node_socket_circle_draw(bNodeTree *UNUSED(ntree), bNodeSocket *sock, float size)
{
- SpaceNode *snode= snode_v;
-
- if(snode->treetype==NTREE_SHADER) {
- nodeShaderSynchronizeID(node_v, 1);
- // allqueue(REDRAWBUTSSHADING, 0);
- }
+ bNodeSocketType *stype = ntreeGetSocketType(sock->type);
+ node_circle_draw(sock->locx, sock->locy, size, stype->ui_color);
}
/* ************** Socket callbacks *********** */
@@ -639,89 +544,12 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv)
}
-typedef struct SocketVectorMenuArgs {
- PointerRNA ptr;
- int x, y, width;
- uiButHandleFunc cb;
- void *arg1, *arg2;
-} SocketVectorMenuArgs;
-
-/* NOTE: this is a block-menu, needs 0 events, otherwise the menu closes */
-static uiBlock *socket_vector_menu(bContext *C, ARegion *ar, void *args_v)
-{
- SocketVectorMenuArgs *args= (SocketVectorMenuArgs*)args_v;
- uiBlock *block;
- uiLayout *layout;
-
- block= uiBeginBlock(C, ar, "socket menu", UI_EMBOSS);
- uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN);
-
- layout= uiLayoutColumn(uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, args->x, args->y+2, args->width, NODE_DY, UI_GetStyle()), 0);
-
- uiItemR(layout, &args->ptr, "default_value", UI_ITEM_R_EXPAND, "", ICON_NONE);
-
- return block;
-}
-
-static void node_draw_socket_button(bNodeTree *ntree, bNodeSocket *sock, const char *name,
- uiBlock *block, int x, int y, int width,
- uiButHandleFunc cb, void *arg1, void *arg2)
-{
- uiBut *bt= NULL;
- PointerRNA ptr;
- int labelw;
- SocketVectorMenuArgs *args;
-
- RNA_pointer_create(&ntree->id, &RNA_NodeSocket, sock, &ptr);
-
- switch (sock->type) {
- case SOCK_VALUE:
- bt=uiDefButR(block, NUM, B_NODE_EXEC, name,
- x, y+1, width, NODE_DY-2,
- &ptr, "default_value", 0, sock->ns.min, sock->ns.max, -1, -1, NULL);
- if (cb)
- uiButSetFunc(bt, cb, arg1, arg2);
- break;
-
- case SOCK_VECTOR:
- args= MEM_callocN(sizeof(SocketVectorMenuArgs), "SocketVectorMenuArgs");
-
- args->ptr = ptr;
- args->x = x;
- args->y = y;
- args->width = width;
- args->cb = cb;
- args->arg1 = arg1;
- args->arg2 = arg2;
-
- uiDefBlockButN(block, socket_vector_menu, args, name,
- x, y+1, width, NODE_DY-2,
- "");
- break;
-
- case SOCK_RGBA:
- labelw= width - 40;
-
- bt=uiDefButR(block, COL, B_NODE_EXEC, "",
- x, y+2, (labelw>0 ? 40 : width), NODE_DY-2,
- &ptr, "default_value", 0, sock->ns.min, sock->ns.max, -1, -1, NULL);
- if (cb)
- uiButSetFunc(bt, cb, arg1, arg2);
-
- if (name[0]!='\0' && labelw>0)
- uiDefBut(block, LABEL, 0, name,
- x + 40, y+2, labelw, NODE_DY-2,
- NULL, 0, 0, 0, 0, "");
- break;
- }
-}
-
static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *node)
{
bNodeSocket *sock;
rctf *rct= &node->totr;
float iconofs;
- float socket_size= NODE_SOCKSIZE*U.dpi/72;
+ /* float socket_size= NODE_SOCKSIZE*U.dpi/72; */ /* UNUSED */
float iconbutw= 0.8f*UI_UNIT_X;
int color_id= node_get_colorid(node);
char showname[128]; /* 128 used below */
@@ -740,7 +568,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
return;
}
- uiSetRoundBox(15-4);
+ uiSetRoundBox(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_LEFT);
ui_dropshadow(rct, BASIS_RAD, snode->aspect, node->flag & SELECT);
/* header */
@@ -752,7 +580,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
if(node->flag & NODE_MUTED)
UI_ThemeColorBlend(color_id, TH_REDALERT, 0.5f);
- uiSetRoundBox(3);
+ uiSetRoundBox(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT);
uiRoundBox(rct->xmin, rct->ymax-NODE_DY, rct->xmax, rct->ymax, BASIS_RAD);
/* show/hide icons, note this sequence is copied in do_header_node() node_state.c */
@@ -809,13 +637,8 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
else
UI_ThemeColor(TH_TEXT); */
- if (node->label[0]!='\0')
- BLI_strncpy(showname, node->label, sizeof(showname));
- else if (node->typeinfo->labelfunc)
- BLI_strncpy(showname, node->typeinfo->labelfunc(node), sizeof(showname));
- else
- BLI_strncpy(showname, node->typeinfo->name, sizeof(showname));
-
+ BLI_strncpy(showname, nodeLabel(node), sizeof(showname));
+
//if(node->flag & NODE_MUTED)
// sprintf(showname, "[%s]", showname);
@@ -825,7 +648,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
/* body */
UI_ThemeColor4(TH_NODE);
glEnable(GL_BLEND);
- uiSetRoundBox(8);
+ uiSetRoundBox(UI_CNR_BOTTOM_LEFT);
uiRoundBox(rct->xmin, rct->ymin, rct->xmax, rct->ymax-NODE_DY, BASIS_RAD);
glDisable(GL_BLEND);
@@ -841,7 +664,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
UI_ThemeColorShadeAlpha(TH_TEXT_HI, 0, -40);
else
UI_ThemeColorShadeAlpha(TH_TEXT_HI, -20, -120);
- uiSetRoundBox(15-4); // round all corners except lower right
+ uiSetRoundBox(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_LEFT); // round all corners except lower right
uiDrawBox(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, BASIS_RAD);
glDisable( GL_LINE_SMOOTH );
@@ -855,37 +678,45 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
/* socket inputs, buttons */
for(sock= node->inputs.first; sock; sock= sock->next) {
- if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
- socket_circle_draw(sock, socket_size);
-
- if(node->block && sock->link==NULL) {
- node_draw_socket_button(ntree, sock, sock->name, node->block, sock->locx+NODE_DYS, sock->locy-NODE_DYS, node->width-NODE_DY, node_sync_cb, snode, node);
- }
- else {
- uiDefBut(node->block, LABEL, 0, sock->name, (short)(sock->locx+7), (short)(sock->locy-9.0f),
- (short)(node->width-NODE_DY), NODE_DY, NULL, 0, 0, 0, 0, "");
- }
+ bNodeSocketType *stype= ntreeGetSocketType(sock->type);
+
+ if(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))
+ continue;
+
+ node_socket_circle_draw(ntree, sock, NODE_SOCKSIZE);
+
+ if (sock->link) {
+ uiDefBut(node->block, LABEL, 0, sock->name, sock->locx+NODE_DYS, sock->locy-NODE_DYS, node->width-NODE_DY, NODE_DY,
+ NULL, 0, 0, 0, 0, "");
+ }
+ else {
+ if (stype->buttonfunc)
+ stype->buttonfunc(C, node->block, ntree, node, sock, sock->name, sock->locx+NODE_DYS, sock->locy-NODE_DYS, node->width-NODE_DY);
}
}
/* socket outputs */
for(sock= node->outputs.first; sock; sock= sock->next) {
- if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
- float slen;
- int ofs= 0;
-
- socket_circle_draw(sock, socket_size);
-
- UI_ThemeColor(TH_TEXT);
- slen= snode->aspect*UI_GetStringWidth(sock->name);
- while(slen > node->width) {
- ofs++;
- slen= snode->aspect*UI_GetStringWidth(sock->name+ofs);
- }
-
- uiDefBut(node->block, LABEL, 0, sock->name+ofs, (short)(sock->locx-15.0f-slen), (short)(sock->locy-9.0f),
- (short)(node->width-NODE_DY), NODE_DY, NULL, 0, 0, 0, 0, "");
+ PointerRNA sockptr;
+ float slen;
+ int ofs;
+
+ RNA_pointer_create((ID*)ntree, &RNA_NodeSocket, sock, &sockptr);
+
+ if(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))
+ continue;
+
+ node_socket_circle_draw(ntree, sock, NODE_SOCKSIZE);
+
+ ofs= 0;
+ UI_ThemeColor(TH_TEXT);
+ slen= snode->aspect*UI_GetStringWidth(sock->name);
+ while(slen > node->width) {
+ ofs++;
+ slen= snode->aspect*UI_GetStringWidth(sock->name+ofs);
}
+ uiDefBut(node->block, LABEL, 0, sock->name+ofs, (short)(sock->locx-15.0f-slen), (short)(sock->locy-9.0f),
+ (short)(node->width-NODE_DY), NODE_DY, NULL, 0, 0, 0, 0, "");
}
/* preview */
@@ -914,7 +745,7 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
char showname[128]; /* 128 is used below */
/* shadow */
- uiSetRoundBox(15);
+ uiSetRoundBox(UI_CNR_ALL);
ui_dropshadow(rct, hiddenrad, snode->aspect, node->flag & SELECT);
/* body */
@@ -956,12 +787,7 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
UI_ThemeColor(TH_TEXT);
if(node->miniwidth>0.0f) {
- if (node->label[0]!='\0')
- BLI_strncpy(showname, node->label, sizeof(showname));
- else if (node->typeinfo->labelfunc)
- BLI_strncpy(showname, node->typeinfo->labelfunc(node), sizeof(showname));
- else
- BLI_strncpy(showname, node->typeinfo->name, sizeof(showname));
+ BLI_strncpy(showname, nodeLabel(node), sizeof(showname));
//if(node->flag & NODE_MUTED)
// sprintf(showname, "[%s]", showname);
@@ -984,12 +810,12 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
/* sockets */
for(sock= node->inputs.first; sock; sock= sock->next) {
if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
- socket_circle_draw(sock, socket_size);
+ node_socket_circle_draw(snode->nodetree, sock, socket_size);
}
for(sock= node->outputs.first; sock; sock= sock->next) {
if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
- socket_circle_draw(sock, socket_size);
+ node_socket_circle_draw(snode->nodetree, sock, socket_size);
}
uiEndBlock(C, node->block);
@@ -997,7 +823,43 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
node->block= NULL;
}
-static void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree)
+void node_draw_default(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *node)
+{
+ if(node->flag & NODE_HIDDEN)
+ node_draw_hidden(C, ar, snode, node);
+ else
+ node_draw_basis(C, ar, snode, ntree, node);
+}
+
+static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
+{
+ if (node->typeinfo->drawupdatefunc)
+ node->typeinfo->drawupdatefunc(C, ntree, node);
+}
+
+void node_update_nodetree(const bContext *C, bNodeTree *ntree, float offsetx, float offsety)
+{
+ bNode *node;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ /* XXX little hack */
+ node->locx += offsetx;
+ node->locy += offsety;
+
+ node_update(C, ntree, node);
+
+ node->locx -= offsetx;
+ node->locy -= offsety;
+ }
+}
+
+static void node_draw(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *node)
+{
+ if (node->typeinfo->drawfunc)
+ node->typeinfo->drawfunc(C, ar, snode, ntree, node);
+}
+
+void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree)
{
bNode *node;
bNodeLink *link;
@@ -1013,212 +875,11 @@ static void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode,
glDisable(GL_LINE_SMOOTH);
glDisable(GL_BLEND);
- /* not selected first */
- for(a=0, node= ntree->nodes.first; node; node= node->next, a++) {
+ /* draw nodes, last nodes in front */
+ for(a=0, node= ntree->nodes.first; node; node=node->next, a++) {
node->nr= a; /* index of node in list, used for exec event code */
- if(!(node->flag & SELECT)) {
- if(node->flag & NODE_GROUP_EDIT);
- else if(node->flag & NODE_HIDDEN)
- node_draw_hidden(C, ar, snode, node);
- else
- node_draw_basis(C, ar, snode, ntree, node);
- }
- }
-
- /* selected */
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->flag & SELECT) {
- if(node->flag & NODE_GROUP_EDIT);
- else if(node->flag & NODE_HIDDEN)
- node_draw_hidden(C, ar, snode, node);
- else
- node_draw_basis(C, ar, snode, ntree, node);
- }
- }
-}
-
-static void group_verify_cb(bContext *UNUSED(C), void *UNUSED(snode_v), void *ngroup_v)
-{
- bNodeTree *ngroup= (bNodeTree*)ngroup_v;
-
- nodeGroupVerify(ngroup);
-}
-
-/* groups are, on creation, centered around 0,0 */
-static void node_draw_group(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *gnode)
-{
- bNodeTree *ngroup= (bNodeTree *)gnode->id;
- bNodeSocket *sock;
- uiLayout *layout;
- PointerRNA ptr;
- uiBut *bt;
- rctf rect= gnode->totr;
- float socket_size= NODE_SOCKSIZE*U.dpi/72;
- float node_group_frame= U.dpi*NODE_GROUP_FRAME/72;
- float group_header= 26*U.dpi/72;
- float arrowbutw= 0.8f*UI_UNIT_X;
- /* layout stuff for buttons on group left frame */
- float col1= 6, colw1= 0.6f*node_group_frame;
- float col2= col1 + colw1+6;
- float col3= node_group_frame - arrowbutw - 6;
- /* layout stuff for buttons on group right frame */
- float cor1= 6;
- float cor2= cor1 + arrowbutw + 6;
- float cor3= cor2 + arrowbutw + 6, corw3= node_group_frame - cor3-6;
-
- int index;
-
- /* backdrop header */
- glEnable(GL_BLEND);
- uiSetRoundBox(3);
- UI_ThemeColorShadeAlpha(TH_NODE_GROUP, 0, -70);
- uiDrawBox(GL_POLYGON, rect.xmin-node_group_frame, rect.ymax, rect.xmax+node_group_frame, rect.ymax+group_header, BASIS_RAD);
-
- /* backdrop body */
- UI_ThemeColorShadeAlpha(TH_BACK, -8, -70);
- uiSetRoundBox(0);
- uiDrawBox(GL_POLYGON, rect.xmin, rect.ymin, rect.xmax, rect.ymax, BASIS_RAD);
-
- /* input column */
- UI_ThemeColorShadeAlpha(TH_BACK, 10, -50);
- uiSetRoundBox(8);
- uiDrawBox(GL_POLYGON, rect.xmin-node_group_frame, rect.ymin, rect.xmin, rect.ymax, BASIS_RAD);
-
- /* output column */
- UI_ThemeColorShadeAlpha(TH_BACK, 10, -50);
- uiSetRoundBox(4);
- uiDrawBox(GL_POLYGON, rect.xmax, rect.ymin, rect.xmax+node_group_frame, rect.ymax, BASIS_RAD);
-
- /* input column separator */
- glColor4ub(200, 200, 200, 140);
- glBegin(GL_LINES);
- glVertex2f(rect.xmin, rect.ymin);
- glVertex2f(rect.xmin, rect.ymax);
- glEnd();
-
- /* output column separator */
- glColor4ub(200, 200, 200, 140);
- glBegin(GL_LINES);
- glVertex2f(rect.xmax, rect.ymin);
- glVertex2f(rect.xmax, rect.ymax);
- glEnd();
-
- /* group node outline */
- uiSetRoundBox(15);
- glColor4ub(200, 200, 200, 140);
- glEnable( GL_LINE_SMOOTH );
- uiDrawBox(GL_LINE_LOOP, rect.xmin-node_group_frame, rect.ymin, rect.xmax+node_group_frame, rect.ymax+group_header, BASIS_RAD);
- glDisable( GL_LINE_SMOOTH );
- glDisable(GL_BLEND);
-
- /* backdrop title */
- UI_ThemeColor(TH_TEXT_HI);
-
- layout = uiBlockLayout(gnode->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, (short)(rect.xmin+15), (short)(rect.ymax+group_header),
- MIN2((int)(rect.xmax - rect.xmin-18.0f), node_group_frame+20), group_header, UI_GetStyle());
- RNA_pointer_create(&ntree->id, &RNA_Node, gnode, &ptr);
- uiTemplateIDBrowse(layout, (bContext*)C, &ptr, "node_tree", NULL, NULL, NULL);
- uiBlockLayoutResolve(gnode->block, NULL, NULL);
-
- /* draw the internal tree nodes and links */
- node_draw_nodetree(C, ar, snode, ngroup);
-
- /* group sockets */
- for(sock=ngroup->inputs.first, index=0; sock; sock=sock->next, ++index) {
- float locx= sock->locx - node_group_frame;
-
- socket_circle_draw(sock, socket_size);
- /* small hack to use socket_circle_draw function with offset */
- sock->locx -= node_group_frame;
- socket_circle_draw(sock, socket_size);
- sock->locx += node_group_frame;
-
- bt = uiDefBut(gnode->block, TEX, 0, "",
- locx+col1, sock->locy+1, colw1, NODE_DY,
- sock->name, 0, 31, 0, 0, "");
- uiButSetFunc(bt, group_verify_cb, snode, ngroup);
-
- node_draw_socket_button(ngroup, sock, "", gnode->block,
- locx+col1, sock->locy-NODE_DY, colw1,
- NULL, NULL, NULL);
-
- uiBlockSetDirection(gnode->block, UI_TOP);
- uiBlockBeginAlign(gnode->block);
- bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_up", 0, ICON_TRIA_UP,
- locx+col2, sock->locy, arrowbutw, arrowbutw, "");
- if (!sock->prev)
- uiButSetFlag(bt, UI_BUT_DISABLED);
- RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
- RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_IN);
- bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_down", 0, ICON_TRIA_DOWN,
- locx+col2, sock->locy-arrowbutw, arrowbutw, arrowbutw, "");
- if (!sock->next)
- uiButSetFlag(bt, UI_BUT_DISABLED);
- RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
- RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_IN);
- uiBlockEndAlign(gnode->block);
- uiBlockSetDirection(gnode->block, 0);
-
- uiBlockSetEmboss(gnode->block, UI_EMBOSSN);
- bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_remove", 0, ICON_X,
- locx+col3, sock->locy-0.5f*arrowbutw, arrowbutw, arrowbutw, "");
- RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
- RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_IN);
- uiBlockSetEmboss(gnode->block, UI_EMBOSS);
- }
-
- for(sock=ngroup->outputs.first, index=0; sock; sock=sock->next, ++index) {
- float locx= sock->locx;
-
- socket_circle_draw(sock, socket_size);
- /* small hack to use socket_circle_draw function with offset */
- sock->locx += node_group_frame;
- socket_circle_draw(sock, socket_size);
- sock->locx -= node_group_frame;
-
- uiBlockSetEmboss(gnode->block, UI_EMBOSSN);
- bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_remove", 0, ICON_X,
- locx+col1, sock->locy-0.5f*arrowbutw, arrowbutw, arrowbutw, "");
- RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
- RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_OUT);
- uiBlockSetEmboss(gnode->block, UI_EMBOSS);
-
- uiBlockSetDirection(gnode->block, UI_TOP);
- uiBlockBeginAlign(gnode->block);
- bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_up", 0, ICON_TRIA_UP,
- locx+cor2, sock->locy, arrowbutw, arrowbutw, "");
- if (!sock->prev)
- uiButSetFlag(bt, UI_BUT_DISABLED);
- RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
- RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_OUT);
- bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_down", 0, ICON_TRIA_DOWN,
- locx+cor2, sock->locy-arrowbutw, arrowbutw, arrowbutw, "");
- if (!sock->next)
- uiButSetFlag(bt, UI_BUT_DISABLED);
- RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
- RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_OUT);
- uiBlockEndAlign(gnode->block);
- uiBlockSetDirection(gnode->block, 0);
-
- if (sock->link) {
- bt = uiDefBut(gnode->block, TEX, 0, "",
- locx+cor3, sock->locy-NODE_DYS+1, corw3, NODE_DY,
- sock->name, 0, 31, 0, 0, "");
- uiButSetFunc(bt, group_verify_cb, snode, ngroup);
- }
- else {
- bt = uiDefBut(gnode->block, TEX, 0, "",
- locx+cor3, sock->locy+1, corw3, NODE_DY,
- sock->name, 0, 31, 0, 0, "");
- uiButSetFunc(bt, group_verify_cb, snode, ngroup);
-
- node_draw_socket_button(ngroup, sock, "", gnode->block, locx+cor3, sock->locy-NODE_DY, corw3, NULL, NULL, NULL);
- }
+ node_draw(C, ar, snode, ntree, node);
}
-
- uiEndBlock(C, gnode->block);
- uiDrawBlock(C, gnode->block);
- gnode->block= NULL;
}
void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d)
@@ -1260,27 +921,19 @@ void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d)
if(node->flag & NODE_GROUP_EDIT)
node_uiblocks_init(C, (bNodeTree *)node->id);
}
-
- node_uiblocks_init(C, snode->nodetree);
+ node_uiblocks_init(C, snode->nodetree);
- /* for now, we set drawing coordinates on each redraw */
- for(node= snode->nodetree->nodes.first; node; node= node->next) {
- if(node->flag & NODE_GROUP_EDIT)
- node_update_group(C, snode->nodetree, node);
- else if(node->flag & NODE_HIDDEN)
- node_update_hidden(node);
- else
- node_update(C, snode->nodetree, node);
- }
-
+ node_update_nodetree(C, snode->nodetree, 0.0f, 0.0f);
node_draw_nodetree(C, ar, snode, snode->nodetree);
-
+
+ #if 0
/* active group */
for(node= snode->nodetree->nodes.first; node; node= node->next) {
if(node->flag & NODE_GROUP_EDIT)
node_draw_group(C, ar, snode, snode->nodetree, node);
}
+ #endif
}
/* temporary links */
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index b7afc617cdc..2bec199fe3b 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -40,9 +40,11 @@
#include "MEM_guardedalloc.h"
+#include "DNA_ID.h"
#include "DNA_object_types.h"
#include "DNA_material_types.h"
#include "DNA_node_types.h"
+#include "DNA_particle_types.h"
#include "DNA_scene_types.h"
#include "BLI_math.h"
@@ -60,11 +62,17 @@
#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_material.h"
+#include "BKE_modifier.h"
#include "BKE_paint.h"
#include "BKE_screen.h"
#include "BKE_texture.h"
#include "BKE_report.h"
+
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_storage_types.h"
+
#include "RE_pipeline.h"
#include "IMB_imbuf_types.h"
@@ -76,11 +84,13 @@
#include "RNA_access.h"
#include "RNA_define.h"
+#include "RNA_enum_types.h"
#include "WM_api.h"
#include "WM_types.h"
#include "UI_interface.h"
+#include "UI_resources.h"
#include "UI_view2d.h"
#include "IMB_imbuf.h"
@@ -90,9 +100,9 @@
#include "node_intern.h"
static EnumPropertyItem socket_in_out_items[] = {
- { SOCK_IN, "IN", 0, N_("In"), "" },
- { SOCK_OUT, "OUT", 0, N_("Out"), "" },
- { 0, NULL, 0, NULL, NULL}
+ { SOCK_IN, "SOCK_IN", 0, N_("Input"), "" },
+ { SOCK_OUT, "SOCK_OUT", 0, N_("Output"), "" },
+ { 0, NULL, 0, NULL, NULL },
};
/* ***************** composite job manager ********************** */
@@ -229,7 +239,7 @@ static bNode *editnode_get_active(bNodeTree *ntree)
/* check for edited group */
for(node= ntree->nodes.first; node; node= node->next)
- if(node->flag & NODE_GROUP_EDIT)
+ if(nodeGroupEditGet(node))
break;
if(node)
return nodeGetActive((bNodeTree *)node->id);
@@ -260,7 +270,7 @@ bNode *node_tree_get_editgroup(bNodeTree *nodetree)
/* get the groupnode */
for(gnode= nodetree->nodes.first; gnode; gnode= gnode->next)
- if(gnode->flag & NODE_GROUP_EDIT)
+ if(nodeGroupEditGet(gnode))
break;
return gnode;
}
@@ -271,6 +281,7 @@ void ED_node_shader_default(Material *ma)
{
bNode *in, *out;
bNodeSocket *fromsock, *tosock;
+ bNodeTemplate ntemp;
/* but lets check it anyway */
if(ma->nodetree) {
@@ -279,12 +290,14 @@ void ED_node_shader_default(Material *ma)
return;
}
- ma->nodetree= ntreeAddTree("Shader Nodetree", NTREE_SHADER, FALSE);
+ ma->nodetree= ntreeAddTree("Shader Nodetree", NTREE_SHADER, 0);
- out= nodeAddNodeType(ma->nodetree, SH_NODE_OUTPUT, NULL, NULL);
+ ntemp.type = SH_NODE_OUTPUT;
+ out= nodeAddNode(ma->nodetree, &ntemp);
out->locx= 300.0f; out->locy= 300.0f;
- in= nodeAddNodeType(ma->nodetree, SH_NODE_MATERIAL, NULL, NULL);
+ ntemp.type = SH_NODE_MATERIAL;
+ in= nodeAddNode(ma->nodetree, &ntemp);
in->locx= 10.0f; in->locy= 300.0f;
nodeSetActive(ma->nodetree, in);
@@ -293,7 +306,7 @@ void ED_node_shader_default(Material *ma)
tosock= out->inputs.first;
nodeAddLink(ma->nodetree, in, fromsock, out, tosock);
- ntreeSolveOrder(ma->nodetree); /* needed for pointers */
+ ntreeUpdateTree(ma->nodetree);
}
/* assumes nothing being done in ntree yet, sets the default in/out node */
@@ -302,6 +315,7 @@ void ED_node_composit_default(Scene *sce)
{
bNode *in, *out;
bNodeSocket *fromsock, *tosock;
+ bNodeTemplate ntemp;
/* but lets check it anyway */
if(sce->nodetree) {
@@ -310,14 +324,16 @@ void ED_node_composit_default(Scene *sce)
return;
}
- sce->nodetree= ntreeAddTree("Compositing Nodetree", NTREE_COMPOSIT, FALSE);
+ sce->nodetree= ntreeAddTree("Compositing Nodetree", NTREE_COMPOSIT, 0);
- out= nodeAddNodeType(sce->nodetree, CMP_NODE_COMPOSITE, NULL, NULL);
+ ntemp.type = CMP_NODE_COMPOSITE;
+ out= nodeAddNode(sce->nodetree, &ntemp);
out->locx= 300.0f; out->locy= 400.0f;
out->id= &sce->id;
id_us_plus(out->id);
- in= nodeAddNodeType(sce->nodetree, CMP_NODE_R_LAYERS, NULL, NULL);
+ ntemp.type = CMP_NODE_R_LAYERS;
+ in= nodeAddNode(sce->nodetree, &ntemp);
in->locx= 10.0f; in->locy= 400.0f;
in->id= &sce->id;
id_us_plus(in->id);
@@ -328,7 +344,7 @@ void ED_node_composit_default(Scene *sce)
tosock= out->inputs.first;
nodeAddLink(sce->nodetree, in, fromsock, out, tosock);
- ntreeSolveOrder(sce->nodetree); /* needed for pointers */
+ ntreeUpdateTree(sce->nodetree);
// XXX ntreeCompositForceHidden(sce->nodetree);
}
@@ -339,6 +355,7 @@ void ED_node_texture_default(Tex *tx)
{
bNode *in, *out;
bNodeSocket *fromsock, *tosock;
+ bNodeTemplate ntemp;
/* but lets check it anyway */
if(tx->nodetree) {
@@ -347,12 +364,14 @@ void ED_node_texture_default(Tex *tx)
return;
}
- tx->nodetree= ntreeAddTree("Texture Nodetree", NTREE_TEXTURE, FALSE);
+ tx->nodetree= ntreeAddTree("Texture Nodetree", NTREE_TEXTURE, 0);
- out= nodeAddNodeType(tx->nodetree, TEX_NODE_OUTPUT, NULL, NULL);
+ ntemp.type = TEX_NODE_OUTPUT;
+ out= nodeAddNode(tx->nodetree, &ntemp);
out->locx= 300.0f; out->locy= 300.0f;
- in= nodeAddNodeType(tx->nodetree, TEX_NODE_CHECKER, NULL, NULL);
+ ntemp.type = TEX_NODE_CHECKER;
+ in= nodeAddNode(tx->nodetree, &ntemp);
in->locx= 10.0f; in->locy= 300.0f;
nodeSetActive(tx->nodetree, in);
@@ -360,43 +379,53 @@ void ED_node_texture_default(Tex *tx)
tosock= out->inputs.first;
nodeAddLink(tx->nodetree, in, fromsock, out, tosock);
- ntreeSolveOrder(tx->nodetree); /* needed for pointers */
+ ntreeUpdateTree(tx->nodetree);
}
/* id is supposed to contain a node tree */
void node_tree_from_ID(ID *id, bNodeTree **ntree, bNodeTree **edittree, int *treetype)
{
- bNode *node= NULL;
- short idtype= GS(id->name);
-
- if(idtype == ID_MA) {
- *ntree= ((Material*)id)->nodetree;
- if(treetype) *treetype= NTREE_SHADER;
- }
- else if(idtype == ID_SCE) {
- *ntree= ((Scene*)id)->nodetree;
- if(treetype) *treetype= NTREE_COMPOSIT;
- }
- else if(idtype == ID_TE) {
- *ntree= ((Tex*)id)->nodetree;
- if(treetype) *treetype= NTREE_TEXTURE;
+ if (id) {
+ bNode *node= NULL;
+ short idtype= GS(id->name);
+
+ if(idtype == ID_NT) {
+ *ntree= (bNodeTree*)id;
+ if(treetype) *treetype= (*ntree)->type;
+ }
+ else if(idtype == ID_MA) {
+ *ntree= ((Material*)id)->nodetree;
+ if(treetype) *treetype= NTREE_SHADER;
+ }
+ else if(idtype == ID_SCE) {
+ *ntree= ((Scene*)id)->nodetree;
+ if(treetype) *treetype= NTREE_COMPOSIT;
+ }
+ else if(idtype == ID_TE) {
+ *ntree= ((Tex*)id)->nodetree;
+ if(treetype) *treetype= NTREE_TEXTURE;
+ }
+ else {
+ if(treetype) *treetype= 0;
+ return;
+ }
+
+ /* find editable group */
+ if(edittree) {
+ if(*ntree)
+ for(node= (*ntree)->nodes.first; node; node= node->next)
+ if(nodeGroupEditGet(node))
+ break;
+
+ if(node && node->id)
+ *edittree= (bNodeTree *)node->id;
+ else
+ *edittree= *ntree;
+ }
}
else {
+ *ntree= NULL;
if(treetype) *treetype= 0;
- return;
- }
-
- /* find editable group */
- if(edittree) {
- if(*ntree)
- for(node= (*ntree)->nodes.first; node; node= node->next)
- if(node->flag & NODE_GROUP_EDIT)
- break;
-
- if(node && node->id)
- *edittree= (bNodeTree *)node->id;
- else
- *edittree= *ntree;
}
}
@@ -405,8 +434,6 @@ void snode_set_context(SpaceNode *snode, Scene *scene)
{
Object *ob= OBACT;
- snode->nodetree= NULL;
- snode->edittree= NULL;
snode->id= snode->from= NULL;
if(snode->treetype==NTREE_SHADER) {
@@ -420,12 +447,10 @@ void snode_set_context(SpaceNode *snode, Scene *scene)
}
}
else if(snode->treetype==NTREE_COMPOSIT) {
- snode->from= NULL;
snode->id= &scene->id;
- /* bit clumsy but reliable way to see if we draw first time */
- if(snode->nodetree==NULL)
- ntreeCompositForceHidden(scene->nodetree, scene);
+ /* update output sockets based on available layers */
+ ntreeCompositForceHidden(scene->nodetree, scene);
}
else if(snode->treetype==NTREE_TEXTURE) {
Tex *tx= NULL;
@@ -463,9 +488,14 @@ void snode_set_context(SpaceNode *snode, Scene *scene)
}
}
}
+ else {
+ if (snode->nodetree && snode->nodetree->type == snode->treetype)
+ snode->id = &snode->nodetree->id;
+ else
+ snode->id = NULL;
+ }
- if(snode->id)
- node_tree_from_ID(snode->id, &snode->nodetree, &snode->edittree, NULL);
+ node_tree_from_ID(snode->id, &snode->nodetree, &snode->edittree, NULL);
}
static void snode_tag_changed(SpaceNode *snode, bNode *node)
@@ -576,17 +606,216 @@ void ED_node_set_active(Main *bmain, bNodeTree *ntree, bNode *node)
}
}
-/* when links in groups change, inputs/outputs change, nodes added/deleted... */
-void node_tree_verify_groups(bNodeTree *nodetree)
+static int compare_nodes(bNode *a, bNode *b)
{
- bNode *gnode;
+ bNode *parent;
+ /* These tell if either the node or any of the parent nodes is selected.
+ * A selected parent means an unselected node is also in foreground!
+ */
+ int a_select=(a->flag & NODE_SELECT), b_select=(b->flag & NODE_SELECT);
+ int a_active=(a->flag & NODE_ACTIVE), b_active=(b->flag & NODE_ACTIVE);
+
+ /* if one is an ancestor of the other */
+ /* XXX there might be a better sorting algorithm for stable topological sort, this is O(n^2) worst case */
+ for (parent = a->parent; parent; parent=parent->parent) {
+ /* if b is an ancestor, it is always behind a */
+ if (parent==b)
+ return 1;
+ /* any selected ancestor moves the node forward */
+ if (parent->flag & NODE_ACTIVE)
+ a_active = 1;
+ if (parent->flag & NODE_SELECT)
+ a_select = 1;
+ }
+ for (parent = b->parent; parent; parent=parent->parent) {
+ /* if a is an ancestor, it is always behind b */
+ if (parent==a)
+ return 0;
+ /* any selected ancestor moves the node forward */
+ if (parent->flag & NODE_ACTIVE)
+ b_active = 1;
+ if (parent->flag & NODE_SELECT)
+ b_select = 1;
+ }
+
+ /* if one of the nodes is in the background and the other not */
+ if ((a->flag & NODE_BACKGROUND) && !(b->flag & NODE_BACKGROUND))
+ return 0;
+ else if (!(a->flag & NODE_BACKGROUND) && (b->flag & NODE_BACKGROUND))
+ return 1;
- gnode= node_tree_get_editgroup(nodetree);
+ /* if one has a higher selection state (active > selected > nothing) */
+ if (!b_active && a_active)
+ return 1;
+ else if (!b_select && (a_active || a_select))
+ return 1;
- /* does all materials */
- if(gnode)
- nodeGroupVerify((bNodeTree *)gnode->id);
+ return 0;
+}
+/* Sorts nodes by selection: unselected nodes first, then selected,
+ * then the active node at the very end. Relative order is kept intact!
+ */
+void node_sort(bNodeTree *ntree)
+{
+ /* merge sort is the algorithm of choice here */
+ bNode *first_a, *first_b, *node_a, *node_b, *tmp;
+ int totnodes= BLI_countlist(&ntree->nodes);
+ int k, a, b;
+
+ k = 1;
+ while (k < totnodes) {
+ first_a = first_b = ntree->nodes.first;
+
+ do {
+ /* setup first_b pointer */
+ for (b=0; b < k && first_b; ++b) {
+ first_b = first_b->next;
+ }
+ /* all batches merged? */
+ if (first_b==NULL)
+ break;
+
+ /* merge batches */
+ node_a = first_a;
+ node_b = first_b;
+ a = b = 0;
+ while (a < k && b < k && node_b) {
+ if (compare_nodes(node_a, node_b)==0) {
+ node_a = node_a->next;
+ ++a;
+ }
+ else {
+ tmp = node_b;
+ node_b = node_b->next;
+ ++b;
+ BLI_remlink(&ntree->nodes, tmp);
+ BLI_insertlinkbefore(&ntree->nodes, node_a, tmp);
+ }
+ }
+
+ /* setup first pointers for next batch */
+ first_b = node_b;
+ for (; b < k; ++b) {
+ /* all nodes sorted? */
+ if (first_b==NULL)
+ break;
+ first_b = first_b->next;
+ }
+ first_a = first_b;
+ } while (first_b);
+
+ k = k << 1;
+ }
+}
+
+static int inside_rctf(rctf *bounds, rctf *rect)
+{
+ return (bounds->xmin <= rect->xmin && bounds->xmax >= rect->xmax
+ && bounds->ymin <= rect->ymin && bounds->ymax >= rect->ymax);
+}
+
+static void node_frame_attach_nodes(bNodeTree *UNUSED(ntree), bNode *frame)
+{
+ bNode *node;
+
+ /* only check nodes on top of the frame for attaching */
+ for (node=frame->next; node; node=node->next) {
+ if (node->parent==frame) {
+ /* detach nodes that went outside the frame */
+ if (!inside_rctf(&frame->totr, &node->totr))
+ nodeDetachNode(node);
+ }
+ else if (node->flag & NODE_SELECT && node->parent==NULL) {
+ /* attach selected, still unparented nodes */
+ if (inside_rctf(&frame->totr, &node->totr))
+ nodeAttachNode(node, frame);
+ }
+ }
+}
+
+void ED_node_update_hierarchy(bContext *UNUSED(C), bNodeTree *ntree)
+{
+ bNode *node;
+
+ /* XXX This does not work due to layout functions relying on node->block,
+ * which only exists during actual drawing. Can we rely on valid totr rects?
+ */
+ /* make sure nodes have correct bounding boxes after transform */
+// node_update_nodetree(C, ntree, 0.0f, 0.0f);
+
+ /* all selected nodes are re-parented */
+ for (node=ntree->nodes.last; node; node=node->prev) {
+ if (node->flag & NODE_SELECT && node->parent)
+ nodeDetachNode(node);
+ }
+
+ /* update higher Z-level nodes first */
+ for (node=ntree->nodes.last; node; node=node->prev) {
+ /* XXX callback? */
+ if (node->type==NODE_FRAME)
+ node_frame_attach_nodes(ntree, node);
+ }
+}
+
+/* ***************** generic operator functions for nodes ***************** */
+
+static int edit_node_poll(bContext *C)
+{
+ return ED_operator_node_active(C);
+}
+
+static void edit_node_properties(wmOperatorType *ot)
+{
+ /* XXX could node be a context pointer? */
+ RNA_def_string(ot->srna, "node", "", 32, "Node", "");
+ RNA_def_int(ot->srna, "socket", 0, 0, MAX_SOCKET, "Socket", "", 0, MAX_SOCKET);
+ RNA_def_enum(ot->srna, "in_out", socket_in_out_items, SOCK_IN, "Socket Side", "");
+}
+
+static int edit_node_invoke_properties(bContext *C, wmOperator *op)
+{
+ if (!RNA_property_is_set(op->ptr, "node")) {
+ bNode *node= CTX_data_pointer_get_type(C, "node", &RNA_Node).data;
+ if (!node)
+ return 0;
+ else
+ RNA_string_set(op->ptr, "node", node->name);
+ }
+
+ if (!RNA_property_is_set(op->ptr, "in_out"))
+ RNA_enum_set(op->ptr, "in_out", SOCK_IN);
+
+ if (!RNA_property_is_set(op->ptr, "socket"))
+ RNA_int_set(op->ptr, "socket", 0);
+
+ return 1;
+}
+
+static void edit_node_properties_get(wmOperator *op, bNodeTree *ntree, bNode **rnode, bNodeSocket **rsock, int *rin_out)
+{
+ bNode *node;
+ bNodeSocket *sock=NULL;
+ char nodename[32];
+ int sockindex;
+ int in_out;
+ RNA_string_get(op->ptr, "node", nodename);
+ node = nodeFindNodebyName(ntree, nodename);
+
+ in_out = RNA_enum_get(op->ptr, "in_out");
+
+ sockindex = RNA_int_get(op->ptr, "socket");
+ switch (in_out) {
+ case SOCK_IN: sock = BLI_findlink(&node->inputs, sockindex); break;
+ case SOCK_OUT: sock = BLI_findlink(&node->outputs, sockindex); break;
+ }
+
+ if (rnode)
+ *rnode = node;
+ if (rsock)
+ *rsock = sock;
+ if (rin_out)
+ *rin_out = in_out;
}
/* ***************** Edit Group operator ************* */
@@ -596,8 +825,8 @@ void snode_make_group_editable(SpaceNode *snode, bNode *gnode)
bNode *node;
/* make sure nothing has group editing on */
- for(node= snode->nodetree->nodes.first; node; node= node->next)
- node->flag &= ~NODE_GROUP_EDIT;
+ for(node=snode->nodetree->nodes.first; node; node=node->next)
+ nodeGroupEditClear(node);
if(gnode==NULL) {
/* with NULL argument we do a toggle */
@@ -605,34 +834,30 @@ void snode_make_group_editable(SpaceNode *snode, bNode *gnode)
gnode= nodeGetActive(snode->nodetree);
}
- if(gnode && gnode->type==NODE_GROUP && gnode->id) {
- if(gnode->id->lib)
- ntreeMakeLocal((bNodeTree *)gnode->id);
-
- gnode->flag |= NODE_GROUP_EDIT;
- snode->edittree= (bNodeTree *)gnode->id;
+ if (gnode) {
+ snode->edittree = nodeGroupEditSet(gnode, 1);
/* deselect all other nodes, so we can also do grabbing of entire subtree */
for(node= snode->nodetree->nodes.first; node; node= node->next)
node->flag &= ~SELECT;
gnode->flag |= SELECT;
-
}
else
snode->edittree= snode->nodetree;
-
- ntreeSolveOrder(snode->nodetree);
}
static int node_group_edit_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode = CTX_wm_space_node(C);
- bNode *gnode;
ED_preview_kill_jobs(C);
- gnode= nodeGetActive(snode->edittree);
- snode_make_group_editable(snode, gnode);
+ if (snode->nodetree==snode->edittree) {
+ bNode *gnode= nodeGetActive(snode->nodetree);
+ snode_make_group_editable(snode, gnode);
+ }
+ else
+ snode_make_group_editable(snode, NULL);
WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL);
@@ -645,7 +870,8 @@ static int node_group_edit_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(e
bNode *gnode;
gnode= nodeGetActive(snode->edittree);
- if(gnode && gnode->type==NODE_GROUP && gnode->id && gnode->id->lib) {
+ /* XXX callback? */
+ if(gnode && gnode->id && GS(gnode->id->name)==ID_NT && gnode->id->lib) {
uiPupMenuOkee(C, op->type->idname, "Make group local?");
return OPERATOR_CANCELLED;
}
@@ -676,7 +902,7 @@ static int node_group_socket_add_exec(bContext *C, wmOperator *op)
SpaceNode *snode = CTX_wm_space_node(C);
int in_out= -1;
char name[32]= "";
- int type= SOCK_VALUE;
+ int type= SOCK_FLOAT;
bNodeTree *ngroup= snode->edittree;
bNodeSocket *sock;
@@ -693,9 +919,10 @@ static int node_group_socket_add_exec(bContext *C, wmOperator *op)
else
return OPERATOR_CANCELLED;
- sock = nodeGroupAddSocket(ngroup, name, type, in_out);
+ /* using placeholder subtype first */
+ sock = node_group_add_socket(ngroup, name, type, in_out);
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(ngroup);
snode_notify(C, snode);
@@ -718,7 +945,7 @@ void NODE_OT_group_socket_add(wmOperatorType *ot)
RNA_def_enum(ot->srna, "in_out", socket_in_out_items, SOCK_IN, _("Socket Type"), _("Input or Output"));
RNA_def_string(ot->srna, "name", "", 32, _("Name"), _("Group socket name"));
- RNA_def_enum(ot->srna, "type", node_socket_type_items, SOCK_VALUE, _("Type"), _("Type of the group socket"));
+ RNA_def_enum(ot->srna, "type", node_socket_type_items, SOCK_FLOAT, _("Type"), _("Type of the group socket"));
}
/* ***************** Remove Group Socket operator ************* */
@@ -745,8 +972,8 @@ static int node_group_socket_remove_exec(bContext *C, wmOperator *op)
sock = (bNodeSocket*)BLI_findlink(in_out==SOCK_IN ? &ngroup->inputs : &ngroup->outputs, index);
if (sock) {
- nodeGroupRemoveSocket(ngroup, sock, in_out);
- node_tree_verify_groups(snode->nodetree);
+ node_group_remove_socket(ngroup, sock, in_out);
+ ntreeUpdateTree(ngroup);
snode_notify(C, snode);
}
@@ -803,6 +1030,8 @@ static int node_group_socket_move_up_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
BLI_remlink(&ngroup->inputs, sock);
BLI_insertlinkbefore(&ngroup->inputs, prev, sock);
+
+ ngroup->update |= NTREE_UPDATE_GROUP_IN;
}
else if (in_out==SOCK_OUT) {
sock = (bNodeSocket*)BLI_findlink(&ngroup->outputs, index);
@@ -812,8 +1041,10 @@ static int node_group_socket_move_up_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
BLI_remlink(&ngroup->outputs, sock);
BLI_insertlinkbefore(&ngroup->outputs, prev, sock);
+
+ ngroup->update |= NTREE_UPDATE_GROUP_OUT;
}
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(ngroup);
snode_notify(C, snode);
@@ -869,6 +1100,8 @@ static int node_group_socket_move_down_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
BLI_remlink(&ngroup->inputs, sock);
BLI_insertlinkafter(&ngroup->inputs, next, sock);
+
+ ngroup->update |= NTREE_UPDATE_GROUP_IN;
}
else if (in_out==SOCK_OUT) {
sock = (bNodeSocket*)BLI_findlink(&ngroup->outputs, index);
@@ -878,8 +1111,10 @@ static int node_group_socket_move_down_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
BLI_remlink(&ngroup->outputs, sock);
BLI_insertlinkafter(&ngroup->outputs, next, sock);
+
+ ngroup->update |= NTREE_UPDATE_GROUP_OUT;
}
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(ngroup);
snode_notify(C, snode);
@@ -926,7 +1161,7 @@ static int node_group_ungroup_exec(bContext *C, wmOperator *op)
BKE_report(op->reports, RPT_WARNING, "Not a group");
return OPERATOR_CANCELLED;
}
- else if(!nodeGroupUnGroup(snode->edittree, gnode)) {
+ else if(!node_group_ungroup(snode->edittree, gnode)) {
BKE_report(op->reports, RPT_WARNING, "Can't ungroup");
return OPERATOR_CANCELLED;
}
@@ -954,70 +1189,16 @@ void NODE_OT_group_ungroup(wmOperatorType *ot)
/* ************************** Node generic ************** */
-/* allows to walk the list in order of visibility */
-bNode *next_node(bNodeTree *ntree)
-{
- static bNode *current=NULL, *last= NULL;
-
- if(ntree) {
- /* set current to the first selected node */
- for(current= ntree->nodes.last; current; current= current->prev)
- if(current->flag & NODE_SELECT)
- break;
-
- /* set last to the first unselected node */
- for(last= ntree->nodes.last; last; last= last->prev)
- if((last->flag & NODE_SELECT)==0)
- break;
-
- if(current==NULL)
- current= last;
-
- return NULL;
- }
- /* no nodes, or we are ready */
- if(current==NULL)
- return NULL;
-
- /* now we walk the list backwards, but we always return current */
- if(current->flag & NODE_SELECT) {
- bNode *node= current;
-
- /* find previous selected */
- current= current->prev;
- while(current && (current->flag & NODE_SELECT)==0)
- current= current->prev;
-
- /* find first unselected */
- if(current==NULL)
- current= last;
-
- return node;
- }
- else {
- bNode *node= current;
-
- /* find previous unselected */
- current= current->prev;
- while(current && (current->flag & NODE_SELECT))
- current= current->prev;
-
- return node;
- }
-
- return NULL;
-}
-
/* is rct in visible part of node? */
static bNode *visible_node(SpaceNode *snode, rctf *rct)
{
- bNode *tnode;
+ bNode *node;
- for(next_node(snode->edittree); (tnode=next_node(NULL));) {
- if(BLI_isect_rctf(&tnode->totr, rct, NULL))
+ for(node=snode->edittree->nodes.last; node; node=node->prev) {
+ if(BLI_isect_rctf(&node->totr, rct, NULL))
break;
}
- return tnode;
+ return node;
}
/* **************************** */
@@ -1320,8 +1501,9 @@ void NODE_OT_backimage_sample(wmOperatorType *ot)
/* ********************** size widget operator ******************** */
typedef struct NodeSizeWidget {
- float mxstart;
- float oldwidth;
+ float mxstart, mystart;
+ float oldwidth, oldheight;
+ float oldminiwidth;
} NodeSizeWidget;
static int node_resize_modal(bContext *C, wmOperator *op, wmEvent *event)
@@ -1340,13 +1522,16 @@ static int node_resize_modal(bContext *C, wmOperator *op, wmEvent *event)
if (node) {
if(node->flag & NODE_HIDDEN) {
- node->miniwidth= nsw->oldwidth + mx - nsw->mxstart;
+ node->miniwidth= nsw->oldminiwidth + mx - nsw->mxstart;
CLAMP(node->miniwidth, 0.0f, 100.0f);
}
else {
node->width= nsw->oldwidth + mx - nsw->mxstart;
CLAMP(node->width, UI_DPI_FAC*node->typeinfo->minwidth, UI_DPI_FAC*node->typeinfo->maxwidth);
}
+ /* height works the other way round ... */
+ node->height= nsw->oldheight - my + nsw->mystart;
+ CLAMP(node->height, node->typeinfo->minheight, node->typeinfo->maxheight);
}
ED_region_tag_redraw(ar);
@@ -1360,6 +1545,8 @@ static int node_resize_modal(bContext *C, wmOperator *op, wmEvent *event)
MEM_freeN(nsw);
op->customdata= NULL;
+ ED_node_update_hierarchy(C, snode->edittree);
+
return OPERATOR_FINISHED;
}
@@ -1373,35 +1560,21 @@ static int node_resize_invoke(bContext *C, wmOperator *op, wmEvent *event)
bNode *node= editnode_get_active(snode->edittree);
if(node) {
- rctf totr;
-
/* convert mouse coordinates to v2d space */
UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1],
&snode->mx, &snode->my);
- totr= node->totr;
-
- if(node->flag & NODE_HIDDEN) {
- /* right part of node */
- totr.xmin= node->totr.xmax-20.0f;
- }
- else {
- /* bottom right corner */
- totr.xmin= totr.xmax-10.0f;
- totr.ymax= totr.ymin+10.0f;
- }
-
- if(BLI_in_rctf(&totr, snode->mx, snode->my)) {
+ if(node->typeinfo->resize_area_func(node, snode->mx, snode->my)) {
NodeSizeWidget *nsw= MEM_callocN(sizeof(NodeSizeWidget), "size widget op data");
op->customdata= nsw;
nsw->mxstart= snode->mx;
+ nsw->mystart= snode->my;
/* store old */
- if(node->flag & NODE_HIDDEN)
- nsw->oldwidth= node->miniwidth;
- else
- nsw->oldwidth= node->width;
+ nsw->oldwidth= node->width;
+ nsw->oldheight= node->height;
+ nsw->oldminiwidth= node->miniwidth;
/* add modal handler */
WM_event_add_modal_handler(C, op);
@@ -1600,7 +1773,7 @@ static void node_link_viewer(SpaceNode *snode, bNode *tonode)
link->fromnode= tonode;
link->fromsock= sock;
}
- ntreeSolveOrder(snode->edittree);
+ ntreeUpdateTree(snode->edittree);
snode_tag_changed(snode, node);
}
}
@@ -1907,6 +2080,7 @@ void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace)
ListBase *nodelist = MEM_callocN(sizeof(ListBase), "items_list");
bNodeListItem *nli;
bNode *node;
+ bNodeLink *link;
int i, numlinks=0;
for(node= snode->edittree->nodes.first; node; node= node->next) {
@@ -1943,7 +2117,15 @@ void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace)
/* then we can connect */
if (replace)
nodeRemSocketLinks(snode->edittree, sock_to);
- nodeAddLink(snode->edittree, node_fr, sock_fr, node_to, sock_to);
+
+ link = nodeAddLink(snode->edittree, node_fr, sock_fr, node_to, sock_to);
+ /* validate the new link */
+ ntreeUpdateTree(snode->edittree);
+ if (!(link->flag & NODE_LINK_VALID)) {
+ nodeRemLink(snode->edittree, link);
+ continue;
+ }
+
snode_tag_changed(snode, node_to);
++numlinks;
break;
@@ -1951,8 +2133,7 @@ void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace)
}
if (numlinks > 0) {
- node_tree_verify_groups(snode->nodetree);
- ntreeSolveOrder(snode->edittree);
+ ntreeUpdateTree(snode->edittree);
}
BLI_freelistN(nodelist);
@@ -1960,28 +2141,13 @@ void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace)
}
/* can be called from menus too, but they should do own undopush and redraws */
-bNode *node_add_node(SpaceNode *snode, Main *bmain, Scene *scene, int type, float locx, float locy)
+bNode *node_add_node(SpaceNode *snode, Main *bmain, Scene *scene, bNodeTemplate *ntemp, float locx, float locy)
{
bNode *node= NULL, *gnode;
node_deselectall(snode);
- if(type>=NODE_DYNAMIC_MENU) {
- node= nodeAddNodeType(snode->edittree, type, NULL, NULL);
- }
- else if(type>=NODE_GROUP_MENU) {
- if(snode->edittree!=snode->nodetree) {
- // XXX error("Can not add a Group in a Group");
- return NULL;
- }
- else {
- bNodeTree *ngroup= BLI_findlink(&bmain->nodetree, type-NODE_GROUP_MENU);
- if(ngroup)
- node= nodeAddNodeType(snode->edittree, NODE_GROUP, ngroup, NULL);
- }
- }
- else
- node= nodeAddNodeType(snode->edittree, type, NULL, NULL);
+ node = nodeAddNode(snode->edittree, ntemp);
/* generics */
if(node) {
@@ -1995,7 +2161,7 @@ bNode *node_add_node(SpaceNode *snode, Main *bmain, Scene *scene, int type, floa
node->locy -= gnode->locy;
}
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(snode->edittree);
ED_node_set_active(bmain, snode->edittree, node);
if(snode->nodetree->type==NTREE_COMPOSIT) {
@@ -2096,9 +2262,8 @@ static int node_duplicate_exec(bContext *C, wmOperator *op)
break;
}
- ntreeSolveOrder(ntree);
+ ntreeUpdateTree(snode->edittree);
- node_tree_verify_groups(snode->nodetree);
snode_notify(C, snode);
snode_dag_update(C, snode);
@@ -2187,17 +2352,25 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event)
if( link->tosock!= tsock && (!tnode || (tnode!=node && link->tonode!=tnode)) ) {
link->tonode= tnode;
link->tosock= tsock;
- if (link->prev==NULL && link->next==NULL)
+ if (link->prev==NULL && link->next==NULL) {
BLI_addtail(&snode->edittree->links, link);
- ntreeSolveOrder(snode->edittree); /* for interactive red line warning */
+ }
+
+ snode->edittree->update |= NTREE_UPDATE_LINKS;
+ ntreeUpdateTree(snode->edittree);
}
}
}
else {
- BLI_remlink(&snode->edittree->links, link);
- link->prev = link->next = NULL;
- link->tonode= NULL;
- link->tosock= NULL;
+ if (link->tonode || link->tosock) {
+ BLI_remlink(&snode->edittree->links, link);
+ link->prev = link->next = NULL;
+ link->tonode= NULL;
+ link->tosock= NULL;
+
+ snode->edittree->update |= NTREE_UPDATE_LINKS;
+ ntreeUpdateTree(snode->edittree);
+ }
}
}
else {
@@ -2207,18 +2380,25 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event)
if( link->fromsock!= tsock && (!tnode || (tnode!=node && link->fromnode!=tnode)) ) {
link->fromnode= tnode;
link->fromsock= tsock;
- if (link->prev==NULL && link->next==NULL)
+ if (link->prev==NULL && link->next==NULL) {
BLI_addtail(&snode->edittree->links, link);
- ntreeSolveOrder(snode->edittree); /* for interactive red line warning */
+ }
+
+ snode->edittree->update |= NTREE_UPDATE_LINKS;
+ ntreeUpdateTree(snode->edittree);
}
}
}
}
else {
- BLI_remlink(&snode->edittree->links, link);
- link->prev = link->next = NULL;
- link->fromnode= NULL;
- link->fromsock= NULL;
+ if (link->tonode || link->tosock) {
+ BLI_remlink(&snode->edittree->links, link);
+ link->prev = link->next = NULL;
+ link->fromnode= NULL;
+ link->fromsock= NULL;
+ snode->edittree->update |= NTREE_UPDATE_LINKS;
+ ntreeUpdateTree(snode->edittree);
+ }
}
}
/* hilight target sockets only */
@@ -2246,23 +2426,26 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event)
else if (outside_group_rect(snode) && (link->tonode || link->fromnode)) {
/* automatically add new group socket */
if (link->tonode && link->tosock) {
- link->fromsock = nodeGroupExposeSocket(snode->edittree, link->tosock, SOCK_IN);
+ link->fromsock = node_group_expose_socket(snode->edittree, link->tosock, SOCK_IN);
link->fromnode = NULL;
- if (link->prev==NULL && link->next==NULL)
+ if (link->prev==NULL && link->next==NULL) {
BLI_addtail(&snode->edittree->links, link);
+ }
+ snode->edittree->update |= NTREE_UPDATE_GROUP_IN | NTREE_UPDATE_LINKS;
}
else if (link->fromnode && link->fromsock) {
- link->tosock = nodeGroupExposeSocket(snode->edittree, link->fromsock, SOCK_OUT);
+ link->tosock = node_group_expose_socket(snode->edittree, link->fromsock, SOCK_OUT);
link->tonode = NULL;
- if (link->prev==NULL && link->next==NULL)
+ if (link->prev==NULL && link->next==NULL) {
BLI_addtail(&snode->edittree->links, link);
+ }
+ snode->edittree->update |= NTREE_UPDATE_GROUP_OUT | NTREE_UPDATE_LINKS;
}
}
else
nodeRemLink(snode->edittree, link);
- ntreeSolveOrder(snode->edittree);
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(snode->edittree);
snode_notify(C, snode);
snode_dag_update(C, snode);
@@ -2337,7 +2520,7 @@ static int node_link_invoke(bContext *C, wmOperator *op, wmEvent *event)
ED_preview_kill_jobs(C);
nldrag->in_out= node_link_init(snode, nldrag);
-
+
if(nldrag->in_out) {
op->customdata= nldrag;
@@ -2410,7 +2593,7 @@ static int node_make_link_exec(bContext *C, wmOperator *op)
snode_autoconnect(snode, 1, replace);
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(snode->edittree);
snode_notify(C, snode);
snode_dag_update(C, snode);
@@ -2484,8 +2667,7 @@ static int cut_links_exec(bContext *C, wmOperator *op)
}
}
- ntreeSolveOrder(snode->edittree);
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(snode->edittree);
snode_notify(C, snode);
snode_dag_update(C, snode);
@@ -2610,7 +2792,7 @@ void ED_node_link_insert(ScrArea *sa)
link->flag &= ~NODE_LINKFLAG_HILITE;
nodeAddLink(snode->edittree, select, socket_best_match(&select->outputs, sockto->type), node, sockto);
- ntreeSolveOrder(snode->edittree); /* needed for pointers */
+ ntreeUpdateTree(snode->edittree); /* needed for pointers */
snode_tag_changed(snode, select);
ED_node_changed_update(snode->id, select);
}
@@ -2821,14 +3003,14 @@ static int node_group_make_exec(bContext *C, wmOperator *op)
ED_preview_kill_jobs(C);
- gnode= nodeMakeGroupFromSelected(snode->nodetree);
+ gnode= node_group_make_from_selected(snode->nodetree);
if(gnode==NULL) {
BKE_report(op->reports, RPT_WARNING, "Can not make Group");
return OPERATOR_CANCELLED;
}
else {
nodeSetActive(snode->nodetree, gnode);
- ntreeSolveOrder(snode->nodetree);
+ ntreeUpdateTree(snode->nodetree);
}
snode_notify(C, snode);
@@ -2974,7 +3156,7 @@ static int node_socket_toggle_exec(bContext *C, wmOperator *UNUSED(op))
}
}
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(snode->edittree);
snode_notify(C, snode);
@@ -3058,7 +3240,7 @@ static int node_delete_exec(bContext *C, wmOperator *UNUSED(op))
}
}
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(snode->edittree);
snode_notify(C, snode);
snode_dag_update(C, snode);
@@ -3128,7 +3310,7 @@ static void node_delete_reconnect(bNodeTree* tree, bNode* node)
deliveringvecsocket = link->fromsock;
}
break;
- case SOCK_VALUE:
+ case SOCK_FLOAT:
if (valsocket == NULL) {
valsocket = link->tosock;
deliveringvalnode = link->fromnode;
@@ -3149,7 +3331,7 @@ static void node_delete_reconnect(bNodeTree* tree, bNode* node)
numberOfConnectedOutputSockets ++;
if (!first) first = link;
switch(sock->type) {
- case SOCK_VALUE:
+ case SOCK_FLOAT:
if (deliveringvalsocket) {
link->fromnode = deliveringvalnode;
link->fromsock = deliveringvalsocket;
@@ -3207,7 +3389,7 @@ static int node_delete_reconnect_exec(bContext *C, wmOperator *UNUSED(op))
}
}
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(snode->edittree);
snode_notify(C, snode);
snode_dag_update(C, snode);
@@ -3237,7 +3419,7 @@ static int node_show_cycles_exec(bContext *C, wmOperator *UNUSED(op))
SpaceNode *snode= CTX_wm_space_node(C);
/* this is just a wrapper around this call... */
- ntreeSolveOrder(snode->edittree);
+ ntreeUpdateTree(snode->nodetree);
snode_notify(C, snode);
return OPERATOR_FINISHED;
@@ -3267,7 +3449,9 @@ static int node_add_file_exec(bContext *C, wmOperator *op)
SpaceNode *snode= CTX_wm_space_node(C);
bNode *node;
Image *ima= NULL;
- int ntype=0;
+ bNodeTemplate ntemp;
+
+ ntemp.type = -1;
/* check input variables */
if (RNA_property_is_set(op->ptr, "filepath"))
@@ -3299,11 +3483,14 @@ static int node_add_file_exec(bContext *C, wmOperator *op)
node_deselectall(snode);
if (snode->nodetree->type==NTREE_COMPOSIT)
- ntype = CMP_NODE_IMAGE;
+ ntemp.type = CMP_NODE_IMAGE;
+ if (ntemp.type < 0)
+ return OPERATOR_CANCELLED;
+
ED_preview_kill_jobs(C);
- node = node_add_node(snode, bmain, scene, ntype, snode->mx, snode->my);
+ node = node_add_node(snode, bmain, scene, &ntemp, snode->mx, snode->my);
if (!node) {
BKE_report(op->reports, RPT_WARNING, "Could not add an image node.");
@@ -3352,5 +3539,67 @@ void NODE_OT_add_file(wmOperatorType *ot)
RNA_def_string(ot->srna, "name", "Image", 24, _("Name"), _("Datablock name to assign."));
}
+/********************** New node tree operator *********************/
+
+static int new_node_tree_exec(bContext *C, wmOperator *op)
+{
+ SpaceNode *snode;
+ bNodeTree *ntree;
+ PointerRNA ptr, idptr;
+ PropertyRNA *prop;
+ int treetype;
+ char treename[MAX_ID_NAME-2] = "NodeTree";
+
+ /* retrieve state */
+ snode= CTX_wm_space_node(C);
+
+ if (RNA_property_is_set(op->ptr, "type"))
+ treetype = RNA_enum_get(op->ptr, "type");
+ else
+ treetype = snode->treetype;
+
+ if (RNA_property_is_set(op->ptr, "name"))
+ RNA_string_get(op->ptr, "name", treename);
+
+ ntree = ntreeAddTree(treename, treetype, 0);
+ if(!ntree)
+ return OPERATOR_CANCELLED;
+
+ /* hook into UI */
+ uiIDContextProperty(C, &ptr, &prop);
+ if(prop) {
+ RNA_id_pointer_create(&ntree->id, &idptr);
+ RNA_property_pointer_set(&ptr, prop, idptr);
+ /* RNA_property_pointer_set increases the user count,
+ * fixed here as the editor is the initial user.
+ */
+ --ntree->id.us;
+ RNA_property_update(C, &ptr, prop);
+ }
+ else if(snode) {
+ Scene *scene= CTX_data_scene(C);
+ snode->nodetree = ntree;
+
+ ED_node_tree_update(snode, scene);
+ }
+
+ return OPERATOR_FINISHED;
+}
+void NODE_OT_new_node_tree(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "New node tree";
+ ot->idname= "NODE_OT_new_node_tree";
+
+ /* api callbacks */
+ ot->exec= new_node_tree_exec;
+ ot->poll= ED_operator_node_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "type", nodetree_type_items, NTREE_COMPOSIT, "Tree Type", "");
+ RNA_def_string(ot->srna, "name", "NodeTree", MAX_ID_NAME-2, "Name", "");
+}
diff --git a/source/blender/editors/space_node/node_header.c b/source/blender/editors/space_node/node_header.c
index c7ac85b6793..7cb3a27d00a 100644
--- a/source/blender/editors/space_node/node_header.c
+++ b/source/blender/editors/space_node/node_header.c
@@ -47,24 +47,26 @@
#include "BLF_api.h"
#include "BKE_context.h"
+#include "BKE_global.h"
#include "BKE_screen.h"
#include "BKE_node.h"
#include "BKE_main.h"
+#include "RNA_access.h"
+
#include "WM_api.h"
#include "WM_types.h"
-
#include "UI_interface.h"
-#include "UI_resources.h"
#include "UI_interface_icons.h"
+#include "UI_resources.h"
#include "UI_view2d.h"
#include "node_intern.h"
/* ************************ add menu *********************** */
-static void do_node_add(bContext *C, void *UNUSED(arg), int event)
+static void do_node_add(bContext *C, bNodeTemplate *ntemp)
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -91,7 +93,7 @@ static void do_node_add(bContext *C, void *UNUSED(arg), int event)
else node->flag &= ~NODE_TEST;
}
- node= node_add_node(snode, bmain, scene, event, snode->mx, snode->my);
+ node= node_add_node(snode, bmain, scene, ntemp, snode->mx, snode->my);
/* select previous selection before autoconnect */
for(node= snode->edittree->nodes.first; node; node= node->next) {
@@ -107,69 +109,111 @@ static void do_node_add(bContext *C, void *UNUSED(arg), int event)
snode_dag_update(C, snode);
}
-static void node_auto_add_menu(bContext *C, uiLayout *layout, void *arg_nodeclass)
+static void do_node_add_static(bContext *C, void *UNUSED(arg), int event)
+{
+ bNodeTemplate ntemp;
+ ntemp.type = event;
+ do_node_add(C, &ntemp);
+}
+
+static void do_node_add_group(bContext *C, void *UNUSED(arg), int event)
+{
+ SpaceNode *snode= CTX_wm_space_node(C);
+ bNodeTemplate ntemp;
+
+ if (event>=0) {
+ ntemp.ngroup= BLI_findlink(&G.main->nodetree, event);
+ ntemp.type = ntemp.ngroup->nodetype;
+ }
+ else {
+ ntemp.type = -event;
+ switch (ntemp.type) {
+ case NODE_GROUP:
+ ntemp.ngroup = ntreeAddTree("Group", snode->treetype, ntemp.type);
+ break;
+ case NODE_FORLOOP:
+ ntemp.ngroup = ntreeAddTree("For Loop", snode->treetype, ntemp.type);
+ break;
+ case NODE_WHILELOOP:
+ ntemp.ngroup = ntreeAddTree("While Loop", snode->treetype, ntemp.type);
+ break;
+ default:
+ ntemp.ngroup = NULL;
+ }
+ }
+ if (!ntemp.ngroup)
+ return;
+
+ do_node_add(C, &ntemp);
+}
+
+#if 0 /* disabled */
+static void do_node_add_dynamic(bContext *C, void *UNUSED(arg), int event)
+{
+ bNodeTemplate ntemp;
+ ntemp.type = NODE_DYNAMIC;
+ do_node_add(C, &ntemp);
+}
+#endif
+
+static int node_tree_has_type(int treetype, int nodetype)
+{
+ bNodeTreeType *ttype= ntreeGetType(treetype);
+ bNodeType *ntype;
+ for (ntype=ttype->node_types.first; ntype; ntype=ntype->next) {
+ if (ntype->type==nodetype)
+ return 1;
+ }
+ return 0;
+}
+
+static void node_add_menu(bContext *C, uiLayout *layout, void *arg_nodeclass)
{
Main *bmain= CTX_data_main(C);
SpaceNode *snode= CTX_wm_space_node(C);
bNodeTree *ntree;
int nodeclass= GET_INT_FROM_POINTER(arg_nodeclass);
- int tot= 0, a;
+ int event;
ntree = snode->nodetree;
-
+
if(!ntree) {
uiItemS(layout);
return;
}
-
- /* mostly taken from toolbox.c, node_add_sublevel() */
- if(nodeclass==NODE_CLASS_GROUP) {
- bNodeTree *ngroup= bmain->nodetree.first;
- for(; ngroup; ngroup= ngroup->id.next)
- if(ngroup->type==ntree->type)
- tot++;
- }
- else {
- bNodeType *type = ntree->alltypes.first;
- while(type) {
- if(type->nclass == nodeclass)
- tot++;
- type= type->next;
- }
- }
- if(tot==0) {
+ if (nodeclass==NODE_CLASS_GROUP) {
+ bNodeTree *ngroup;
+
+ uiLayoutSetFunc(layout, do_node_add_group, NULL);
+
+ /* XXX hack: negative numbers used for empty group types */
+ if (node_tree_has_type(ntree->type, NODE_GROUP))
+ uiItemV(layout, "New Group", 0, -NODE_GROUP);
+ if (node_tree_has_type(ntree->type, NODE_FORLOOP))
+ uiItemV(layout, "New For Loop", 0, -NODE_FORLOOP);
+ if (node_tree_has_type(ntree->type, NODE_WHILELOOP))
+ uiItemV(layout, "New While Loop", 0, -NODE_WHILELOOP);
uiItemS(layout);
- return;
- }
-
- uiLayoutSetFunc(layout, do_node_add, NULL);
-
- if(nodeclass==NODE_CLASS_GROUP) {
- bNodeTree *ngroup= bmain->nodetree.first;
-
- for(tot=0, a=0; ngroup; ngroup= ngroup->id.next, tot++) {
- if(ngroup->type==ntree->type) {
- uiItemV(layout, ngroup->id.name+2, ICON_NONE, NODE_GROUP_MENU+tot);
- a++;
+
+ for(ngroup=bmain->nodetree.first, event=0; ngroup; ngroup= ngroup->id.next, ++event) {
+ /* only use group trees */
+ if (ngroup->type==ntree->type && ELEM3(ngroup->nodetype, NODE_GROUP, NODE_FORLOOP, NODE_WHILELOOP)) {
+ uiItemV(layout, ngroup->id.name+2, 0, event);
}
}
}
+ else if (nodeclass==NODE_DYNAMIC) {
+ /* disabled */
+ }
else {
- bNodeType *type;
- int script=0;
-
- for(a=0, type= ntree->alltypes.first; type; type=type->next) {
- if(type->nclass == nodeclass && type->name) {
- if(type->type == NODE_DYNAMIC) {
- uiItemV(layout, type->name, ICON_NONE, NODE_DYNAMIC_MENU+script);
- script++;
- }
- else
- uiItemV(layout, type->name, ICON_NONE, type->type);
-
- a++;
- }
+ bNodeType *ntype;
+
+ uiLayoutSetFunc(layout, do_node_add_static, NULL);
+
+ for (ntype=ntreeGetType(ntree->type)->node_types.first; ntype; ntype=ntype->next) {
+ if(ntype->nclass==nodeclass && ntype->name)
+ uiItemV(layout, ntype->name, 0, ntype->type);
}
}
}
@@ -183,34 +227,37 @@ static void node_menu_add(const bContext *C, Menu *menu)
uiLayoutSetActive(layout, 0);
if(snode->treetype==NTREE_SHADER) {
- uiItemMenuF(layout, _("Input"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
- uiItemMenuF(layout, _("Output"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
- uiItemMenuF(layout, _("Color"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
- uiItemMenuF(layout, _("Vector"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_VECTOR));
- uiItemMenuF(layout, _("Convertor"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
- uiItemMenuF(layout, _("Group"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
- uiItemMenuF(layout, _("Dynamic"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_DYNAMIC));
+ uiItemMenuF(layout, _("Input"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
+ uiItemMenuF(layout, _("Output"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
+ uiItemMenuF(layout, _("Color"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
+ uiItemMenuF(layout, _("Vector"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_VECTOR));
+ uiItemMenuF(layout, _("Convertor"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
+ uiItemMenuF(layout, _("Group"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
+ uiItemMenuF(layout, _("Dynamic"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_DYNAMIC));
+ uiItemMenuF(layout, _("Layout"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_LAYOUT));
}
else if(snode->treetype==NTREE_COMPOSIT) {
- uiItemMenuF(layout, _("Input"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
- uiItemMenuF(layout, _("Output"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
- uiItemMenuF(layout, _("Color"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
- uiItemMenuF(layout, _("Vector"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_VECTOR));
- uiItemMenuF(layout, _("Filter"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_FILTER));
- uiItemMenuF(layout, _("Convertor"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
- uiItemMenuF(layout, _("Matte"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_MATTE));
- uiItemMenuF(layout, _("Distort"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_DISTORT));
- uiItemMenuF(layout, _("Group"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
+ uiItemMenuF(layout, _("Input"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
+ uiItemMenuF(layout, _("Output"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
+ uiItemMenuF(layout, _("Color"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
+ uiItemMenuF(layout, _("Vector"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_VECTOR));
+ uiItemMenuF(layout, _("Filter"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_FILTER));
+ uiItemMenuF(layout, _("Convertor"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
+ uiItemMenuF(layout, _("Matte"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_MATTE));
+ uiItemMenuF(layout, _("Distort"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_DISTORT));
+ uiItemMenuF(layout, _("Group"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
+ uiItemMenuF(layout, _("Layout"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_LAYOUT));
}
else if(snode->treetype==NTREE_TEXTURE) {
- uiItemMenuF(layout, _("Input"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
- uiItemMenuF(layout, _("Output"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
- uiItemMenuF(layout, _("Color"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
- uiItemMenuF(layout, _("Patterns"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_PATTERN));
- uiItemMenuF(layout, _("Textures"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_TEXTURE));
- uiItemMenuF(layout, _("Convertor"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
- uiItemMenuF(layout, _("Distort"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_DISTORT));
- uiItemMenuF(layout, _("Group"), 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
+ uiItemMenuF(layout, _("Input"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
+ uiItemMenuF(layout, _("Output"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
+ uiItemMenuF(layout, _("Color"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
+ uiItemMenuF(layout, _("Patterns"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_PATTERN));
+ uiItemMenuF(layout, _("Textures"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_TEXTURE));
+ uiItemMenuF(layout, _("Convertor"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
+ uiItemMenuF(layout, _("Distort"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_DISTORT));
+ uiItemMenuF(layout, _("Group"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
+ uiItemMenuF(layout, _("Layout"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_LAYOUT));
}
}
diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h
index 4cfde22b8a0..3751d8efae8 100644
--- a/source/blender/editors/space_node/node_intern.h
+++ b/source/blender/editors/space_node/node_intern.h
@@ -33,6 +33,8 @@
#ifndef ED_NODE_INTERN_H
#define ED_NODE_INTERN_H
+#include "UI_interface.h"
+
/* internal exports only */
struct ARegion;
@@ -40,6 +42,7 @@ struct ARegionType;
struct View2D;
struct bContext;
struct wmWindowManager;
+struct bNodeTemplate;
struct bNode;
struct bNodeSocket;
struct bNodeLink;
@@ -64,6 +67,11 @@ void node_header_buttons(const bContext *C, ARegion *ar);
void node_menus_register(void);
/* node_draw.c */
+void node_socket_circle_draw(struct bNodeTree *ntree, struct bNodeSocket *sock, float size);
+void node_draw_default(const struct bContext *C, struct ARegion *ar, struct SpaceNode *snode, struct bNodeTree *ntree, struct bNode *node);
+void node_update_default(const struct bContext *C, struct bNodeTree *ntree, struct bNode *node);
+void node_update_nodetree(const struct bContext *C, struct bNodeTree *ntree, float offsetx, float offsety);
+void node_draw_nodetree(const struct bContext *C, struct ARegion *ar, struct SpaceNode *snode, struct bNodeTree *ntree);
void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d);
/* node_buttons.c */
@@ -90,6 +98,7 @@ void NODE_OT_select_same_type_prev(wmOperatorType *ot);
void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link);
void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3 );
int node_link_bezier_points(View2D *v2d, SpaceNode *snode, bNodeLink *link, float coord_array[][2], int resol);
+void node_draw_link_straight(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3 );
void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode, int color_manage);
void draw_nodespace_color_info(struct ARegion *ar, int color_manage, int channels, int x, int y, char *cp, float *fp);
@@ -97,10 +106,10 @@ void draw_nodespace_color_info(struct ARegion *ar, int color_manage, int channel
void node_tree_from_ID(ID *id, bNodeTree **ntree, bNodeTree **edittree, int *treetype);
void snode_notify(bContext *C, SpaceNode *snode);
void snode_dag_update(bContext *C, SpaceNode *snode);
-bNode *next_node(bNodeTree *ntree);
-bNode *node_add_node(SpaceNode *snode, struct Main *bmain, Scene *scene, int type, float locx, float locy);
+bNode *node_add_node(struct SpaceNode *snode, struct Main *bmain, struct Scene *scene, struct bNodeTemplate *ntemp, float locx, float locy);
void snode_set_context(SpaceNode *snode, Scene *scene);
void snode_make_group_editable(SpaceNode *snode, bNode *gnode);
+void node_sort(struct bNodeTree *ntree);
void node_deselectall(SpaceNode *snode);
int node_select_same_type(SpaceNode *snode);
int node_select_same_type_np(SpaceNode *snode, int dir);
@@ -146,6 +155,8 @@ void NODE_OT_backimage_sample(wmOperatorType *ot);
void NODE_OT_add_file(struct wmOperatorType *ot);
+void NODE_OT_new_node_tree(struct wmOperatorType *ot);
+
extern const char *node_context_dir[];
// XXXXXX
diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c
index 3a4ca866d41..849e67e0431 100644
--- a/source/blender/editors/space_node/node_ops.c
+++ b/source/blender/editors/space_node/node_ops.c
@@ -98,6 +98,8 @@ void node_operatortypes(void)
WM_operatortype_append(NODE_OT_backimage_sample);
WM_operatortype_append(NODE_OT_add_file);
+
+ WM_operatortype_append(NODE_OT_new_node_tree);
}
void ED_operatormacros_node(void)
@@ -195,6 +197,5 @@ void node_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "NODE_OT_read_fullsamplelayers", RKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "NODE_OT_render_changed", ZKEY, KM_PRESS, 0, 0);
-
transform_keymap_for_space(keyconf, keymap, SPACE_NODE);
}
diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c
index a73e8c17f75..ccf1752896b 100644
--- a/source/blender/editors/space_node/node_select.c
+++ b/source/blender/editors/space_node/node_select.c
@@ -64,7 +64,7 @@ static bNode *node_under_mouse(bNodeTree *ntree, int mx, int my)
{
bNode *node;
- for(next_node(ntree); (node=next_node(NULL));) {
+ for(node=ntree->nodes.last; node; node=node->prev) {
/* node body (header and scale are in other operators) */
if (BLI_in_rctf(&node->totr, mx, my))
return node;
@@ -95,8 +95,10 @@ static bNode *node_mouse_select(Main *bmain, SpaceNode *snode, ARegion *ar, cons
}
else
node->flag ^= SELECT;
-
+
ED_node_set_active(bmain, snode->edittree, node);
+
+ node_sort(snode->edittree);
}
return node;
@@ -184,6 +186,8 @@ static int node_borderselect_exec(bContext *C, wmOperator *op)
}
}
+ node_sort(snode->edittree);
+
WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL);
return OPERATOR_FINISHED;
@@ -254,6 +258,8 @@ static int node_select_all_exec(bContext *C, wmOperator *UNUSED(op))
node->flag |= NODE_SELECT;
}
+ node_sort(snode->edittree);
+
WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL);
return OPERATOR_FINISHED;
}
@@ -294,6 +300,8 @@ static int node_select_linked_to_exec(bContext *C, wmOperator *UNUSED(op))
node->flag |= NODE_SELECT;
}
+ node_sort(snode->edittree);
+
WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL);
return OPERATOR_FINISHED;
}
@@ -334,6 +342,8 @@ static int node_select_linked_from_exec(bContext *C, wmOperator *UNUSED(op))
node->flag |= NODE_SELECT;
}
+ node_sort(snode->edittree);
+
WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL);
return OPERATOR_FINISHED;
}
@@ -360,6 +370,9 @@ static int node_select_same_type_exec(bContext *C, wmOperator *UNUSED(op))
SpaceNode *snode = CTX_wm_space_node(C);
node_select_same_type(snode);
+
+ node_sort(snode->edittree);
+
WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL);
return OPERATOR_FINISHED;
}
@@ -386,7 +399,11 @@ static int node_select_same_type_next_exec(bContext *C, wmOperator *UNUSED(op))
SpaceNode *snode = CTX_wm_space_node(C);
node_select_same_type_np(snode, 0);
+
+ node_sort(snode->edittree);
+
WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL);
+
return OPERATOR_FINISHED;
}
@@ -410,6 +427,9 @@ static int node_select_same_type_prev_exec(bContext *C, wmOperator *UNUSED(op))
SpaceNode *snode = CTX_wm_space_node(C);
node_select_same_type_np(snode, 1);
+
+ node_sort(snode->edittree);
+
WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL);
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/space_node/node_state.c b/source/blender/editors/space_node/node_state.c
index a422222ae26..1c64d09265d 100644
--- a/source/blender/editors/space_node/node_state.c
+++ b/source/blender/editors/space_node/node_state.c
@@ -71,30 +71,14 @@ void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set)
sock->flag &= ~SOCK_HIDDEN;
}
else {
- bNode *gnode= node_tree_get_editgroup(snode->nodetree);
-
- /* hiding inside group should not break links in other group users */
- if(gnode) {
- nodeGroupSocketUseFlags((bNodeTree *)gnode->id);
- for(sock= node->inputs.first; sock; sock= sock->next)
- if(!(sock->flag & SOCK_IN_USE))
- if(sock->link==NULL)
- sock->flag |= SOCK_HIDDEN;
- for(sock= node->outputs.first; sock; sock= sock->next)
- if(!(sock->flag & SOCK_IN_USE))
- if(nodeCountSocketLinks(snode->edittree, sock)==0)
- sock->flag |= SOCK_HIDDEN;
+ /* hide unused sockets */
+ for(sock= node->inputs.first; sock; sock= sock->next) {
+ if(sock->link==NULL)
+ sock->flag |= SOCK_HIDDEN;
}
- else {
- /* hide unused sockets */
- for(sock= node->inputs.first; sock; sock= sock->next) {
- if(sock->link==NULL)
- sock->flag |= SOCK_HIDDEN;
- }
- for(sock= node->outputs.first; sock; sock= sock->next) {
- if(nodeCountSocketLinks(snode->edittree, sock)==0)
- sock->flag |= SOCK_HIDDEN;
- }
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ if(nodeCountSocketLinks(snode->edittree, sock)==0)
+ sock->flag |= SOCK_HIDDEN;
}
}
}
@@ -102,7 +86,7 @@ void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set)
static void node_hide_unhide_sockets(SpaceNode *snode, bNode *node)
{
node_set_hidden_sockets(snode, node, !node_has_hidden_sockets(node));
- node_tree_verify_groups(snode->nodetree);
+ ntreeUpdateTree(snode->edittree);
}
static int do_header_node(SpaceNode *snode, bNode *node, float mx, float my)
@@ -170,7 +154,7 @@ static int node_toggle_visibility(SpaceNode *snode, ARegion *ar, const int mval[
UI_view2d_region_to_view(&ar->v2d, mval[0], mval[1], &mx, &my);
- for(next_node(snode->edittree); (node=next_node(NULL));) {
+ for(node=snode->edittree->nodes.last; node; node=node->prev) {
if(node->flag & NODE_HIDDEN) {
if(do_header_hidden_node(node, mx, my)) {
ED_region_tag_redraw(ar);
diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c
index 3c5f4a163a2..0990afa4fe6 100644
--- a/source/blender/editors/space_node/space_node.c
+++ b/source/blender/editors/space_node/space_node.c
@@ -439,14 +439,30 @@ static int node_context(const bContext *C, const char *member, bContextDataResul
else if(CTX_data_equals(member, "selected_nodes")) {
bNode *node;
- for(next_node(snode->edittree); (node=next_node(NULL));) {
- if(node->flag & NODE_SELECT) {
- CTX_data_list_add(result, &snode->edittree->id, &RNA_Node, node);
+ if(snode->edittree) {
+ for(node=snode->edittree->nodes.last; node; node=node->prev) {
+ if(node->flag & NODE_SELECT) {
+ CTX_data_list_add(result, &snode->edittree->id, &RNA_Node, node);
+ }
}
}
CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
return 1;
}
+ else if(CTX_data_equals(member, "active_node")) {
+ bNode *node;
+
+ if(snode->edittree) {
+ for(node=snode->edittree->nodes.last; node; node=node->prev) {
+ if(node->flag & NODE_ACTIVE) {
+ CTX_data_pointer_set(result, &snode->edittree->id, &RNA_Node, node);
+ break;
+ }
+ }
+ }
+ CTX_data_type_set(result, CTX_DATA_TYPE_POINTER);
+ return 1;
+ }
return 0;
}
diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c
index 0cb05fa2115..357730aff39 100644
--- a/source/blender/editors/space_outliner/outliner_draw.c
+++ b/source/blender/editors/space_outliner/outliner_draw.c
@@ -97,7 +97,7 @@ static void outliner_height(SpaceOops *soops, ListBase *lb, int *h)
TreeElement *te= lb->first;
while(te) {
TreeStoreElem *tselem= TREESTORE(te);
- if((tselem->flag & TSE_CLOSED)==0)
+ if(TSELEM_OPEN(tselem,soops))
outliner_height(soops, &te->subtree, h);
(*h) += UI_UNIT_Y;
te= te->next;
@@ -112,7 +112,7 @@ static void outliner_width(SpaceOops *soops, ListBase *lb, int *w)
// TreeStoreElem *tselem= TREESTORE(te);
// XXX fixme... te->xend is not set yet
- if(tselem->flag & TSE_CLOSED) {
+ if(!TSELEM_OPEN(tselem,soops)) {
if (te->xend > *w)
*w = te->xend;
}
@@ -135,7 +135,7 @@ static void outliner_rna_width(SpaceOops *soops, ListBase *lb, int *w, int start
if(startx+100 > *w)
*w = startx+100;
- if((tselem->flag & TSE_CLOSED)==0)
+ if(TSELEM_OPEN(tselem,soops))
outliner_rna_width(soops, &te->subtree, w, startx+UI_UNIT_X);
te= te->next;
}
@@ -236,7 +236,7 @@ static int group_select_flag(Group *gr)
return 0;
}
-static void restrictbutton_gr_restrict_flag(void *poin, void *poin2, int flag)
+void restrictbutton_gr_restrict_flag(void *poin, void *poin2, int flag)
{
Scene *scene = (Scene *)poin;
GroupObject *gob;
@@ -519,7 +519,7 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
}
}
- if((tselem->flag & TSE_CLOSED)==0) outliner_draw_restrictbuts(block, scene, ar, soops, &te->subtree);
+ if(TSELEM_OPEN(tselem,soops)) outliner_draw_restrictbuts(block, scene, ar, soops, &te->subtree);
}
}
@@ -560,7 +560,7 @@ static void outliner_draw_rnabuts(uiBlock *block, Scene *scene, ARegion *ar, Spa
ptr= &te->rnaptr;
prop= te->directdata;
- if(!(RNA_property_type(prop) == PROP_POINTER && (tselem->flag & TSE_CLOSED)==0))
+ if(!(RNA_property_type(prop) == PROP_POINTER && (TSELEM_OPEN(tselem,soops))) )
uiDefAutoButR(block, ptr, prop, -1, "", ICON_NONE, sizex, (int)te->ys, OL_RNA_COL_SIZEX, UI_UNIT_Y-1);
}
else if(tselem->type == TSE_RNA_ARRAY_ELEM) {
@@ -571,7 +571,7 @@ static void outliner_draw_rnabuts(uiBlock *block, Scene *scene, ARegion *ar, Spa
}
}
- if((tselem->flag & TSE_CLOSED)==0) outliner_draw_rnabuts(block, scene, ar, soops, sizex, &te->subtree);
+ if(TSELEM_OPEN(tselem,soops)) outliner_draw_rnabuts(block, scene, ar, soops, sizex, &te->subtree);
}
}
@@ -828,7 +828,7 @@ static void outliner_draw_keymapbuts(uiBlock *block, ARegion *ar, SpaceOops *soo
}
}
- if((tselem->flag & TSE_CLOSED)==0) outliner_draw_keymapbuts(block, ar, soops, &te->subtree);
+ if(TSELEM_OPEN(tselem,soops)) outliner_draw_keymapbuts(block, ar, soops, &te->subtree);
}
}
@@ -871,7 +871,7 @@ static void outliner_buttons(const bContext *C, uiBlock *block, ARegion *ar, Spa
}
}
- if((tselem->flag & TSE_CLOSED)==0) outliner_buttons(C, block, ar, soops, &te->subtree);
+ if(TSELEM_OPEN(tselem,soops)) outliner_buttons(C, block, ar, soops, &te->subtree);
}
}
@@ -1182,7 +1182,7 @@ static void outliner_draw_iconrow(bContext *C, uiBlock *block, Scene *scene, Spa
if(active) {
float ufac= UI_UNIT_X/20.0f;
- uiSetRoundBox(15);
+ uiSetRoundBox(UI_CNR_ALL);
glColor4ub(255, 255, 255, 100);
uiRoundBox( (float)*offsx-0.5f*ufac, (float)ys-1.0f*ufac, (float)*offsx+UI_UNIT_Y-3.0f*ufac, (float)ys+UI_UNIT_Y-3.0f*ufac, UI_UNIT_Y/2.0f-2.0f*ufac);
glEnable(GL_BLEND); /* roundbox disables */
@@ -1237,6 +1237,18 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene
glEnable(GL_BLEND);
+ /* start by highlighting search matches
+ * we don't expand items when searching in the datablocks but we
+ * still want to highlight any filter matches.
+ */
+ if ( (SEARCHING_OUTLINER(soops) || (soops->outlinevis==SO_DATABLOCKS && soops->search_string[0]!=0)) &&
+ (tselem->flag & TSE_SEARCHMATCH))
+ {
+ /* TODO - add search highlight colour to theme? */
+ glColor4f(0.2f, 0.5f, 0.2f, 0.3f);
+ glRecti(startx, *starty+1, ar->v2d.cur.xmax, *starty+UI_UNIT_Y-1);
+ }
+
/* colors for active/selected data */
if(tselem->type==0) {
if(te->idcode==ID_SCE) {
@@ -1301,7 +1313,7 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene
/* active circle */
if(active) {
- uiSetRoundBox(15);
+ uiSetRoundBox(UI_CNR_ALL);
uiRoundBox( (float)startx+UI_UNIT_Y-1.5f*ufac, (float)*starty+2.0f*ufac, (float)startx+2.0f*UI_UNIT_Y-4.0f*ufac, (float)*starty+UI_UNIT_Y-1.0f*ufac, UI_UNIT_Y/2.0f-2.0f*ufac);
glEnable(GL_BLEND); /* roundbox disables it */
@@ -1317,10 +1329,10 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene
icon_x = startx+5*ufac;
// icons a bit higher
- if(tselem->flag & TSE_CLOSED)
- UI_icon_draw((float)icon_x, (float)*starty+2*ufac, ICON_DISCLOSURE_TRI_RIGHT);
- else
+ if(TSELEM_OPEN(tselem,soops))
UI_icon_draw((float)icon_x, (float)*starty+2*ufac, ICON_DISCLOSURE_TRI_DOWN);
+ else
+ UI_icon_draw((float)icon_x, (float)*starty+2*ufac, ICON_DISCLOSURE_TRI_RIGHT);
}
offsx+= UI_UNIT_X;
@@ -1356,7 +1368,7 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene
offsx+= (int)(UI_UNIT_X + UI_GetStringWidth(te->name));
/* closed item, we draw the icons, not when it's a scene, or master-server list though */
- if(tselem->flag & TSE_CLOSED) {
+ if(!TSELEM_OPEN(tselem,soops)) {
if(te->subtree.first) {
if(tselem->type==0 && te->idcode==ID_SCE);
else if(tselem->type!=TSE_R_LAYER) { /* this tree element always has same amount of branches, so dont draw */
@@ -1382,7 +1394,7 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene
te->ys= (float)*starty;
te->xend= startx+offsx;
- if((tselem->flag & TSE_CLOSED)==0) {
+ if(TSELEM_OPEN(tselem,soops)) {
*starty-= UI_UNIT_Y;
for(ten= te->subtree.first; ten; ten= ten->next)
@@ -1415,7 +1427,7 @@ static void outliner_draw_hierarchy(SpaceOops *soops, ListBase *lb, int startx,
*starty-= UI_UNIT_Y;
- if((tselem->flag & TSE_CLOSED)==0)
+ if(TSELEM_OPEN(tselem,soops))
outliner_draw_hierarchy(soops, &te->subtree, startx+UI_UNIT_X, starty);
}
@@ -1439,12 +1451,12 @@ static void outliner_draw_struct_marks(ARegion *ar, SpaceOops *soops, ListBase *
tselem= TREESTORE(te);
/* selection status */
- if((tselem->flag & TSE_CLOSED)==0)
+ if(TSELEM_OPEN(tselem,soops))
if(tselem->type == TSE_RNA_STRUCT)
glRecti(0, *starty+1, (int)ar->v2d.cur.xmax+V2D_SCROLL_WIDTH, *starty+UI_UNIT_Y-1);
*starty-= UI_UNIT_Y;
- if((tselem->flag & TSE_CLOSED)==0) {
+ if(TSELEM_OPEN(tselem,soops)) {
outliner_draw_struct_marks(ar, soops, &te->subtree, starty);
if(tselem->type == TSE_RNA_STRUCT)
fdrawline(0, (float)*starty+UI_UNIT_Y, ar->v2d.cur.xmax+V2D_SCROLL_WIDTH, (float)*starty+UI_UNIT_Y);
@@ -1465,7 +1477,7 @@ static void outliner_draw_selection(ARegion *ar, SpaceOops *soops, ListBase *lb,
glRecti(0, *starty+1, (int)ar->v2d.cur.xmax, *starty+UI_UNIT_Y-1);
}
*starty-= UI_UNIT_Y;
- if((tselem->flag & TSE_CLOSED)==0) outliner_draw_selection(ar, soops, &te->subtree, starty);
+ if(TSELEM_OPEN(tselem,soops)) outliner_draw_selection(ar, soops, &te->subtree, starty);
}
}
diff --git a/source/blender/editors/space_outliner/outliner_edit.c b/source/blender/editors/space_outliner/outliner_edit.c
index fbd5281b1d9..05eace0d4ef 100644
--- a/source/blender/editors/space_outliner/outliner_edit.c
+++ b/source/blender/editors/space_outliner/outliner_edit.c
@@ -218,6 +218,34 @@ void OUTLINER_OT_item_openclose(wmOperatorType *ot)
/* Rename --------------------------------------------------- */
+void do_item_rename(ARegion *ar, TreeElement *te, TreeStoreElem *tselem, ReportList *reports)
+{
+ /* can't rename rna datablocks entries */
+ if(ELEM3(tselem->type, TSE_RNA_STRUCT, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM))
+ ;
+ else if(ELEM10(tselem->type, TSE_ANIM_DATA, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_MODIFIER_BASE, TSE_SCRIPT_BASE, TSE_POSE_BASE, TSE_POSEGRP_BASE, TSE_R_LAYER_BASE, TSE_R_PASS))
+ BKE_report(reports, RPT_WARNING, "Cannot edit builtin name");
+ else if(ELEM3(tselem->type, TSE_SEQUENCE, TSE_SEQ_STRIP, TSE_SEQUENCE_DUP))
+ BKE_report(reports, RPT_WARNING, "Cannot edit sequence name");
+ else if(tselem->id->lib) {
+ // XXX error_libdata();
+ }
+ else if(te->idcode == ID_LI && te->parent) {
+ BKE_report(reports, RPT_WARNING, "Cannot edit the path of an indirectly linked library");
+ }
+ else {
+ tselem->flag |= TSE_TEXTBUT;
+ ED_region_tag_redraw(ar);
+ }
+}
+
+void item_rename_cb(bContext *C, Scene *UNUSED(scene), TreeElement *te, TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem)
+{
+ ARegion *ar= CTX_wm_region(C);
+ ReportList *reports= CTX_wm_reports(C); // XXX
+ do_item_rename(ar, te, tselem, reports) ;
+}
+
static int do_outliner_item_rename(bContext *C, ARegion *ar, SpaceOops *soops, TreeElement *te, const float mval[2])
{
ReportList *reports= CTX_wm_reports(C); // XXX
@@ -228,23 +256,7 @@ static int do_outliner_item_rename(bContext *C, ARegion *ar, SpaceOops *soops, T
/* name and first icon */
if(mval[0]>te->xs+UI_UNIT_X && mval[0]<te->xend) {
- /* can't rename rna datablocks entries */
- if(ELEM3(tselem->type, TSE_RNA_STRUCT, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM))
- ;
- else if(ELEM10(tselem->type, TSE_ANIM_DATA, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_MODIFIER_BASE, TSE_SCRIPT_BASE, TSE_POSE_BASE, TSE_POSEGRP_BASE, TSE_R_LAYER_BASE, TSE_R_PASS))
- BKE_report(reports, RPT_WARNING, "Cannot edit builtin name");
- else if(ELEM3(tselem->type, TSE_SEQUENCE, TSE_SEQ_STRIP, TSE_SEQUENCE_DUP))
- BKE_report(reports, RPT_WARNING, "Cannot edit sequence name");
- else if(tselem->id->lib) {
- // XXX error_libdata();
- }
- else if(te->idcode == ID_LI && te->parent) {
- BKE_report(reports, RPT_WARNING, "Cannot edit the path of an indirectly linked library");
- }
- else {
- tselem->flag |= TSE_TEXTBUT;
- ED_region_tag_redraw(ar);
- }
+ do_item_rename(ar, te, tselem, reports) ;
}
return 1;
}
@@ -377,6 +389,12 @@ void object_toggle_visibility_cb(bContext *C, Scene *scene, TreeElement *te, Tre
}
}
+void group_toggle_visibility_cb(bContext *UNUSED(C), Scene *scene, TreeElement *UNUSED(te), TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem)
+{
+ Group *group= (Group *)tselem->id;
+ restrictbutton_gr_restrict_flag(scene, group, OB_RESTRICT_VIEW);
+}
+
static int outliner_toggle_visibility_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceOops *soops= CTX_wm_space_outliner(C);
@@ -417,6 +435,12 @@ void object_toggle_selectability_cb(bContext *UNUSED(C), Scene *scene, TreeEleme
}
}
+void group_toggle_selectability_cb(bContext *UNUSED(C), Scene *scene, TreeElement *UNUSED(te), TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem)
+{
+ Group *group= (Group *)tselem->id;
+ restrictbutton_gr_restrict_flag(scene, group, OB_RESTRICT_SELECT);
+}
+
static int outliner_toggle_selectability_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceOops *soops= CTX_wm_space_outliner(C);
@@ -457,6 +481,12 @@ void object_toggle_renderability_cb(bContext *UNUSED(C), Scene *scene, TreeEleme
}
}
+void group_toggle_renderability_cb(bContext *UNUSED(C), Scene *scene, TreeElement *UNUSED(te), TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem)
+{
+ Group *group= (Group *)tselem->id;
+ restrictbutton_gr_restrict_flag(scene, group, OB_RESTRICT_RENDER);
+}
+
static int outliner_toggle_renderability_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceOops *soops= CTX_wm_space_outliner(C);
@@ -657,7 +687,7 @@ static void outliner_set_coordinates_element(SpaceOops *soops, TreeElement *te,
te->ys= (float)(*starty);
*starty-= UI_UNIT_Y;
- if((tselem->flag & TSE_CLOSED)==0) {
+ if(TSELEM_OPEN(tselem,soops)) {
TreeElement *ten;
for(ten= te->subtree.first; ten; ten= ten->next) {
outliner_set_coordinates_element(soops, ten, startx+UI_UNIT_X, starty);
@@ -880,7 +910,7 @@ static void tree_element_show_hierarchy(Scene *scene, SpaceOops *soops, ListBase
}
else tselem->flag |= TSE_CLOSED;
- if(tselem->flag & TSE_CLOSED); else tree_element_show_hierarchy(scene, soops, &te->subtree);
+ if(TSELEM_OPEN(tselem,soops)) tree_element_show_hierarchy(scene, soops, &te->subtree);
}
}
@@ -1145,7 +1175,7 @@ static void do_outliner_drivers_editop(SpaceOops *soops, ListBase *tree, ReportL
}
/* go over sub-tree */
- if ((tselem->flag & TSE_CLOSED)==0)
+ if (TSELEM_OPEN(tselem,soops))
do_outliner_drivers_editop(soops, &te->subtree, reports, mode);
}
}
@@ -1313,7 +1343,7 @@ static void do_outliner_keyingset_editop(SpaceOops *soops, KeyingSet *ks, ListBa
}
/* go over sub-tree */
- if ((tselem->flag & TSE_CLOSED)==0)
+ if (TSELEM_OPEN(tselem,soops))
do_outliner_keyingset_editop(soops, ks, &te->subtree, mode);
}
}
diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h
index 9da09144125..215ab508ab6 100644
--- a/source/blender/editors/space_outliner/outliner_intern.h
+++ b/source/blender/editors/space_outliner/outliner_intern.h
@@ -126,9 +126,31 @@ typedef struct TreeElement {
#define OL_RNA_COL_SPACEX (UI_UNIT_X*2.5f)
+/* Outliner Searching --
+
+ Are we looking for something in the outliner?
+ If so finding matches in child items makes it more useful
+
+ - We want to flag parents to act as being open to filter child matches
+ - and also flag matches so we can highlight them
+ - Flags are stored in TreeStoreElem->flag
+ - Flag options defined in DNA_outliner_types.h
+ - SO_SEARCH_RECURSIVE defined in DNA_space_types.h
+
+ - NOT in datablocks view - searching all datablocks takes way too long
+ to be useful
+ - not searching into RNA items helps but isn't the complete solution
+ */
+
+#define SEARCHING_OUTLINER(sov) (sov->search_flags & SO_SEARCH_RECURSIVE)
+
+/* is the currrent element open? if so we also show children */
+#define TSELEM_OPEN(telm,sv) ( (telm->flag & TSE_CLOSED)==0 || (SEARCHING_OUTLINER(sv) && (telm->flag & TSE_CHILDSEARCH)) )
+
/* outliner_tree.c ----------------------------------------------- */
void outliner_free_tree(ListBase *lb);
+void outliner_cleanup_tree(struct SpaceOops *soops);
TreeElement *outliner_find_tse(struct SpaceOops *soops, TreeStoreElem *tse);
TreeElement *outliner_find_id(struct SpaceOops *soops, ListBase *lb, struct ID *id);
@@ -139,6 +161,7 @@ void outliner_build_tree(struct Main *mainvar, struct Scene *scene, struct Space
/* outliner_draw.c ---------------------------------------------- */
void draw_outliner(const struct bContext *C);
+void restrictbutton_gr_restrict_flag(void *poin, void *poin2, int flag);
/* outliner_select.c -------------------------------------------- */
int tree_element_type_active(struct bContext *C, struct Scene *scene, struct SpaceOops *soops, TreeElement *te, TreeStoreElem *tselem, int set);
@@ -158,6 +181,13 @@ void object_toggle_visibility_cb(struct bContext *C, struct Scene *scene, TreeEl
void object_toggle_selectability_cb(struct bContext *C, struct Scene *scene, TreeElement *te, struct TreeStoreElem *tsep, struct TreeStoreElem *tselem);
void object_toggle_renderability_cb(struct bContext *C, struct Scene *scene, TreeElement *te, struct TreeStoreElem *tsep, struct TreeStoreElem *tselem);
+
+void group_toggle_visibility_cb(struct bContext *C, struct Scene *scene, TreeElement *te, struct TreeStoreElem *tsep, struct TreeStoreElem *tselem);
+void group_toggle_selectability_cb(struct bContext *C, struct Scene *scene, TreeElement *te, struct TreeStoreElem *tsep, struct TreeStoreElem *tselem);
+void group_toggle_renderability_cb(struct bContext *C, struct Scene *scene, TreeElement *te, struct TreeStoreElem *tsep, struct TreeStoreElem *tselem);
+
+void item_rename_cb(struct bContext *C, struct Scene *scene, TreeElement *te, struct TreeStoreElem *tsep, struct TreeStoreElem *tselem);
+
/* ...................................................... */
void OUTLINER_OT_item_activate(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_outliner/outliner_select.c b/source/blender/editors/space_outliner/outliner_select.c
index 2c0a8c34747..a88625aad0d 100644
--- a/source/blender/editors/space_outliner/outliner_select.c
+++ b/source/blender/editors/space_outliner/outliner_select.c
@@ -134,7 +134,7 @@ static int outliner_select(SpaceOops *soops, ListBase *lb, int *index, short *se
change |= 1;
}
}
- else if ((tselem->flag & TSE_CLOSED)==0) {
+ else if (TSELEM_OPEN(tselem,soops)) {
/* Only try selecting sub-elements if we haven't hit the right element yet
*
* Hack warning:
diff --git a/source/blender/editors/space_outliner/outliner_tools.c b/source/blender/editors/space_outliner/outliner_tools.c
index 3ae158bd275..b2fdd34aab2 100644
--- a/source/blender/editors/space_outliner/outliner_tools.c
+++ b/source/blender/editors/space_outliner/outliner_tools.c
@@ -145,7 +145,7 @@ static void set_operation_types(SpaceOops *soops, ListBase *lb,
}
}
}
- if((tselem->flag & TSE_CLOSED)==0) {
+ if(TSELEM_OPEN(tselem,soops)) {
set_operation_types(soops, &te->subtree,
scenelevel, objectlevel, idlevel, datalevel);
}
@@ -250,7 +250,7 @@ static void outliner_do_libdata_operation(bContext *C, Scene *scene, SpaceOops *
operation_cb(C, scene, te, tsep, tselem);
}
}
- if((tselem->flag & TSE_CLOSED)==0) {
+ if(TSELEM_OPEN(tselem,soops)) {
outliner_do_libdata_operation(C, scene, soops, &te->subtree, operation_cb);
}
}
@@ -287,6 +287,8 @@ static void object_delete_cb(bContext *C, Scene *scene, TreeElement *te, TreeSto
if(base==NULL)
base= object_in_scene((Object *)tselem->id, scene);
if(base) {
+ SpaceOops *soops= CTX_wm_space_outliner(C);
+
// check also library later
if(scene->obedit==base->object)
ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR|EM_DO_UNDO);
@@ -294,6 +296,13 @@ static void object_delete_cb(bContext *C, Scene *scene, TreeElement *te, TreeSto
ED_base_object_free_and_unlink(CTX_data_main(C), scene, base);
te->directdata= NULL;
tselem->id= NULL;
+
+ /* XXX: tree management normally happens from draw_outliner(), but when
+ you're clicking to fast on Delete object from context menu in
+ outliner several mouse events can be handled in one cycle without
+ handling notifiers/redraw which leads to deleting the same object twice.
+ cleanup tree here to prevent such cases. */
+ outliner_cleanup_tree(soops);
}
}
@@ -388,7 +397,7 @@ void outliner_do_object_operation(bContext *C, Scene *scene_act, SpaceOops *soop
operation_cb(C, scene_owner ? scene_owner : scene_act, te, NULL, tselem);
}
}
- if((tselem->flag & TSE_CLOSED)==0) {
+ if(TSELEM_OPEN(tselem,soops)) {
outliner_do_object_operation(C, scene_act, soops, &te->subtree, operation_cb);
}
}
@@ -495,7 +504,7 @@ static void outliner_do_data_operation(SpaceOops *soops, int type, int event, Li
operation_cb(event, te, tselem);
}
}
- if((tselem->flag & TSE_CLOSED)==0) {
+ if(TSELEM_OPEN(tselem,soops)) {
outliner_do_data_operation(soops, type, event, &te->subtree, operation_cb);
}
}
@@ -510,6 +519,7 @@ static EnumPropertyItem prop_object_op_types[] = {
{6, "TOGVIS", 0, "Toggle Visible", ""},
{7, "TOGSEL", 0, "Toggle Selectable", ""},
{8, "TOGREN", 0, "Toggle Renderable", ""},
+ {9, "RENAME", 0, "Rename", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -567,6 +577,10 @@ static int outliner_object_operation_exec(bContext *C, wmOperator *op)
str= "Toggle Renderability";
WM_event_add_notifier(C, NC_SCENE|ND_OB_RENDER, scene);
}
+ else if(event==9) {
+ outliner_do_object_operation(C, scene, soops, &soops->tree, item_rename_cb);
+ str= "Rename Object";
+ }
ED_undo_push(C, str);
@@ -600,6 +614,7 @@ static EnumPropertyItem prop_group_op_types[] = {
{4, "TOGVIS", 0, "Toggle Visible", ""},
{5, "TOGSEL", 0, "Toggle Selectable", ""},
{6, "TOGREN", 0, "Toggle Renderable", ""},
+ {7, "RENAME", 0, "Rename", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -608,6 +623,7 @@ static int outliner_group_operation_exec(bContext *C, wmOperator *op)
Scene *scene= CTX_data_scene(C);
SpaceOops *soops= CTX_wm_space_outliner(C);
int event;
+ const char *str= NULL;
/* check for invalid states */
if (soops == NULL)
@@ -617,18 +633,35 @@ static int outliner_group_operation_exec(bContext *C, wmOperator *op)
if(event==1) {
outliner_do_libdata_operation(C, scene, soops, &soops->tree, unlink_group_cb);
- ED_undo_push(C, "Unlink group");
+ str= "Unlink group";
}
else if(event==2) {
outliner_do_libdata_operation(C, scene, soops, &soops->tree, id_local_cb);
- ED_undo_push(C, "Localized Data");
+ str= "Localized Data";
}
else if(event==3) {
outliner_do_libdata_operation(C, scene, soops, &soops->tree, group_linkobs2scene_cb);
- ED_undo_push(C, "Link Group Objects to Scene");
+ str= "Link Group Objects to Scene";
+ }
+ else if(event==4) {
+ outliner_do_libdata_operation(C, scene, soops, &soops->tree, group_toggle_visibility_cb);
+ str= "Toggle Visibility";
+ }
+ else if(event==5) {
+ outliner_do_libdata_operation(C, scene, soops, &soops->tree, group_toggle_selectability_cb);
+ str= "Toggle Selectability";
+ }
+ else if(event==6) {
+ outliner_do_libdata_operation(C, scene, soops, &soops->tree, group_toggle_renderability_cb);
+ str= "Toggle Renderability";
+ }
+ else if(event==7) {
+ outliner_do_libdata_operation(C, scene, soops, &soops->tree, item_rename_cb);
+ str= "Rename";
}
+ ED_undo_push(C, str);
WM_event_add_notifier(C, NC_GROUP, NULL);
return OPERATOR_FINISHED;
@@ -662,7 +695,8 @@ typedef enum eOutlinerIdOpTypes {
OUTLINER_IDOP_SINGLE,
OUTLINER_IDOP_FAKE_ADD,
- OUTLINER_IDOP_FAKE_CLEAR
+ OUTLINER_IDOP_FAKE_CLEAR,
+ OUTLINER_IDOP_RENAME
} eOutlinerIdOpTypes;
// TODO: implement support for changing the ID-block used
@@ -672,6 +706,7 @@ static EnumPropertyItem prop_id_op_types[] = {
{OUTLINER_IDOP_SINGLE, "SINGLE", 0, "Make Single User", ""},
{OUTLINER_IDOP_FAKE_ADD, "ADD_FAKE", 0, "Add Fake User", "Ensure datablock gets saved even if it isn't in use (e.g. for motion and material libraries)"},
{OUTLINER_IDOP_FAKE_CLEAR, "CLEAR_FAKE", 0, "Clear Fake User", ""},
+ {OUTLINER_IDOP_RENAME, "RENAME", 0, "Rename", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -765,6 +800,14 @@ static int outliner_id_operation_exec(bContext *C, wmOperator *op)
ED_undo_push(C, "Clear Fake User");
}
break;
+ case OUTLINER_IDOP_RENAME:
+ /* rename */
+ outliner_do_libdata_operation(C, scene, soops, &soops->tree, item_rename_cb);
+
+ WM_event_add_notifier(C, NC_ID|NA_EDITED, NULL);
+ ED_undo_push(C, "Rename");
+
+ break;
default:
// invalid - unhandled
@@ -814,7 +857,7 @@ static void outliner_do_id_set_operation(SpaceOops *soops, int type, ListBase *l
operation_cb(te, tselem, tsep, newid);
}
}
- if ((tselem->flag & TSE_CLOSED)==0) {
+ if (TSELEM_OPEN(tselem,soops)) {
outliner_do_id_set_operation(soops, type, &te->subtree, newid, operation_cb);
}
}
diff --git a/source/blender/editors/space_outliner/outliner_tree.c b/source/blender/editors/space_outliner/outliner_tree.c
index 0b07c824f3e..7e9eabc08db 100644
--- a/source/blender/editors/space_outliner/outliner_tree.c
+++ b/source/blender/editors/space_outliner/outliner_tree.c
@@ -222,6 +222,12 @@ void outliner_free_tree(ListBase *lb)
}
}
+void outliner_cleanup_tree(SpaceOops *soops)
+{
+ outliner_free_tree(&soops->tree);
+ outliner_storage_cleanup(soops);
+}
+
/* Find ith item from the treestore */
static TreeElement *outliner_find_tree_element(ListBase *lb, int store_index)
{
@@ -821,6 +827,10 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
check_persistant(soops, te, id, type, index);
tselem= TREESTORE(te);
+ /* if we are searching for something expand to see child elements */
+ if(SEARCHING_OUTLINER(soops))
+ tselem->flag |= TSE_CHILDSEARCH;
+
te->parent= parent;
te->index= index; // for data arays
if(ELEM3(type, TSE_SEQUENCE, TSE_SEQ_STRIP, TSE_SEQUENCE_DUP));
@@ -975,6 +985,9 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
else
te->name= (char*)RNA_struct_ui_name(ptr->type);
+ /* If searching don't expand RNA entries */
+ if(SEARCHING_OUTLINER(soops) && BLI_strcasecmp("RNA",te->name)==0) tselem->flag &= ~TSE_CHILDSEARCH;
+
iterprop= RNA_struct_iterator_property(ptr->type);
tot= RNA_property_collection_length(ptr, iterprop);
@@ -983,7 +996,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
if(!tselem->used)
tselem->flag &= ~TSE_CLOSED;
- if(!(tselem->flag & TSE_CLOSED)) {
+ if(TSELEM_OPEN(tselem,soops)) {
for(a=0; a<tot; a++)
outliner_add_element(soops, &te->subtree, (void*)ptr, te, TSE_RNA_PROPERTY, a);
}
@@ -1004,11 +1017,14 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
te->directdata= prop;
te->rnaptr= *ptr;
+ /* If searching don't expand RNA entries */
+ if(SEARCHING_OUTLINER(soops) && BLI_strcasecmp("RNA",te->name)==0) tselem->flag &= ~TSE_CHILDSEARCH;
+
if(proptype == PROP_POINTER) {
pptr= RNA_property_pointer_get(ptr, prop);
if(pptr.data) {
- if(!(tselem->flag & TSE_CLOSED))
+ if(TSELEM_OPEN(tselem,soops))
outliner_add_element(soops, &te->subtree, (void*)&pptr, te, TSE_RNA_STRUCT, -1);
else
te->flag |= TE_LAZY_CLOSED;
@@ -1017,7 +1033,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
else if(proptype == PROP_COLLECTION) {
tot= RNA_property_collection_length(ptr, prop);
- if(!(tselem->flag & TSE_CLOSED)) {
+ if(TSELEM_OPEN(tselem,soops)) {
for(a=0; a<tot; a++) {
RNA_property_collection_lookup_int(ptr, prop, a, &pptr);
outliner_add_element(soops, &te->subtree, (void*)&pptr, te, TSE_RNA_STRUCT, a);
@@ -1029,7 +1045,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
else if(ELEM3(proptype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT)) {
tot= RNA_property_array_length(ptr, prop);
- if(!(tselem->flag & TSE_CLOSED)) {
+ if(TSELEM_OPEN(tselem,soops)) {
for(a=0; a<tot; a++)
outliner_add_element(soops, &te->subtree, (void*)ptr, te, TSE_RNA_ARRAY_ELEM, a);
}
@@ -1062,7 +1078,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
te->directdata= idv;
te->name= km->idname;
- if(!(tselem->flag & TSE_CLOSED)) {
+ if(TSELEM_OPEN(tselem,soops)) {
a= 0;
for (kmi= km->items.first; kmi; kmi= kmi->next, a++) {
@@ -1362,7 +1378,10 @@ static int outliner_filter_tree(SpaceOops *soops, ListBase *lb)
*/
tselem= TREESTORE(te);
- if ((tselem->flag & TSE_CLOSED) || outliner_filter_tree(soops, &te->subtree)==0) {
+ /* flag as not a found item */
+ tselem->flag &= ~TSE_SEARCHMATCH;
+
+ if ((!TSELEM_OPEN(tselem,soops)) || outliner_filter_tree(soops, &te->subtree)==0) {
outliner_free_tree(&te->subtree);
BLI_remlink(lb, te);
@@ -1371,6 +1390,11 @@ static int outliner_filter_tree(SpaceOops *soops, ListBase *lb)
}
}
else {
+ tselem= TREESTORE(te);
+
+ /* flag as a found item - we can then highlight it */
+ tselem->flag |= TSE_SEARCHMATCH;
+
/* filter subtree too */
outliner_filter_tree(soops, &te->subtree);
}
@@ -1393,6 +1417,14 @@ void outliner_build_tree(Main *mainvar, Scene *scene, SpaceOops *soops)
TreeStoreElem *tselem;
int show_opened= (soops->treestore==NULL); /* on first view, we open scenes */
+ /* Are we looking for something - we want to tag parents to filter child matches
+ - NOT in datablocks view - searching all datablocks takes way too long to be useful
+ - this variable is only set once per tree build */
+ if(soops->search_string[0]!=0 && soops->outlinevis!=SO_DATABLOCKS)
+ soops->search_flags |= SO_SEARCH_RECURSIVE;
+ else
+ soops->search_flags &= ~SO_SEARCH_RECURSIVE;
+
if(soops->tree.first && (soops->storeflag & SO_TREESTORE_REDRAW))
return;
diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index 299fe9df460..0f5398f24a7 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -99,7 +99,7 @@ static void get_seq_color3ubv(Scene *curscene, Sequence *seq, unsigned char col[
UI_GetThemeColor3ubv(TH_SEQ_SCENE, col);
if(seq->scene==curscene) {
- UI_GetColorPtrBlendShade3ubv(col, col, col, 1.0, 20);
+ UI_GetColorPtrShade3ubv(col, col, 20);
}
break;
@@ -299,7 +299,7 @@ static void drawmeta_contents(Scene *scene, Sequence *seqm, float x1, float y1,
glRectf(x1_chan, y1_chan, x2_chan, y2_chan);
- UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, -30);
+ UI_GetColorPtrShade3ubv(col, col, -30);
glColor4ubv(col);
fdrawbox(x1_chan, y1_chan, x2_chan, y2_chan);
@@ -473,7 +473,7 @@ static void draw_seq_extensions(Scene *scene, ARegion *ar, Sequence *seq)
/* feint pinstripes, helps see exactly which is extended and which isn't,
* especially when the extension is very small */
if (seq->flag & SELECT) UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, 24);
- else UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, -16);
+ else UI_GetColorPtrShade3ubv(col, col, -16);
glColor3ubv((GLubyte *)col);
@@ -490,8 +490,8 @@ static void draw_seq_extensions(Scene *scene, ARegion *ar, Sequence *seq)
/* feint pinstripes, helps see exactly which is extended and which isn't,
* especially when the extension is very small */
- if (seq->flag & SELECT) UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, 24);
- else UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, -16);
+ if (seq->flag & SELECT) UI_GetColorPtrShade3ubv(col, col, 24);
+ else UI_GetColorPtrShade3ubv(col, col, -16);
glColor3ubv((GLubyte *)col);
@@ -584,8 +584,8 @@ static void draw_shadedstrip(Sequence *seq, unsigned char col[3], float x1, floa
glBegin(GL_QUADS);
if(seq->flag & SEQ_INVALID_EFFECT) { col[0]= 255; col[1]= 0; col[2]= 255; }
- else if(seq->flag & SELECT) UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, -50);
- else UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, 0);
+ else if(seq->flag & SELECT) UI_GetColorPtrShade3ubv(col, col, -50);
+ /* else UI_GetColorPtrShade3ubv(col, col, 0); */ /* DO NOTHING */
glColor3ubv(col);
@@ -594,7 +594,7 @@ static void draw_shadedstrip(Sequence *seq, unsigned char col[3], float x1, floa
if(seq->flag & SEQ_INVALID_EFFECT) { col[0]= 255; col[1]= 0; col[2]= 255; }
else if(seq->flag & SELECT) UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, 5);
- else UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, -5);
+ else UI_GetColorPtrShade3ubv(col, col, -5);
glColor3ubv((GLubyte *)col);
@@ -610,8 +610,8 @@ static void draw_shadedstrip(Sequence *seq, unsigned char col[3], float x1, floa
glVertex2f(x1,ymid2);
glVertex2f(x2,ymid2);
- if(seq->flag & SELECT) UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, -15);
- else UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, 25);
+ if(seq->flag & SELECT) UI_GetColorPtrShade3ubv(col, col, -15);
+ else UI_GetColorPtrShade3ubv(col, col, 25);
glColor3ubv((GLubyte *)col);
@@ -697,10 +697,10 @@ static void draw_seq_strip(Scene *scene, ARegion *ar, Sequence *seq, int outline
col[0]= 255; col[1]= col[2]= 40;
}
else
- UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, 120+outline_tint);
+ UI_GetColorPtrShade3ubv(col, col, 120+outline_tint);
}
else
- UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, outline_tint);
+ UI_GetColorPtrShade3ubv(col, col, outline_tint);
glColor3ubv((GLubyte *)col);
@@ -914,7 +914,7 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- uiSetRoundBox(15);
+ uiSetRoundBox(UI_CNR_ALL);
uiDrawBox(GL_LINE_LOOP, x1, y1, x2, y2, 12.0);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index 5ae06119da3..ac38445267e 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -2176,7 +2176,7 @@ static int sequencer_view_toggle_exec(bContext *C, wmOperator *UNUSED(op))
sseq->view++;
if (sseq->view > SEQ_VIEW_SEQUENCE_PREVIEW) sseq->view = SEQ_VIEW_SEQUENCE;
- ED_sequencer_update_view(C, sseq->view);
+ ED_area_tag_refresh(CTX_wm_area(C));
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c
index 36471c7ffcf..5a0369ef80b 100644
--- a/source/blender/editors/space_sequencer/space_sequencer.c
+++ b/source/blender/editors/space_sequencer/space_sequencer.c
@@ -98,61 +98,6 @@ static ARegion *sequencer_find_region(ScrArea *sa, short type)
return ar;
}
-void ED_sequencer_update_view(bContext *C, int view)
-{
- ScrArea *sa= CTX_wm_area(C);
-
- ARegion *ar_main= sequencer_find_region(sa, RGN_TYPE_WINDOW);
- ARegion *ar_preview= sequencer_find_region(sa, RGN_TYPE_PREVIEW);
-
- switch (view) {
- case SEQ_VIEW_SEQUENCE:
- if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) {
- ar_main->flag &= ~RGN_FLAG_HIDDEN;
- ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
- }
- if (ar_preview && !(ar_preview->flag & RGN_FLAG_HIDDEN)) {
- ar_preview->flag |= RGN_FLAG_HIDDEN;
- ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
- WM_event_remove_handlers(C, &ar_preview->handlers);
- }
- if (ar_main) ar_main->alignment= RGN_ALIGN_NONE;
- if (ar_preview) ar_preview->alignment= RGN_ALIGN_NONE;
- break;
- case SEQ_VIEW_PREVIEW:
- if (ar_main && !(ar_main->flag & RGN_FLAG_HIDDEN)) {
- ar_main->flag |= RGN_FLAG_HIDDEN;
- ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
- WM_event_remove_handlers(C, &ar_main->handlers);
- }
- if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) {
- ar_preview->flag &= ~RGN_FLAG_HIDDEN;
- ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
- ar_preview->v2d.cur = ar_preview->v2d.tot;
- }
- if (ar_main) ar_main->alignment= RGN_ALIGN_NONE;
- if (ar_preview) ar_preview->alignment= RGN_ALIGN_NONE;
- break;
- case SEQ_VIEW_SEQUENCE_PREVIEW:
- if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) {
- ar_main->flag &= ~RGN_FLAG_HIDDEN;
- ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
- }
- if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) {
- ar_preview->flag &= ~RGN_FLAG_HIDDEN;
- ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
- ar_preview->v2d.cur = ar_preview->v2d.tot;
- }
- if (ar_main) ar_main->alignment= RGN_ALIGN_NONE;
- if (ar_preview) ar_preview->alignment= RGN_ALIGN_TOP;
- break;
- }
-
- ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa);
- ED_area_tag_redraw(sa);
-}
-
-
/* ******************** default callbacks for sequencer space ***************** */
static SpaceLink *sequencer_new(const bContext *C)
@@ -256,6 +201,88 @@ static void sequencer_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(s
}
+static void sequencer_refresh(const bContext *C, ScrArea *sa)
+{
+ wmWindowManager *wm= CTX_wm_manager(C);
+ wmWindow *window= CTX_wm_window(C);
+ SpaceSeq *sseq= (SpaceSeq *)sa->spacedata.first;
+ ARegion *ar_main= sequencer_find_region(sa, RGN_TYPE_WINDOW);
+ ARegion *ar_preview= sequencer_find_region(sa, RGN_TYPE_PREVIEW);
+ int view_changed= 0;
+
+ switch (sseq->view) {
+ case SEQ_VIEW_SEQUENCE:
+ if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) {
+ ar_main->flag &= ~RGN_FLAG_HIDDEN;
+ ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
+ view_changed= 1;
+ }
+ if (ar_preview && !(ar_preview->flag & RGN_FLAG_HIDDEN)) {
+ ar_preview->flag |= RGN_FLAG_HIDDEN;
+ ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
+ WM_event_remove_handlers((bContext*)C, &ar_preview->handlers);
+ view_changed= 1;
+ }
+ if (ar_main && ar_main->alignment != RGN_ALIGN_TOP) {
+ ar_main->alignment= RGN_ALIGN_NONE;
+ view_changed= 1;
+ }
+ if (ar_preview && ar_preview->alignment != RGN_ALIGN_TOP) {
+ ar_preview->alignment= RGN_ALIGN_NONE;
+ view_changed= 1;
+ }
+ break;
+ case SEQ_VIEW_PREVIEW:
+ if (ar_main && !(ar_main->flag & RGN_FLAG_HIDDEN)) {
+ ar_main->flag |= RGN_FLAG_HIDDEN;
+ ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
+ WM_event_remove_handlers((bContext*)C, &ar_main->handlers);
+ view_changed= 1;
+ }
+ if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) {
+ ar_preview->flag &= ~RGN_FLAG_HIDDEN;
+ ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
+ ar_preview->v2d.cur = ar_preview->v2d.tot;
+ view_changed= 1;
+ }
+ if (ar_main && ar_main->alignment != RGN_ALIGN_TOP) {
+ ar_main->alignment= RGN_ALIGN_NONE;
+ view_changed= 1;
+ }
+ if (ar_preview && ar_preview->alignment != RGN_ALIGN_TOP) {
+ ar_preview->alignment= RGN_ALIGN_NONE;
+ view_changed= 1;
+ }
+ break;
+ case SEQ_VIEW_SEQUENCE_PREVIEW:
+ if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) {
+ ar_main->flag &= ~RGN_FLAG_HIDDEN;
+ ar_main->v2d.flag &= ~V2D_IS_INITIALISED;
+ view_changed= 1;
+ }
+ if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) {
+ ar_preview->flag &= ~RGN_FLAG_HIDDEN;
+ ar_preview->v2d.flag &= ~V2D_IS_INITIALISED;
+ ar_preview->v2d.cur = ar_preview->v2d.tot;
+ view_changed= 1;
+ }
+ if (ar_main && ar_main->alignment != RGN_ALIGN_TOP) {
+ ar_main->alignment= RGN_ALIGN_NONE;
+ view_changed= 1;
+ }
+ if (ar_preview && ar_preview->alignment != RGN_ALIGN_TOP) {
+ ar_preview->alignment= RGN_ALIGN_TOP;
+ view_changed= 1;
+ }
+ break;
+ }
+
+ if(view_changed) {
+ ED_area_initialize(wm, window, sa);
+ ED_area_tag_redraw(sa);
+ }
+}
+
static SpaceLink *sequencer_duplicate(SpaceLink *sl)
{
SpaceSeq *sseqn= MEM_dupallocN(sl);
@@ -516,6 +543,7 @@ void ED_spacetype_sequencer(void)
st->operatortypes= sequencer_operatortypes;
st->keymap= sequencer_keymap;
st->dropboxes= sequencer_dropboxes;
+ st->refresh= sequencer_refresh;
/* regions: main window */
art= MEM_callocN(sizeof(ARegionType), "spacetype sequencer region");
diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c
index c7d4d78422e..47f051e1ec4 100644
--- a/source/blender/editors/space_text/space_text.c
+++ b/source/blender/editors/space_text/space_text.c
@@ -154,6 +154,11 @@ static void text_listener(ScrArea *sa, wmNotifier *wmn)
case NA_REMOVED:
ED_area_tag_redraw(sa);
break;
+ case NA_SELECTED:
+ if(st->text && st->text == wmn->reference)
+ text_scroll_to_cursor(st, sa);
+
+ break;
}
break;
diff --git a/source/blender/editors/space_text/text_draw.c b/source/blender/editors/space_text/text_draw.c
index 28230b7a48b..3d49bc7ffa0 100644
--- a/source/blender/editors/space_text/text_draw.c
+++ b/source/blender/editors/space_text/text_draw.c
@@ -1190,7 +1190,7 @@ static void draw_textscroll(SpaceText *st, rcti *scroll, rcti *back)
uiWidgetScrollDraw(&wcol, scroll, &st->txtbar, (st->flags & ST_SCROLL_SELECT)?UI_SCROLL_PRESSED:0);
- uiSetRoundBox(15);
+ uiSetRoundBox(UI_CNR_ALL);
rad= 0.4f*MIN2(st->txtscroll.xmax - st->txtscroll.xmin, st->txtscroll.ymax - st->txtscroll.ymin);
UI_GetThemeColor3ubv(TH_HILITE, col);
col[3]= 48;
@@ -1821,12 +1821,10 @@ void text_update_character_width(SpaceText *st)
/* Moves the view to the cursor location,
also used to make sure the view isnt outside the file */
-void text_update_cursor_moved(bContext *C)
+void text_scroll_to_cursor(SpaceText *st, ScrArea *sa)
{
- ScrArea *sa= CTX_wm_area(C);
- SpaceText *st= CTX_wm_space_text(C);
Text *text;
- ARegion *ar;
+ ARegion *ar= NULL;
int i, x, winx= 0;
if(ELEM3(NULL, st, st->text, st->text->curl)) return;
@@ -1834,8 +1832,10 @@ void text_update_cursor_moved(bContext *C)
text= st->text;
for(ar=sa->regionbase.first; ar; ar= ar->next)
- if(ar->regiontype==RGN_TYPE_WINDOW)
+ if(ar->regiontype==RGN_TYPE_WINDOW) {
winx= ar->winx;
+ break;
+ }
winx -= TXT_SCROLL_WIDTH;
@@ -1844,7 +1844,7 @@ void text_update_cursor_moved(bContext *C)
i= txt_get_span(text->lines.first, text->sell);
if(st->wordwrap) {
int offl, offc;
- wrap_offset(st, CTX_wm_region(C), text->sell, text->selc, &offl, &offc);
+ wrap_offset(st, ar, text->sell, text->selc, &offl, &offc);
i+= offl;
}
@@ -1865,3 +1865,10 @@ void text_update_cursor_moved(bContext *C)
if(st->left <0) st->left= 0;
}
+void text_update_cursor_moved(bContext *C)
+{
+ ScrArea *sa= CTX_wm_area(C);
+ SpaceText *st= CTX_wm_space_text(C);
+
+ text_scroll_to_cursor(st, sa);
+}
diff --git a/source/blender/editors/space_text/text_intern.h b/source/blender/editors/space_text/text_intern.h
index cb55f41acb5..b34c7815f35 100644
--- a/source/blender/editors/space_text/text_intern.h
+++ b/source/blender/editors/space_text/text_intern.h
@@ -55,6 +55,7 @@ int text_font_width(struct SpaceText *st, const char *str);
void text_update_line_edited(struct TextLine *line);
void text_update_edited(struct Text *text);
void text_update_character_width(struct SpaceText *st);
+void text_scroll_to_cursor(struct SpaceText *st, struct ScrArea *sa);
void text_update_cursor_moved(struct bContext *C);
/* TXT_OFFSET used to be 35 when the scrollbar was on the left... */
diff --git a/source/blender/editors/space_view3d/drawarmature.c b/source/blender/editors/space_view3d/drawarmature.c
index ecf5df4af7c..fc35ab93f70 100644
--- a/source/blender/editors/space_view3d/drawarmature.c
+++ b/source/blender/editors/space_view3d/drawarmature.c
@@ -85,7 +85,7 @@ enum {
PCHAN_COLOR_SPHEREBONE_BASE, /* for the 'stick' of sphere (envelope) bones */
PCHAN_COLOR_SPHEREBONE_END, /* for the ends of sphere (envelope) bones */
PCHAN_COLOR_LINEBONE /* for the middle of line-bones */
-};
+};
/* This function sets the color-set for coloring a certain bone */
static void set_pchan_colorset (Object *ob, bPoseChannel *pchan)
@@ -437,43 +437,64 @@ static void draw_bonevert_solid(void)
glCallList(displist);
}
+static float bone_octahedral_verts[6][3]= {
+ { 0.0f, 0.0f, 0.0f},
+ { 0.1f, 0.1f, 0.1f},
+ { 0.1f, 0.1f, -0.1f},
+ {-0.1f, 0.1f, -0.1f},
+ {-0.1f, 0.1f, 0.1f},
+ { 0.0f, 1.0f, 0.0f}
+};
+
+static unsigned int bone_octahedral_wire_sides[8]= {0, 1, 5, 3, 0, 4, 5, 2};
+static unsigned int bone_octahedral_wire_square[8]= {1, 2, 3, 4, 1};
+
+static unsigned int bone_octahedral_solid_tris[8][3]= {
+ {2, 1, 0}, /* bottom */
+ {3, 2, 0},
+ {4, 3, 0},
+ {1, 4, 0},
+
+ {5, 1, 2}, /* top */
+ {5, 2, 3},
+ {5, 3, 4},
+ {5, 4, 1}
+};
+
+/* aligned with bone_octahedral_solid_tris */
+static float bone_octahedral_solid_normals[8][3]= {
+ { 0.70710683f, -0.70710683f, 0.00000000f},
+ {-0.00000000f, -0.70710683f, -0.70710683f},
+ {-0.70710683f, -0.70710683f, 0.00000000f},
+ { 0.00000000f, -0.70710683f, 0.70710683f},
+ { 0.99388373f, 0.11043154f, -0.00000000f},
+ { 0.00000000f, 0.11043154f, -0.99388373f},
+ {-0.99388373f, 0.11043154f, 0.00000000f},
+ { 0.00000000f, 0.11043154f, 0.99388373f}
+};
+
static void draw_bone_octahedral(void)
{
static GLuint displist=0;
if (displist == 0) {
- float vec[6][3];
-
displist= glGenLists(1);
glNewList(displist, GL_COMPILE);
-
- vec[0][0]= vec[0][1]= vec[0][2]= 0.0f;
- vec[5][0]= vec[5][2]= 0.0f; vec[5][1]= 1.0f;
-
- vec[1][0]= 0.1f; vec[1][2]= 0.1f; vec[1][1]= 0.1f;
- vec[2][0]= 0.1f; vec[2][2]= -0.1f; vec[2][1]= 0.1f;
- vec[3][0]= -0.1f; vec[3][2]= -0.1f; vec[3][1]= 0.1f;
- vec[4][0]= -0.1f; vec[4][2]= 0.1f; vec[4][1]= 0.1f;
-
+
/* Section 1, sides */
- glBegin(GL_LINE_LOOP);
- glVertex3fv(vec[0]);
- glVertex3fv(vec[1]);
- glVertex3fv(vec[5]);
- glVertex3fv(vec[3]);
- glVertex3fv(vec[0]);
- glVertex3fv(vec[4]);
- glVertex3fv(vec[5]);
- glVertex3fv(vec[2]);
- glEnd();
-
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, bone_octahedral_verts);
+ glDrawElements(GL_LINE_LOOP,
+ sizeof(bone_octahedral_wire_sides)/sizeof(*bone_octahedral_wire_sides),
+ GL_UNSIGNED_INT,
+ bone_octahedral_wire_sides);
+
/* Section 1, square */
- glBegin(GL_LINE_LOOP);
- glVertex3fv(vec[1]);
- glVertex3fv(vec[2]);
- glVertex3fv(vec[3]);
- glVertex3fv(vec[4]);
- glEnd();
+ glDrawElements(GL_LINE_LOOP,
+ sizeof(bone_octahedral_wire_square)/sizeof(*bone_octahedral_wire_square),
+ GL_UNSIGNED_INT,
+ bone_octahedral_wire_square);
+ glDisableClientState(GL_VERTEX_ARRAY);
glEndList();
}
@@ -484,59 +505,34 @@ static void draw_bone_octahedral(void)
static void draw_bone_solid_octahedral(void)
{
static GLuint displist=0;
-
+
if (displist == 0) {
- float vec[6][3], nor[3];
-
+ int i;
+
displist= glGenLists(1);
glNewList(displist, GL_COMPILE);
-
- vec[0][0]= vec[0][1]= vec[0][2]= 0.0f;
- vec[5][0]= vec[5][2]= 0.0f; vec[5][1]= 1.0f;
-
- vec[1][0]= 0.1f; vec[1][2]= 0.1f; vec[1][1]= 0.1f;
- vec[2][0]= 0.1f; vec[2][2]= -0.1f; vec[2][1]= 0.1f;
- vec[3][0]= -0.1f; vec[3][2]= -0.1f; vec[3][1]= 0.1f;
- vec[4][0]= -0.1f; vec[4][2]= 0.1f; vec[4][1]= 0.1f;
-
-
- glBegin(GL_TRIANGLES);
- /* bottom */
- normal_tri_v3( nor,vec[2], vec[1], vec[0]);
- glNormal3fv(nor);
- glVertex3fv(vec[2]); glVertex3fv(vec[1]); glVertex3fv(vec[0]);
-
- normal_tri_v3( nor,vec[3], vec[2], vec[0]);
- glNormal3fv(nor);
- glVertex3fv(vec[3]); glVertex3fv(vec[2]); glVertex3fv(vec[0]);
-
- normal_tri_v3( nor,vec[4], vec[3], vec[0]);
- glNormal3fv(nor);
- glVertex3fv(vec[4]); glVertex3fv(vec[3]); glVertex3fv(vec[0]);
- normal_tri_v3( nor,vec[1], vec[4], vec[0]);
- glNormal3fv(nor);
- glVertex3fv(vec[1]); glVertex3fv(vec[4]); glVertex3fv(vec[0]);
+#if 1
+ glBegin(GL_TRIANGLES);
+ for(i= 0; i < 8; i++) {
+ glNormal3fv(bone_octahedral_solid_normals[i]);
+ glVertex3fv(bone_octahedral_verts[bone_octahedral_solid_tris[i][0]]);
+ glVertex3fv(bone_octahedral_verts[bone_octahedral_solid_tris[i][1]]);
+ glVertex3fv(bone_octahedral_verts[bone_octahedral_solid_tris[i][2]]);
+ }
- /* top */
- normal_tri_v3( nor,vec[5], vec[1], vec[2]);
- glNormal3fv(nor);
- glVertex3fv(vec[5]); glVertex3fv(vec[1]); glVertex3fv(vec[2]);
-
- normal_tri_v3( nor,vec[5], vec[2], vec[3]);
- glNormal3fv(nor);
- glVertex3fv(vec[5]); glVertex3fv(vec[2]); glVertex3fv(vec[3]);
-
- normal_tri_v3( nor,vec[5], vec[3], vec[4]);
- glNormal3fv(nor);
- glVertex3fv(vec[5]); glVertex3fv(vec[3]); glVertex3fv(vec[4]);
-
- normal_tri_v3( nor,vec[5], vec[4], vec[1]);
- glNormal3fv(nor);
- glVertex3fv(vec[5]); glVertex3fv(vec[4]); glVertex3fv(vec[1]);
-
glEnd();
-
+
+#else /* not working because each vert needs a different normal */
+ glEnableClientState(GL_NORMAL_ARRAY);
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glNormalPointer(GL_FLOAT, 0, bone_octahedral_solid_normals);
+ glVertexPointer(3, GL_FLOAT, 0, bone_octahedral_verts);
+ glDrawElements(GL_TRIANGLES, sizeof(bone_octahedral_solid_tris)/sizeof(unsigned int), GL_UNSIGNED_INT, bone_octahedral_solid_tris);
+ glDisableClientState(GL_NORMAL_ARRAY);
+ glDisableClientState(GL_VERTEX_ARRAY);
+#endif
+
glEndList();
}
@@ -831,7 +827,7 @@ static void draw_sphere_bone_wire(float smat[][4], float imat[][4], int armflag,
if (0.0f != normalize_v3(dirvec)) {
float norvech[3], norvect[3], vec[3];
- VECCOPY(vec, dirvec);
+ copy_v3_v3(vec, dirvec);
mul_v3_fl(dirvec, head);
cross_v3_v3v3(norvech, dirvec, imat[2]);
@@ -1548,7 +1544,7 @@ static void draw_pose_dofs(Object *ob)
/* in parent-bone pose, but own restspace */
glPushMatrix();
- VECCOPY(posetrans, pchan->pose_mat[3]);
+ copy_v3_v3(posetrans, pchan->pose_mat[3]);
glTranslatef(posetrans[0], posetrans[1], posetrans[2]);
if (pchan->parent) {
@@ -1646,7 +1642,7 @@ static void bone_matrix_translate_y(float mat[][4], float y)
{
float trans[3];
- VECCOPY(trans, mat[1]);
+ copy_v3_v3(trans, mat[1]);
mul_v3_fl(trans, y);
add_v3_v3(mat[3], trans);
}
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index d573198aa10..02f3bec3782 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -58,6 +58,7 @@
#include "BKE_anim.h" //for the where_on_path function
#include "BKE_constraint.h" // for the get_constraint_target function
+#include "BKE_curve.h"
#include "BKE_DerivedMesh.h"
#include "BKE_deform.h"
#include "BKE_displist.h"
@@ -92,7 +93,7 @@
#include "ED_screen.h"
#include "ED_sculpt.h"
#include "ED_types.h"
-#include "ED_curve.h" /* for ED_curve_editnurbs */
+#include "ED_curve.h" /* for curve_editnurbs */
#include "UI_resources.h"
@@ -139,7 +140,7 @@ static int check_ob_drawface_dot(Scene *sce, View3D *vd, char dt)
/* ************* only use while object drawing **************
* or after running ED_view3d_init_mats_rv3d
* */
-static void view3d_project_short_clip(ARegion *ar, float *vec, short *adr, int local)
+static void view3d_project_short_clip(ARegion *ar, const float vec[3], short *adr, int local)
{
RegionView3D *rv3d= ar->regiondata;
float fx, fy, vec4[4];
@@ -174,7 +175,7 @@ static void view3d_project_short_clip(ARegion *ar, float *vec, short *adr, int l
}
/* only use while object drawing */
-static void view3d_project_short_noclip(ARegion *ar, float *vec, short *adr)
+static void view3d_project_short_noclip(ARegion *ar, const float vec[3], short *adr)
{
RegionView3D *rv3d= ar->regiondata;
float fx, fy, vec4[4];
@@ -837,7 +838,7 @@ static void drawcube_size(float size)
/* this is an unused (old) cube-drawing function based on a given size */
#if 0
-static void drawcube_size(float *size)
+static void drawcube_size(const float size[3])
{
glPushMatrix();
@@ -891,7 +892,7 @@ static void drawshadbuflimits(Lamp *la, float mat[][4])
-static void spotvolume(float *lvec, float *vvec, float inp)
+static void spotvolume(float lvec[3], float vvec[3], const float inp)
{
/* camera is at 0,0,0 */
float temp[3],plane[3],mat1[3][3],mat2[3][3],mat3[3][3],mat4[3][3],q[4],co,si,angle;
@@ -920,8 +921,8 @@ static void spotvolume(float *lvec, float *vvec, float inp)
normalize_v3(&q[1]);
angle = saacos(plane[2])/2.0f;
- co = cos(angle);
- si = sqrt(1-co*co);
+ co = cosf(angle);
+ si = sqrtf(1-co*co);
q[0] = co;
q[1] *= si;
@@ -935,7 +936,7 @@ static void spotvolume(float *lvec, float *vvec, float inp)
unit_m3(mat2);
co = inp;
- si = sqrt(1-inp*inp);
+ si = sqrtf(1.0f-inp*inp);
mat2[0][0] = co;
mat2[1][0] = -si;
@@ -1796,7 +1797,7 @@ void nurbs_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, Nurb
short s[2] = {IS_CLIPPED, 0};
Nurb *nu;
int i;
- ListBase *nurbs= ED_curve_editnurbs(cu);
+ ListBase *nurbs= curve_editnurbs(cu);
ED_view3d_local_clipping(vc->rv3d, vc->obedit->obmat); /* for local clipping lookups */
@@ -5035,7 +5036,7 @@ static void draw_textcurs(float textcurs[][2])
set_inverted_drawing(0);
}
-static void drawspiral(float *cent, float rad, float tmat[][4], int start)
+static void drawspiral(const float cent[3], float rad, float tmat[][4], int start)
{
float vec[3], vx[3], vy[3];
int a, tot=32;
@@ -5106,7 +5107,7 @@ static void drawcircle_size(float size)
}
/* needs fixing if non-identity matrice used */
-static void drawtube(float *vec, float radius, float height, float tmat[][4])
+static void drawtube(const float vec[3], float radius, float height, float tmat[][4])
{
float cur[3];
drawcircball(GL_LINE_LOOP, vec, radius, tmat);
@@ -5128,7 +5129,7 @@ static void drawtube(float *vec, float radius, float height, float tmat[][4])
glEnd();
}
/* needs fixing if non-identity matrice used */
-static void drawcone(float *vec, float radius, float height, float tmat[][4])
+static void drawcone(const float vec[3], float radius, float height, float tmat[][4])
{
float cur[3];
@@ -5404,7 +5405,7 @@ static void draw_box(float vec[8][3])
/* uses boundbox, function used by Ketsji */
#if 0
-static void get_local_bounds(Object *ob, float *center, float *size)
+static void get_local_bounds(Object *ob, float center[3], float size[3])
{
BoundBox *bb= object_get_boundbox(ob);
@@ -5841,46 +5842,68 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
/* which wire color */
if((flag & DRAW_CONSTCOLOR) == 0) {
+ /* confusing logic here, there are 2 methods of setting the color
+ * 'colortab[colindex]' and 'theme_id', colindex overrides theme_id.
+ *
+ * note: no theme yet for 'colindex' */
+ int theme_id= TH_WIRE;
+ int theme_shade= 0;
+
project_short(ar, ob->obmat[3], &base->sx);
- if( (!scene->obedit) && (G.moving & G_TRANSFORM_OBJ) && (base->flag & (SELECT+BA_WAS_SEL))) UI_ThemeColor(TH_TRANSFORM);
+ if( (scene->obedit == NULL) &&
+ (G.moving & G_TRANSFORM_OBJ) &&
+ (base->flag & (SELECT+BA_WAS_SEL)))
+ {
+ theme_id= TH_TRANSFORM;
+ }
else {
-
- if(ob->type==OB_LAMP) UI_ThemeColor(TH_LAMP);
- else if(ob->type==OB_SPEAKER) UI_ThemeColor(TH_SPEAKER);
- else UI_ThemeColor(TH_WIRE);
-
- if((scene->basact)==base) {
- if(base->flag & (SELECT+BA_WAS_SEL)) UI_ThemeColor(TH_ACTIVE);
- }
- else {
- if(base->flag & (SELECT+BA_WAS_SEL)) UI_ThemeColor(TH_SELECT);
- }
-
- // no theme yet
+ /* Sets the 'colindex' */
if(ob->id.lib) {
- if(base->flag & (SELECT+BA_WAS_SEL)) colindex = 4;
- else colindex = 3;
+ colindex= (base->flag & (SELECT+BA_WAS_SEL)) ? 4 : 3;
}
else if(warning_recursive==1) {
if(base->flag & (SELECT+BA_WAS_SEL)) {
- if(scene->basact==base) colindex = 8;
- else colindex= 7;
+ colindex= (scene->basact==base) ? 8 : 7;
}
- else colindex = 6;
- }
- else if(ob->flag & OB_FROMGROUP) {
- if(base->flag & (SELECT+BA_WAS_SEL)) {
- if(scene->basact==base) UI_ThemeColor(TH_GROUP_ACTIVE);
- else UI_ThemeColorShade(TH_GROUP_ACTIVE, -16);
+ else {
+ colindex = 6;
}
- else UI_ThemeColor(TH_GROUP);
- colindex= 0;
}
+ /* Sets the 'theme_id' or fallback to wire */
+ else {
+ if(ob->flag & OB_FROMGROUP) {
+ if(base->flag & (SELECT+BA_WAS_SEL)) {
+ /* uses darker active color for non-active + selected*/
+ theme_id= TH_GROUP_ACTIVE;
- }
+ if(scene->basact != base) {
+ theme_shade= -16;
+ }
+ }
+ else {
+ theme_id= TH_GROUP;
+ }
+ }
+ else {
+ if(base->flag & (SELECT+BA_WAS_SEL)) {
+ theme_id= scene->basact == base ? TH_ACTIVE : TH_SELECT;
+ }
+ else {
+ if(ob->type==OB_LAMP) theme_id= TH_LAMP;
+ else if(ob->type==OB_SPEAKER) theme_id= TH_SPEAKER;
+ /* fallback to TH_WIRE */
+ }
+ }
+ }
+ }
- if(colindex) {
+ /* finally set the color */
+ if(colindex == 0) {
+ if(theme_shade == 0) UI_ThemeColor(theme_id);
+ else UI_ThemeColorShade(theme_id, theme_shade);
+ }
+ else {
col= colortab[colindex];
cpack(col);
}
@@ -5965,7 +5988,6 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
if (cu->linewidth != 0.0f) {
- cpack(0xff44ff);
UI_ThemeColor(TH_WIRE);
copy_v3_v3(vec1, ob->orig);
copy_v3_v3(vec2, ob->orig);
@@ -5984,10 +6006,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
setlinestyle(3);
for (i=0; i<cu->totbox; i++) {
if (cu->tb[i].w != 0.0f) {
- if (i == (cu->actbox-1))
- UI_ThemeColor(TH_ACTIVE);
- else
- UI_ThemeColor(TH_WIRE);
+ UI_ThemeColor(i == (cu->actbox-1) ? TH_ACTIVE : TH_WIRE);
vec1[0] = (cu->xof * cu->fsize) + cu->tb[i].x;
vec1[1] = (cu->yof * cu->fsize) + cu->tb[i].y + cu->fsize;
vec1[2] = 0.001;
@@ -6047,7 +6066,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
cu= ob->data;
if(cu->editnurb) {
- ListBase *nurbs= ED_curve_editnurbs(cu);
+ ListBase *nurbs= curve_editnurbs(cu);
drawnurb(scene, v3d, rv3d, base, nurbs->first, dt);
}
else if(dt==OB_BOUNDBOX) {
diff --git a/source/blender/editors/space_view3d/drawvolume.c b/source/blender/editors/space_view3d/drawvolume.c
index acdbcb0d06d..8da6f49e089 100644
--- a/source/blender/editors/space_view3d/drawvolume.c
+++ b/source/blender/editors/space_view3d/drawvolume.c
@@ -154,10 +154,10 @@ static int convex(float *p0, float *up, float *a, float *b)
{
// Vec3 va = a-p0, vb = b-p0;
float va[3], vb[3], tmp[3];
- VECSUB(va, a, p0);
- VECSUB(vb, b, p0);
+ sub_v3_v3v3(va, a, p0);
+ sub_v3_v3v3(vb, b, p0);
cross_v3_v3v3(tmp, va, vb);
- return INPR(up, tmp) >= 0;
+ return dot_v3v3(up, tmp) >= 0;
}
// copied from gpu_extension.c
@@ -280,20 +280,20 @@ void draw_volume(ARegion *ar, GPUTexture *tex, float *min, float *max, int res[3
cv[7][1] = min[1];
cv[7][2] = min[2];
- VECCOPY(edges[0][0], cv[4]); // maxx, maxy, minz
- VECCOPY(edges[1][0], cv[5]); // minx, maxy, minz
- VECCOPY(edges[2][0], cv[6]); // minx, miny, minz
- VECCOPY(edges[3][0], cv[7]); // maxx, miny, minz
+ copy_v3_v3(edges[0][0], cv[4]); // maxx, maxy, minz
+ copy_v3_v3(edges[1][0], cv[5]); // minx, maxy, minz
+ copy_v3_v3(edges[2][0], cv[6]); // minx, miny, minz
+ copy_v3_v3(edges[3][0], cv[7]); // maxx, miny, minz
- VECCOPY(edges[4][0], cv[3]); // maxx, miny, maxz
- VECCOPY(edges[5][0], cv[2]); // minx, miny, maxz
- VECCOPY(edges[6][0], cv[6]); // minx, miny, minz
- VECCOPY(edges[7][0], cv[7]); // maxx, miny, minz
+ copy_v3_v3(edges[4][0], cv[3]); // maxx, miny, maxz
+ copy_v3_v3(edges[5][0], cv[2]); // minx, miny, maxz
+ copy_v3_v3(edges[6][0], cv[6]); // minx, miny, minz
+ copy_v3_v3(edges[7][0], cv[7]); // maxx, miny, minz
- VECCOPY(edges[8][0], cv[1]); // minx, maxy, maxz
- VECCOPY(edges[9][0], cv[2]); // minx, miny, maxz
- VECCOPY(edges[10][0], cv[6]); // minx, miny, minz
- VECCOPY(edges[11][0], cv[5]); // minx, maxy, minz
+ copy_v3_v3(edges[8][0], cv[1]); // minx, maxy, maxz
+ copy_v3_v3(edges[9][0], cv[2]); // minx, miny, maxz
+ copy_v3_v3(edges[10][0], cv[6]); // minx, miny, minz
+ copy_v3_v3(edges[11][0], cv[5]); // minx, maxy, minz
// printf("size x: %f, y: %f, z: %f\n", size[0], size[1], size[2]);
// printf("min[2]: %f, max[2]: %f\n", min[2], max[2]);
@@ -332,7 +332,7 @@ void draw_volume(ARegion *ar, GPUTexture *tex, float *min, float *max, int res[3
*/
// get view vector
- VECCOPY(viewnormal, rv3d->viewinv[2]);
+ copy_v3_v3(viewnormal, rv3d->viewinv[2]);
normalize_v3(viewnormal);
// find cube vertex that is closest to the viewer
@@ -407,10 +407,10 @@ void draw_volume(ARegion *ar, GPUTexture *tex, float *min, float *max, int res[3
if(dd*(float)n > ds)
break;
- VECCOPY(tmp_point, viewnormal);
+ copy_v3_v3(tmp_point, viewnormal);
mul_v3_fl(tmp_point, -dd*((ds/dd)-(float)n));
- VECADD(tmp_point2, cv[good_index], tmp_point);
- d = INPR(tmp_point2, viewnormal);
+ add_v3_v3v3(tmp_point2, cv[good_index], tmp_point);
+ d = dot_v3v3(tmp_point2, viewnormal);
// printf("my d: %f\n", d);
@@ -421,7 +421,7 @@ void draw_volume(ARegion *ar, GPUTexture *tex, float *min, float *max, int res[3
// printf("points: %d\n", numpoints);
if (numpoints > 2) {
- VECCOPY(p0, points);
+ copy_v3_v3(p0, points);
// sort points to get a convex polygon
for(i = 1; i < numpoints - 1; i++)
@@ -431,9 +431,9 @@ void draw_volume(ARegion *ar, GPUTexture *tex, float *min, float *max, int res[3
if(!convex(p0, viewnormal, &points[j * 3], &points[i * 3]))
{
float tmp2[3];
- VECCOPY(tmp2, &points[j * 3]);
- VECCOPY(&points[j * 3], &points[i * 3]);
- VECCOPY(&points[i * 3], tmp2);
+ copy_v3_v3(tmp2, &points[j * 3]);
+ copy_v3_v3(&points[j * 3], &points[i * 3]);
+ copy_v3_v3(&points[i * 3], tmp2);
}
}
}
diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c
index cf696a6d063..67e523ec355 100644
--- a/source/blender/editors/space_view3d/view3d_buttons.c
+++ b/source/blender/editors/space_view3d/view3d_buttons.c
@@ -212,7 +212,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
BPoint *bp;
BezTriple *bezt;
int a;
- ListBase *nurbs= ED_curve_editnurbs(cu);
+ ListBase *nurbs= curve_editnurbs(cu);
nu= nurbs->first;
while(nu) {
@@ -459,7 +459,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
BPoint *bp;
BezTriple *bezt;
int a;
- ListBase *nurbs= ED_curve_editnurbs(cu);
+ ListBase *nurbs= curve_editnurbs(cu);
nu= nurbs->first;
while(nu) {
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 98768e369cb..ba9faf7682e 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -150,20 +150,22 @@ void circ(float x, float y, float rad)
static void view3d_draw_clipping(RegionView3D *rv3d)
{
BoundBox *bb= rv3d->clipbb;
-
+
if(bb) {
+ static unsigned int clipping_index[6][4]= {{0, 1, 2, 3},
+ {0, 4, 5, 1},
+ {4, 7, 6, 5},
+ {7, 3, 2, 6},
+ {1, 5, 6, 2},
+ {7, 4, 0, 3}};
+
UI_ThemeColorShade(TH_BACK, -8);
-
- glBegin(GL_QUADS);
-
- glVertex3fv(bb->vec[0]); glVertex3fv(bb->vec[1]); glVertex3fv(bb->vec[2]); glVertex3fv(bb->vec[3]);
- glVertex3fv(bb->vec[0]); glVertex3fv(bb->vec[4]); glVertex3fv(bb->vec[5]); glVertex3fv(bb->vec[1]);
- glVertex3fv(bb->vec[4]); glVertex3fv(bb->vec[7]); glVertex3fv(bb->vec[6]); glVertex3fv(bb->vec[5]);
- glVertex3fv(bb->vec[7]); glVertex3fv(bb->vec[3]); glVertex3fv(bb->vec[2]); glVertex3fv(bb->vec[6]);
- glVertex3fv(bb->vec[1]); glVertex3fv(bb->vec[5]); glVertex3fv(bb->vec[6]); glVertex3fv(bb->vec[2]);
- glVertex3fv(bb->vec[7]); glVertex3fv(bb->vec[4]); glVertex3fv(bb->vec[0]); glVertex3fv(bb->vec[3]);
-
- glEnd();
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, bb->vec);
+ glDrawElements(GL_QUADS, sizeof(clipping_index)/sizeof(unsigned int), GL_UNSIGNED_INT, clipping_index);
+ glDisableClientState(GL_VERTEX_ARRAY);
+
}
}
@@ -194,11 +196,11 @@ static int test_clipping(const float vec[3], float clip[][4])
{
float view[3];
copy_v3_v3(view, vec);
-
- if(0.0f < clip[0][3] + INPR(view, clip[0]))
- if(0.0f < clip[1][3] + INPR(view, clip[1]))
- if(0.0f < clip[2][3] + INPR(view, clip[2]))
- if(0.0f < clip[3][3] + INPR(view, clip[3]))
+
+ if(0.0f < clip[0][3] + dot_v3v3(view, clip[0]))
+ if(0.0f < clip[1][3] + dot_v3v3(view, clip[1]))
+ if(0.0f < clip[2][3] + dot_v3v3(view, clip[2]))
+ if(0.0f < clip[3][3] + dot_v3v3(view, clip[3]))
return 0;
return 1;
@@ -216,36 +218,37 @@ int ED_view3d_test_clipping(RegionView3D *rv3d, const float vec[3], const int lo
static void drawgrid_draw(ARegion *ar, float wx, float wy, float x, float y, float dx)
{
- float v1[2], v2[2];
+ float verts[2][2];
x+= (wx);
y+= (wy);
- v1[1]= 0.0f;
- v2[1]= (float)ar->winy;
+ /* set fixed 'Y' */
+ verts[0][1]= 0.0f;
+ verts[1][1]= (float)ar->winy;
- v1[0] = v2[0] = x-dx*floorf(x/dx);
-
- glBegin(GL_LINES);
-
- while(v1[0] < ar->winx) {
- glVertex2fv(v1);
- glVertex2fv(v2);
- v1[0] = v2[0] = v1[0] + dx;
- }
+ /* iter over 'X' */
+ verts[0][0] = verts[1][0] = x-dx*floorf(x/dx);
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, verts);
- v1[0]= 0.0f;
- v2[0]= (float)ar->winx;
+ while(verts[0][0] < ar->winx) {
+ glDrawArrays(GL_LINES, 0, 2);
+ verts[0][0] = verts[1][0] = verts[0][0] + dx;
+ }
- v1[1]= v2[1]= y-dx*floorf(y/dx);
+ /* set fixed 'X' */
+ verts[0][0]= 0.0f;
+ verts[1][0]= (float)ar->winx;
- while(v1[1] < ar->winy) {
- glVertex2fv(v1);
- glVertex2fv(v2);
- v1[1] = v2[1] = v1[1] + dx;
+ /* iter over 'Y' */
+ verts[0][1]= verts[1][1]= y-dx*floorf(y/dx);
+ while(verts[0][1] < ar->winy) {
+ glDrawArrays(GL_LINES, 0, 2);
+ verts[0][1] = verts[1][1] = verts[0][1] + dx;
}
- glEnd();
+ glDisableClientState(GL_VERTEX_ARRAY);
}
#define GRID_MIN_PX 6.0f
@@ -425,13 +428,10 @@ static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, const char **
static void drawfloor(Scene *scene, View3D *v3d, const char **grid_unit)
{
- float vert[3], grid, grid_scale;
- int a, gridlines, emphasise;
- unsigned char col[3], col2[3];
- short draw_line = 0;
-
- vert[2]= 0.0;
-
+ float grid, grid_scale;
+ unsigned char col_grid[3];
+ const int gridlines= v3d->gridlines/2;
+
if(v3d->gridlines<3) return;
grid_scale= v3d->grid;
@@ -450,115 +450,81 @@ static void drawfloor(Scene *scene, View3D *v3d, const char **grid_unit)
grid_scale = (grid_scale * (float)bUnit_GetScaler(usys, i)) / scene->unit.scale_length;
}
}
-
- if(v3d->zbuf && scene->obedit) glDepthMask(0); // for zbuffer-select
-
- gridlines= v3d->gridlines/2;
+
grid= gridlines * grid_scale;
- UI_GetThemeColor3ubv(TH_GRID, col);
- UI_GetThemeColor3ubv(TH_BACK, col2);
-
- /* emphasise division lines lighter instead of darker, if background is darker than grid */
- if ( ((col[0]+col[1]+col[2])/3+10) > (col2[0]+col2[1]+col2[2])/3 )
- emphasise = 20;
- else
- emphasise = -10;
-
+ if(v3d->zbuf && scene->obedit) glDepthMask(0); // for zbuffer-select
+
+ UI_GetThemeColor3ubv(TH_GRID, col_grid);
+
/* draw the Y axis and/or grid lines */
- for(a= -gridlines;a<=gridlines;a++) {
- if(a==0) {
- /* check for the 'show Y axis' preference */
- if (v3d->gridflag & V3D_SHOW_Y) {
- UI_make_axis_color(col, col2, 'Y');
- glColor3ubv(col2);
-
- draw_line = 1;
- } else if (v3d->gridflag & V3D_SHOW_FLOOR) {
- UI_ThemeColorShade(TH_GRID, emphasise);
- } else {
- draw_line = 0;
+ if(v3d->gridflag & V3D_SHOW_FLOOR) {
+ float vert[4][3]= {{0.0f}};
+ unsigned char col_bg[3];
+ unsigned char col_grid_emphasise[3], col_grid_light[3];
+ int a;
+ int prev_emphasise= -1;
+
+ UI_GetThemeColor3ubv(TH_BACK, col_bg);
+
+ /* emphasise division lines lighter instead of darker, if background is darker than grid */
+ UI_GetColorPtrShade3ubv(col_grid, col_grid_light, 10);
+ UI_GetColorPtrShade3ubv(col_grid, col_grid_emphasise,
+ (((col_grid[0]+col_grid[1]+col_grid[2])+30) > (col_bg[0]+col_bg[1]+col_bg[2])) ? 20 : -10);
+
+ /* set fixed axis */
+ vert[0][0]= vert[2][1]= grid;
+ vert[1][0]= vert[3][1]= -grid;
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, vert);
+
+ for(a= -gridlines;a<=gridlines;a++) {
+ const float line= a * grid_scale;
+ const int is_emphasise= (a % 10) == 0;
+
+ if(is_emphasise != prev_emphasise) {
+ glColor3ubv(is_emphasise ? col_grid_emphasise : col_grid_light);
+ prev_emphasise= is_emphasise;
}
- } else {
- /* check for the 'show grid floor' preference */
- if (v3d->gridflag & V3D_SHOW_FLOOR) {
- if( (a % 10)==0) {
- UI_ThemeColorShade(TH_GRID, emphasise);
- }
- else UI_ThemeColorShade(TH_GRID, 10);
-
- draw_line = 1;
- } else {
- draw_line = 0;
- }
- }
-
- if (draw_line) {
- glBegin(GL_LINE_STRIP);
- vert[0]= a * grid_scale;
- vert[1]= grid;
- glVertex3fv(vert);
- vert[1]= -grid;
- glVertex3fv(vert);
- glEnd();
+
+ /* set variable axis */
+ vert[0][1]= vert[1][1]=
+ vert[2][0]= vert[3][0]= line;
+
+ glDrawArrays(GL_LINES, 0, 4);
}
+
+ glDisableClientState(GL_VERTEX_ARRAY);
+
+ GPU_print_error("sdsd");
}
- /* draw the X axis and/or grid lines */
- for(a= -gridlines;a<=gridlines;a++) {
- if(a==0) {
- /* check for the 'show X axis' preference */
- if (v3d->gridflag & V3D_SHOW_X) {
- UI_make_axis_color(col, col2, 'X');
- glColor3ubv(col2);
-
- draw_line = 1;
- } else if (v3d->gridflag & V3D_SHOW_FLOOR) {
- UI_ThemeColorShade(TH_GRID, emphasise);
- } else {
- draw_line = 0;
- }
- } else {
- /* check for the 'show grid floor' preference */
- if (v3d->gridflag & V3D_SHOW_FLOOR) {
- if( (a % 10)==0) {
- UI_ThemeColorShade(TH_GRID, emphasise);
- }
- else UI_ThemeColorShade(TH_GRID, 10);
-
- draw_line = 1;
- } else {
- draw_line = 0;
- }
- }
-
- if (draw_line) {
+ /* draw the Z axis line */
+ /* check for the 'show Z axis' preference */
+ if (v3d->gridflag & (V3D_SHOW_X | V3D_SHOW_Y | V3D_SHOW_Z)) {
+ int axis;
+ for(axis= 0; axis < 3; axis++)
+ if (v3d->gridflag & (V3D_SHOW_X << axis)) {
+ float vert[3];
+ unsigned char tcol[3];
+
+ UI_make_axis_color(col_grid, tcol, 'X' + axis);
+ glColor3ubv(tcol);
+
glBegin(GL_LINE_STRIP);
- vert[1]= a * grid_scale;
- vert[0]= grid;
+ zero_v3(vert);
+ vert[axis]= grid;
glVertex3fv(vert );
- vert[0]= -grid;
+ vert[axis]= -grid;
glVertex3fv(vert);
glEnd();
}
}
-
- /* draw the Z axis line */
- /* check for the 'show Z axis' preference */
- if (v3d->gridflag & V3D_SHOW_Z) {
- UI_make_axis_color(col, col2, 'Z');
- glColor3ubv(col2);
-
- glBegin(GL_LINE_STRIP);
- vert[0]= 0;
- vert[1]= 0;
- vert[2]= grid;
- glVertex3fv(vert );
- vert[2]= -grid;
- glVertex3fv(vert);
- glEnd();
- }
-
+
+
+
+
if(v3d->zbuf && scene->obedit) glDepthMask(1);
}
@@ -697,60 +663,63 @@ static void draw_rotation_guide(RegionView3D *rv3d)
float scaled_axis[3];
const float scale = rv3d->dist;
mul_v3_v3fl(scaled_axis, rv3d->rot_axis, scale);
-
+
+
glBegin(GL_LINE_STRIP);
- color[3] = 0.f; // more transparent toward the ends
- glColor4fv(color);
- add_v3_v3v3(end, o, scaled_axis);
- glVertex3fv(end);
-
- // color[3] = 0.2f + fabsf(rv3d->rot_angle); // modulate opacity with angle
- // ^^ neat idea, but angle is frame-rate dependent, so it's usually close to 0.2
+ color[3] = 0.f; // more transparent toward the ends
+ glColor4fv(color);
+ add_v3_v3v3(end, o, scaled_axis);
+ glVertex3fv(end);
- color[3] = 0.5f; // more opaque toward the center
- glColor4fv(color);
- glVertex3fv(o);
-
- color[3] = 0.f;
- glColor4fv(color);
- sub_v3_v3v3(end, o, scaled_axis);
- glVertex3fv(end);
+ // color[3] = 0.2f + fabsf(rv3d->rot_angle); // modulate opacity with angle
+ // ^^ neat idea, but angle is frame-rate dependent, so it's usually close to 0.2
+
+ color[3] = 0.5f; // more opaque toward the center
+ glColor4fv(color);
+ glVertex3fv(o);
+
+ color[3] = 0.f;
+ glColor4fv(color);
+ sub_v3_v3v3(end, o, scaled_axis);
+ glVertex3fv(end);
glEnd();
// -- draw ring around rotation center --
{
- #define ROT_AXIS_DETAIL 13
- const float s = 0.05f * scale;
- const float step = 2.f * (float)(M_PI / ROT_AXIS_DETAIL);
- float angle;
- int i;
-
- float q[4]; // rotate ring so it's perpendicular to axis
- const int upright = fabsf(rv3d->rot_axis[2]) >= 0.95f;
- if (!upright)
- {
- const float up[3] = {0.f, 0.f, 1.f};
- float vis_angle, vis_axis[3];
-
- cross_v3_v3v3(vis_axis, up, rv3d->rot_axis);
- vis_angle = acosf(dot_v3v3(up, rv3d->rot_axis));
- axis_angle_to_quat(q, vis_axis, vis_angle);
+#define ROT_AXIS_DETAIL 13
+
+ const float s = 0.05f * scale;
+ const float step = 2.f * (float)(M_PI / ROT_AXIS_DETAIL);
+ float angle;
+ int i;
+
+ float q[4]; // rotate ring so it's perpendicular to axis
+ const int upright = fabsf(rv3d->rot_axis[2]) >= 0.95f;
+ if (!upright) {
+ const float up[3] = {0.f, 0.f, 1.f};
+ float vis_angle, vis_axis[3];
+
+ cross_v3_v3v3(vis_axis, up, rv3d->rot_axis);
+ vis_angle = acosf(dot_v3v3(up, rv3d->rot_axis));
+ axis_angle_to_quat(q, vis_axis, vis_angle);
}
- color[3] = 0.25f; // somewhat faint
- glColor4fv(color);
- glBegin(GL_LINE_LOOP);
- for (i = 0, angle = 0.f; i < ROT_AXIS_DETAIL; ++i, angle += step)
- {
- float p[3] = { s * cosf(angle), s * sinf(angle), 0.f };
+ color[3] = 0.25f; // somewhat faint
+ glColor4fv(color);
+ glBegin(GL_LINE_LOOP);
+ for (i = 0, angle = 0.f; i < ROT_AXIS_DETAIL; ++i, angle += step) {
+ float p[3] = {s * cosf(angle), s * sinf(angle), 0.0f};
- if (!upright)
- mul_qt_v3(q, p);
+ if (!upright) {
+ mul_qt_v3(q, p);
+ }
- add_v3_v3(p, o);
- glVertex3fv(p);
+ add_v3_v3(p, o);
+ glVertex3fv(p);
}
- glEnd();
+ glEnd();
+
+#undef ROT_AXIS_DETAIL
}
color[3] = 1.f; // solid dot
@@ -1237,7 +1206,7 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
UI_ThemeColorBlendShade(TH_WIRE, TH_BACK, 0.25, 0);
- uiSetRoundBox(15);
+ uiSetRoundBox(UI_CNR_ALL);
uiDrawBox(GL_LINE_LOOP, x1, y1, x2, y2, 12.0);
}
}
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index 809bccf43ac..af08690b869 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -1019,18 +1019,26 @@ static int ndof_orbit_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event
if (has_rotation) {
- const int invert = U.ndof_flag & NDOF_ORBIT_INVERT_AXES;
-
rv3d->view = RV3D_VIEW_USER;
if (U.flag & USER_TRACKBALL) {
+ const int invert_roll = U.ndof_flag & NDOF_ROLL_INVERT_AXIS;
+ const int invert_tilt = U.ndof_flag & NDOF_TILT_INVERT_AXIS;
+ const int invert_rot = U.ndof_flag & NDOF_ROTATE_INVERT_AXIS;
+
float rot[4];
float axis[3];
float angle = rot_sensitivity * ndof_to_axis_angle(ndof, axis);
-
- if (invert)
- angle = -angle;
-
+
+ if (invert_roll)
+ axis[2] = -axis[2];
+
+ if (invert_tilt)
+ axis[0] = -axis[0];
+
+ if (invert_rot)
+ axis[1] = -axis[1];
+
// transform rotation axis from view to world coordinates
mul_qt_v3(view_inv, axis);
@@ -1044,6 +1052,8 @@ static int ndof_orbit_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event
mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, rot);
} else {
/* turntable view code by John Aughey, adapted for 3D mouse by [mce] */
+ const int invert = U.ndof_flag & NDOF_ORBIT_INVERT_AXES;
+
float angle, rot[4];
float xvec[3] = {1,0,0};
@@ -1145,10 +1155,26 @@ static int ndof_pan_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
const float vertical_sensitivity = 0.4f;
const float lateral_sensitivity = 0.6f;
- float pan_vec[3] = {lateral_sensitivity * ndof->tvec[0],
- vertical_sensitivity * ndof->tvec[1],
- forward_sensitivity * ndof->tvec[2]
- };
+ const int invert_panx = U.ndof_flag & NDOF_PANX_INVERT_AXIS;
+ const int invert_pany = U.ndof_flag & NDOF_PANY_INVERT_AXIS;
+ const int invert_panz = U.ndof_flag & NDOF_PANZ_INVERT_AXIS;
+
+ float pan_vec[3];
+
+ if (invert_panx)
+ pan_vec[0] = -lateral_sensitivity * ndof->tvec[0];
+ else
+ pan_vec[0] = lateral_sensitivity * ndof->tvec[0];
+
+ if (invert_panz)
+ pan_vec[1] = -vertical_sensitivity * ndof->tvec[1];
+ else
+ pan_vec[1] = vertical_sensitivity * ndof->tvec[1];
+
+ if (invert_pany)
+ pan_vec[2] = -forward_sensitivity * ndof->tvec[2];
+ else
+ pan_vec[2] = forward_sensitivity * ndof->tvec[2];
mul_v3_fl(pan_vec, speed * dt);
#endif
diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c
index b4d2fc22143..1ed65f7875f 100644
--- a/source/blender/editors/space_view3d/view3d_snap.c
+++ b/source/blender/editors/space_view3d/view3d_snap.c
@@ -66,7 +66,7 @@
#include "ED_armature.h"
#include "ED_mesh.h"
#include "ED_screen.h"
-#include "ED_curve.h" /* for ED_curve_editnurbs */
+#include "ED_curve.h" /* for curve_editnurbs */
#include "view3d_intern.h"
@@ -102,7 +102,7 @@ static void special_transvert_update(Object *obedit)
}
else if (ELEM(obedit->type, OB_CURVE, OB_SURF)) {
Curve *cu= obedit->data;
- ListBase *nurbs= ED_curve_editnurbs(cu);
+ ListBase *nurbs= curve_editnurbs(cu);
Nurb *nu= nurbs->first;
while(nu) {
@@ -312,7 +312,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
else if (ELEM(obedit->type, OB_CURVE, OB_SURF)) {
Curve *cu= obedit->data;
int totmalloc= 0;
- ListBase *nurbs= ED_curve_editnurbs(cu);
+ ListBase *nurbs= curve_editnurbs(cu);
for(nu= nurbs->first; nu; nu= nu->next) {
if(nu->type == CU_BEZIER)
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index c9f0113691f..ae9acf7efc4 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -1094,7 +1094,7 @@ int calculateTransformCenter(bContext *C, int centerMode, float *vec)
calculateCenter(t);
// Copy center from constraint center. Transform center can be local
- VECCOPY(vec, t->con.center);
+ copy_v3_v3(vec, t->con.center);
}
@@ -1213,7 +1213,7 @@ static void drawHelpline(bContext *UNUSED(C), int x, int y, void *customdata)
mval[0]= x;
mval[1]= y;
- VECCOPY(vecrot, t->center);
+ copy_v3_v3(vecrot, t->center);
if(t->flag & T_EDIT) {
Object *ob= t->obedit;
if(ob) mul_m4_v3(ob->obmat, vecrot);
@@ -1681,7 +1681,14 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
if (RNA_property_is_set(op->ptr, "value"))
{
float values[4]= {0}; /* incase value isn't length 4, avoid uninitialized memory */
- RNA_float_get_array(op->ptr, "value", values);
+ PropertyRNA *prop= RNA_struct_find_property(op->ptr, "value");
+
+ if(RNA_property_array_check(prop)) {
+ RNA_float_get_array(op->ptr, "value", values);
+ } else {
+ values[0]= RNA_float_get(op->ptr, "value");
+ }
+
QUATCOPY(t->values, values);
QUATCOPY(t->auto_values, values);
t->flag |= T_AUTOVALUES;
@@ -1959,7 +1966,7 @@ static void constraintTransLim(TransInfo *t, TransData *td)
* - current space should be local
*/
unit_m4(cob.matrix);
- VECCOPY(cob.matrix[3], td->loc);
+ copy_v3_v3(cob.matrix[3], td->loc);
/* Evaluate valid constraints */
for (con= td->con; con; con= con->next) {
@@ -2018,7 +2025,7 @@ static void constraintTransLim(TransInfo *t, TransData *td)
}
/* copy results from cob->matrix */
- VECCOPY(td->loc, cob.matrix[3]);
+ copy_v3_v3(td->loc, cob.matrix[3]);
}
}
@@ -2288,8 +2295,8 @@ int Warp(TransInfo *t, const int UNUSED(mval[2]))
* It needs to be in view space, but we need to take object's offset
* into account if in Edit mode.
*/
- VECCOPY(cursor, curs);
- VECCOPY(gcursor, cursor);
+ copy_v3_v3(cursor, curs);
+ copy_v3_v3(gcursor, cursor);
if (t->flag & T_EDIT) {
sub_v3_v3(cursor, t->obedit->obmat[3]);
sub_v3_v3(gcursor, t->obedit->obmat[3]);
@@ -2332,7 +2339,7 @@ int Warp(TransInfo *t, const int UNUSED(mval[2]))
continue;
/* translate point to center, rotate in such a way that outline==distance */
- VECCOPY(vec, td->iloc);
+ copy_v3_v3(vec, td->iloc);
mul_m3_v3(td->mtx, vec);
mul_m4_v3(t->viewmat, vec);
sub_v3_v3(vec, t->viewmat[3]);
@@ -2599,23 +2606,23 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) {
/* local constraint shouldn't alter center */
if (t->around == V3D_LOCAL) {
if (t->flag & T_OBJECT) {
- VECCOPY(center, td->center);
+ copy_v3_v3(center, td->center);
}
else if (t->flag & T_EDIT) {
if(t->around==V3D_LOCAL && (t->settings->selectmode & SCE_SELECT_FACE)) {
- VECCOPY(center, td->center);
+ copy_v3_v3(center, td->center);
}
else {
- VECCOPY(center, t->center);
+ copy_v3_v3(center, t->center);
}
}
else {
- VECCOPY(center, t->center);
+ copy_v3_v3(center, t->center);
}
}
else {
- VECCOPY(center, t->center);
+ copy_v3_v3(center, t->center);
}
if (td->ext) {
@@ -2715,10 +2722,10 @@ int Resize(TransInfo *t, const int mval[2])
if (t->flag & T_AUTOVALUES)
{
- VECCOPY(size, t->auto_values);
+ copy_v3_v3(size, t->auto_values);
}
- VECCOPY(t->values, size);
+ copy_v3_v3(t->values, size);
size_to_mat3( mat,size);
@@ -3016,7 +3023,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
mul_m3_m3m3(smat, td->smtx, totmat);
/* calculate the total rotatation in eulers */
- VECCOPY(eul, td->ext->irot);
+ copy_v3_v3(eul, td->ext->irot);
eulO_to_mat3( eulmat,eul, td->ext->rotOrder);
/* mat = transform, obmat = bone rotation */
@@ -3026,7 +3033,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
/* and apply (to end result only) */
protectedRotateBits(td->protectflag, eul, td->ext->irot);
- VECCOPY(td->ext->rot, eul);
+ copy_v3_v3(td->ext->rot, eul);
}
constraintRotLim(t, td);
@@ -3096,7 +3103,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
/* and apply */
protectedRotateBits(td->protectflag, eul, td->ext->irot);
- VECCOPY(td->ext->rot, eul);
+ copy_v3_v3(td->ext->rot, eul);
}
constraintRotLim(t, td);
@@ -3240,8 +3247,8 @@ int Trackball(TransInfo *t, const int UNUSED(mval[2]))
float mat[3][3], totmat[3][3], smat[3][3];
float phi[2];
- VECCOPY(axis1, t->persinv[0]);
- VECCOPY(axis2, t->persinv[1]);
+ copy_v3_v3(axis1, t->persinv[0]);
+ copy_v3_v3(axis2, t->persinv[1]);
normalize_v3(axis1);
normalize_v3(axis2);
@@ -3337,7 +3344,7 @@ static void headerTranslation(TransInfo *t, float vec[3], char *str) {
else {
float dvec[3];
- VECCOPY(dvec, vec);
+ copy_v3_v3(dvec, vec);
applyAspectRatio(t, dvec);
dist = len_v3(vec);
@@ -3444,7 +3451,7 @@ static void applyTranslation(TransInfo *t, float vec[3]) {
t->con.applyVec(t, td, vec, tvec, pvec);
}
else {
- VECCOPY(tvec, vec);
+ copy_v3_v3(tvec, vec);
}
mul_m3_v3(td->smtx, tvec);
@@ -3471,7 +3478,7 @@ int Translation(TransInfo *t, const int UNUSED(mval[2]))
}
applySnapping(t, t->values);
t->con.applyVec(t, NULL, t->values, tvec, pvec);
- VECCOPY(t->values, tvec);
+ copy_v3_v3(t->values, tvec);
headerTranslation(t, pvec, str);
}
else {
@@ -3560,7 +3567,7 @@ int ShrinkFatten(TransInfo *t, const int UNUSED(mval[2]))
if (td->flag & TD_SKIP)
continue;
- VECCOPY(vec, td->axismtx[2]);
+ copy_v3_v3(vec, td->axismtx[2]);
mul_v3_fl(vec, distance);
mul_v3_fl(vec, td->factor);
@@ -4604,7 +4611,7 @@ static int createSlideVerts(TransInfo *t)
add_v3_v3(start, end);
mul_v3_fl(start, 0.5f*(1.0f/totvec));
- VECCOPY(vec, start);
+ copy_v3_v3(vec, start);
start[0] = t->mval[0];
start[1] = t->mval[1];
add_v3_v3v3(end, start, vec);
@@ -5211,7 +5218,7 @@ int Align(TransInfo *t, const int UNUSED(mval[2]))
int i;
/* saving original center */
- VECCOPY(center, t->center);
+ copy_v3_v3(center, t->center);
for(i = 0 ; i < t->total; i++, td++)
{
@@ -5225,11 +5232,11 @@ int Align(TransInfo *t, const int UNUSED(mval[2]))
/* around local centers */
if (t->flag & (T_OBJECT|T_POSE)) {
- VECCOPY(t->center, td->center);
+ copy_v3_v3(t->center, td->center);
}
else {
if(t->settings->selectmode & SCE_SELECT_FACE) {
- VECCOPY(t->center, td->center);
+ copy_v3_v3(t->center, td->center);
}
}
@@ -5241,7 +5248,7 @@ int Align(TransInfo *t, const int UNUSED(mval[2]))
}
/* restoring original center */
- VECCOPY(t->center, center);
+ copy_v3_v3(t->center, center);
recalcData(t);
@@ -5313,7 +5320,7 @@ int SeqSlide(TransInfo *t, const int UNUSED(mval[2]))
float pvec[3] = {0.0f, 0.0f, 0.0f};
float tvec[3];
t->con.applyVec(t, NULL, t->values, tvec, pvec);
- VECCOPY(t->values, tvec);
+ copy_v3_v3(t->values, tvec);
}
else {
snapGrid(t, t->values);
@@ -5419,9 +5426,13 @@ static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, TransData2D *td2d,
{
/* snap key to nearest frame? */
if (autosnap == SACTSNAP_FRAME) {
+
+#if 0 /* 'doTime' disabled for now */
+
const Scene *scene= t->scene;
const short doTime= 0; //getAnimEdit_DrawTime(t); // NOTE: this works, but may be confusing behaviour given the option's label, hence disabled
const double secf= FPS;
+#endif
double val;
/* convert frame to nla-action time (if needed) */
@@ -5430,11 +5441,17 @@ static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, TransData2D *td2d,
else
val= *(td->val);
+#if 0 /* 'doTime' disabled for now */
+
/* do the snapping to nearest frame/second */
- if (doTime)
+ if (doTime) {
val= (float)( floor((val/secf) + 0.5f) * secf );
+ }
else
+#endif
+ {
val= (float)( floor(val+0.5f) );
+ }
/* convert frame out of nla-action time */
if (adt)
diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c
index be5f539431f..a06de9fa1ce 100644
--- a/source/blender/editors/transform/transform_constraints.c
+++ b/source/blender/editors/transform/transform_constraints.c
@@ -239,7 +239,7 @@ static void axisProjection(TransInfo *t, float axis[3], float in[3], float out[3
if(factor<0.0f) factor*= -factor;
else factor*= factor;
- VECCOPY(out, axis);
+ copy_v3_v3(out, axis);
normalize_v3(out);
mul_v3_fl(out, -factor); /* -factor makes move down going backwards */
}
@@ -261,7 +261,7 @@ static void axisProjection(TransInfo *t, float axis[3], float in[3], float out[3
/* give arbitrary large value if projection is impossible */
factor = dot_v3v3(axis, norm);
if (1.0f - fabsf(factor) < 0.0002f) {
- VECCOPY(out, axis);
+ copy_v3_v3(out, axis);
if (factor > 0) {
mul_v3_fl(out, 1000000000.0f);
} else {
@@ -300,7 +300,7 @@ static void planeProjection(TransInfo *t, float in[3], float out[3]) {
}
factor = dot_v3v3(vec, vec) / factor;
- VECCOPY(vec, norm);
+ copy_v3_v3(vec, norm);
mul_v3_fl(vec, factor);
add_v3_v3v3(out, in, vec);
@@ -317,7 +317,7 @@ static void planeProjection(TransInfo *t, float in[3], float out[3]) {
static void applyAxisConstraintVec(TransInfo *t, TransData *td, float in[3], float out[3], float pvec[3])
{
- VECCOPY(out, in);
+ copy_v3_v3(out, in);
if (!td && t->con.mode & CON_APPLY) {
mul_m3_v3(t->con.pmtx, out);
@@ -332,13 +332,13 @@ static void applyAxisConstraintVec(TransInfo *t, TransData *td, float in[3], flo
float c[3];
if (t->con.mode & CON_AXIS0) {
- VECCOPY(c, t->con.mtx[0]);
+ copy_v3_v3(c, t->con.mtx[0]);
}
else if (t->con.mode & CON_AXIS1) {
- VECCOPY(c, t->con.mtx[1]);
+ copy_v3_v3(c, t->con.mtx[1]);
}
else if (t->con.mode & CON_AXIS2) {
- VECCOPY(c, t->con.mtx[2]);
+ copy_v3_v3(c, t->con.mtx[2]);
}
axisProjection(t, c, in, out);
}
@@ -360,7 +360,7 @@ static void applyAxisConstraintVec(TransInfo *t, TransData *td, float in[3], flo
static void applyObjectConstraintVec(TransInfo *t, TransData *td, float in[3], float out[3], float pvec[3])
{
- VECCOPY(out, in);
+ copy_v3_v3(out, in);
if (t->con.mode & CON_APPLY) {
if (!td) {
mul_m3_v3(t->con.pmtx, out);
@@ -373,18 +373,18 @@ static void applyObjectConstraintVec(TransInfo *t, TransData *td, float in[3], f
float c[3];
if (t->con.mode & CON_AXIS0) {
- VECCOPY(c, t->con.mtx[0]);
+ copy_v3_v3(c, t->con.mtx[0]);
}
else if (t->con.mode & CON_AXIS1) {
- VECCOPY(c, t->con.mtx[1]);
+ copy_v3_v3(c, t->con.mtx[1]);
}
else if (t->con.mode & CON_AXIS2) {
- VECCOPY(c, t->con.mtx[2]);
+ copy_v3_v3(c, t->con.mtx[2]);
}
axisProjection(t, c, in, out);
}
postConstraintChecks(t, out, pvec);
- VECCOPY(out, pvec);
+ copy_v3_v3(out, pvec);
}
else {
int i=0;
@@ -481,15 +481,15 @@ static void applyAxisConstraintRot(TransInfo *t, TransData *td, float vec[3], fl
switch(mode) {
case CON_AXIS0:
case (CON_AXIS1|CON_AXIS2):
- VECCOPY(vec, t->con.mtx[0]);
+ copy_v3_v3(vec, t->con.mtx[0]);
break;
case CON_AXIS1:
case (CON_AXIS0|CON_AXIS2):
- VECCOPY(vec, t->con.mtx[1]);
+ copy_v3_v3(vec, t->con.mtx[1]);
break;
case CON_AXIS2:
case (CON_AXIS0|CON_AXIS1):
- VECCOPY(vec, t->con.mtx[2]);
+ copy_v3_v3(vec, t->con.mtx[2]);
break;
}
/* don't flip axis if asked to or if num input */
@@ -528,15 +528,15 @@ static void applyObjectConstraintRot(TransInfo *t, TransData *td, float vec[3],
switch(mode) {
case CON_AXIS0:
case (CON_AXIS1|CON_AXIS2):
- VECCOPY(vec, td->axismtx[0]);
+ copy_v3_v3(vec, td->axismtx[0]);
break;
case CON_AXIS1:
case (CON_AXIS0|CON_AXIS2):
- VECCOPY(vec, td->axismtx[1]);
+ copy_v3_v3(vec, td->axismtx[1]);
break;
case CON_AXIS2:
case (CON_AXIS0|CON_AXIS1):
- VECCOPY(vec, td->axismtx[2]);
+ copy_v3_v3(vec, td->axismtx[2]);
break;
}
if (angle && (mode & CON_NOFLIP) == 0 && hasNumInput(&t->num) == 0) {
@@ -724,7 +724,7 @@ void drawPropCircle(const struct bContext *C, TransInfo *t)
glPushMatrix();
- VECCOPY(center, t->center);
+ copy_v3_v3(center, t->center);
if((t->spacetype == SPACE_VIEW3D) && t->obedit)
{
@@ -897,7 +897,7 @@ static void setNearestAxis3d(TransInfo *t)
zfac = len_v3(t->persinv[0]) * 2.0f/t->ar->winx * zfac * 30.0f;
for (i = 0; i<3; i++) {
- VECCOPY(axis, t->con.mtx[i]);
+ copy_v3_v3(axis, t->con.mtx[i]);
mul_v3_fl(axis, zfac);
/* now we can project to get window coordinate */
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 7b43d0955a7..fc5c80d22c9 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -90,7 +90,6 @@
#include "ED_node.h"
#include "ED_types.h"
#include "ED_uvedit.h"
-#include "ED_curve.h" /* for ED_curve_editnurbs */
#include "ED_util.h" /* for crazyspace correction */
#include "UI_view2d.h"
@@ -269,7 +268,7 @@ static void createTransTexspace(TransInfo *t)
td->ext= t->ext= MEM_callocN(sizeof(TransDataExtension), "TransTexspace");
td->flag= TD_SELECTED;
- VECCOPY(td->center, ob->obmat[3]);
+ copy_v3_v3(td->center, ob->obmat[3]);
td->ob = ob;
copy_m3_m4(td->mtx, ob->obmat);
@@ -282,9 +281,9 @@ static void createTransTexspace(TransInfo *t)
*texflag &= ~AUTOSPACE;
}
- VECCOPY(td->iloc, td->loc);
- VECCOPY(td->ext->irot, td->ext->rot);
- VECCOPY(td->ext->isize, td->ext->size);
+ copy_v3_v3(td->iloc, td->loc);
+ copy_v3_v3(td->ext->irot, td->ext->rot);
+ copy_v3_v3(td->ext->isize, td->ext->size);
}
/* ********************* edge (for crease) ***** */
@@ -420,7 +419,7 @@ static short apply_targetless_ik(Object *ob)
copy_m4_m3(offs_bone, bone->bone_mat);
/* The bone's root offset (is in the parent's coordinate system) */
- VECCOPY(offs_bone[3], bone->head);
+ copy_v3_v3(offs_bone[3], bone->head);
/* Get the length translation of parent (length along y axis) */
offs_bone[3][1]+= parbone->length;
@@ -431,7 +430,7 @@ static short apply_targetless_ik(Object *ob)
copy_m4_m4(rmat, parbone->arm_mat); /* rmat used as temp */
/* the location of actual parent transform */
- VECCOPY(rmat[3], offs_bone[3]);
+ copy_v3_v3(rmat[3], offs_bone[3]);
offs_bone[3][0]= offs_bone[3][1]= offs_bone[3][2]= 0.0f;
mul_m4_v3(parchan->parent->pose_mat, rmat[3]);
@@ -449,7 +448,7 @@ static short apply_targetless_ik(Object *ob)
else {
copy_m4_m3(tmat, bone->bone_mat);
- VECCOPY(tmat[3], bone->head);
+ copy_v3_v3(tmat[3], bone->head);
invert_m4_m4(imat, tmat);
}
/* result matrix */
@@ -491,7 +490,7 @@ static short apply_targetless_ik(Object *ob)
/* causes problems with some constraints (e.g. childof), so disable this */
/* as it is IK shouldn't affect location directly */
- /* VECCOPY(parchan->loc, rmat[3]); */
+ /* copy_v3_v3(parchan->loc, rmat[3]); */
}
}
@@ -511,8 +510,8 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
float cmat[3][3], tmat[3][3];
float vec[3];
- VECCOPY(vec, pchan->pose_mat[3]);
- VECCOPY(td->center, vec);
+ copy_v3_v3(vec, pchan->pose_mat[3]);
+ copy_v3_v3(td->center, vec);
td->ob = ob;
td->flag = TD_SELECTED;
@@ -530,10 +529,10 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
td->protectflag= pchan->protectflag;
td->loc = pchan->loc;
- VECCOPY(td->iloc, pchan->loc);
+ copy_v3_v3(td->iloc, pchan->loc);
td->ext->size= pchan->size;
- VECCOPY(td->ext->isize, pchan->size);
+ copy_v3_v3(td->ext->isize, pchan->size);
if (pchan->rotmode > 0) {
td->ext->rot= pchan->eul;
@@ -541,7 +540,7 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
td->ext->rotAngle= NULL;
td->ext->quat= NULL;
- VECCOPY(td->ext->irot, pchan->eul);
+ copy_v3_v3(td->ext->irot, pchan->eul);
}
else if (pchan->rotmode == ROT_MODE_AXISANGLE) {
td->ext->rot= NULL;
@@ -550,7 +549,7 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
td->ext->quat= NULL;
td->ext->irotAngle= pchan->rotAngle;
- VECCOPY(td->ext->irotAxis, pchan->rotAxis);
+ copy_v3_v3(td->ext->irotAxis, pchan->rotAxis);
}
else {
td->ext->rot= NULL;
@@ -626,7 +625,7 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
else {
// abusive storage of scale in the loc pointer :)
td->loc= &bone->xwidth;
- VECCOPY (td->iloc, td->loc);
+ copy_v3_v3(td->iloc, td->loc);
td->val= NULL;
}
}
@@ -636,13 +635,13 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
bKinematicConstraint *data= has_targetless_ik(pchan);
if(data) {
if(data->flag & CONSTRAINT_IK_TIP) {
- VECCOPY(data->grabtarget, pchan->pose_tail);
+ copy_v3_v3(data->grabtarget, pchan->pose_tail);
}
else {
- VECCOPY(data->grabtarget, pchan->pose_head);
+ copy_v3_v3(data->grabtarget, pchan->pose_head);
}
td->loc = data->grabtarget;
- VECCOPY(td->iloc, td->loc);
+ copy_v3_v3(td->iloc, td->loc);
data->flag |= CONSTRAINT_IK_AUTO;
/* only object matrix correction */
@@ -885,7 +884,7 @@ static short pose_grab_with_ik_add(bPoseChannel *pchan)
else
data->flag= CONSTRAINT_IK_TIP;
data->flag |= CONSTRAINT_IK_TEMP|CONSTRAINT_IK_AUTO;
- VECCOPY(data->grabtarget, pchan->pose_tail);
+ copy_v3_v3(data->grabtarget, pchan->pose_tail);
data->rootbone= 0; /* watch-it! has to be 0 here, since we're still on the same bone for the first time through the loop [#25885] */
/* we only include bones that are part of a continual connected chain */
@@ -1109,7 +1108,7 @@ static void createTransArmatureVerts(TransInfo *t)
td->val= &ebo->rad_head;
td->ival= *td->val;
- VECCOPY (td->center, ebo->head);
+ copy_v3_v3(td->center, ebo->head);
td->flag= TD_SELECTED;
copy_m3_m3(td->smtx, smtx);
@@ -1125,7 +1124,7 @@ static void createTransArmatureVerts(TransInfo *t)
{
td->val= &ebo->rad_tail;
td->ival= *td->val;
- VECCOPY (td->center, ebo->tail);
+ copy_v3_v3(td->center, ebo->tail);
td->flag= TD_SELECTED;
copy_m3_m3(td->smtx, smtx);
@@ -1152,10 +1151,10 @@ static void createTransArmatureVerts(TransInfo *t)
{
// abusive storage of scale in the loc pointer :)
td->loc= &ebo->xwidth;
- VECCOPY (td->iloc, td->loc);
+ copy_v3_v3(td->iloc, td->loc);
td->val= NULL;
}
- VECCOPY (td->center, ebo->head);
+ copy_v3_v3(td->center, ebo->head);
td->flag= TD_SELECTED;
/* use local bone matrix */
@@ -1181,7 +1180,7 @@ static void createTransArmatureVerts(TransInfo *t)
td->val= &(ebo->roll);
td->ival= ebo->roll;
- VECCOPY (td->center, ebo->head);
+ copy_v3_v3(td->center, ebo->head);
td->flag= TD_SELECTED;
td->ext = NULL;
@@ -1194,8 +1193,8 @@ static void createTransArmatureVerts(TransInfo *t)
{
if (ebo->flag & BONE_TIPSEL)
{
- VECCOPY (td->iloc, ebo->tail);
- VECCOPY (td->center, td->iloc);
+ copy_v3_v3(td->iloc, ebo->tail);
+ copy_v3_v3(td->center, td->iloc);
td->loc= ebo->tail;
td->flag= TD_SELECTED;
if (ebo->flag & BONE_EDITMODE_LOCKED)
@@ -1220,8 +1219,8 @@ static void createTransArmatureVerts(TransInfo *t)
}
if (ebo->flag & BONE_ROOTSEL)
{
- VECCOPY (td->iloc, ebo->head);
- VECCOPY (td->center, td->iloc);
+ copy_v3_v3(td->iloc, ebo->head);
+ copy_v3_v3(td->center, td->iloc);
td->loc= ebo->head;
td->flag= TD_SELECTED;
if (ebo->flag & BONE_EDITMODE_LOCKED)
@@ -1279,8 +1278,8 @@ static void createTransMBallVerts(TransInfo *t)
for(ml= mb->editelems->first; ml; ml= ml->next) {
if(propmode || (ml->flag & SELECT)) {
td->loc= &ml->x;
- VECCOPY(td->iloc, td->loc);
- VECCOPY(td->center, td->loc);
+ copy_v3_v3(td->iloc, td->loc);
+ copy_v3_v3(td->center, td->loc);
if(ml->flag & SELECT) td->flag= TD_SELECTED | TD_USEQUAT | TD_SINGLESIZE;
else td->flag= TD_USEQUAT;
@@ -1395,7 +1394,7 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
if(cu->editnurb==NULL) return;
/* count total of vertices, check identical as in 2nd loop for making transdata! */
- nurbs= ED_curve_editnurbs(cu);
+ nurbs= curve_editnurbs(cu);
for(nu= nurbs->first; nu; nu= nu->next) {
if(nu->type == CU_BEZIER) {
for(a=0, bezt= nu->bezt; a<nu->pntsu; a++, bezt++) {
@@ -1444,9 +1443,9 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
((bezt->f2 & SELECT) && hide_handles) ||
((bezt->f1 & SELECT) && hide_handles == 0)
) {
- VECCOPY(td->iloc, bezt->vec[0]);
+ copy_v3_v3(td->iloc, bezt->vec[0]);
td->loc= bezt->vec[0];
- VECCOPY(td->center, bezt->vec[(hide_handles || bezt->f2 & SELECT) ? 1:0]);
+ copy_v3_v3(td->center, bezt->vec[(hide_handles || bezt->f2 & SELECT) ? 1:0]);
if (hide_handles) {
if(bezt->f2 & SELECT) td->flag= TD_SELECTED;
else td->flag= 0;
@@ -1469,9 +1468,9 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
/* This is the Curve Point, the other two are handles */
if(propmode || (bezt->f2 & SELECT)) {
- VECCOPY(td->iloc, bezt->vec[1]);
+ copy_v3_v3(td->iloc, bezt->vec[1]);
td->loc= bezt->vec[1];
- VECCOPY(td->center, td->loc);
+ copy_v3_v3(td->center, td->loc);
if(bezt->f2 & SELECT) td->flag= TD_SELECTED;
else td->flag= 0;
td->ext = NULL;
@@ -1503,9 +1502,9 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
((bezt->f2 & SELECT) && hide_handles) ||
((bezt->f3 & SELECT) && hide_handles == 0)
) {
- VECCOPY(td->iloc, bezt->vec[2]);
+ copy_v3_v3(td->iloc, bezt->vec[2]);
td->loc= bezt->vec[2];
- VECCOPY(td->center, bezt->vec[(hide_handles || bezt->f2 & SELECT) ? 1:2]);
+ copy_v3_v3(td->center, bezt->vec[(hide_handles || bezt->f2 & SELECT) ? 1:2]);
if (hide_handles) {
if(bezt->f2 & SELECT) td->flag= TD_SELECTED;
else td->flag= 0;
@@ -1547,9 +1546,9 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
for(a= nu->pntsu*nu->pntsv, bp= nu->bp; a>0; a--, bp++) {
if(bp->hide==0) {
if(propmode || (bp->f1 & SELECT)) {
- VECCOPY(td->iloc, bp->vec);
+ copy_v3_v3(td->iloc, bp->vec);
td->loc= bp->vec;
- VECCOPY(td->center, td->loc);
+ copy_v3_v3(td->center, td->loc);
if(bp->f1 & SELECT) td->flag= TD_SELECTED;
else td->flag= 0;
td->ext = NULL;
@@ -1619,9 +1618,9 @@ static void createTransLatticeVerts(TransInfo *t)
while(a--) {
if(propmode || (bp->f1 & SELECT)) {
if(bp->hide==0) {
- VECCOPY(td->iloc, bp->vec);
+ copy_v3_v3(td->iloc, bp->vec);
td->loc= bp->vec;
- VECCOPY(td->center, td->loc);
+ copy_v3_v3(td->center, td->loc);
if(bp->f1 & SELECT) td->flag= TD_SELECTED;
else td->flag= 0;
copy_m3_m3(td->smtx, smtx);
@@ -1714,15 +1713,15 @@ static void createTransParticleVerts(bContext *C, TransInfo *t)
for(k=0, key=point->keys; k<point->totkey; k++, key++) {
if(key->flag & PEK_USE_WCO) {
- VECCOPY(key->world_co, key->co);
+ copy_v3_v3(key->world_co, key->co);
mul_m4_v3(mat, key->world_co);
td->loc = key->world_co;
}
else
td->loc = key->co;
- VECCOPY(td->iloc, td->loc);
- VECCOPY(td->center, td->loc);
+ copy_v3_v3(td->iloc, td->loc);
+ copy_v3_v3(td->center, td->loc);
if(key->flag & PEK_SELECT)
td->flag |= TD_SELECTED;
@@ -1787,13 +1786,13 @@ void flushTransParticles(TransInfo *t)
invert_m4_m4(imat,mat);
for(k=0, key=point->keys; k<point->totkey; k++, key++) {
- VECCOPY(co, key->world_co);
+ copy_v3_v3(co, key->world_co);
mul_m4_v3(imat, co);
/* optimization for proportional edit */
if(!propmode || !compare_v3v3(key->co, co, 0.0001f)) {
- VECCOPY(key->co, co);
+ copy_v3_v3(key->co, co);
point->flag |= PEP_EDIT_RECALC;
}
}
@@ -1910,7 +1909,7 @@ static void get_face_center(float *cent, EditMesh *em, EditVert *eve)
if(efa->v1==eve || efa->v2==eve || efa->v3==eve || efa->v4==eve)
break;
if(efa) {
- VECCOPY(cent, efa->cent);
+ copy_v3_v3(cent, efa->cent);
}
}
@@ -1924,13 +1923,13 @@ static void VertsToTransData(TransInfo *t, TransData *td, EditMesh *em, EditVert
//else
td->loc = eve->co;
- VECCOPY(td->center, td->loc);
+ copy_v3_v3(td->center, td->loc);
if(t->around==V3D_LOCAL && (em->selectmode & SCE_SELECT_FACE))
get_face_center(td->center, em, eve);
- VECCOPY(td->iloc, td->loc);
+ copy_v3_v3(td->iloc, td->loc);
// Setting normals
- VECCOPY(td->axismtx[2], eve->no);
+ copy_v3_v3(td->axismtx[2], eve->no);
td->axismtx[0][0] =
td->axismtx[0][1] =
td->axismtx[0][2] =
@@ -1960,9 +1959,9 @@ static void createTransBMeshVerts(TransInfo *t, BME_Mesh *bm, BME_TransData_Head
if ( (vtd = BME_get_transdata(td,v)) ) {
tob->loc = vtd->loc;
tob->val = &vtd->factor;
- VECCOPY(tob->iloc,vtd->co);
- VECCOPY(tob->center,vtd->org);
- VECCOPY(tob->axismtx[0],vtd->vec);
+ copy_v3_v3(tob->iloc,vtd->co);
+ copy_v3_v3(tob->center,vtd->org);
+ copy_v3_v3(tob->axismtx[0],vtd->vec);
tob->axismtx[1][0] = vtd->max ? *vtd->max : 0;
tob++;
i++;
@@ -2305,8 +2304,8 @@ static void UVsToTransData(SpaceImage *sima, TransData *td, TransData2D *td2d, f
td->flag = 0;
td->loc = td2d->loc;
- VECCOPY(td->center, td->loc);
- VECCOPY(td->iloc, td->loc);
+ copy_v3_v3(td->center, td->loc);
+ copy_v3_v3(td->iloc, td->loc);
memset(td->axismtx, 0, sizeof(td->axismtx));
td->axismtx[2][2] = 1.0f;
@@ -2606,10 +2605,10 @@ static void createTransNlaData(bContext *C, TransInfo *t)
/* now, link the transform data up to this data */
if (ELEM(t->mode, TFM_TRANSLATION, TFM_TIME_EXTEND)) {
td->loc= tdn->h1;
- VECCOPY(td->iloc, tdn->h1);
+ copy_v3_v3(td->iloc, tdn->h1);
/* store all the other gunk that is required by transform */
- VECCOPY(td->center, center);
+ copy_v3_v3(td->center, center);
memset(td->axismtx, 0, sizeof(td->axismtx));
td->axismtx[2][2] = 1.0f;
@@ -2638,10 +2637,10 @@ static void createTransNlaData(bContext *C, TransInfo *t)
/* now, link the transform data up to this data */
if (ELEM(t->mode, TFM_TRANSLATION, TFM_TIME_EXTEND)) {
td->loc= tdn->h2;
- VECCOPY(td->iloc, tdn->h2);
+ copy_v3_v3(td->iloc, tdn->h2);
/* store all the other gunk that is required by transform */
- VECCOPY(td->center, center);
+ copy_v3_v3(td->center, center);
memset(td->axismtx, 0, sizeof(td->axismtx));
td->axismtx[2][2] = 1.0f;
@@ -3194,7 +3193,7 @@ static void bezt_to_transdata (TransData *td, TransData2D *td2d, AnimData *adt,
td->center[1] = cent[1];
td->center[2] = 0.0f;
- VECCOPY(td->iloc, td->loc);
+ copy_v3_v3(td->iloc, td->loc);
}
else {
td2d->loc[0] = loc[0];
@@ -3203,8 +3202,8 @@ static void bezt_to_transdata (TransData *td, TransData2D *td2d, AnimData *adt,
td2d->loc2d = loc;
td->loc = td2d->loc;
- VECCOPY(td->center, cent);
- VECCOPY(td->iloc, td->loc);
+ copy_v3_v3(td->center, cent);
+ copy_v3_v3(td->iloc, td->loc);
}
if (td->flag & TD_MOVEHANDLE1) {
@@ -3903,8 +3902,8 @@ static TransData *SeqToTransData(TransData *td, TransData2D *td2d, TransDataSeq
td->flag = 0;
td->loc = td2d->loc;
- VECCOPY(td->center, td->loc);
- VECCOPY(td->iloc, td->loc);
+ copy_v3_v3(td->center, td->loc);
+ copy_v3_v3(td->iloc, td->loc);
memset(td->axismtx, 0, sizeof(td->axismtx));
td->axismtx[2][2] = 1.0f;
@@ -4255,7 +4254,7 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob)
td->ob = ob;
td->loc = ob->loc;
- VECCOPY(td->iloc, td->loc);
+ copy_v3_v3(td->iloc, td->loc);
if (ob->rotmode > 0) {
td->ext->rot= ob->rot;
@@ -4263,8 +4262,8 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob)
td->ext->rotAngle= NULL;
td->ext->quat= NULL;
- VECCOPY(td->ext->irot, ob->rot);
- VECCOPY(td->ext->drot, ob->drot);
+ copy_v3_v3(td->ext->irot, ob->rot);
+ copy_v3_v3(td->ext->drot, ob->drot);
}
else if (ob->rotmode == ROT_MODE_AXISANGLE) {
td->ext->rot= NULL;
@@ -4273,9 +4272,9 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob)
td->ext->quat= NULL;
td->ext->irotAngle= ob->rotAngle;
- VECCOPY(td->ext->irotAxis, ob->rotAxis);
+ copy_v3_v3(td->ext->irotAxis, ob->rotAxis);
// td->ext->drotAngle= ob->drotAngle; // XXX, not implimented
- // VECCOPY(td->ext->drotAxis, ob->drotAxis); // XXX, not implimented
+ // copy_v3_v3(td->ext->drotAxis, ob->drotAxis); // XXX, not implimented
}
else {
td->ext->rot= NULL;
@@ -4289,10 +4288,10 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob)
td->ext->rotOrder=ob->rotmode;
td->ext->size = ob->size;
- VECCOPY(td->ext->isize, ob->size);
- VECCOPY(td->ext->dsize, ob->dsize);
+ copy_v3_v3(td->ext->isize, ob->size);
+ copy_v3_v3(td->ext->dsize, ob->dsize);
- VECCOPY(td->center, ob->obmat[3]);
+ copy_v3_v3(td->center, ob->obmat[3]);
copy_m4_m4(td->ext->obmat, ob->obmat);
@@ -4771,12 +4770,14 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
}
else if (t->spacetype == SPACE_NODE) {
+ SpaceNode *snode= (SpaceNode *)t->sa->spacedata.first;
+ ED_node_update_hierarchy(C, snode->edittree);
+
if(cancelled == 0)
ED_node_link_insert(t->sa);
/* clear link line */
ED_node_link_intersect_test(t->sa, 0);
-
}
else if (t->spacetype == SPACE_ACTION) {
SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first;
@@ -5194,9 +5195,14 @@ static void NodeToTransData(TransData *td, TransData2D *td2d, bNode *node)
td2d->loc2d = &node->locx; /* current location */
td->flag = 0;
+ /* exclude nodes whose parent is also transformed */
+ if (node->parent && (node->parent->flag & NODE_TRANSFORM)) {
+ td->flag |= TD_SKIP;
+ }
+
td->loc = td2d->loc;
- VECCOPY(td->center, td->loc);
- VECCOPY(td->iloc, td->loc);
+ copy_v3_v3(td->center, td->loc);
+ copy_v3_v3(td->iloc, td->loc);
memset(td->axismtx, 0, sizeof(td->axismtx));
td->axismtx[2][2] = 1.0f;
@@ -5214,6 +5220,16 @@ static void createTransNodeData(bContext *C, TransInfo *t)
{
TransData *td;
TransData2D *td2d;
+ SpaceNode *snode= t->sa->spacedata.first;
+ bNode *node;
+
+ /* set transform flags on nodes */
+ for (node=snode->edittree->nodes.first; node; node=node->next) {
+ if ((node->flag & NODE_SELECT) || (node->parent && (node->parent->flag & NODE_TRANSFORM)))
+ node->flag |= NODE_TRANSFORM;
+ else
+ node->flag &= ~NODE_TRANSFORM;
+ }
t->total= CTX_DATA_COUNT(C, selected_nodes);
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index ec76bb3ac35..b187ca0650c 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -84,7 +84,7 @@
#include "ED_space_api.h"
#include "ED_uvedit.h"
#include "ED_view3d.h"
-#include "ED_curve.h" /* for ED_curve_editnurbs */
+#include "ED_curve.h" /* for curve_editnurbs */
//#include "BDR_unwrapper.h"
@@ -115,9 +115,9 @@ void getViewVector(TransInfo *t, float coord[3], float vec[3])
{
float p1[4], p2[4];
- VECCOPY(p1, coord);
+ copy_v3_v3(p1, coord);
p1[3] = 1.0f;
- VECCOPY(p2, p1);
+ copy_v3_v3(p2, p1);
p2[3] = 1.0f;
mul_m4_v4(t->viewmat, p2);
@@ -130,7 +130,7 @@ void getViewVector(TransInfo *t, float coord[3], float vec[3])
sub_v3_v3v3(vec, p1, p2);
}
else {
- VECCOPY(vec, t->viewinv[2]);
+ copy_v3_v3(vec, t->viewinv[2]);
}
normalize_v3(vec);
}
@@ -144,7 +144,7 @@ static void clipMirrorModifier(TransInfo *t, Object *ob)
int axis = 0;
for (; md; md=md->next) {
- if (md->type==eModifierType_Mirror) {
+ if ((md->type==eModifierType_Mirror) && (md->mode & eModifierMode_Realtime)) {
MirrorModifierData *mmd = (MirrorModifierData*) md;
if(mmd->flag & MOD_MIR_CLIPPING) {
@@ -626,7 +626,7 @@ static void recalcData_view3d(TransInfo *t)
if (t->obedit) {
if ELEM(t->obedit->type, OB_CURVE, OB_SURF) {
Curve *cu= t->obedit->data;
- ListBase *nurbs= ED_curve_editnurbs(cu);
+ ListBase *nurbs= curve_editnurbs(cu);
Nurb *nu= nurbs->first;
if(t->state != TRANS_CANCEL) {
@@ -694,12 +694,12 @@ static void recalcData_view3d(TransInfo *t)
if ((ebo->flag & BONE_CONNECTED) && ebo->parent){
/* If this bone has a parent tip that has been moved */
if (ebo->parent->flag & BONE_TIPSEL){
- VECCOPY (ebo->head, ebo->parent->tail);
+ copy_v3_v3 (ebo->head, ebo->parent->tail);
if(t->mode==TFM_BONE_ENVELOPE) ebo->rad_head= ebo->parent->rad_tail;
}
/* If this bone has a parent tip that has NOT been moved */
else{
- VECCOPY (ebo->parent->tail, ebo->head);
+ copy_v3_v3 (ebo->parent->tail, ebo->head);
if(t->mode==TFM_BONE_ENVELOPE) ebo->parent->rad_tail= ebo->rad_head;
}
}
@@ -736,7 +736,7 @@ static void recalcData_view3d(TransInfo *t)
float qrot[4];
ebo = td->extra;
- VECCOPY(up_axis, td->axismtx[2]);
+ copy_v3_v3(up_axis, td->axismtx[2]);
if (t->mode != TFM_ROTATION)
{
@@ -1259,12 +1259,12 @@ void applyTransObjects(TransInfo *t)
TransData *td;
for (td = t->data; td < t->data + t->total; td++) {
- VECCOPY(td->iloc, td->loc);
+ copy_v3_v3(td->iloc, td->loc);
if (td->ext->rot) {
- VECCOPY(td->ext->irot, td->ext->rot);
+ copy_v3_v3(td->ext->irot, td->ext->rot);
}
if (td->ext->size) {
- VECCOPY(td->ext->isize, td->ext->size);
+ copy_v3_v3(td->ext->isize, td->ext->size);
}
}
recalcData(t);
@@ -1273,7 +1273,7 @@ void applyTransObjects(TransInfo *t)
static void restoreElement(TransData *td) {
/* TransData for crease has no loc */
if (td->loc) {
- VECCOPY(td->loc, td->iloc);
+ copy_v3_v3(td->loc, td->iloc);
}
if (td->val) {
*td->val = td->ival;
@@ -1281,17 +1281,17 @@ static void restoreElement(TransData *td) {
if (td->ext && (td->flag&TD_NO_EXT)==0) {
if (td->ext->rot) {
- VECCOPY(td->ext->rot, td->ext->irot);
+ copy_v3_v3(td->ext->rot, td->ext->irot);
}
if(td->ext->rotAngle) {
*td->ext->rotAngle= td->ext->irotAngle;
}
if(td->ext->rotAxis) {
- VECCOPY(td->ext->rotAxis, td->ext->irotAxis);
+ copy_v3_v3(td->ext->rotAxis, td->ext->irotAxis);
}
/* XXX, drotAngle & drotAxis not used yet */
if (td->ext->size) {
- VECCOPY(td->ext->size, td->ext->isize);
+ copy_v3_v3(td->ext->size, td->ext->isize);
}
if (td->ext->quat) {
QUATCOPY(td->ext->quat, td->ext->iquat);
@@ -1335,7 +1335,7 @@ void calculateCenter2D(TransInfo *t)
Object *ob= t->obedit?t->obedit:t->poseobj;
float vec[3];
- VECCOPY(vec, t->center);
+ copy_v3_v3(vec, t->center);
mul_m4_v3(ob->obmat, vec);
projectIntView(t, vec, t->center2d);
}
@@ -1349,7 +1349,7 @@ void calculateCenterCursor(TransInfo *t)
float *cursor;
cursor = give_cursor(t->scene, t->view);
- VECCOPY(t->center, cursor);
+ copy_v3_v3(t->center, cursor);
/* If edit or pose mode, move cursor in local space */
if (t->flag & (T_EDIT|T_POSE)) {
@@ -1421,7 +1421,7 @@ void calculateCenterMedian(TransInfo *t)
}
if(i)
mul_v3_fl(partial, 1.0f / total);
- VECCOPY(t->center, partial);
+ copy_v3_v3(t->center, partial);
calculateCenter2D(t);
}
@@ -1446,8 +1446,8 @@ void calculateCenterBound(TransInfo *t)
}
}
else {
- VECCOPY(max, t->data[i].center);
- VECCOPY(min, t->data[i].center);
+ copy_v3_v3(max, t->data[i].center);
+ copy_v3_v3(min, t->data[i].center);
}
}
add_v3_v3v3(t->center, min, max);
@@ -1501,7 +1501,7 @@ void calculateCenter(TransInfo *t)
Object *ob= OBACT;
if(ob)
{
- VECCOPY(t->center, ob->obmat[3]);
+ copy_v3_v3(t->center, ob->obmat[3]);
projectIntView(t, t->center, t->center2d);
}
}
@@ -1510,7 +1510,7 @@ void calculateCenter(TransInfo *t)
}
/* setting constraint center */
- VECCOPY(t->con.center, t->center);
+ copy_v3_v3(t->con.center, t->center);
if(t->flag & (T_EDIT|T_POSE))
{
Object *ob= t->obedit?t->obedit:t->poseobj;
@@ -1530,7 +1530,7 @@ void calculateCenter(TransInfo *t)
{
float axis[3];
/* persinv is nasty, use viewinv instead, always right */
- VECCOPY(axis, t->viewinv[2]);
+ copy_v3_v3(axis, t->viewinv[2]);
normalize_v3(axis);
/* 6.0 = 6 grid units */
@@ -1543,8 +1543,8 @@ void calculateCenter(TransInfo *t)
/* rotate only needs correct 2d center, grab needs initgrabz() value */
if(t->mode==TFM_TRANSLATION)
{
- VECCOPY(t->center, axis);
- VECCOPY(t->con.center, t->center);
+ copy_v3_v3(t->center, axis);
+ copy_v3_v3(t->con.center, t->center);
}
}
}
@@ -1557,7 +1557,7 @@ void calculateCenter(TransInfo *t)
Object *ob= t->obedit?t->obedit:t->poseobj;
float vec[3];
- VECCOPY(vec, t->center);
+ copy_v3_v3(vec, t->center);
mul_m4_v3(ob->obmat, vec);
initgrabz(t->ar->regiondata, vec[0], vec[1], vec[2]);
}
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index d62227a122d..3b895f5fbd0 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -57,6 +57,7 @@
#include "BKE_action.h"
#include "BKE_context.h"
+#include "BKE_curve.h"
#include "BKE_global.h"
#include "BKE_mesh.h"
#include "BKE_particle.h"
@@ -75,7 +76,6 @@
#include "ED_mesh.h"
#include "ED_particle.h"
#include "ED_view3d.h"
-#include "ED_curve.h" /* for ED_curve_editnurbs */
#include "UI_resources.h"
@@ -395,7 +395,7 @@ int calc_manipulator_stats(const bContext *C)
Nurb *nu;
BezTriple *bezt;
BPoint *bp;
- ListBase *nurbs= ED_curve_editnurbs(cu);
+ ListBase *nurbs= curve_editnurbs(cu);
nu= nurbs->first;
while(nu) {
@@ -884,7 +884,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
if(arcs) {
/* clipplane makes nice handles, calc here because of multmatrix but with translate! */
- VECCOPY(plane, rv3d->viewinv[2]);
+ VECCOPY(plane, rv3d->viewinv[2]); /* float -> double */
plane[3]= -0.02f*size; // clip just a bit more
glClipPlane(GL_CLIP_PLANE0, plane);
}
@@ -1498,15 +1498,15 @@ void BIF_draw_manipulator(const bContext *C)
if(v3d->around==V3D_ACTIVE && scene->obedit==NULL) {
Object *ob= OBACT;
if(ob && !(ob->mode & OB_MODE_POSE))
- VECCOPY(rv3d->twmat[3], ob->obmat[3]);
+ copy_v3_v3(rv3d->twmat[3], ob->obmat[3]);
}
break;
case V3D_LOCAL:
case V3D_CENTROID:
- VECCOPY(rv3d->twmat[3], scene->twcent);
+ copy_v3_v3(rv3d->twmat[3], scene->twcent);
break;
case V3D_CURSOR:
- VECCOPY(rv3d->twmat[3], give_cursor(scene, v3d));
+ copy_v3_v3(rv3d->twmat[3], give_cursor(scene, v3d));
break;
}
diff --git a/source/blender/editors/transform/transform_orientations.c b/source/blender/editors/transform/transform_orientations.c
index 35053cf3b97..68bf7d181f5 100644
--- a/source/blender/editors/transform/transform_orientations.c
+++ b/source/blender/editors/transform/transform_orientations.c
@@ -41,6 +41,7 @@
#include "BKE_armature.h"
+#include "BKE_curve.h"
#include "BKE_context.h"
#include "BKE_report.h"
@@ -58,8 +59,6 @@
#include "ED_armature.h"
#include "ED_mesh.h"
-#include "ED_curve.h" /* for ED_curve_editnurbs */
-
#include "RNA_define.h"
@@ -224,7 +223,7 @@ int createSpaceNormal(float mat[3][3], float normal[3])
{
float tangent[3] = {0.0f, 0.0f, 1.0f};
- VECCOPY(mat[2], normal);
+ copy_v3_v3(mat[2], normal);
if (normalize_v3(mat[2]) == 0.0f) {
return 0; /* error return */
}
@@ -245,7 +244,7 @@ int createSpaceNormal(float mat[3][3], float normal[3])
int createSpaceNormalTangent(float mat[3][3], float normal[3], float tangent[3])
{
- VECCOPY(mat[2], normal);
+ copy_v3_v3(mat[2], normal);
if (normalize_v3(mat[2]) == 0.0f) {
return 0; /* error return */
}
@@ -409,7 +408,7 @@ EnumPropertyItem *BIF_enumTransformOrientation(bContext *C)
}
const char * BIF_menustringTransformOrientation(const bContext *C, const char *title) {
- char* menu = _("%t|Global%x0|Local%x1|Gimbal%x4|Normal%x2|View%x3");
+ const char* menu = _("%t|Global%x0|Local%x1|Gimbal%x4|Normal%x2|View%x3");
ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;
TransformOrientation *ts;
int i = V3D_MANIP_CUSTOM;
@@ -661,7 +660,7 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
for(eed= em->edges.first; eed; eed= eed->next) {
if(eed->f & SELECT) {
/* use average vert normals as plane and edge vector as normal */
- VECCOPY(plane, eed->v1->no);
+ copy_v3_v3(plane, eed->v1->no);
VECADD(plane, plane, eed->v2->no);
sub_v3_v3v3(normal, eed->v2->co, eed->v1->co);
break;
@@ -682,7 +681,7 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
else {
v2 = eve;
- VECCOPY(plane, v1->no);
+ copy_v3_v3(plane, v1->no);
VECADD(plane, plane, v2->no);
sub_v3_v3v3(normal, v2->co, v1->co);
break;
@@ -696,7 +695,7 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
for (eve = em->verts.first; eve; eve = eve->next)
{
if ( eve->f & SELECT ) {
- VECCOPY(normal, eve->no);
+ copy_v3_v3(normal, eve->no);
break;
}
}
@@ -723,7 +722,7 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
Nurb *nu;
BezTriple *bezt;
int a;
- ListBase *nurbs= ED_curve_editnurbs(cu);
+ ListBase *nurbs= curve_editnurbs(cu);
for (nu = nurbs->first; nu; nu = nu->next)
{
@@ -794,7 +793,7 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
/* Rotation of MetaElem is stored in quat */
quat_to_mat4( mat,ml_sel->quat);
- VECCOPY(normal, mat[2]);
+ copy_v3_v3(normal, mat[2]);
negate_v3_v3(plane, mat[1]);
@@ -895,8 +894,8 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
}
if (ob) {
- VECCOPY(normal, ob->obmat[2]);
- VECCOPY(plane, ob->obmat[1]);
+ copy_v3_v3(normal, ob->obmat[2]);
+ copy_v3_v3(plane, ob->obmat[1]);
}
result = ORIENTATION_NORMAL;
}
diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c
index ca89670dedb..17fd7517d71 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -264,7 +264,7 @@ void applyProject(TransInfo *t)
if (td->flag & TD_SKIP)
continue;
- VECCOPY(iloc, td->loc);
+ copy_v3_v3(iloc, td->loc);
if (t->flag & (T_EDIT|T_POSE))
{
Object *ob = t->obedit?t->obedit:t->poseobj;
@@ -274,7 +274,7 @@ void applyProject(TransInfo *t)
{
td->ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
object_handle_update(t->scene, td->ob);
- VECCOPY(iloc, td->ob->obmat[3]);
+ copy_v3_v3(iloc, td->ob->obmat[3]);
}
project_float(t->ar, iloc, mval);
@@ -543,7 +543,7 @@ void addSnapPoint(TransInfo *t)
if (t->tsnap.status & POINT_INIT) {
TransSnapPoint *p = MEM_callocN(sizeof(TransSnapPoint), "SnapPoint");
- VECCOPY(p->co, t->tsnap.snapPoint);
+ copy_v3_v3(p->co, t->tsnap.snapPoint);
BLI_addtail(&t->tsnap.points, p);
@@ -580,7 +580,7 @@ void getSnapPoint(TransInfo *t, float vec[3])
mul_v3_fl(vec, 1.0f / total);
} else {
- VECCOPY(vec, t->tsnap.snapPoint)
+ copy_v3_v3(vec, t->tsnap.snapPoint);
}
}
@@ -628,7 +628,7 @@ float RotationBetween(TransInfo *t, float p1[3], float p2[3])
{
float angle, start[3], end[3], center[3];
- VECCOPY(center, t->center);
+ copy_v3_v3(center, t->center);
if(t->flag & (T_EDIT|T_POSE)) {
Object *ob= t->obedit?t->obedit:t->poseobj;
mul_m4_v3(ob->obmat, center);
@@ -684,7 +684,7 @@ float ResizeBetween(TransInfo *t, float p1[3], float p2[3])
{
float d1[3], d2[3], center[3];
- VECCOPY(center, t->center);
+ copy_v3_v3(center, t->center);
if(t->flag & (T_EDIT|T_POSE)) {
Object *ob= t->obedit?t->obedit:t->poseobj;
mul_m4_v3(ob->obmat, center);
@@ -784,12 +784,12 @@ void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec))
}
else
{
- VECCOPY(vec, p1->p);
+ copy_v3_v3(vec, p1->p);
}
if (last_p == NULL)
{
- VECCOPY(p, vec);
+ copy_v3_v3(p, vec);
max_dist = 0;
break;
}
@@ -798,7 +798,7 @@ void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec))
if (new_dist < max_dist)
{
- VECCOPY(p, vec);
+ copy_v3_v3(p, vec);
max_dist = new_dist;
}
}
@@ -806,7 +806,7 @@ void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec))
if (max_dist != FLT_MAX)
{
- VECCOPY(loc, p);
+ copy_v3_v3(loc, p);
/* XXX, is there a correct normal in this case ???, for now just z up */
no[0]= 0.0;
no[1]= 0.0;
@@ -830,11 +830,11 @@ void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec))
if (dot_v3v3(tangent, tangent) > 0)
{
- VECCOPY(t->tsnap.snapTangent, tangent);
+ copy_v3_v3(t->tsnap.snapTangent, tangent);
}
- VECCOPY(t->tsnap.snapPoint, loc);
- VECCOPY(t->tsnap.snapNormal, no);
+ copy_v3_v3(t->tsnap.snapPoint, loc);
+ copy_v3_v3(t->tsnap.snapNormal, no);
t->tsnap.status |= POINT_INIT;
}
@@ -873,7 +873,7 @@ void TargetSnapCenter(TransInfo *t)
// Only need to calculate once
if ((t->tsnap.status & TARGET_INIT) == 0)
{
- VECCOPY(t->tsnap.snapTarget, t->center);
+ copy_v3_v3(t->tsnap.snapTarget, t->center);
if(t->flag & (T_EDIT|T_POSE)) {
Object *ob= t->obedit?t->obedit:t->poseobj;
mul_m4_v3(ob->obmat, t->tsnap.snapTarget);
@@ -903,7 +903,7 @@ void TargetSnapActive(TransInfo *t)
if (active_td)
{
- VECCOPY(t->tsnap.snapTarget, active_td->center);
+ copy_v3_v3(t->tsnap.snapTarget, active_td->center);
if(t->flag & (T_EDIT|T_POSE)) {
Object *ob= t->obedit?t->obedit:t->poseobj;
@@ -974,14 +974,14 @@ void TargetSnapClosest(TransInfo *t)
float loc[3];
float dist;
- VECCOPY(loc, bb->vec[j]);
+ copy_v3_v3(loc, bb->vec[j]);
mul_m4_v3(td->ext->obmat, loc);
dist = t->tsnap.distance(t, loc, t->tsnap.snapPoint);
if (closest == NULL || fabs(dist) < fabs(t->tsnap.dist))
{
- VECCOPY(t->tsnap.snapTarget, loc);
+ copy_v3_v3(t->tsnap.snapTarget, loc);
closest = td;
t->tsnap.dist = dist;
}
@@ -993,13 +993,13 @@ void TargetSnapClosest(TransInfo *t)
float loc[3];
float dist;
- VECCOPY(loc, td->center);
+ copy_v3_v3(loc, td->center);
dist = t->tsnap.distance(t, loc, t->tsnap.snapPoint);
if (closest == NULL || fabs(dist) < fabs(t->tsnap.dist))
{
- VECCOPY(t->tsnap.snapTarget, loc);
+ copy_v3_v3(t->tsnap.snapTarget, loc);
closest = td;
t->tsnap.dist = dist;
}
@@ -1014,7 +1014,7 @@ void TargetSnapClosest(TransInfo *t)
float loc[3];
float dist;
- VECCOPY(loc, td->center);
+ copy_v3_v3(loc, td->center);
if(t->flag & (T_EDIT|T_POSE)) {
Object *ob= t->obedit?t->obedit:t->poseobj;
@@ -1025,7 +1025,7 @@ void TargetSnapClosest(TransInfo *t)
if (closest == NULL || fabs(dist) < fabs(t->tsnap.dist))
{
- VECCOPY(t->tsnap.snapTarget, loc);
+ copy_v3_v3(t->tsnap.snapTarget, loc);
closest = td;
t->tsnap.dist = dist;
}
@@ -1052,11 +1052,11 @@ static int snapFace(ARegion *ar, float v1co[3], float v2co[3], float v3co[3], fl
int screen_loc[2];
int new_dist;
- VECCOPY(intersect, ray_normal_local);
+ copy_v3_v3(intersect, ray_normal_local);
mul_v3_fl(intersect, lambda);
add_v3_v3(intersect, ray_start_local);
- VECCOPY(location, intersect);
+ copy_v3_v3(location, intersect);
if (v4co)
normal_quad_v3( normal,v1co, v2co, v3co, v4co);
@@ -1075,8 +1075,8 @@ static int snapFace(ARegion *ar, float v1co[3], float v2co[3], float v3co[3], fl
*depth = new_depth;
retval = 1;
- VECCOPY(loc, location);
- VECCOPY(no, normal);
+ copy_v3_v3(loc, location);
+ copy_v3_v3(no, normal);
mul_m3_v3(timat, no);
normalize_v3(no);
@@ -1095,7 +1095,7 @@ static int snapEdge(ARegion *ar, float v1co[3], short v1no[3], float v2co[3], sh
int result;
int retval = 0;
- VECCOPY(ray_end, ray_normal_local);
+ copy_v3_v3(ray_end, ray_normal_local);
mul_v3_fl(ray_end, 2000);
add_v3_v3v3(ray_end, ray_start_local, ray_end);
@@ -1116,11 +1116,11 @@ static int snapEdge(ARegion *ar, float v1co[3], short v1no[3], float v2co[3], sh
if (mul > 1) {
mul = 1;
- VECCOPY(intersect, v1co);
+ copy_v3_v3(intersect, v1co);
}
else if (mul < 0) {
mul = 0;
- VECCOPY(intersect, v2co);
+ copy_v3_v3(intersect, v2co);
}
if (dot_v3v3(ray_normal_local, dvec) > 0)
@@ -1130,7 +1130,7 @@ static int snapEdge(ARegion *ar, float v1co[3], short v1no[3], float v2co[3], sh
int screen_loc[2];
int new_dist;
- VECCOPY(location, intersect);
+ copy_v3_v3(location, intersect);
mul_m4_v3(obmat, location);
@@ -1164,7 +1164,7 @@ static int snapEdge(ARegion *ar, float v1co[3], short v1no[3], float v2co[3], sh
normalize_v3(no);
}
- VECCOPY(loc, location);
+ copy_v3_v3(loc, location);
*dist = new_dist;
}
@@ -1188,7 +1188,7 @@ static int snapVertex(ARegion *ar, float vco[3], short vno[3], float mval[2], fl
int screen_loc[2];
int new_dist;
- VECCOPY(location, vco);
+ copy_v3_v3(location, vco);
mul_m4_v3(obmat, location);
@@ -1202,7 +1202,7 @@ static int snapVertex(ARegion *ar, float vco[3], short vno[3], float mval[2], fl
*depth = new_depth;
retval = 1;
- VECCOPY(loc, location);
+ copy_v3_v3(loc, location);
if (no)
{
@@ -1226,8 +1226,8 @@ static int snapArmature(short snap_mode, ARegion *ar, Object *ob, bArmature *arm
invert_m4_m4(imat, obmat);
- VECCOPY(ray_start_local, ray_start);
- VECCOPY(ray_normal_local, ray_normal);
+ copy_v3_v3(ray_start_local, ray_start);
+ copy_v3_v3(ray_normal_local, ray_normal);
mul_m4_v3(imat, ray_start_local);
mul_mat3_m4_v3(imat, ray_normal_local);
@@ -1300,8 +1300,8 @@ static int snapDerivedMesh(short snap_mode, ARegion *ar, Object *ob, DerivedMesh
copy_m3_m4(timat, imat);
transpose_m3(timat);
- VECCOPY(ray_start_local, ray_start);
- VECCOPY(ray_normal_local, ray_normal);
+ copy_v3_v3(ray_start_local, ray_start);
+ copy_v3_v3(ray_normal_local, ray_normal);
mul_m4_v3(imat, ray_start_local);
mul_mat3_m4_v3(imat, ray_normal_local);
@@ -1699,8 +1699,8 @@ static void addDepthPeel(ListBase *depth_peels, float depth, float p[3], float n
peel->depth = depth;
peel->ob = ob;
- VECCOPY(peel->p, p);
- VECCOPY(peel->no, no);
+ copy_v3_v3(peel->p, p);
+ copy_v3_v3(peel->no, no);
BLI_addtail(depth_peels, peel);
@@ -1724,8 +1724,8 @@ static int peelDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[][4], float
copy_m3_m4(timat, imat);
transpose_m3(timat);
- VECCOPY(ray_start_local, ray_start);
- VECCOPY(ray_normal_local, ray_normal);
+ copy_v3_v3(ray_start_local, ray_start);
+ copy_v3_v3(ray_normal_local, ray_normal);
mul_m4_v3(imat, ray_start_local);
mul_mat3_m4_v3(imat, ray_normal_local);
@@ -1757,11 +1757,11 @@ static int peelDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[][4], float
float intersect[3];
float new_depth;
- VECCOPY(intersect, ray_normal_local);
+ copy_v3_v3(intersect, ray_normal_local);
mul_v3_fl(intersect, lambda);
add_v3_v3(intersect, ray_start_local);
- VECCOPY(location, intersect);
+ copy_v3_v3(location, intersect);
if (f->v4)
normal_quad_v3( normal,verts[f->v1].co, verts[f->v2].co, verts[f->v3].co, verts[f->v4].co);
@@ -1787,11 +1787,11 @@ static int peelDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[][4], float
float intersect[3];
float new_depth;
- VECCOPY(intersect, ray_normal_local);
+ copy_v3_v3(intersect, ray_normal_local);
mul_v3_fl(intersect, lambda);
add_v3_v3(intersect, ray_start_local);
- VECCOPY(location, intersect);
+ copy_v3_v3(location, intersect);
if (f->v4)
normal_quad_v3( normal,verts[f->v1].co, verts[f->v2].co, verts[f->v3].co, verts[f->v4].co);
diff --git a/source/blender/editors/util/SConscript b/source/blender/editors/util/SConscript
index cfbf1c83079..fffd2670814 100644
--- a/source/blender/editors/util/SConscript
+++ b/source/blender/editors/util/SConscript
@@ -8,4 +8,4 @@ incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
incs += ' ../../makesrna'
incs += ' ../../blenloader'
-env.BlenderLib ( 'bf_editors_util', sources, Split(incs), [], libtype=['core'], priority=[130] )
+env.BlenderLib ( 'bf_editors_util', sources, Split(incs), [], libtype=['core','player'], priority=[330,210] )
diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c
index 4fedf35acd1..21420d88899 100644
--- a/source/blender/editors/util/undo.c
+++ b/source/blender/editors/util/undo.c
@@ -56,6 +56,7 @@
#include "ED_armature.h"
#include "ED_particle.h"
#include "ED_curve.h"
+#include "ED_gpencil.h"
#include "ED_mball.h"
#include "ED_mesh.h"
#include "ED_object.h"
@@ -128,6 +129,11 @@ static int ed_undo_step(bContext *C, int step, const char *undoname)
Object *obact= CTX_data_active_object(C);
ScrArea *sa= CTX_wm_area(C);
+ /* grease pencil can be can be used in plenty of spaces, so check it first */
+ if(ED_gpencil_session_active()) {
+ return ED_undo_gpencil_step(C, step, undoname);
+ }
+
if(sa && sa->spacetype==SPACE_IMAGE) {
SpaceImage *sima= (SpaceImage *)sa->spacedata.first;
diff --git a/source/blender/gpu/GPU_extensions.h b/source/blender/gpu/GPU_extensions.h
index d0c7f9d494f..5a1c0c537c0 100644
--- a/source/blender/gpu/GPU_extensions.h
+++ b/source/blender/gpu/GPU_extensions.h
@@ -126,6 +126,7 @@ GPUFrameBuffer *GPU_texture_framebuffer(GPUTexture *tex);
int GPU_texture_target(GPUTexture *tex);
int GPU_texture_opengl_width(GPUTexture *tex);
int GPU_texture_opengl_height(GPUTexture *tex);
+int GPU_texture_opengl_bindcode(GPUTexture *tex);
/* GPU Framebuffer
- this is a wrapper for an OpenGL framebuffer object (FBO). in practice
@@ -179,6 +180,7 @@ typedef struct GPUVertexAttribs {
int type;
int glindex;
int gltexco;
+ int attribid;
char name[32];
} layer[GPU_MAX_ATTRIB];
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index f563d8cbe92..95a08e6d5b3 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -37,6 +37,8 @@
#ifndef __GPU_MATERIAL__
#define __GPU_MATERIAL__
+#include "DNA_listBase.h"
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -46,6 +48,7 @@ struct ImageUser;
struct Material;
struct Object;
struct Lamp;
+struct Image;
struct bNode;
struct LinkNode;
struct Scene;
@@ -72,7 +75,6 @@ typedef enum GPUType {
GPU_VEC4 = 4,
GPU_MAT3 = 9,
GPU_MAT4 = 16,
- GPU_TEX1D = 1001,
GPU_TEX2D = 1002,
GPU_SHADOW2D = 1003,
GPU_ATTRIB = 3001
@@ -107,10 +109,10 @@ typedef struct GPUNodeStack {
GPUNodeLink *GPU_attribute(int type, const char *name);
GPUNodeLink *GPU_uniform(float *num);
-GPUNodeLink *GPU_dynamic_uniform(float *num);
+GPUNodeLink *GPU_dynamic_uniform(float *num, int dynamictype, void *data);
GPUNodeLink *GPU_image(struct Image *ima, struct ImageUser *iuser);
GPUNodeLink *GPU_texture(int size, float *pixels);
-GPUNodeLink *GPU_dynamic_texture(struct GPUTexture *tex);
+GPUNodeLink *GPU_dynamic_texture(struct GPUTexture *tex, int dynamictype, void *data);
GPUNodeLink *GPU_socket(GPUNodeStack *sock);
GPUNodeLink *GPU_builtin(GPUBuiltin builtin);
@@ -153,6 +155,72 @@ typedef struct GPUShadeResult {
void GPU_shadeinput_set(GPUMaterial *mat, struct Material *ma, GPUShadeInput *shi);
void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr);
+/* Export GLSL shader */
+
+typedef enum GPUDynamicType {
+ GPU_DYNAMIC_NONE = 0,
+ GPU_DYNAMIC_OBJECT_VIEWMAT = 1,
+ GPU_DYNAMIC_OBJECT_MAT = 2,
+ GPU_DYNAMIC_OBJECT_VIEWIMAT = 3,
+ GPU_DYNAMIC_OBJECT_IMAT = 4,
+ GPU_DYNAMIC_OBJECT_COLOR = 5,
+ GPU_DYNAMIC_LAMP_FIRST = 6,
+ GPU_DYNAMIC_LAMP_DYNVEC = 6,
+ GPU_DYNAMIC_LAMP_DYNCO = 7,
+ GPU_DYNAMIC_LAMP_DYNIMAT = 8,
+ GPU_DYNAMIC_LAMP_DYNPERSMAT = 9,
+ GPU_DYNAMIC_LAMP_DYNENERGY = 10,
+ GPU_DYNAMIC_LAMP_DYNCOL = 11,
+ GPU_DYNAMIC_LAMP_LAST = 11,
+ GPU_DYNAMIC_SAMPLER_2DBUFFER = 12,
+ GPU_DYNAMIC_SAMPLER_2DIMAGE = 13,
+ GPU_DYNAMIC_SAMPLER_2DSHADOW = 14,
+} GPUDynamicType;
+
+typedef enum GPUDataType {
+ GPU_DATA_NONE = 0,
+ GPU_DATA_1I = 1, // 1 integer
+ GPU_DATA_1F = 2,
+ GPU_DATA_2F = 3,
+ GPU_DATA_3F = 4,
+ GPU_DATA_4F = 5,
+ GPU_DATA_9F = 6,
+ GPU_DATA_16F = 7,
+ GPU_DATA_4UB = 8,
+} GPUDataType;
+
+/* this structure gives information of each uniform found in the shader */
+typedef struct GPUInputUniform {
+ struct GPUInputUniform *next, *prev;
+ char varname[32]; /* name of uniform in shader */
+ GPUDynamicType type; /* type of uniform, data format and calculation derive from it */
+ GPUDataType datatype; /* type of uniform data */
+ struct Object *lamp; /* when type=GPU_DYNAMIC_LAMP_... or GPU_DYNAMIC_SAMPLER_2DSHADOW */
+ struct Image *image; /* when type=GPU_DYNAMIC_SAMPLER_2DIMAGE */
+ int texnumber; /* when type=GPU_DYNAMIC_SAMPLER, texture number: 0.. */
+ unsigned char *texpixels; /* for internally generated texture, pixel data in RGBA format */
+ int texsize; /* size in pixel of the texture in texpixels buffer: for 2D textures, this is S and T size (square texture) */
+} GPUInputUniform;
+
+typedef struct GPUInputAttribute {
+ struct GPUInputAttribute *next, *prev;
+ char varname[32]; /* name of attribute in shader */
+ int type; /* from CustomData.type, data type derives from it */
+ GPUDataType datatype; /* type of attribute data */
+ const char *name; /* layer name */
+ int number; /* generic attribute number */
+} GPUInputAttribute;
+
+typedef struct GPUShaderExport {
+ ListBase uniforms;
+ ListBase attributes;
+ char *vertex;
+ char *fragment;
+} GPUShaderExport;
+
+GPUShaderExport *GPU_shader_export(struct Scene *scene, struct Material *ma);
+void GPU_free_shader_export(GPUShaderExport *shader);
+
/* Lamps */
GPULamp *GPU_lamp_from_blender(struct Scene *scene, struct Object *ob, struct Object *par);
diff --git a/source/blender/gpu/SConscript b/source/blender/gpu/SConscript
index b48e1d5a8e2..adb52d577a1 100644
--- a/source/blender/gpu/SConscript
+++ b/source/blender/gpu/SConscript
@@ -5,7 +5,7 @@ sources = env.Glob('intern/*.c')
defs = [ 'GLEW_STATIC' ]
-incs = '../blenlib ../blenkernel ../makesdna ../include ../blenloader'
+incs = '../blenlib ../blenkernel ../makesdna ../makesrna ../include ../blenloader'
incs += ' #/extern/glew/include #intern/guardedalloc #intern/smoke/extern ../imbuf .'
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c
index 360f3dbf63f..b47f6687720 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -64,101 +64,9 @@ extern char datatoc_gpu_shader_vertex_glsl[];
/* structs and defines */
-typedef enum GPUDataSource {
- GPU_SOURCE_VEC_UNIFORM,
- GPU_SOURCE_BUILTIN,
- GPU_SOURCE_TEX_PIXEL,
- GPU_SOURCE_TEX,
- GPU_SOURCE_ATTRIB
-} GPUDataSource;
-
static const char* GPU_DATATYPE_STR[17] = {"", "float", "vec2", "vec3", "vec4",
NULL, NULL, NULL, NULL, "mat3", NULL, NULL, NULL, NULL, NULL, NULL, "mat4"};
-struct GPUNode {
- struct GPUNode *next, *prev;
-
- const char *name;
- int tag;
-
- ListBase inputs;
- ListBase outputs;
-};
-
-struct GPUNodeLink {
- GPUNodeStack *socket;
-
- int attribtype;
- const char *attribname;
-
- int image;
-
- int texture;
- int texturesize;
-
- void *ptr1, *ptr2;
-
- int dynamic;
-
- int type;
- int users;
-
- GPUTexture *dynamictex;
-
- GPUBuiltin builtin;
-
- struct GPUOutput *output;
-};
-
-typedef struct GPUOutput {
- struct GPUOutput *next, *prev;
-
- GPUNode *node;
- int type; /* data type = length of vector/matrix */
- GPUNodeLink *link; /* output link */
- int id; /* unique id as created by code generator */
-} GPUOutput;
-
-typedef struct GPUInput {
- struct GPUInput *next, *prev;
-
- GPUNode *node;
-
- int type; /* datatype */
- int source; /* data source */
-
- int id; /* unique id as created by code generator */
- int texid; /* number for multitexture */
- int attribid; /* id for vertex attributes */
- int bindtex; /* input is responsible for binding the texture? */
- int definetex; /* input is responsible for defining the pixel? */
- int textarget; /* GL_TEXTURE_* */
- int textype; /* datatype */
-
- struct Image *ima; /* image */
- struct ImageUser *iuser;/* image user */
- float *dynamicvec; /* vector data in case it is dynamic */
- GPUTexture *tex; /* input texture, only set at runtime */
- int shaderloc; /* id from opengl */
- char shadername[32]; /* name in shader */
-
- float vec[16]; /* vector data */
- GPUNodeLink *link;
- int dynamictex; /* dynamic? */
- int attribtype; /* attribute type */
- char attribname[32]; /* attribute name */
- int attribfirst; /* this is the first one that is bound */
- GPUBuiltin builtin; /* builtin uniform */
-} GPUInput;
-
-struct GPUPass {
- struct GPUPass *next, *prev;
-
- ListBase inputs;
- struct GPUOutput *output;
- struct GPUShader *shader;
-};
-
/* GLSL code parsing for finding function definitions.
* These are stored in a hash for lookup when creating a material. */
@@ -185,7 +93,7 @@ static char *gpu_str_skip_token(char *str, char *token, int max)
/* skip a variable/function name */
while(*str) {
- if(ELEM6(*str, ' ', '(', ')', ',', '\t', '\n'))
+ if(ELEM7(*str, ' ', '(', ')', ',', '\t', '\n', '\r'))
break;
else {
if(token && len < max-1) {
@@ -203,7 +111,7 @@ static char *gpu_str_skip_token(char *str, char *token, int max)
/* skip the next special characters:
* note the missing ')' */
while(*str) {
- if(ELEM5(*str, ' ', '(', ',', '\t', '\n'))
+ if(ELEM6(*str, ' ', '(', ',', '\t', '\n', '\r'))
str++;
else
break;
@@ -245,8 +153,6 @@ static void gpu_parse_functions_string(GHash *hash, char *code)
if(!type && gpu_str_prefix(code, "sampler2DShadow"))
type= GPU_SHADOW2D;
- if(!type && gpu_str_prefix(code, "sampler1D"))
- type= GPU_TEX1D;
if(!type && gpu_str_prefix(code, "sampler2D"))
type= GPU_TEX2D;
@@ -298,9 +204,7 @@ static char *gpu_generate_function_prototyps(GHash *hash)
else if(function->paramqual[a] == FUNCTION_QUAL_INOUT)
BLI_dynstr_append(ds, "inout ");
- if(function->paramtype[a] == GPU_TEX1D)
- BLI_dynstr_append(ds, "sampler1D");
- else if(function->paramtype[a] == GPU_TEX2D)
+ if(function->paramtype[a] == GPU_TEX2D)
BLI_dynstr_append(ds, "sampler2D");
else if(function->paramtype[a] == GPU_SHADOW2D)
BLI_dynstr_append(ds, "sampler2DShadow");
@@ -542,7 +446,6 @@ static void codegen_print_uniforms_functions(DynStr *ds, ListBase *nodes)
/* create exactly one sampler for each texture */
if (codegen_input_has_texture(input) && input->bindtex)
BLI_dynstr_appendf(ds, "uniform %s samp%d;\n",
- (input->textype == GPU_TEX1D)? "sampler1D":
(input->textype == GPU_TEX2D)? "sampler2D": "sampler2DShadow",
input->texid);
}
@@ -947,6 +850,7 @@ static void gpu_node_input_link(GPUNode *node, GPUNodeLink *link, int type)
input->textarget = GL_TEXTURE_2D;
input->textype = type;
input->dynamictex = 1;
+ input->dynamicdata = link->ptr2;
MEM_freeN(link);
}
else if(link->texture) {
@@ -955,14 +859,9 @@ static void gpu_node_input_link(GPUNode *node, GPUNodeLink *link, int type)
input->source = GPU_SOURCE_TEX;
input->textype = type;
- if (type == GPU_TEX1D) {
- input->tex = GPU_texture_create_1D(link->texturesize, link->ptr1, NULL);
- input->textarget = GL_TEXTURE_1D;
- }
- else {
- input->tex = GPU_texture_create_2D(link->texturesize, link->texturesize, link->ptr2, NULL);
- input->textarget = GL_TEXTURE_2D;
- }
+ //input->tex = GPU_texture_create_2D(link->texturesize, link->texturesize, link->ptr2, NULL);
+ input->tex = GPU_texture_create_2D(link->texturesize, 1, link->ptr1, NULL);
+ input->textarget = GL_TEXTURE_2D;
MEM_freeN(link->ptr1);
MEM_freeN(link);
@@ -993,8 +892,11 @@ static void gpu_node_input_link(GPUNode *node, GPUNodeLink *link, int type)
input->source = GPU_SOURCE_VEC_UNIFORM;
memcpy(input->vec, link->ptr1, type*sizeof(float));
- if(link->dynamic)
+ if(link->dynamic) {
input->dynamicvec= link->ptr1;
+ input->dynamictype= link->dynamictype;
+ input->dynamicdata= link->ptr2;
+ }
MEM_freeN(link);
}
@@ -1102,12 +1004,12 @@ static void gpu_nodes_get_vertex_attributes(ListBase *nodes, GPUVertexAttribs *a
input->attribfirst = 1;
attribs->layer[a].type = input->attribtype;
- attribs->layer[a].glindex = input->attribid;
+ attribs->layer[a].attribid = input->attribid;
BLI_strncpy(attribs->layer[a].name, input->attribname,
sizeof(attribs->layer[a].name));
}
else
- input->attribid = attribs->layer[a].glindex;
+ input->attribid = attribs->layer[a].attribid;
}
}
}
@@ -1148,13 +1050,15 @@ GPUNodeLink *GPU_uniform(float *num)
return link;
}
-GPUNodeLink *GPU_dynamic_uniform(float *num)
+GPUNodeLink *GPU_dynamic_uniform(float *num, int dynamictype, void *data)
{
GPUNodeLink *link = GPU_node_link_create(0);
link->ptr1= num;
- link->ptr2= NULL;
+ link->ptr2= data;
link->dynamic= 1;
+ link->dynamictype = dynamictype;
+
return link;
}
@@ -1181,12 +1085,14 @@ GPUNodeLink *GPU_texture(int size, float *pixels)
return link;
}
-GPUNodeLink *GPU_dynamic_texture(GPUTexture *tex)
+GPUNodeLink *GPU_dynamic_texture(GPUTexture *tex, int dynamictype, void *data)
{
GPUNodeLink *link = GPU_node_link_create(0);
link->dynamic = 1;
link->dynamictex = tex;
+ link->dynamictype = dynamictype;
+ link->ptr2 = data;
return link;
}
@@ -1389,8 +1295,6 @@ GPUPass *GPU_generate_pass(ListBase *nodes, GPUNodeLink *outlink, GPUVertexAttri
fragmentcode = code_generate_fragment(nodes, outlink->output, name);
vertexcode = code_generate_vertex(nodes);
shader = GPU_shader_create(vertexcode, fragmentcode, datatoc_gpu_shader_material_glsl); /*FUNCTION_LIB);*/
- MEM_freeN(fragmentcode);
- MEM_freeN(vertexcode);
/* failed? */
if (!shader) {
@@ -1405,6 +1309,9 @@ GPUPass *GPU_generate_pass(ListBase *nodes, GPUNodeLink *outlink, GPUVertexAttri
pass->output = outlink->output;
pass->shader = shader;
+ pass->fragmentcode = fragmentcode;
+ pass->vertexcode = vertexcode;
+ pass->libcode = datatoc_gpu_shader_material_glsl;
/* extract dynamic inputs and throw away nodes */
GPU_nodes_extract_dynamic_inputs(pass, nodes);
@@ -1417,6 +1324,10 @@ void GPU_pass_free(GPUPass *pass)
{
GPU_shader_free(pass->shader);
GPU_inputs_free(&pass->inputs);
+ if (pass->fragmentcode)
+ MEM_freeN(pass->fragmentcode);
+ if (pass->vertexcode)
+ MEM_freeN(pass->vertexcode);
MEM_freeN(pass);
}
diff --git a/source/blender/gpu/intern/gpu_codegen.h b/source/blender/gpu/intern/gpu_codegen.h
index b0a131f5989..1e44eba89d4 100644
--- a/source/blender/gpu/intern/gpu_codegen.h
+++ b/source/blender/gpu/intern/gpu_codegen.h
@@ -39,12 +39,15 @@
#define __GPU_CODEGEN_H__
#include "DNA_listBase.h"
+#include "GPU_material.h"
+#include "GL/glew.h"
struct ListBase;
struct GPUShader;
struct GPUOutput;
struct GPUNode;
struct GPUVertexAttribs;
+struct GPUFrameBuffer;
#define MAX_FUNCTION_NAME 64
#define MAX_PARAMETER 32
@@ -68,7 +71,105 @@ GPUFunction *GPU_lookup_function(const char *name);
at the end if used.
*/
-struct GPUPass;
+typedef enum GPUDataSource {
+ GPU_SOURCE_VEC_UNIFORM,
+ GPU_SOURCE_BUILTIN,
+ GPU_SOURCE_TEX_PIXEL,
+ GPU_SOURCE_TEX,
+ GPU_SOURCE_ATTRIB
+} GPUDataSource;
+
+struct GPUNode {
+ struct GPUNode *next, *prev;
+
+ const char *name;
+ int tag;
+
+ ListBase inputs;
+ ListBase outputs;
+};
+
+struct GPUNodeLink {
+ GPUNodeStack *socket;
+
+ int attribtype;
+ const char *attribname;
+
+ int image;
+
+ int texture;
+ int texturesize;
+
+ void *ptr1, *ptr2;
+
+ int dynamic;
+ int dynamictype;
+
+ int type;
+ int users;
+
+ GPUTexture *dynamictex;
+
+ GPUBuiltin builtin;
+
+ struct GPUOutput *output;
+};
+
+typedef struct GPUOutput {
+ struct GPUOutput *next, *prev;
+
+ GPUNode *node;
+ int type; /* data type = length of vector/matrix */
+ GPUNodeLink *link; /* output link */
+ int id; /* unique id as created by code generator */
+} GPUOutput;
+
+typedef struct GPUInput {
+ struct GPUInput *next, *prev;
+
+ GPUNode *node;
+
+ int type; /* datatype */
+ int source; /* data source */
+
+ int id; /* unique id as created by code generator */
+ int texid; /* number for multitexture */
+ int attribid; /* id for vertex attributes */
+ int bindtex; /* input is responsible for binding the texture? */
+ int definetex; /* input is responsible for defining the pixel? */
+ int textarget; /* GL_TEXTURE_* */
+ int textype; /* datatype */
+
+ struct Image *ima; /* image */
+ struct ImageUser *iuser;/* image user */
+ float *dynamicvec; /* vector data in case it is dynamic */
+ int dynamictype; /* origin of the dynamic uniform (GPUDynamicType) */
+ void *dynamicdata; /* data source of the dynamic uniform */
+ GPUTexture *tex; /* input texture, only set at runtime */
+ int shaderloc; /* id from opengl */
+ char shadername[32]; /* name in shader */
+
+ float vec[16]; /* vector data */
+ GPUNodeLink *link;
+ int dynamictex; /* dynamic? */
+ int attribtype; /* attribute type */
+ char attribname[32]; /* attribute name */
+ int attribfirst; /* this is the first one that is bound */
+ GPUBuiltin builtin; /* builtin uniform */
+} GPUInput;
+
+struct GPUPass {
+ struct GPUPass *next, *prev;
+
+ ListBase inputs;
+ struct GPUOutput *output;
+ struct GPUShader *shader;
+ char *fragmentcode;
+ char *vertexcode;
+ const char *libcode;
+};
+
+
typedef struct GPUPass GPUPass;
GPUPass *GPU_generate_pass(ListBase *nodes, struct GPUNodeLink *outlink,
diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c
index c9f1b093b7a..fb9f21cde8c 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -423,7 +423,7 @@ static GPUTexture *GPU_texture_create_nD(int w, int h, int n, float *fpixels, in
if (tex->target != GL_TEXTURE_1D) {
/* CLAMP_TO_BORDER is an OpenGL 1.3 core feature */
- GLenum wrapmode = (depth)? GL_CLAMP_TO_EDGE: GL_CLAMP_TO_BORDER;
+ GLenum wrapmode = (depth || tex->h == 1)? GL_CLAMP_TO_EDGE: GL_CLAMP_TO_BORDER;
glTexParameteri(tex->target, GL_TEXTURE_WRAP_S, wrapmode);
glTexParameteri(tex->target, GL_TEXTURE_WRAP_T, wrapmode);
@@ -685,6 +685,11 @@ int GPU_texture_opengl_height(GPUTexture *tex)
return tex->h;
}
+int GPU_texture_opengl_bindcode(GPUTexture *tex)
+{
+ return tex->bindcode;
+}
+
GPUFrameBuffer *GPU_texture_framebuffer(GPUTexture *tex)
{
return tex->fb;
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index 15b96b6d808..9aa453af4d6 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -175,7 +175,7 @@ static void gpu_material_set_attrib_id(GPUMaterial *material)
* removed by the glsl compiler by dead code elimination */
for(a=0, b=0; a<attribs->totlayer; a++) {
- sprintf(name, "att%d", attribs->layer[a].glindex);
+ sprintf(name, "att%d", attribs->layer[a].attribid);
attribs->layer[a].glindex = GPU_shader_get_attribute(shader, name);
if(attribs->layer[a].glindex >= 0) {
@@ -386,12 +386,12 @@ static GPUNodeLink *lamp_get_visibility(GPUMaterial *mat, GPULamp *lamp, GPUNode
/* from get_lamp_visibility */
if(lamp->type==LA_SUN || lamp->type==LA_HEMI) {
mat->dynproperty |= DYN_LAMP_VEC;
- GPU_link(mat, "lamp_visibility_sun_hemi", GPU_dynamic_uniform(lamp->dynvec), lv, dist, &visifac);
+ GPU_link(mat, "lamp_visibility_sun_hemi", GPU_dynamic_uniform(lamp->dynvec, GPU_DYNAMIC_LAMP_DYNVEC, lamp->ob), lv, dist, &visifac);
return visifac;
}
else {
mat->dynproperty |= DYN_LAMP_CO;
- GPU_link(mat, "lamp_visibility_other", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->dynco), lv, dist, &visifac);
+ GPU_link(mat, "lamp_visibility_other", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->dynco, GPU_DYNAMIC_LAMP_DYNCO, lamp->ob), lv, dist, &visifac);
if(lamp->type==LA_AREA)
return visifac;
@@ -426,11 +426,11 @@ static GPUNodeLink *lamp_get_visibility(GPUMaterial *mat, GPULamp *lamp, GPUNode
if(lamp->type == LA_SPOT) {
if(lamp->mode & LA_SQUARE) {
mat->dynproperty |= DYN_LAMP_VEC|DYN_LAMP_IMAT;
- GPU_link(mat, "lamp_visibility_spot_square", GPU_dynamic_uniform(lamp->dynvec), GPU_dynamic_uniform((float*)lamp->dynimat), *lv, &inpr);
+ GPU_link(mat, "lamp_visibility_spot_square", GPU_dynamic_uniform(lamp->dynvec, GPU_DYNAMIC_LAMP_DYNVEC, lamp->ob), GPU_dynamic_uniform((float*)lamp->dynimat, GPU_DYNAMIC_LAMP_DYNIMAT, lamp->ob), *lv, &inpr);
}
else {
mat->dynproperty |= DYN_LAMP_VEC;
- GPU_link(mat, "lamp_visibility_spot_circle", GPU_dynamic_uniform(lamp->dynvec), *lv, &inpr);
+ GPU_link(mat, "lamp_visibility_spot_circle", GPU_dynamic_uniform(lamp->dynvec, GPU_DYNAMIC_LAMP_DYNVEC, lamp->ob), *lv, &inpr);
}
GPU_link(mat, "lamp_visibility_spot", GPU_uniform(&lamp->spotsi), GPU_uniform(&lamp->spotbl), inpr, visifac, &visifac);
@@ -646,7 +646,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
float area[4][4]= {{0.0f}}, areasize= 0.0f;
mat->dynproperty |= DYN_LAMP_VEC|DYN_LAMP_CO;
- GPU_link(mat, "shade_inp_area", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->dynco), GPU_dynamic_uniform(lamp->dynvec), vn, GPU_uniform((float*)area),
+ GPU_link(mat, "shade_inp_area", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->dynco, GPU_DYNAMIC_LAMP_DYNCO, lamp->ob), GPU_dynamic_uniform(lamp->dynvec, GPU_DYNAMIC_LAMP_DYNVEC, lamp->ob), vn, GPU_uniform((float*)area),
GPU_uniform(&areasize), GPU_uniform(&lamp->k), &inp);
}
@@ -684,13 +684,13 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
GPU_link(mat, "test_shadowbuf",
GPU_builtin(GPU_VIEW_POSITION),
- GPU_dynamic_texture(lamp->tex),
- GPU_dynamic_uniform((float*)lamp->dynpersmat),
+ GPU_dynamic_texture(lamp->tex, GPU_DYNAMIC_SAMPLER_2DSHADOW, lamp->ob),
+ GPU_dynamic_uniform((float*)lamp->dynpersmat, GPU_DYNAMIC_LAMP_DYNPERSMAT, lamp->ob),
GPU_uniform(&lamp->bias), inp, &shadfac);
if(lamp->mode & LA_ONLYSHADOW) {
GPU_link(mat, "shade_only_shadow", i, shadfac,
- GPU_dynamic_uniform(&lamp->dynenergy), &shadfac);
+ GPU_dynamic_uniform(&lamp->dynenergy, GPU_DYNAMIC_LAMP_DYNENERGY, lamp->ob), &shadfac);
if(!(lamp->mode & LA_NO_DIFF))
GPU_link(mat, "shade_only_shadow_diffuse", shadfac, shi->rgb,
@@ -719,7 +719,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
if(GPU_link_changed(shi->refl) || ma->ref != 0.0f) {
if(!(lamp->mode & LA_NO_DIFF)) {
GPUNodeLink *rgb;
- GPU_link(mat, "shade_mul_value", i, GPU_dynamic_uniform(lamp->dyncol), &rgb);
+ GPU_link(mat, "shade_mul_value", i, GPU_dynamic_uniform(lamp->dyncol, GPU_DYNAMIC_LAMP_DYNCOL, lamp->ob), &rgb);
add_to_diffuse(mat, ma, shi, is, rgb, &shr->diff);
}
}
@@ -729,7 +729,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
(GPU_link_changed(shi->spec) || ma->spec != 0.0f)) {
if(lamp->type == LA_HEMI) {
GPU_link(mat, "shade_hemi_spec", vn, lv, view, GPU_uniform(&ma->spec), shi->har, visifac, &t);
- GPU_link(mat, "shade_add_spec", t, GPU_dynamic_uniform(lamp->dyncol), shi->specrgb, &outcol);
+ GPU_link(mat, "shade_add_spec", t, GPU_dynamic_uniform(lamp->dyncol, GPU_DYNAMIC_LAMP_DYNCOL, lamp->ob), shi->specrgb, &outcol);
GPU_link(mat, "shade_add_clamped", shr->spec, outcol, &shr->spec);
}
else {
@@ -752,11 +752,11 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
if(ma->mode & MA_RAMP_SPEC) {
GPUNodeLink *spec;
do_specular_ramp(shi, specfac, t, &spec);
- GPU_link(mat, "shade_add_spec", t, GPU_dynamic_uniform(lamp->dyncol), spec, &outcol);
+ GPU_link(mat, "shade_add_spec", t, GPU_dynamic_uniform(lamp->dyncol, GPU_DYNAMIC_LAMP_DYNCOL, lamp->ob), spec, &outcol);
GPU_link(mat, "shade_add_clamped", shr->spec, outcol, &shr->spec);
}
else {
- GPU_link(mat, "shade_add_spec", t, GPU_dynamic_uniform(lamp->dyncol), shi->specrgb, &outcol);
+ GPU_link(mat, "shade_add_spec", t, GPU_dynamic_uniform(lamp->dyncol, GPU_DYNAMIC_LAMP_DYNCOL, lamp->ob), shi->specrgb, &outcol);
GPU_link(mat, "shade_add_clamped", shr->spec, outcol, &shr->spec);
}
}
@@ -1676,3 +1676,187 @@ int GPU_lamp_shadow_layer(GPULamp *lamp)
return -1;
}
+/* export the GLSL shader */
+
+GPUShaderExport *GPU_shader_export(struct Scene *scene, struct Material *ma)
+{
+ static struct {
+ GPUBuiltin gputype;
+ GPUDynamicType dynamictype;
+ GPUDataType datatype;
+ } builtins[] = {
+ { GPU_VIEW_MATRIX, GPU_DYNAMIC_OBJECT_VIEWMAT, GPU_DATA_16F },
+ { GPU_INVERSE_VIEW_MATRIX, GPU_DYNAMIC_OBJECT_VIEWIMAT, GPU_DATA_16F },
+ { GPU_OBJECT_MATRIX, GPU_DYNAMIC_OBJECT_MAT, GPU_DATA_16F },
+ { GPU_INVERSE_OBJECT_MATRIX, GPU_DYNAMIC_OBJECT_IMAT, GPU_DATA_16F },
+ { GPU_OBCOLOR, GPU_DYNAMIC_OBJECT_COLOR, GPU_DATA_4F },
+ { 0 }
+ };
+
+ GPUShaderExport *shader = NULL;
+ GPUPass *pass;
+ GPUInput *input;
+ GPUMaterial *mat;
+ GPUInputUniform *uniform;
+ GPUInputAttribute *attribute;
+ GLint lastbindcode;
+ int i, liblen, fraglen;
+
+ if(!GPU_glsl_support())
+ return NULL;
+
+ mat = GPU_material_from_blender(scene, ma);
+ pass = (mat)? mat->pass: NULL;
+
+ if(pass && pass->fragmentcode && pass->vertexcode) {
+ shader = MEM_callocN(sizeof(GPUShaderExport), "GPUShaderExport");
+
+ for(input = pass->inputs.first; input; input = input->next) {
+ uniform = MEM_callocN(sizeof(GPUInputUniform), "GPUInputUniform");
+
+ if(input->ima) {
+ /* image sampler uniform */
+ uniform->type = GPU_DYNAMIC_SAMPLER_2DIMAGE;
+ uniform->datatype = GPU_DATA_1I;
+ uniform->image = input->ima;
+ uniform->texnumber = input->texid;
+ BLI_strncpy(uniform->varname, input->shadername, sizeof(uniform->varname));
+ }
+ else if(input->tex) {
+ /* generated buffer */
+ uniform->texnumber = input->texid;
+ uniform->datatype = GPU_DATA_1I;
+ BLI_strncpy(uniform->varname, input->shadername, sizeof(uniform->varname));
+
+ switch(input->textype) {
+ case GPU_SHADOW2D:
+ uniform->type = GPU_DYNAMIC_SAMPLER_2DSHADOW;
+ uniform->lamp = input->dynamicdata;
+ break;
+ case GPU_TEX2D:
+ if(GPU_texture_opengl_bindcode(input->tex)) {
+ uniform->type = GPU_DYNAMIC_SAMPLER_2DBUFFER;
+ glGetIntegerv(GL_TEXTURE_BINDING_2D, &lastbindcode);
+ glBindTexture(GL_TEXTURE_2D, GPU_texture_opengl_bindcode(input->tex));
+ uniform->texsize = GPU_texture_opengl_width(input->tex) * GPU_texture_opengl_height(input->tex);
+ uniform->texpixels = MEM_mallocN(uniform->texsize*4, "RGBApixels");
+ glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, uniform->texpixels);
+ glBindTexture(GL_TEXTURE_2D, lastbindcode);
+ }
+ break;
+ }
+ }
+ else {
+ uniform->type = input->dynamictype;
+ BLI_strncpy(uniform->varname, input->shadername, sizeof(uniform->varname));
+ switch(input->type) {
+ case 1:
+ uniform->datatype = GPU_DATA_1F;
+ break;
+ case 2:
+ uniform->datatype = GPU_DATA_2F;
+ break;
+ case 3:
+ uniform->datatype = GPU_DATA_3F;
+ break;
+ case 4:
+ uniform->datatype = GPU_DATA_4F;
+ break;
+ case 9:
+ uniform->datatype = GPU_DATA_9F;
+ break;
+ case 16:
+ uniform->datatype = GPU_DATA_16F;
+ break;
+ }
+
+ if(uniform->type >= GPU_DYNAMIC_LAMP_FIRST && uniform->type <= GPU_DYNAMIC_LAMP_LAST)
+ uniform->lamp = input->dynamicdata;
+ }
+
+ if(uniform->type != GPU_DYNAMIC_NONE)
+ BLI_addtail(&shader->uniforms, uniform);
+ else
+ MEM_freeN(uniform);
+ }
+
+ /* process builtin uniform */
+ for(i=0; builtins[i].gputype; i++) {
+ if(mat->builtins & builtins[i].gputype) {
+ uniform = MEM_callocN(sizeof(GPUInputUniform), "GPUInputUniform");
+ uniform->type = builtins[i].dynamictype;
+ uniform->datatype = builtins[i].datatype;
+ BLI_strncpy(uniform->varname, GPU_builtin_name(builtins[i].gputype), sizeof(uniform->varname));
+ BLI_addtail(&shader->uniforms, uniform);
+ }
+ }
+
+ // now link fragement shader with library shader
+ // TBD: remove the function that are not used in the main function
+ liblen = (pass->libcode) ? strlen(pass->libcode) : 0;
+ fraglen = strlen(pass->fragmentcode);
+ shader->fragment = (char *)MEM_mallocN(liblen+fraglen+1, "GPUFragShader");
+ if(pass->libcode)
+ memcpy(shader->fragment, pass->libcode, liblen);
+ memcpy(&shader->fragment[liblen], pass->fragmentcode, fraglen);
+ shader->fragment[liblen+fraglen] = 0;
+
+ // export the attribute
+ for(i=0; i<mat->attribs.totlayer; i++) {
+ attribute = MEM_callocN(sizeof(GPUInputAttribute), "GPUInputAttribute");
+ attribute->type = mat->attribs.layer[i].type;
+ attribute->number = mat->attribs.layer[i].glindex;
+ BLI_snprintf(attribute->varname, sizeof(attribute->varname), "att%d", mat->attribs.layer[i].attribid);
+
+ switch(attribute->type) {
+ case CD_TANGENT:
+ attribute->datatype = GPU_DATA_4F;
+ break;
+ case CD_MTFACE:
+ attribute->datatype = GPU_DATA_2F;
+ attribute->name = mat->attribs.layer[i].name;
+ break;
+ case CD_MCOL:
+ attribute->datatype = GPU_DATA_4UB;
+ attribute->name = mat->attribs.layer[i].name;
+ break;
+ case CD_ORCO:
+ attribute->datatype = GPU_DATA_3F;
+ break;
+ }
+
+ if(attribute->datatype != GPU_DATA_NONE)
+ BLI_addtail(&shader->attributes, attribute);
+ else
+ MEM_freeN(attribute);
+ }
+
+ // export the vertex shader
+ shader->vertex = BLI_strdup(pass->vertexcode);
+ }
+
+ return shader;
+}
+
+void GPU_free_shader_export(GPUShaderExport *shader)
+{
+ GPUInputUniform *uniform;
+
+ if(shader == NULL)
+ return;
+
+ for(uniform = shader->uniforms.first; uniform; uniform=uniform->next)
+ if(uniform->texpixels)
+ MEM_freeN(uniform->texpixels);
+
+ BLI_freelistN(&shader->uniforms);
+ BLI_freelistN(&shader->attributes);
+
+ if(shader->vertex)
+ MEM_freeN(shader->vertex);
+ if(shader->fragment)
+ MEM_freeN(shader->fragment);
+
+ MEM_freeN(shader);
+}
+
diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl b/source/blender/gpu/intern/gpu_shader_material.glsl
index 815b74a1bf4..c5c822d9224 100644
--- a/source/blender/gpu/intern/gpu_shader_material.glsl
+++ b/source/blender/gpu/intern/gpu_shader_material.glsl
@@ -308,22 +308,22 @@ void normal(vec3 dir, vec3 nor, out vec3 outnor, out float outdot)
outdot = -dot(dir, nor);
}
-void curves_vec(float fac, vec3 vec, sampler1D curvemap, out vec3 outvec)
+void curves_vec(float fac, vec3 vec, sampler2D curvemap, out vec3 outvec)
{
- outvec.x = texture1D(curvemap, (vec.x + 1.0)*0.5).x;
- outvec.y = texture1D(curvemap, (vec.y + 1.0)*0.5).y;
- outvec.z = texture1D(curvemap, (vec.z + 1.0)*0.5).z;
+ outvec.x = texture2D(curvemap, vec2((vec.x + 1.0)*0.5, 0.0)).x;
+ outvec.y = texture2D(curvemap, vec2((vec.y + 1.0)*0.5, 0.0)).y;
+ outvec.z = texture2D(curvemap, vec2((vec.z + 1.0)*0.5, 0.0)).z;
if (fac != 1.0)
outvec = (outvec*fac) + (vec*(1.0-fac));
}
-void curves_rgb(float fac, vec4 col, sampler1D curvemap, out vec4 outcol)
+void curves_rgb(float fac, vec4 col, sampler2D curvemap, out vec4 outcol)
{
- outcol.r = texture1D(curvemap, texture1D(curvemap, col.r).a).r;
- outcol.g = texture1D(curvemap, texture1D(curvemap, col.g).a).g;
- outcol.b = texture1D(curvemap, texture1D(curvemap, col.b).a).b;
+ outcol.r = texture2D(curvemap, vec2(texture2D(curvemap, vec2(col.r, 0.0)).a, 0.0)).r;
+ outcol.g = texture2D(curvemap, vec2(texture2D(curvemap, vec2(col.g, 0.0)).a, 0.0)).g;
+ outcol.b = texture2D(curvemap, vec2(texture2D(curvemap, vec2(col.b, 0.0)).a, 0.0)).b;
if (fac != 1.0)
outcol = (outcol*fac) + (col*(1.0-fac));
@@ -635,9 +635,9 @@ void mix_linear(float fac, vec4 col1, vec4 col2, out vec4 outcol)
outcol.b= col1.b + fac*(2.0*(col2.b) - 1.0);
}
-void valtorgb(float fac, sampler1D colormap, out vec4 outcol, out float outalpha)
+void valtorgb(float fac, sampler2D colormap, out vec4 outcol, out float outalpha)
{
- outcol = texture1D(colormap, fac);
+ outcol = texture2D(colormap, vec2(fac, 0.0));
outalpha = outcol.a;
}
@@ -1320,9 +1320,9 @@ void lamp_falloff_sliders(float lampdist, float ld1, float ld2, float dist, out
visifac *= lampdistkw/(lampdistkw + ld2*dist*dist);
}
-void lamp_falloff_curve(float lampdist, sampler1D curvemap, float dist, out float visifac)
+void lamp_falloff_curve(float lampdist, sampler2D curvemap, float dist, out float visifac)
{
- visifac = texture1D(curvemap, dist/lampdist).x;
+ visifac = texture2D(curvemap, vec2(dist/lampdist, 0.0)).x;
}
void lamp_visibility_sphere(float lampdist, float dist, float visifac, out float outvisifac)
diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl.c b/source/blender/gpu/intern/gpu_shader_material.glsl.c
index 87a8ed65532..b551ee9dda1 100644
--- a/source/blender/gpu/intern/gpu_shader_material.glsl.c
+++ b/source/blender/gpu/intern/gpu_shader_material.glsl.c
@@ -1,935 +1,939 @@
/* DataToC output of file <gpu_shader_material_glsl> */
-int datatoc_gpu_shader_material_glsl_size= 39789;
+int datatoc_gpu_shader_material_glsl_size= 39910;
char datatoc_gpu_shader_material_glsl[]= {
- 10,102,108,111, 97,116, 32,101,120,112, 95, 98,108,
-101,110,100,101,114, 40,102,108,111, 97,116, 32,102, 41, 10,123, 10, 9,114,101,116,117,114,110, 32,112,111,119, 40, 50, 46, 55,
- 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114,103, 98, 95,116,111, 95,104,
-115,118, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,
- 9,102,108,111, 97,116, 32, 99,109, 97,120, 44, 32, 99,109,105,110, 44, 32,104, 44, 32,115, 44, 32,118, 44, 32, 99,100,101,108,
-116, 97, 59, 10, 9,118,101, 99, 51, 32, 99, 59, 10, 10, 9, 99,109, 97,120, 32, 61, 32,109, 97,120, 40,114,103, 98, 91, 48, 93,
- 44, 32,109, 97,120, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10, 9, 99,109,105,110, 32, 61, 32,
-109,105,110, 40,114,103, 98, 91, 48, 93, 44, 32,109,105,110, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41,
- 59, 10, 9, 99,100,101,108,116, 97, 32, 61, 32, 99,109, 97,120, 45, 99,109,105,110, 59, 10, 10, 9,118, 32, 61, 32, 99,109, 97,
-120, 59, 10, 9,105,102, 32, 40, 99,109, 97,120, 33, 61, 48, 46, 48, 41, 10, 9, 9,115, 32, 61, 32, 99,100,101,108,116, 97, 47,
- 99,109, 97,120, 59, 10, 9,101,108,115,101, 32,123, 10, 9, 9,115, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,104, 32, 61, 32, 48,
- 46, 48, 59, 10, 9,125, 10, 10, 9,105,102, 32, 40,115, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,104, 32, 61, 32, 48,
- 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9, 99, 32, 61, 32, 40,118,101, 99, 51, 40, 99,109, 97,120, 44,
- 32, 99,109, 97,120, 44, 32, 99,109, 97,120, 41, 32, 45, 32,114,103, 98, 46,120,121,122, 41, 47, 99,100,101,108,116, 97, 59, 10,
- 10, 9, 9,105,102, 32, 40,114,103, 98, 46,120, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 99, 91, 50, 93, 32, 45, 32, 99,
- 91, 49, 93, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,114,103, 98, 46,121, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61,
- 32, 50, 46, 48, 32, 43, 32, 99, 91, 48, 93, 32, 45, 32, 32, 99, 91, 50, 93, 59, 10, 9, 9,101,108,115,101, 32,104, 32, 61, 32,
- 52, 46, 48, 32, 43, 32, 99, 91, 49, 93, 32, 45, 32, 99, 91, 48, 93, 59, 10, 10, 9, 9,104, 32, 47, 61, 32, 54, 46, 48, 59, 10,
- 10, 9, 9,105,102, 32, 40,104, 60, 48, 46, 48, 41, 10, 9, 9, 9,104, 32, 43, 61, 32, 49, 46, 48, 59, 10, 9,125, 10, 10, 9,
-111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,104, 44, 32,115, 44, 32,118, 44, 32,114,103, 98, 46,119, 41, 59, 10,125,
- 10, 10,118,111,105,100, 32,104,115,118, 95,116,111, 95,114,103, 98, 40,118,101, 99, 52, 32,104,115,118, 44, 32,111,117,116, 32,
-118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,105, 44, 32,102, 44, 32,112, 44, 32,113,
- 44, 32,116, 44, 32,104, 44, 32,115, 44, 32,118, 59, 10, 9,118,101, 99, 51, 32,114,103, 98, 59, 10, 10, 9,104, 32, 61, 32,104,
-115,118, 91, 48, 93, 59, 10, 9,115, 32, 61, 32,104,115,118, 91, 49, 93, 59, 10, 9,118, 32, 61, 32,104,115,118, 91, 50, 93, 59,
- 10, 10, 9,105,102, 40,115, 61, 61, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,
-118, 44, 32,118, 41, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,105,102, 40,104, 61, 61, 49, 46, 48, 41, 10, 9,
- 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9, 10, 9, 9,104, 32, 42, 61, 32, 54, 46, 48, 59, 10, 9, 9,105, 32, 61, 32,
-102,108,111,111,114, 40,104, 41, 59, 10, 9, 9,102, 32, 61, 32,104, 32, 45, 32,105, 59, 10, 9, 9,114,103, 98, 32, 61, 32,118,
-101, 99, 51, 40,102, 44, 32,102, 44, 32,102, 41, 59, 10, 9, 9,112, 32, 61, 32,118, 42, 40, 49, 46, 48, 45,115, 41, 59, 10, 9,
- 9,113, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42,102, 41, 41, 59, 10, 9, 9,116, 32, 61, 32,118, 42, 40, 49, 46, 48,
- 45, 40,115, 42, 40, 49, 46, 48, 45,102, 41, 41, 41, 59, 10, 9, 9, 10, 9, 9,105,102, 32, 40,105, 32, 61, 61, 32, 48, 46, 48,
- 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,116, 44, 32,112, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102,
- 32, 40,105, 32, 61, 61, 32, 49, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,113, 44, 32,118, 44, 32,112, 41, 59,
- 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 50, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51,
- 40,112, 44, 32,118, 44, 32,116, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 51, 46, 48, 41, 32,
-114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,113, 44, 32,118, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,
-105, 32, 61, 61, 32, 52, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,116, 44, 32,112, 44, 32,118, 41, 59, 10, 9,
- 9,101,108,115,101, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,112, 44, 32,113, 41, 59, 10, 9,125, 10, 10, 9,
-111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 44, 32,104,115,118, 46,119, 41, 59, 10,125, 10, 10,102,108,
-111, 97,116, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123,
- 10, 9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 52, 48, 52, 53, 41, 10, 9, 9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32,
- 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 40, 49, 46, 48, 47, 49, 50, 46, 57, 50, 41, 59, 10, 9,101,108,115,
-101, 10, 9, 9,114,101,116,117,114,110, 32,112,111,119, 40, 40, 99, 32, 43, 32, 48, 46, 48, 53, 53, 41, 42, 40, 49, 46, 48, 47,
- 49, 46, 48, 53, 53, 41, 44, 32, 50, 46, 52, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,108,105,110,101, 97,114,114,103, 98,
- 95,116,111, 95,115,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123, 10, 9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 48,
- 51, 49, 51, 48, 56, 41, 10, 9, 9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32,
- 99, 32, 42, 32, 49, 50, 46, 57, 50, 59, 10, 9,101,108,115,101, 10, 9, 9,114,101,116,117,114,110, 32, 49, 46, 48, 53, 53, 32,
- 42, 32,112,111,119, 40, 99, 44, 32, 49, 46, 48, 47, 50, 46, 52, 41, 32, 45, 32, 48, 46, 48, 53, 53, 59, 10,125, 10, 10,118,111,
-105,100, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,
-111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10, 9, 99,111,108, 95,116,111, 46,114,
- 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41,
- 59, 10, 9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,
- 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,115,114,103, 98, 95,116,111,
- 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10, 9, 99,111,108, 95,116,111, 46,
- 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,108,105,110,101, 97,114,114,103,
- 98, 95,116,111, 95,115,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99,
- 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10, 9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,108,105,110,101, 97,114,114,103,
- 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10, 9, 99,111,108, 95,116,111, 46,103,
- 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41,
- 59, 10, 9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,
- 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,
-109, 46, 97, 59, 10,125, 10, 10, 35,100,101,102,105,110,101, 32, 77, 95, 80, 73, 32, 51, 46, 49, 52, 49, 53, 57, 50, 54, 53, 51,
- 53, 56, 57, 55, 57, 51, 50, 51, 56, 52, 54, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 83, 72, 65, 68, 69, 82,
- 32, 78, 79, 68, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,118, 99,
-111,108, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,
-101, 99, 52, 32,118, 99,111,108, 41, 10,123, 10, 9,118, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 97,116,116,118, 99,111,108,
- 46,120, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,121, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,
-111,108, 46,122, 47, 50, 53, 53, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,117,118, 95, 97,116,116,
-114,105, 98,117,116,101, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,
-123, 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, 40, 49, 46,
- 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,103,101,111,109, 40,118,101, 99, 51,
- 32, 99,111, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,
-118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,118,101, 99, 52, 32, 97,
-116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 44, 32,111,117,116, 32,118,101, 99,
- 51, 32,108,111, 99, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51,
- 32,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,
-109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102,114,
-111,110,116, 98, 97, 99,107, 41, 10,123, 10, 9,108,111, 99, 97,108, 32, 61, 32, 99,111, 59, 10, 9,118,105,101,119, 32, 61, 32,
-110,111,114,109, 97,108,105,122,101, 40,108,111, 99, 97,108, 41, 59, 10, 9,103,108,111, 98, 97,108, 32, 61, 32, 40,118,105,101,
-119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40,108,111, 99, 97,108, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9,
-111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10, 9,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40, 97,116,
-116,117,118, 44, 32,117,118, 41, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,110,
-111,114, 41, 59, 9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,115,
- 32,110,101,103, 97,116,101,100, 32, 42, 47, 10, 9,118, 99,111,108, 95, 97,116,116,114,105, 98,117,116,101, 40, 97,116,116,118,
- 99,111,108, 44, 32,118, 99,111,108, 41, 59, 10, 9,102,114,111,110,116, 98, 97, 99,107, 32, 61, 32, 49, 46, 48, 59, 10,125, 10,
- 10,118,111,105,100, 32,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,109, 97,116, 52, 32,109, 97,116,
- 44, 32,118,101, 99, 51, 32,109,105,110,118,101, 99, 44, 32,118,101, 99, 51, 32,109, 97,120,118,101, 99, 44, 32,102,108,111, 97,
-116, 32,100,111,109,105,110, 44, 32,102,108,111, 97,116, 32,100,111,109, 97,120, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,
-117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32, 40,109, 97,116, 32, 42, 32,118,101, 99, 52, 40,118,
-101, 99, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9,105,102, 40,100,111,109,105,110, 32, 61, 61, 32, 49, 46, 48, 41,
- 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32,109, 97,120, 40,111,117,116,118,101, 99, 44, 32,109,105,110,118,101, 99, 41, 59,
- 10, 9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32,109,105,
-110, 40,111,117,116,118,101, 99, 44, 32,109, 97,120,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32, 99, 97,109,101,114,
- 97, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,105,101,119, 44, 32,111,117,116,
- 32,102,108,111, 97,116, 32,111,117,116,100,101,112,116,104, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,105,
-115,116, 41, 10,123, 10, 9,111,117,116,100,101,112,116,104, 32, 61, 32, 97, 98,115, 40, 99,111, 46,122, 41, 59, 10, 9,111,117,
-116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,111, 41, 59, 10, 9,111,117,116,118,105,101,119, 32, 61, 32,110,
-111,114,109, 97,108,105,122,101, 40, 99,111, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,100,100, 40,102,
+ 10,102,108,111, 97,116,
+ 32,101,120,112, 95, 98,108,101,110,100,101,114, 40,102,108,111, 97,116, 32,102, 41, 10,123, 10, 9,114,101,116,117,114,110, 32,
+112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114,
+103, 98, 95,116,111, 95,104,115,118, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,
+ 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, 99,109, 97,120, 44, 32, 99,109,105,110, 44, 32,104, 44, 32,115, 44, 32,
+118, 44, 32, 99,100,101,108,116, 97, 59, 10, 9,118,101, 99, 51, 32, 99, 59, 10, 10, 9, 99,109, 97,120, 32, 61, 32,109, 97,120,
+ 40,114,103, 98, 91, 48, 93, 44, 32,109, 97,120, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10, 9,
+ 99,109,105,110, 32, 61, 32,109,105,110, 40,114,103, 98, 91, 48, 93, 44, 32,109,105,110, 40,114,103, 98, 91, 49, 93, 44, 32,114,
+103, 98, 91, 50, 93, 41, 41, 59, 10, 9, 99,100,101,108,116, 97, 32, 61, 32, 99,109, 97,120, 45, 99,109,105,110, 59, 10, 10, 9,
+118, 32, 61, 32, 99,109, 97,120, 59, 10, 9,105,102, 32, 40, 99,109, 97,120, 33, 61, 48, 46, 48, 41, 10, 9, 9,115, 32, 61, 32,
+ 99,100,101,108,116, 97, 47, 99,109, 97,120, 59, 10, 9,101,108,115,101, 32,123, 10, 9, 9,115, 32, 61, 32, 48, 46, 48, 59, 10,
+ 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 10, 9,105,102, 32, 40,115, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10,
+ 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9, 99, 32, 61, 32, 40,118,101, 99,
+ 51, 40, 99,109, 97,120, 44, 32, 99,109, 97,120, 44, 32, 99,109, 97,120, 41, 32, 45, 32,114,103, 98, 46,120,121,122, 41, 47, 99,
+100,101,108,116, 97, 59, 10, 10, 9, 9,105,102, 32, 40,114,103, 98, 46,120, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 99,
+ 91, 50, 93, 32, 45, 32, 99, 91, 49, 93, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,114,103, 98, 46,121, 61, 61, 99,109,
+ 97,120, 41, 32,104, 32, 61, 32, 50, 46, 48, 32, 43, 32, 99, 91, 48, 93, 32, 45, 32, 32, 99, 91, 50, 93, 59, 10, 9, 9,101,108,
+115,101, 32,104, 32, 61, 32, 52, 46, 48, 32, 43, 32, 99, 91, 49, 93, 32, 45, 32, 99, 91, 48, 93, 59, 10, 10, 9, 9,104, 32, 47,
+ 61, 32, 54, 46, 48, 59, 10, 10, 9, 9,105,102, 32, 40,104, 60, 48, 46, 48, 41, 10, 9, 9, 9,104, 32, 43, 61, 32, 49, 46, 48,
+ 59, 10, 9,125, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,104, 44, 32,115, 44, 32,118, 44, 32,114,103,
+ 98, 46,119, 41, 59, 10,125, 10, 10,118,111,105,100, 32,104,115,118, 95,116,111, 95,114,103, 98, 40,118,101, 99, 52, 32,104,115,
+118, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,105, 44, 32,
+102, 44, 32,112, 44, 32,113, 44, 32,116, 44, 32,104, 44, 32,115, 44, 32,118, 59, 10, 9,118,101, 99, 51, 32,114,103, 98, 59, 10,
+ 10, 9,104, 32, 61, 32,104,115,118, 91, 48, 93, 59, 10, 9,115, 32, 61, 32,104,115,118, 91, 49, 93, 59, 10, 9,118, 32, 61, 32,
+104,115,118, 91, 50, 93, 59, 10, 10, 9,105,102, 40,115, 61, 61, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 32, 61, 32,118,
+101, 99, 51, 40,118, 44, 32,118, 44, 32,118, 41, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,105,102, 40,104, 61,
+ 61, 49, 46, 48, 41, 10, 9, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9, 10, 9, 9,104, 32, 42, 61, 32, 54, 46, 48, 59,
+ 10, 9, 9,105, 32, 61, 32,102,108,111,111,114, 40,104, 41, 59, 10, 9, 9,102, 32, 61, 32,104, 32, 45, 32,105, 59, 10, 9, 9,
+114,103, 98, 32, 61, 32,118,101, 99, 51, 40,102, 44, 32,102, 44, 32,102, 41, 59, 10, 9, 9,112, 32, 61, 32,118, 42, 40, 49, 46,
+ 48, 45,115, 41, 59, 10, 9, 9,113, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42,102, 41, 41, 59, 10, 9, 9,116, 32, 61,
+ 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42, 40, 49, 46, 48, 45,102, 41, 41, 41, 59, 10, 9, 9, 10, 9, 9,105,102, 32, 40,105,
+ 32, 61, 61, 32, 48, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,116, 44, 32,112, 41, 59, 10, 9, 9,
+101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 49, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,113, 44,
+ 32,118, 44, 32,112, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 50, 46, 48, 41, 32,114,103, 98,
+ 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,118, 44, 32,116, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61,
+ 61, 32, 51, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,113, 44, 32,118, 41, 59, 10, 9, 9,101,108,
+115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 52, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,116, 44, 32,112,
+ 44, 32,118, 41, 59, 10, 9, 9,101,108,115,101, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,112, 44, 32,113, 41,
+ 59, 10, 9,125, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 44, 32,104,115,118, 46,119, 41,
+ 59, 10,125, 10, 10,102,108,111, 97,116, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,102,108,111,
+ 97,116, 32, 99, 41, 10,123, 10, 9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 52, 48, 52, 53, 41, 10, 9, 9,114,101,116,117,114,
+110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 40, 49, 46, 48, 47, 49, 50, 46, 57, 50,
+ 41, 59, 10, 9,101,108,115,101, 10, 9, 9,114,101,116,117,114,110, 32,112,111,119, 40, 40, 99, 32, 43, 32, 48, 46, 48, 53, 53,
+ 41, 42, 40, 49, 46, 48, 47, 49, 46, 48, 53, 53, 41, 44, 32, 50, 46, 52, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,108,105,
+110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123, 10, 9,105,102, 40, 99,
+ 32, 60, 32, 48, 46, 48, 48, 51, 49, 51, 48, 56, 41, 10, 9, 9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41,
+ 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 49, 50, 46, 57, 50, 59, 10, 9,101,108,115,101, 10, 9, 9,114,101,116,117,114,110,
+ 32, 49, 46, 48, 53, 53, 32, 42, 32,112,111,119, 40, 99, 44, 32, 49, 46, 48, 47, 50, 46, 52, 41, 32, 45, 32, 48, 46, 48, 53, 53,
+ 59, 10,125, 10, 10,118,111,105,100, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,118,101, 99, 52,
+ 32, 99,111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10, 9, 99,
+111,108, 95,116,111, 46,114, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,
+102,114,111,109, 46,114, 41, 59, 10, 9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,
+101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,
+115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10, 9,
+ 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,108,
+105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,111,109, 44, 32,
+111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10, 9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,108,
+105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10, 9, 99,
+111,108, 95,116,111, 46,103, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,
+102,114,111,109, 46,103, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,
+111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32,
+ 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10, 35,100,101,102,105,110,101, 32, 77, 95, 80, 73, 32, 51, 46, 49, 52,
+ 49, 53, 57, 50, 54, 53, 51, 53, 56, 57, 55, 57, 51, 50, 51, 56, 52, 54, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 32, 83, 72, 65, 68, 69, 82, 32, 78, 79, 68, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,
+118,111,105,100, 32,118, 99,111,108, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 52, 32, 97,116,116,118, 99,111,108,
+ 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 41, 10,123, 10, 9,118, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,
+ 97,116,116,118, 99,111,108, 46,120, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,121, 47, 50, 53, 53, 46, 48,
+ 44, 32, 97,116,116,118, 99,111,108, 46,122, 47, 50, 53, 53, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100,
+ 32,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101,
+ 99, 51, 32,117,118, 41, 10,123, 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,
+118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,103,101,
+111,109, 40,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,109, 97,116, 52, 32,118,105,101,119,105,
+110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,118,101, 99, 50, 32, 97,116,116,117,118, 44,
+ 32,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 44, 32,
+111,117,116, 32,118,101, 99, 51, 32,108,111, 99, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,
+117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 44, 32,111,117,116, 32,118,
+101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 44, 32,111,117,116, 32,102,
+108,111, 97,116, 32,102,114,111,110,116, 98, 97, 99,107, 41, 10,123, 10, 9,108,111, 99, 97,108, 32, 61, 32, 99,111, 59, 10, 9,
+118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,111, 99, 97,108, 41, 59, 10, 9,103,108,111, 98, 97,108,
+ 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40,108,111, 99, 97,108, 44, 32, 49, 46, 48, 41, 41,
+ 46,120,121,122, 59, 10, 9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10, 9,117,118, 95, 97,116,116,114,105,
+ 98,117,116,101, 40, 97,116,116,117,118, 44, 32,117,118, 41, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109,
+ 97,108,105,122,101, 40,110,111,114, 41, 59, 9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,
+114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10, 9,118, 99,111,108, 95, 97,116,116,114,105, 98,117,
+116,101, 40, 97,116,116,118, 99,111,108, 44, 32,118, 99,111,108, 41, 59, 10, 9,102,114,111,110,116, 98, 97, 99,107, 32, 61, 32,
+ 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,109,
+ 97,116, 52, 32,109, 97,116, 44, 32,118,101, 99, 51, 32,109,105,110,118,101, 99, 44, 32,118,101, 99, 51, 32,109, 97,120,118,101,
+ 99, 44, 32,102,108,111, 97,116, 32,100,111,109,105,110, 44, 32,102,108,111, 97,116, 32,100,111,109, 97,120, 44, 32,111,117,116,
+ 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32, 40,109, 97,116, 32, 42,
+ 32,118,101, 99, 52, 40,118,101, 99, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9,105,102, 40,100,111,109,105,110, 32,
+ 61, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32,109, 97,120, 40,111,117,116,118,101, 99, 44, 32,109,
+105,110,118,101, 99, 41, 59, 10, 9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116,118,
+101, 99, 32, 61, 32,109,105,110, 40,111,117,116,118,101, 99, 44, 32,109, 97,120,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,
+100, 32, 99, 97,109,101,114, 97, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,105,
+101,119, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,101,112,116,104, 44, 32,111,117,116, 32,102,108,111, 97,
+116, 32,111,117,116,100,105,115,116, 41, 10,123, 10, 9,111,117,116,100,101,112,116,104, 32, 61, 32, 97, 98,115, 40, 99,111, 46,
+122, 41, 59, 10, 9,111,117,116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,111, 41, 59, 10, 9,111,117,116,118,
+105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,
+104, 95, 97,100,100, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,
+116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49,
+ 32, 43, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,117, 98,116,114, 97, 99,116, 40,102,
108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116,
- 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 43, 32,118, 97,108, 50,
- 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,117, 98,116,114, 97, 99,116, 40,102,108,111, 97,116, 32,118, 97,
+ 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 45, 32,118, 97,108, 50,
+ 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,117,108,116,105,112,108,121, 40,102,108,111, 97,116, 32,118, 97,
108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
- 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 45, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,
-105,100, 32,109, 97,116,104, 95,109,117,108,116,105,112,108,121, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111,
- 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,
-116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104,
- 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 32, 40,118, 97,108, 50, 32, 61, 61,
- 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,
-116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 47, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104,
- 95,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,
-108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,115,105,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100,
- 32,109, 97,116,104, 95, 99,111,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,
-116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 99,111,115, 40,118, 97,108, 41, 59, 10,
-125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,116, 97,110,103,101,110,116, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,116, 97,
-110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,115,105,110, 40,102,108,111, 97,116, 32,
-118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 32, 40,118, 97,
-108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,
-108, 32, 61, 32, 97,115,105,110, 40,118, 97,108, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32,
- 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97, 99,111,115, 40,102,108,111, 97,116, 32,118, 97,108,
- 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 32, 40,118, 97,108, 32, 60,
- 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61,
- 32, 97, 99,111,115, 40,118, 97,108, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48,
- 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,116, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 97,116, 97,
-110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,112,111,119, 40,102,108,111, 97,116, 32,118,
- 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,
-108, 41, 10,123, 10, 9,105,102, 32, 40,118, 97,108, 49, 32, 62, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 32,
- 61, 32,112,111,119, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,
-108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,111,103, 40,102,108,111, 97,116, 32,
-118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,
- 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 62, 32, 48, 46, 48, 32, 32, 38, 38, 32,118, 97,108, 50, 32, 62, 32,
- 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 61, 32,108,111,103, 50, 40,118, 97,108, 49, 41, 32, 47, 32,108,111,103, 50,
- 40,118, 97,108, 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,
-118,111,105,100, 32,109, 97,116,104, 95,109, 97,120, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,
-118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,
-108, 32, 61, 32,109, 97,120, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,
-104, 95,109,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,
-116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,109,105,110, 40,
-118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,114,111,117,110,100, 40,
-102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,
-111,117,116,118, 97,108, 61, 32,102,108,111,111,114, 40,118, 97,108, 32, 43, 32, 48, 46, 53, 41, 59, 10,125, 10, 10,118,111,105,
-100, 32,109, 97,116,104, 95,108,101,115,115, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111,
- 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102,
- 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,
-108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104,
- 95,103,114,101, 97,116,101,114, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,
-118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97,
-108, 49, 32, 62, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101,
- 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,113,117,101,101,122,101,
- 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,102,108,111, 97,116, 32,119,105,100,116,104, 44, 32,102,108,111, 97,116, 32, 99,
-101,110,116,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,
- 97,108, 32, 61, 32, 49, 46, 48, 47, 40, 49, 46, 48, 32, 43, 32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 51, 44, 32,
- 45, 40, 40,118, 97,108, 45, 99,101,110,116,101,114, 41, 42,119,105,100,116,104, 41, 41, 41, 59, 10,125, 10, 10,118,111,105,100,
- 32,118,101, 99, 95,109, 97,116,104, 95, 97,100,100, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,
-111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,
-108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 10, 9,111,117,116,118, 97,108, 32,
- 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 49,
- 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46, 48, 59, 10,125, 10, 10,118,111,105,
-100, 32,118,101, 99, 95,109, 97,116,104, 95,115,117, 98, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44,
+ 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,
+105,100, 32,109, 97,116,104, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116,
+ 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 32, 40,
+118, 97,108, 50, 32, 61, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,
+115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 47, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,
+105,100, 32,109, 97,116,104, 95,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,
+116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,115,105,110, 40,118, 97,108, 41, 59, 10,
+125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 99,111,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,
+117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 99,111,115,
+ 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,116, 97,110,103,101,110,116, 40,102,108,111, 97,
+116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,
+ 97,108, 32, 61, 32,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,115,105,110,
+ 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,
+ 9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10,
+ 9, 9,111,117,116,118, 97,108, 32, 61, 32, 97,115,105,110, 40,118, 97,108, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,
+116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97, 99,111,115, 40,102,108,
+111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102,
+ 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10, 9, 9,111,
+117,116,118, 97,108, 32, 61, 32, 97, 99,111,115, 40,118, 97,108, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,
+108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,116, 97,110, 40,102,108,111, 97,116,
+ 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,
+108, 32, 61, 32, 97,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,112,111,119, 40,
+102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,
+116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 32, 40,118, 97,108, 49, 32, 62, 61, 32, 48, 46, 48, 41, 10, 9, 9,
+111,117,116,118, 97,108, 32, 61, 32,112,111,119, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10, 9,101,108,115,101, 10,
+ 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,111,103,
+ 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111,
+ 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 62, 32, 48, 46, 48, 32, 32, 38, 38, 32,
+118, 97,108, 50, 32, 62, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 61, 32,108,111,103, 50, 40,118, 97,108, 49, 41,
+ 32, 47, 32,108,111,103, 50, 40,118, 97,108, 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 61, 32, 48,
+ 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109, 97,120, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44,
+ 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123,
+ 10, 9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,
+111,105,100, 32,109, 97,116,104, 95,109,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118,
+ 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108,
+ 32, 61, 32,109,105,110, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104,
+ 95,114,111,117,110,100, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,
+ 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 61, 32,102,108,111,111,114, 40,118, 97,108, 32, 43, 32, 48, 46, 53, 41, 59,
+ 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,101,115,115, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,
+108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
+ 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32,
+ 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,
+105,100, 32,109, 97,116,104, 95,103,114,101, 97,116,101,114, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44,
+ 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123,
+ 10, 9,105,102, 40,118, 97,108, 49, 32, 62, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48,
+ 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,
+115,113,117,101,101,122,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,102,108,111, 97,116, 32,119,105,100,116,104, 44, 32,
+102,108,111, 97,116, 32, 99,101,110,116,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,
+123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 47, 40, 49, 46, 48, 32, 43, 32,112,111,119, 40, 50, 46, 55, 49, 56,
+ 50, 56, 49, 56, 51, 44, 32, 45, 40, 40,118, 97,108, 45, 99,101,110,116,101,114, 41, 42,119,105,100,116,104, 41, 41, 41, 59, 10,
+125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,100,100, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101,
+ 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,
+116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 10, 9,
+111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115, 40,111,
+117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46, 48, 59,
+ 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,115,117, 98, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,
+101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111,
+ 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 45, 32,118, 50, 59, 10,
+ 9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115, 40,
+111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46, 48,
+ 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,118,101,114, 97,103,101, 40,118,101, 99, 51, 32,
+118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,
+116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43,
+ 32,118, 50, 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10, 9,
+111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,
+111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,100,111,116, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118,
+ 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,
+116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40, 48, 44, 32, 48, 44, 32, 48, 41, 59,
+ 10, 9,111,117,116,118, 97,108, 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
+118,101, 99, 95,109, 97,116,104, 95, 99,114,111,115,115, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44,
32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,
- 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 45, 32,118, 50, 59, 10, 9,111,117,116,118, 97,108,
- 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91,
- 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46, 48, 59, 10,125, 10, 10,118,111,
-105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,118,101,114, 97,103,101, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99,
- 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116,
- 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 10, 9,111,
-117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10, 9,111,117,116,118,101, 99, 32,
- 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99,
- 95,109, 97,116,104, 95,100,111,116, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,
+ 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32, 99,114,111,115,115, 40,118, 49, 44, 32,118, 50, 41, 59, 10, 9,
+111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100,
+ 32,118,101, 99, 95,109, 97,116,104, 95,110,111,114,109, 97,108,105,122,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,
118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123,
- 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40, 48, 44, 32, 48, 44, 32, 48, 41, 59, 10, 9,111,117,116,118, 97,
-108, 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,
-104, 95, 99,114,111,115,115, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101,
- 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,
-111,117,116,118,101, 99, 32, 61, 32, 99,114,111,115,115, 40,118, 49, 44, 32,118, 50, 41, 59, 10, 9,111,117,116,118, 97,108, 32,
- 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,
-116,104, 95,110,111,114,109, 97,108,105,122,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,
-116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,
-108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10, 9,111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,
-122,101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,110,101,103, 97,116,101, 40,118,
-101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 41, 10,123, 10, 9,111,117,116,118, 32, 61, 32,
- 45,118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,100,105,114, 44, 32,118,101, 99,
- 51, 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114, 44, 32,111,117,116, 32,102,108,111, 97,
-116, 32,111,117,116,100,111,116, 41, 10,123, 10, 9,111,117,116,110,111,114, 32, 61, 32,100,105,114, 59, 10, 9,111,117,116,100,
-111,116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110,111,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,
-118,101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,
-112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99,
- 41, 10,123, 10, 9,111,117,116,118,101, 99, 46,120, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109,
- 97,112, 44, 32, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,120, 59, 10, 9,111,117,116,118,101,
- 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,121,
- 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,121, 59, 10, 9,111,117,116,118,101, 99, 46,122, 32, 61, 32,116,101,120,116,
-117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,122, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46,
- 53, 41, 46,122, 59, 10, 10, 9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116,118,101, 99,
- 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32, 43, 32, 40,118,101, 99, 42, 40, 49, 46, 48, 45,102, 97, 99, 41,
- 41, 59, 10, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,114,103, 98, 40,102,108,111, 97,116, 32,102, 97, 99,
- 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,
-111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,
-101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,
-118,101,109, 97,112, 44, 32, 99,111,108, 46,114, 41, 46, 97, 41, 46,114, 59, 10, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,
-116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,
-114,118,101,109, 97,112, 44, 32, 99,111,108, 46,103, 41, 46, 97, 41, 46,103, 59, 10, 9,111,117,116, 99,111,108, 46, 98, 32, 61,
- 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,
-117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46, 98, 41, 46, 97, 41, 46, 98, 59, 10, 10, 9,105,102, 32, 40,102, 97, 99, 32,
- 33, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32, 40,111,117,116, 99,111,108, 42,102, 97, 99, 41, 32,
- 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32,
- 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 40,102,108,111, 97,116, 32,118,
- 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32,
- 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 40,118,101, 99, 51, 32, 99,111,108, 44,
- 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,
-108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,
-116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10,
-125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,122,101,114,111, 40,111,117,116, 32,102,108,111, 97,116,
- 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,
-100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101, 40,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
- 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,
-103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,
- 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97,
- 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108,
- 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 98,108,101,110,100, 40,
-102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44,
- 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112,
- 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,
-111,108, 49, 44, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108,
- 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 97,100,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,
-118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,
-117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32,
- 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 43,
- 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59,
- 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,109,117,108,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99,
- 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,
-111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48,
- 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 42, 32, 99,111,
-108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10,
- 10,118,111,105,100, 32,109,105,120, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52,
- 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,
-108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41,
- 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116,
- 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 52, 40,102, 97, 99,109, 41, 32, 43, 32,
-102, 97, 99, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 50, 41, 41, 42, 40,118,101, 99, 52, 40, 49, 46,
- 48, 41, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,
-125, 10, 10,118,111,105,100, 32,109,105,120, 95,111,118,101,114,108, 97,121, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,
+ 10, 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10, 9,111,117,116,118,101, 99, 32, 61, 32,
+110,111,114,109, 97,108,105,122,101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,110,
+101,103, 97,116,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 41, 10,123, 10, 9,
+111,117,116,118, 32, 61, 32, 45,118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,100,
+105,114, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114, 44, 32,111,
+117,116, 32,102,108,111, 97,116, 32,111,117,116,100,111,116, 41, 10,123, 10, 9,111,117,116,110,111,114, 32, 61, 32,100,105,114,
+ 59, 10, 9,111,117,116,100,111,116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110,111,114, 41, 59, 10,125, 10, 10,118,
+111,105,100, 32, 99,117,114,118,101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 51, 32,118,
+101, 99, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 51,
+ 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 46,120, 32, 61, 32,116,101,120,116,117,114,101, 50, 68,
+ 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46,
+ 53, 44, 32, 48, 46, 48, 41, 41, 46,120, 59, 10, 9,111,117,116,118,101, 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 50,
+ 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,121, 32, 43, 32, 49, 46, 48, 41, 42, 48,
+ 46, 53, 44, 32, 48, 46, 48, 41, 41, 46,121, 59, 10, 9,111,117,116,118,101, 99, 46,122, 32, 61, 32,116,101,120,116,117,114,101,
+ 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,122, 32, 43, 32, 49, 46, 48, 41, 42,
+ 48, 46, 53, 44, 32, 48, 46, 48, 41, 41, 46,122, 59, 10, 10, 9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10,
+ 9, 9,111,117,116,118,101, 99, 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32, 43, 32, 40,118,101, 99, 42, 40,
+ 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,114,103, 98, 40,102,
+108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32, 99,117,
+114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,
+111,108, 46,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,
+116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 99,111,108, 46,114, 44, 32,
+ 48, 46, 48, 41, 41, 46, 97, 44, 32, 48, 46, 48, 41, 41, 46,114, 59, 10, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,101,
+120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50, 68,
+ 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 99,111,108, 46,103, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44, 32,
+ 48, 46, 48, 41, 41, 46,103, 59, 10, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,
+117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112,
+ 44, 32,118,101, 99, 50, 40, 99,111,108, 46, 98, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44, 32, 48, 46, 48, 41, 41, 46, 98, 59, 10,
+ 10, 9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32, 40,111,117,
+116, 99,111,108, 42,102, 97, 99, 41, 32, 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10, 9,111,
+117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,
+117,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,
+123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98,
+ 40,118,101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,
+117,116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 40,118,101,
+ 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,
+111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,122,101,114,111,
+ 40,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 48,
+ 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101, 40,111,117,116, 32,102,108,
+111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,
+118,111,105,100, 32,115,101,116, 95,114,103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 97,
+108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,
+100, 32,115,101,116, 95,114,103, 98, 97, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,111,117,116,118, 97,108, 41,
+ 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
+109,105,120, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,
+118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102,
+ 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,
+111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,
+111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 97,100,100, 40,102,
+108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,
+111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,
+102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,
+108, 49, 44, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97,
+ 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,109,117,108,116, 40,102,108,111, 97,
+116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116,
+ 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99,
+ 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44,
+ 32, 99,111,108, 49, 32, 42, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32,
+ 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116,
+ 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,
+118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44,
+ 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,
+102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99,
+ 52, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 50, 41,
+ 41, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32,
+ 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,111,118,101,114,108, 97,121, 40,102,108,
+111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,
+117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102,
+ 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48,
+ 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,
+116, 99,111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 42, 61, 32,102, 97, 99,109,
+ 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,
+108, 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48,
+ 32, 45, 32, 99,111,108, 50, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10, 10, 9,
+105,102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 42, 61,
+ 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,101,108,115,101, 10, 9, 9,
+111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,
+ 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103,
+ 41, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108,
+ 46, 98, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,101,108,
+115,101, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46,
+ 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116,
+ 99,111,108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,117, 98, 40,102,108,111, 97,116, 32,102, 97,
+ 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99,
+ 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46,
+ 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108,
+ 49, 32, 45, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49,
+ 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,105,118, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,
101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,
116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49,
46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,
-111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 60, 32, 48,
- 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,
- 42, 99,111,108, 50, 46,114, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 32,
- 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,114, 41,
- 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,
-103, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46,
- 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61,
- 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,
-108, 50, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, 10, 10, 9,105,102, 40,111,117,
-116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 42, 61, 32,102, 97, 99,109,
- 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,
-108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48,
- 32, 45, 32, 99,111,108, 50, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 59, 10,125, 10,
- 10,118,111,105,100, 32,109,105,120, 95,115,117, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,
+111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 33, 61, 32, 48, 46,
+ 48, 41, 32,111,117,116, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97,
+ 99, 42,111,117,116, 99,111,108, 46,114, 47, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 50, 46,103, 32, 33, 61,
+ 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43,
+ 32,102, 97, 99, 42,111,117,116, 99,111,108, 46,103, 47, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 50, 46, 98,
+ 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,
+ 98, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46, 98, 47, 99,111,108, 50, 46, 98, 59, 10,125, 10, 10,118,111,105,100,
+ 32,109,105,120, 95,100,105,102,102, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,
+118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102,
+ 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,
+111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 97, 98,115, 40, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 41, 44,
+ 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,
+105,100, 32,109,105,120, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49,
+ 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,
+ 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,
+116, 99,111,108, 46,114,103, 98, 32, 61, 32,109,105,110, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103,
+ 98, 42,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,
+111,105,100, 32,109,105,120, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,
108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,
123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,
-111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 44, 32,
-102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,
-100, 32,109,105,120, 95,100,105,118, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,
-118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102,
- 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,
-116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,
-111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46,
-114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46,114,
- 47, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 50, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,
-111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,
-108, 46,103, 47, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,
-117,116, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99, 42,111,117,
-116, 99,111,108, 46, 98, 47, 99,111,108, 50, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,105,102,102, 40,
-102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44,
- 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112,
- 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,
-111,108, 49, 44, 32, 97, 98,115, 40, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 41, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,
-116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100, 97,114,
-107, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108,
- 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,
-109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 46,114,103, 98, 32, 61,
- 32,109,105,110, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, 98, 42,102, 97, 99, 41, 59, 10, 9,111,
-117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,105,
-103,104,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,
-111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,
-108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 46,114,103, 98,
- 32, 61, 32,109, 97,120, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, 98, 42,102, 97, 99, 41, 59, 10,
- 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,
-100,111,100,103,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52,
- 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61,
- 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61,
- 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9,
- 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9,
- 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46,
- 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46,114, 47,116,109,112,
- 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,
-115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 9,125, 10, 9,105,102, 40,111,117,116,
- 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46,
- 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41,
- 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,
-109,112, 32, 61, 32,111,117,116, 99,111,108, 46,103, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116,
- 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32,
- 61, 32,116,109,112, 59, 10, 9,125, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,123,
- 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59,
- 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,
- 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 47,116,
-109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,
-101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10, 9,125, 10,125, 10, 10,118,111,
-105,100, 32,109,105,120, 95, 98,117,114,110, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49,
+111,117,116, 99,111,108, 46,114,103, 98, 32, 61, 32,109, 97,120, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,
+114,103, 98, 42,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10,
+ 10,118,111,105,100, 32,109,105,120, 95,100,111,100,103,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32,
+ 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108,
+ 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59,
+ 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 33,
+ 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,
+ 42, 99,111,108, 50, 46,114, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116,
+ 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,
+116, 99,111,108, 46,114, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61,
+ 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10,
+ 9,125, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,
+116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9, 9,105,102, 40,116,
+109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,
+101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46,103, 47,116,109,112, 41, 32, 62, 32, 49,
+ 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9,
+ 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 9,125, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98,
+ 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102,
+ 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,
+117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,
+111,117,116, 99,111,108, 46, 98, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98,
+ 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112,
+ 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 98,117,114,110, 40,102,108,111, 97,116, 32,102, 97, 99, 44,
+ 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,
+111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44,
+ 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,116,109,112, 44, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,
+102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, 97,
+ 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41,
+ 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112,
+ 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 47,116,109,112, 41, 41,
+ 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,
+105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10,
+ 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61, 32,
+102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46,
+ 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,
+109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 47,116,109,112,
+ 41, 41, 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,
+101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48,
+ 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32,
+ 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32,
+ 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,
+ 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 47,116,
+109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,
+108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49,
+ 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10,125, 10, 10,118,
+111,105,100, 32,109,105,120, 95,104,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49,
44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,
9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,
-111, 97,116, 32,116,109,112, 44, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116,
- 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,
-111,108, 50, 46,114, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,
-114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32,
- 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,
-111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49,
- 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,
-116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99,
- 42, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,
-108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32,
- 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10,
- 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,116,109,112, 32, 62,
- 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,
-111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102,
- 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,
- 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46,
- 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48,
- 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,116,109,112,
- 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10,
- 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,104,117,
-101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108,
+111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61,
+ 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,
+103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50,
+ 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108,
+ 44, 32,104,115,118, 41, 59, 10, 9, 9,104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 95,
+116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,109,
+105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,117,116, 99,111,108, 46, 97,
+ 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 97,116, 40,102,108,
+111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,
+117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102,
+ 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48,
+ 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,
+104,115,118, 44, 32,104,115,118, 50, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,
+115,118, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,
+116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,102,
+ 97, 99,109, 42,104,115,118, 46,121, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,121, 59, 10, 9, 9,104,115,118, 95,116,111,
+ 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,
+120, 95,118, 97,108, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52,
+ 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61,
+ 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97,
+ 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50,
+ 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 49, 44, 32,104,115,118, 41, 59, 10, 9,114,103, 98, 95,116,
+111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,104,115,118, 46,122, 32, 61, 32,102, 97, 99,
+109, 42,104,115,118, 46,122, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,122, 59, 10, 9,104,115,118, 95,116,111, 95,114,103,
+ 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 99,111,108,111,
+114, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108,
50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,
109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61,
32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,
101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,
99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41,
32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 9, 9,
-104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118,
- 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44,
- 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59,
- 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 97,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,
-101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,
-116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49,
- 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,
-111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59,
- 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 10, 9,105,102, 40,
-104,115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108,
- 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,102, 97, 99,109, 42,104,115,118, 46,121, 32,
- 43, 32,102, 97, 99, 42,104,115,118, 50, 46,121, 59, 10, 9, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,
-111,117,116, 99,111,108, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,118, 97,108, 40,102,108,111, 97,
-116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116,
- 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99,
- 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45,
- 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59, 10, 9,114,103, 98, 95,116,111, 95,
-104,115,118, 40, 99,111,108, 49, 44, 32,104,115,118, 41, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50,
- 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,104,115,118, 46,122, 32, 61, 32,102, 97, 99,109, 42,104,115,118, 46,122, 32, 43, 32,
-102, 97, 99, 42,104,115,118, 50, 46,122, 59, 10, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116,
- 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 99,111,108,111,114, 40,102,108,111, 97,116, 32,102, 97,
- 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99,
- 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46,
- 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,
- 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,
-115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50,
- 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,
-111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 9, 9,104,115,118, 46,120, 32, 61, 32,104,115,
-118, 50, 46,120, 59, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,104,115,118, 50, 46,121, 59, 10, 9, 9,104,115,118, 95,116,111,
- 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120,
- 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,117,116, 99,111,108, 46, 97, 32, 61,
- 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,111,102,116, 40,102,108,111,
- 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,
-116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97,
- 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32,
- 45, 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,111,110,101, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10, 9,118,
-101, 99, 52, 32,115, 99,114, 61, 32,111,110,101, 32, 45, 32, 40,111,110,101, 32, 45, 32, 99,111,108, 50, 41, 42, 40,111,110,101,
- 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,102, 97, 99,109, 42, 99,111,108, 49, 32, 43, 32,
-102, 97, 99, 42, 40, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 42, 99,111,108, 50, 42, 99,111,108, 49, 32, 43, 32, 99,111,
-108, 49, 42,115, 99,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,105,110,101, 97,114, 40,102,108,111, 97,
-116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116,
- 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99,
- 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,
-105,102, 40, 99,111,108, 50, 46,114, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108,
- 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10,
- 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40,
- 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,103,
- 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99,
- 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,
-117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50,
- 46,103, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, 32, 62, 32, 48, 46, 53, 41, 10, 9,
- 9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,
-108, 50, 46, 98, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 61, 32,
- 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98, 41, 32, 45, 32, 49, 46, 48,
- 41, 59, 10,125, 10, 10,118,111,105,100, 32,118, 97,108,116,111,114,103, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,115,
- 97,109,112,108,101,114, 49, 68, 32, 99,111,108,111,114,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,
-111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, 97,108,112,104, 97, 41, 10,123, 10, 9,111,117,116, 99,111,
-108, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,111,108,111,114,109, 97,112, 44, 32,102, 97, 99, 41, 59, 10, 9,111,
-117,116, 97,108,112,104, 97, 32, 61, 32,111,117,116, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,114,103, 98,116,
-111, 98,119, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
- 41, 32, 32, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 99,111,108,111,114, 46,114, 42, 48, 46, 51, 53, 32, 43, 32, 99,
-111,108,111,114, 46,103, 42, 48, 46, 52, 53, 32, 43, 32, 99,111,108,111,114, 46, 98, 42, 48, 46, 50, 59, 32, 47, 42, 32,107,101,
-101,112, 32,116,104,101,115,101, 32,102, 97, 99,116,111,114,115, 32,105,110, 32,115,121,110, 99, 32,119,105,116,104, 32,116,101,
-120,116,117,114,101, 46,104, 58, 82, 71, 66, 84, 79, 66, 87, 32, 42, 47, 10,125, 10, 10,118,111,105,100, 32,105,110,118,101,114,
-116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,
-111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 46,120,121,122, 32, 61, 32,109,105,120, 40, 99,111,108, 46,
-120,121,122, 44, 32,118,101, 99, 51, 40, 49, 46, 48, 44, 32, 49, 46, 48, 44, 32, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 46,120,
-121,122, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46,119, 32, 61, 32, 99,111,108, 46,119, 59, 10,125, 10, 10,
-118,111,105,100, 32,104,117,101, 95,115, 97,116, 40,102,108,111, 97,116, 32,104,117,101, 44, 32,102,108,111, 97,116, 32,115, 97,
-116, 44, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32,
- 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32,104,115,
-118, 59, 10, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 10, 9,104,115,118,
- 91, 48, 93, 32, 43, 61, 32, 40,104,117,101, 32, 45, 32, 48, 46, 53, 41, 59, 10, 9,105,102, 40,104,115,118, 91, 48, 93, 62, 49,
- 46, 48, 41, 32,104,115,118, 91, 48, 93, 45, 61, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 48, 93, 60,
- 48, 46, 48, 41, 32,104,115,118, 91, 48, 93, 43, 61, 32, 49, 46, 48, 59, 10, 9,104,115,118, 91, 49, 93, 32, 42, 61, 32,115, 97,
-116, 59, 10, 9,105,102, 40,104,115,118, 91, 49, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 49, 46, 48, 59, 32,
-101,108,115,101, 32,105,102, 40,104,115,118, 91, 49, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 48, 46, 48, 59,
- 10, 9,104,115,118, 91, 50, 93, 32, 42, 61, 32,118, 97,108,117,101, 59, 10, 9,105,102, 40,104,115,118, 91, 50, 93, 62, 49, 46,
- 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 50, 93, 60, 48,
- 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 48, 46, 48, 59, 10, 10, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,
-118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 44, 32,
-111,117,116, 99,111,108, 44, 32,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,112, 97,114, 97,116,101, 95,114,
-103, 98, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,114, 44, 32,111,117,116, 32,102,108,
-111, 97,116, 32,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 98, 41, 10,123, 10, 9,114, 32, 61, 32, 99,111,108, 46,114,
- 59, 10, 9,103, 32, 61, 32, 99,111,108, 46,103, 59, 10, 9, 98, 32, 61, 32, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,
-100, 32, 99,111,109, 98,105,110,101, 95,114,103, 98, 40,102,108,111, 97,116, 32,114, 44, 32,102,108,111, 97,116, 32,103, 44, 32,
-102,108,111, 97,116, 32, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 41, 10,123, 10, 9, 99,111,108, 32, 61, 32,
-118,101, 99, 52, 40,114, 44, 32,103, 44, 32, 98, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,111,117,116,112,
-117,116, 95,110,111,100,101, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,
-117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52,
- 40,114,103, 98, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
- 42, 32, 84, 69, 88, 84, 85, 82, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,
-100, 32,116,101,120,116,117,114,101, 95,102,108,105,112, 95, 98,108,101,110,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,
-117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 46,
-121,120,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,108,105,110, 40,118,
-101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,
-116,118, 97,108, 32, 61, 32, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,
-116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,113,117, 97,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116,
- 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40, 40,
- 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10, 9,111,117,116,118, 97,108, 32, 42, 61,
- 32,111,117,116,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,119,111,111,100, 95,115,105,
-110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116,
- 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10,
- 9,102,108,111, 97,116, 32, 97, 32, 61, 32,115,113,114,116, 40,118,101, 99, 46,120, 42,118,101, 99, 46,120, 32, 43, 32,118,101,
- 99, 46,121, 42,118,101, 99, 46,121, 32, 43, 32,118,101, 99, 46,122, 42,118,101, 99, 46,122, 41, 42, 50, 48, 46, 48, 59, 10, 9,
-102,108,111, 97,116, 32,119,105, 32, 61, 32, 48, 46, 53, 32, 43, 32, 48, 46, 53, 42,115,105,110, 40, 97, 41, 59, 10, 10, 9,118,
- 97,108,117,101, 32, 61, 32,119,105, 59, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40,119,105, 44, 32,119,105, 44,
- 32,119,105, 44, 32, 49, 46, 48, 41, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48,
- 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,105,109, 97,103,101, 40,
-118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111,
- 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101,
- 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,
-105,109, 97, 44, 32, 40,118,101, 99, 46,120,121, 32, 43, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 41, 42, 48,
- 46, 53, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 10, 10, 9,110,111,114,109, 97,108, 46,120, 32, 61, 32,
- 50, 46, 48, 42, 40, 99,111,108,111,114, 46,114, 32, 45, 32, 48, 46, 53, 41, 59, 10, 9,110,111,114,109, 97,108, 46,121, 32, 61,
- 32, 50, 46, 48, 42, 40, 48, 46, 53, 32, 45, 32, 99,111,108,111,114, 46,103, 41, 59, 10, 9,110,111,114,109, 97,108, 46,122, 32,
- 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46, 98, 32, 45, 32, 48, 46, 53, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42,
- 42, 42, 42, 42, 42, 42, 42, 42, 32, 77, 84, 69, 88, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47,
- 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111,114, 99,111, 40,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,
-111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 41, 10,123, 10, 9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111,
- 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,117,118, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,
-117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123, 10, 9, 47, 42, 32,100,105,115, 97, 98,108,101,100, 32,102,111,114, 32,110,
-111,119, 44, 32,119,111,114,107,115, 32,116,111,103,101,116,104,101,114, 32,119,105,116,104, 32,108,101, 97,118,105,110,103, 32,
-111,117,116, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 10, 9, 32, 32, 32,117,118, 32, 61, 32,118,101, 99,
- 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46,
- 48, 41, 59, 32, 42, 47, 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 44, 32, 48, 46, 48, 41, 59, 10,125,
- 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,110,111,114,109, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,
-117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9, 47, 42, 32, 99,111,114,114,101,115,112,
-111,110,100,115, 32,116,111, 32,115,104,105, 45, 62,111,114,110, 44, 32,119,104,105, 99,104, 32,105,115, 32,110,101,103, 97,116,
-101,100, 32,115,111, 32, 99, 97,110, 99,101,108,115, 10, 9, 32, 32, 32,111,117,116, 32, 98,108,101,110,100,101,114, 32,110,111,
-114,109, 97,108, 32,110,101,103, 97,116,105,111,110, 32, 42, 47, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,
-114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,116,
- 97,110,103,101,110,116, 40,118,101, 99, 52, 32,116, 97,110,103,101,110,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,
-116,116, 97,110,103,101,110,116, 41, 10,123, 10, 9,111,117,116,116, 97,110,103,101,110,116, 32, 61, 32,110,111,114,109, 97,108,
-105,122,101, 40,116, 97,110,103,101,110,116, 46,120,121,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,
-103,108,111, 98, 97,108, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44,
- 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 41, 10,123, 10, 9,103,108,111, 98, 97,108, 32, 61, 32, 40,118,
-105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,125, 10,
- 10,118,111,105,100, 32,116,101,120, 99,111, 95,111, 98,106,101, 99,116, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109,
- 97,116, 44, 32,109, 97,116, 52, 32,111, 98,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,
-118,101, 99, 51, 32,111, 98,106,101, 99,116, 41, 10,123, 10, 9,111, 98,106,101, 99,116, 32, 61, 32, 40,111, 98,105,110,118,109,
- 97,116, 42, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48, 41, 41, 41, 46,120,
-121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,114,101,102,108, 40,118,101, 99, 51, 32,118,110, 44, 32,
-118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,114,101,102, 41, 10,123, 10, 9,114,101,102, 32,
- 61, 32,118,105,101,119, 32, 45, 32, 50, 46, 48, 42,100,111,116, 40,118,110, 44, 32,118,105,101,119, 41, 42,118,110, 59, 10,125,
- 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,110,111,114,109, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,
-117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9, 47, 42, 32, 98,108,101,110,100,101,114,
- 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10, 9,111,117,
-116,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, 41, 59, 10,125, 10,
- 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 98,108,101,110,100, 40,118,101, 99, 51, 32,111,117,116, 99,111,108,
- 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116,
- 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,
-102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46,
- 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,
-102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,109,117,
-108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,
-116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,
-111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,
-103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32, 40,
-102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 99,114,101,101,110, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44,
- 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,
-102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102,
- 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48,
- 45,102, 97, 99,103, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101,
- 99, 51, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99,116, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,116,101,120,
- 99,111,108, 41, 41, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,111,118,101,114,108, 97,121, 40,118,101, 99, 51, 32,111,117,116, 99,111,108,
- 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116,
- 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,
-102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46,
- 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,
-110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97,
- 99,116, 42,116,101,120, 99,111,108, 46,114, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 46,114, 32, 61, 32,
- 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,
-120, 99,111,108, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10, 10, 9,105,102, 40,
-111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,
-111,108, 46,103, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 41, 59,
- 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43,
- 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,103, 41, 41, 42, 40, 49, 46, 48,
- 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46,
- 53, 41, 10, 9, 9,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 42, 40,102, 97, 99,109, 32, 43, 32,
- 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,
-108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46,
- 48, 32, 45, 32,116,101,120, 99,111,108, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 59,
- 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,117, 98, 40,118,101, 99, 51, 32,111,117,116, 99,111,
-108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,
-116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,105,110, 99,111,108,
- 32, 61, 32, 45,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125,
- 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 97,100,100, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44,
- 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,
-102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,105,110, 99,111,108, 32, 61,
- 32,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,118, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101,
- 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,
-103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109,
- 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97,
- 99,116, 59, 10, 10, 9,105,102, 40,116,101,120, 99,111,108, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,
-114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,
-114, 47,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40,116,101,120, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41,
- 32,105,110, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32,102, 97, 99,116, 42,
-111,117,116, 99,111,108, 46,103, 47,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40,116,101,120, 99,111,108, 46, 98, 32,
- 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98, 32,
- 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46, 98, 47,116,101,120, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,
-100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,102,102, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99,
- 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103,
- 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59,
- 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,
-116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42,
- 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,
-101,120, 95,114,103, 98, 95,100, 97,114,107, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,
-120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,
-116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108,
- 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97,
- 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40, 99,
-111,108, 32, 60, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108,
-115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97,
- 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,103, 41,
- 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,103, 32, 61, 32,111,
-117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 59, 10, 9,
-105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108,
- 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,
-105,100, 32,109,116,101,120, 95,114,103, 98, 95,108,105,103,104,116, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,
-101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97,
- 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,
-109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32,
- 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 59,
- 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32, 99,
-111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 59, 10, 9, 99,111,
-108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116,
- 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108,
- 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,
-108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,110, 99,111,108, 46, 98,
- 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 59,
- 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,104,117,101, 40,118,101, 99, 51, 32,111,117,116, 99,111,
-108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,
-116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32,
- 99,111,108, 59, 10, 10, 9,109,105,120, 95,104,117,101, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,
-117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,
- 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 97,116, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101,
- 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,
-103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10,
- 10, 9,109,105,120, 95,115, 97,116, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108,
- 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59,
- 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,
-116,101,120, 95,114,103, 98, 95,118, 97,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,
-120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,
-116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120,
- 95,118, 97,108, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48,
- 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,
-111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,
-103, 98, 95, 99,111,108,111,114, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,
+104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,104,115,118, 50, 46,121,
+ 59, 10, 9, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,
+116, 99,111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,
+111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,
+120, 95,115,111,102,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99,
+ 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32,
+ 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102,
+ 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,111,110,101, 61, 32,118,101, 99,
+ 52, 40, 49, 46, 48, 41, 59, 10, 9,118,101, 99, 52, 32,115, 99,114, 61, 32,111,110,101, 32, 45, 32, 40,111,110,101, 32, 45, 32,
+ 99,111,108, 50, 41, 42, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,102, 97,
+ 99,109, 42, 99,111,108, 49, 32, 43, 32,102, 97, 99, 42, 40, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 42, 99,111,108, 50,
+ 42, 99,111,108, 49, 32, 43, 32, 99,111,108, 49, 42,115, 99,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,
+105,110,101, 97,114, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52,
+ 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61,
+ 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 32,
+ 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116,
+ 99,111,108, 46,114, 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114,
+ 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108, 49,
+ 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10,
+ 9,105,102, 40, 99,111,108, 50, 46,103, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,
+108, 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 32, 45, 32, 48, 46, 53, 41, 41, 59,
+ 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, 42,
+ 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,
+ 98, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97,
+ 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,
+111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108,
+ 50, 46, 98, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118, 97,108,116,111,114,103, 98, 40,102,108,
+111, 97,116, 32,102, 97, 99, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32, 99,111,108,111,114,109, 97,112, 44, 32,111,117,116,
+ 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, 97,108,112,104, 97,
+ 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,111,108,111,114,109, 97,112,
+ 44, 32,118,101, 99, 50, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 41, 59, 10, 9,111,117,116, 97,108,112,104, 97, 32, 61, 32,111,
+117,116, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,114,103, 98,116,111, 98,119, 40,118,101, 99, 52, 32, 99,111,
+108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 32, 32, 10,123, 10, 9,111,117,116,118,
+ 97,108, 32, 61, 32, 99,111,108,111,114, 46,114, 42, 48, 46, 51, 53, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 52, 53,
+ 32, 43, 32, 99,111,108,111,114, 46, 98, 42, 48, 46, 50, 59, 32, 47, 42, 32,107,101,101,112, 32,116,104,101,115,101, 32,102, 97,
+ 99,116,111,114,115, 32,105,110, 32,115,121,110, 99, 32,119,105,116,104, 32,116,101,120,116,117,114,101, 46,104, 58, 82, 71, 66,
+ 84, 79, 66, 87, 32, 42, 47, 10,125, 10, 10,118,111,105,100, 32,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,102, 97, 99,
+ 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,
+111,117,116, 99,111,108, 46,120,121,122, 32, 61, 32,109,105,120, 40, 99,111,108, 46,120,121,122, 44, 32,118,101, 99, 51, 40, 49,
+ 46, 48, 44, 32, 49, 46, 48, 44, 32, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 46,120,121,122, 44, 32,102, 97, 99, 41, 59, 10, 9,
+111,117,116, 99,111,108, 46,119, 32, 61, 32, 99,111,108, 46,119, 59, 10,125, 10, 10,118,111,105,100, 32,104,117,101, 95,115, 97,
+116, 40,102,108,111, 97,116, 32,104,117,101, 44, 32,102,108,111, 97,116, 32,115, 97,116, 44, 32,102,108,111, 97,116, 32,118, 97,
+108,117,101, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101,
+ 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32,104,115,118, 59, 10, 10, 9,114,103, 98, 95,116,111,
+ 95,104,115,118, 40, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 10, 9,104,115,118, 91, 48, 93, 32, 43, 61, 32, 40,104,117,101,
+ 32, 45, 32, 48, 46, 53, 41, 59, 10, 9,105,102, 40,104,115,118, 91, 48, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 48, 93, 45,
+ 61, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 48, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 48, 93,
+ 43, 61, 32, 49, 46, 48, 59, 10, 9,104,115,118, 91, 49, 93, 32, 42, 61, 32,115, 97,116, 59, 10, 9,105,102, 40,104,115,118, 91,
+ 49, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118,
+ 91, 49, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 48, 46, 48, 59, 10, 9,104,115,118, 91, 50, 93, 32, 42, 61,
+ 32,118, 97,108,117,101, 59, 10, 9,105,102, 40,104,115,118, 91, 50, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32,
+ 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 50, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61,
+ 32, 48, 46, 48, 59, 10, 10, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59,
+ 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 44, 32,111,117,116, 99,111,108, 44, 32,102, 97, 99,
+ 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,112, 97,114, 97,116,101, 95,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108,
+ 44, 32,111,117,116, 32,102,108,111, 97,116, 32,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,103, 44, 32,111,117,116, 32,
+102,108,111, 97,116, 32, 98, 41, 10,123, 10, 9,114, 32, 61, 32, 99,111,108, 46,114, 59, 10, 9,103, 32, 61, 32, 99,111,108, 46,
+103, 59, 10, 9, 98, 32, 61, 32, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,109, 98,105,110,101, 95,114,
+103, 98, 40,102,108,111, 97,116, 32,114, 44, 32,102,108,111, 97,116, 32,103, 44, 32,102,108,111, 97,116, 32, 98, 44, 32,111,117,
+116, 32,118,101, 99, 52, 32, 99,111,108, 41, 10,123, 10, 9, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114, 44, 32,103, 44, 32,
+ 98, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,111,117,116,112,117,116, 95,110,111,100,101, 40,118,101, 99,
+ 52, 32,114,103, 98, 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,
+114,103, 98, 41, 10,123, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32, 97,
+108,112,104, 97, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 84, 69, 88, 84, 85, 82, 69, 83, 32,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,102,
+108,105,112, 95, 98,108,101,110,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,
+118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 46,121,120,122, 59, 10,125, 10, 10,118,111,105,
+100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,108,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,
+116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 40, 49, 46, 48,
+ 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,
+110,100, 95,113,117, 97,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,
+ 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47,
+ 50, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10, 9,111,117,116,118, 97,108, 32, 42, 61, 32,111,117,116,118, 97,108, 59, 10,125, 10,
+ 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,119,111,111,100, 95,115,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44,
+ 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114,
+ 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, 97, 32, 61, 32,
+115,113,114,116, 40,118,101, 99, 46,120, 42,118,101, 99, 46,120, 32, 43, 32,118,101, 99, 46,121, 42,118,101, 99, 46,121, 32, 43,
+ 32,118,101, 99, 46,122, 42,118,101, 99, 46,122, 41, 42, 50, 48, 46, 48, 59, 10, 9,102,108,111, 97,116, 32,119,105, 32, 61, 32,
+ 48, 46, 53, 32, 43, 32, 48, 46, 53, 42,115,105,110, 40, 97, 41, 59, 10, 10, 9,118, 97,108,117,101, 32, 61, 32,119,105, 59, 10,
+ 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40,119,105, 44, 32,119,105, 44, 32,119,105, 44, 32, 49, 46, 48, 41, 59, 10,
+ 9,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125,
+ 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,115,
+ 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,
+117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,
+123, 10, 9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 40,118,101, 99, 46,120,
+121, 32, 43, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 41, 42, 48, 46, 53, 41, 59, 10, 9,118, 97,108,117,101,
+ 32, 61, 32, 49, 46, 48, 59, 10, 10, 9,110,111,114,109, 97,108, 46,120, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46,
+114, 32, 45, 32, 48, 46, 53, 41, 59, 10, 9,110,111,114,109, 97,108, 46,121, 32, 61, 32, 50, 46, 48, 42, 40, 48, 46, 53, 32, 45,
+ 32, 99,111,108,111,114, 46,103, 41, 59, 10, 9,110,111,114,109, 97,108, 46,122, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,
+114, 46, 98, 32, 45, 32, 48, 46, 53, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 77, 84,
+ 69, 88, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120, 99,
+111, 95,111,114, 99,111, 40,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114,
+ 99,111, 41, 10,123, 10, 9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,116,
+101,120, 99,111, 95,117,118, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41,
+ 10,123, 10, 9, 47, 42, 32,100,105,115, 97, 98,108,101,100, 32,102,111,114, 32,110,111,119, 44, 32,119,111,114,107,115, 32,116,
+111,103,101,116,104,101,114, 32,119,105,116,104, 32,108,101, 97,118,105,110,103, 32,111,117,116, 32,109,116,101,120, 95, 50,100,
+ 95,109, 97,112,112,105,110,103, 10, 9, 32, 32, 32,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48,
+ 32, 45, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 32, 42, 47, 10, 9,117,118, 32,
+ 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,
+111, 95,110,111,114,109, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,
+110,111,114,109, 97,108, 41, 10,123, 10, 9, 47, 42, 32, 99,111,114,114,101,115,112,111,110,100,115, 32,116,111, 32,115,104,105,
+ 45, 62,111,114,110, 44, 32,119,104,105, 99,104, 32,105,115, 32,110,101,103, 97,116,101,100, 32,115,111, 32, 99, 97,110, 99,101,
+108,115, 10, 9, 32, 32, 32,111,117,116, 32, 98,108,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,110,101,103, 97,116,105,
+111,110, 32, 42, 47, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,110,111,114,
+109, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 52,
+ 32,116, 97,110,103,101,110,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116, 97,110,103,101,110,116, 41, 10,123,
+ 10, 9,111,117,116,116, 97,110,103,101,110,116, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101,110,116,
+ 46,120,121,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,103,108,111, 98, 97,108, 40,109, 97,116, 52,
+ 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,
+108,111, 98, 97,108, 41, 10,123, 10, 9,103,108,111, 98, 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,
+101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111,
+ 95,111, 98,106,101, 99,116, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,109, 97,116, 52, 32,111, 98,
+105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111, 98,106,101, 99,116,
+ 41, 10,123, 10, 9,111, 98,106,101, 99,116, 32, 61, 32, 40,111, 98,105,110,118,109, 97,116, 42, 40,118,105,101,119,105,110,118,
+109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48, 41, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100,
+ 32,116,101,120, 99,111, 95,114,101,102,108, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,
+111,117,116, 32,118,101, 99, 51, 32,114,101,102, 41, 10,123, 10, 9,114,101,102, 32, 61, 32,118,105,101,119, 32, 45, 32, 50, 46,
+ 48, 42,100,111,116, 40,118,110, 44, 32,118,105,101,119, 41, 42,118,110, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,
+101, 95,110,111,114,109, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,
+110,111,114,109, 97,108, 41, 10,123, 10, 9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,114,
+109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32, 45,
+110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,
+114,103, 98, 95, 98,108,101,110,100, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,
+111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,
+118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,
+116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,
+110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108,
+ 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,109,117,108, 40,118,101, 99, 51, 32,111,117,116, 99,
+111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111,
+ 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,
+116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32,
+ 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116,
+ 42,116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103,
+ 98, 95,115, 99,114,101,101,110, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,
+108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,
+101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116,
+ 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,110,
+ 99,111,108, 32, 61, 32,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 51, 40,102, 97, 99,109, 41, 32, 43, 32,
+102, 97, 99,116, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40,118,101, 99, 51,
+ 40, 49, 46, 48, 41, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103,
+ 98, 95,111,118,101,114,108, 97,121, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,
+111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,
+118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,
+116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,
+102, 40,111,117,116, 99,111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,
+116, 99,111,108, 46,114, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114,
+ 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109,
+ 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,114, 41, 41, 42, 40, 49,
+ 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32,
+ 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 42, 40,102, 97, 99,109, 32,
+ 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110,
+ 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40,
+ 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103,
+ 41, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46,
+ 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,
+120, 99,111,108, 46, 98, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45,
+ 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,
+ 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,
+101,120, 95,114,103, 98, 95,115,117, 98, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120,
+ 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116,
+ 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,105,110, 99,111,108, 32, 61, 32, 45,102, 97, 99,116, 42,102, 97,
+ 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120,
+ 95,114,103, 98, 95, 97,100,100, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,
108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,
-101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95, 99,111,
-108,111,114, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41,
+101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,102, 97, 99,103, 42,
+116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103,
+ 98, 95,100,105,118, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,
+102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51,
+ 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61,
+ 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,102, 40,116,101,
+120, 99,111,108, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,
+116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,114, 47,116,101,120, 99,111,108, 46,114, 59,
+ 10, 9,105,102, 40,116,101,120, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32,
+102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,103, 47,116,101,
+120, 99,111,108, 46,103, 59, 10, 9,105,102, 40,116,101,120, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,
+111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,
+111,108, 46, 98, 47,116,101,120, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,
+100,105,102,102, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,
+108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
+105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,
+102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32,
+ 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42, 97, 98,115, 40,116,101,120, 99,111,108, 32,
+ 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100, 97,114,107,
+ 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116,
+ 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,
+108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61,
+ 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61,
+ 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108,
+ 46,114, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32,
+ 61, 32,111,117,116, 99,111,108, 46,114, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103,
+ 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32,
+ 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,
+111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,
+116, 99,111,108, 46, 98, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,
+108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98,
+ 95,108,105,103,104,116, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44,
+ 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99,
+ 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10, 9,102,
+ 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10,
+ 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,
+111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110,
+ 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,
+120, 99,111,108, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,
+108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108,
+ 46,103, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 59, 10, 9,105,102, 40, 99,111,
+108, 32, 62, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,
+101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,
+101,120, 95,114,103, 98, 95,104,117,101, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120,
+ 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116,
+ 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,
+104,117,101, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41,
44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,
-108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,
-108,117,101, 95,118, 97,114,115, 40,105,110,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116,
- 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,109, 41, 10,123, 10, 9,102, 97, 99,116, 32, 42,
- 61, 32, 97, 98,115, 40,102, 97, 99,103, 41, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10,
- 9,105,102, 40,102, 97, 99,103, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32,
-102, 97, 99,116, 59, 10, 9, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,109, 59, 10, 9, 9,102, 97, 99,109, 32, 61, 32,116,109,
-112, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 98,108,101,110,100, 40,102,
-108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116,
- 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,
-111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118,
- 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,110, 99,111,108, 32, 61,
- 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,109,117,108, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44,
+108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103,
+ 98, 95,115, 97,116, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,
+102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51,
+ 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,115, 97,116, 40,102,
+ 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99,
+ 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98,
+ 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,118, 97,108,
+ 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116,
+ 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,
+108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,118, 97,108, 40,102, 97, 99,116, 42,102,
+ 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120,
+ 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,
+108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 99,111,108,111,114, 40,118,101,
+ 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97,
+ 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,
+123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95, 99,111,108,111,114, 40,102, 97, 99,116, 42,102, 97,
+ 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,
+111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108,
+ 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,105,110,
+111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,
+102,108,111, 97,116, 32,102, 97, 99,109, 41, 10,123, 10, 9,102, 97, 99,116, 32, 42, 61, 32, 97, 98,115, 40,102, 97, 99,103, 41,
+ 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,102, 40,102, 97, 99,103, 32, 60, 32,
+ 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32,102, 97, 99,116, 59, 10, 9, 9,102, 97, 99,
+116, 32, 61, 32,102, 97, 99,109, 59, 10, 9, 9,102, 97, 99,109, 32, 61, 32,116,109,112, 59, 10, 9,125, 10,125, 10, 10,118,111,
+105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108,
+ 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,
+116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,
+116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102,
+ 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,
+108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,
+108,117,101, 95,109,117,108, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,
+111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,
+102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,
+120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10,
+ 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, 61, 32, 40,102,
+ 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,
+105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,111,117,116, 99,111,
+108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111,
+ 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111,
+ 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,
+102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103,
+ 59, 10, 9,105,110, 99,111,108, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42, 40, 49,
+ 46, 48, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10,
+ 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115,117, 98, 40,102,108,111, 97,116, 32,111,117,116, 99,111,
+108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111,
+ 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111,
+ 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,
+102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,116, 32, 61, 32, 45,102, 97, 99,116, 59, 10, 9,105,110,
+ 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,
+111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 97,100,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44,
32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116,
32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116,
32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97,
- 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10,
- 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117,
-116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115, 99,114,101,101,110, 40,
-102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,
-116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,
- 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,
-118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,109, 32, 61,
- 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,
-109, 32, 43, 32,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,
-111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115,117, 98, 40,
-102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,
-116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,
- 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,
-118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,116, 32, 61,
- 32, 45,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,111,
-117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 97,100,100, 40,102,108,
-111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,
-102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,
-108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,
-114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,116, 32, 61, 32,102,
- 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,
-111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100,105,118, 40,102,108,111, 97,116,
- 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,
-116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,
-123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,
-102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,102, 40,116,101,120, 99,111,108, 32, 33,
- 61, 32, 48, 46, 48, 41, 10, 9, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102,
- 97, 99,116, 42,111,117,116, 99,111,108, 47,116,101,120, 99,111,108, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108,
- 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100,105,102,102, 40,
-102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,
-116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,
- 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,
-118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,110, 99,111,108, 32,
- 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42, 97, 98,115, 40,116,101,120, 99,111,108, 32,
- 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100, 97,
-114,107, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,
-108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116,
- 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,
-117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102,108,111,
- 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,
-111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 32,
- 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,108,105,103,
-104,116, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,
-108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116,
- 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,
-117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102,108,111,
- 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,
-111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 32,
- 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 99,108, 97,
-109,112, 95,112,111,115,105,116,105,118,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116,
- 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,111,117,116,102, 97, 99, 32, 61, 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, 46,
- 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 99,108, 97,109,112, 40,102,108,111,
- 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,111,117,116,
-102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,104, 97,114, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,111,117,116,104, 97,114, 32, 61, 32,104, 97,114,
- 47, 49, 50, 56, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,109,117,108,116,105,112,108,
-121, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,104, 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,
-104, 97,114, 41, 10,123, 10, 9,104, 97,114, 32, 42, 61, 32, 49, 50, 56, 46, 48, 59, 10, 10, 9,105,102, 40,104, 97,114, 32, 60,
- 32, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,104, 97,114,
- 32, 62, 32, 53, 49, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 53, 49, 49, 46, 48, 59, 10, 9,101,108,115,101, 32,
-111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97,
- 95,102,114,111,109, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 97,108,
-112,104, 97, 41, 10,123, 10, 9, 97,108,112,104, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,
-116,101,120, 95, 97,108,112,104, 97, 95,116,111, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,102,108,111, 97,116,
- 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,
-111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, 59, 10,125, 10, 10,118,111,
-105,100, 32,109,116,101,120, 95,114,103, 98,116,111,105,110,116, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,102,
-108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,105,110,116,101,110,115,105,116,121, 32, 61, 32,100,
-111,116, 40,118,101, 99, 51, 40, 48, 46, 51, 53, 44, 32, 48, 46, 52, 53, 44, 32, 48, 46, 50, 41, 44, 32,114,103, 98, 46,114,103,
- 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,105,110,118,101,114,116, 40,102,108,
-111, 97,116, 32,105,110,118, 97,108,117,101, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,117,101, 41,
- 10,123, 10, 9,111,117,116,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 32, 45, 32,105,110,118, 97,108,117,101, 59, 10,125, 10,
- 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,105,110,118,101,114,116, 40,118,101, 99, 52, 32,105,110,114,103, 98,
- 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,
-101, 99, 52, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,105,110,114,103, 98, 46,114,103, 98, 44, 32,105,110,114,103, 98,
- 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115,116,101,110, 99,105,108, 40,
-102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,102,108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
-111,117,116,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,105,110,
-116,101,110,115,105,116,121, 59, 10, 9,111,117,116,105,110,116,101,110,115,105,116,121, 32, 61, 32,105,110,116,101,110,115,105,
-116,121, 42,115,116,101,110, 99,105,108, 59, 10, 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,
-108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,116,101,110, 99,105,108,
- 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,102,108,
-111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41,
- 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,114,103, 98, 46, 97, 59, 10, 9,111,117,116,114,103, 98, 32,
- 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32,114,103, 98, 46, 97, 42,115,116,101,110, 99,105,108, 41, 59, 10,
- 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,111,102,115, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44,
- 32,118,101, 99, 51, 32,111,102,115, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116,101,120, 99,111, 41, 10,123, 10,
- 9,111,117,116,116,101,120, 99,111, 32, 61, 32,116,101,120, 99,111, 32, 43, 32,111,102,115, 59, 10,125, 10, 10,118,111,105,100,
- 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,115,105,122,101, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,118,
-101, 99, 51, 32,115,105,122,101, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116,101,120, 99,111, 41, 10,123, 10, 9,
-111,117,116,116,101,120, 99,111, 32, 61, 32,115,105,122,101, 42,116,101,120, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,109,
-116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,101, 99,
- 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40,118,101, 99, 46,120,
-121, 42, 48, 46, 53, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 32, 48, 46, 53, 41, 44, 32,118,101, 99, 46,122, 41, 59, 10,
-125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115,
- 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,
-117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,
-101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48,
- 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,116,101,120, 99,111,
- 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108,
- 41, 10,123, 10, 9, 47, 47, 32, 84,104,101, 32,105,110,118,101,114,116, 32,111,102, 32,116,104,101, 32,114,101,100, 32, 99,104,
- 97,110,110,101,108, 32,105,115, 32,116,111, 32,109, 97,107,101, 10, 9, 47, 47, 32,116,104,101, 32,110,111,114,109, 97,108, 32,
-109, 97,112, 32, 99,111,109,112,108,105, 97,110,116, 32,119,105,116,104, 32,116,104,101, 32,111,117,116,115,105,100,101, 32,119,
-111,114,108,100, 46, 10, 9, 47, 47, 32, 73,116, 32,110,101,101,100,115, 32,116,111, 32, 98,101, 32,100,111,110,101, 32, 98,101,
- 99, 97,117,115,101, 32,105,110, 32, 66,108,101,110,100,101,114, 10, 9, 47, 47, 32,116,104,101, 32,110,111,114,109, 97,108, 32,
-117,115,101,100, 32,112,111,105,110,116,115, 32,105,110,119, 97,114,100, 46, 10, 9, 47, 47, 32, 83,104,111,117,108,100, 32,116,
-104,105,115, 32,101,118,101,114, 32, 99,104, 97,110,103,101, 32,116,104,105,115, 32,110,101,103, 97,116,101, 32,109,117,115,116,
- 32, 98,101, 32,114,101,109,111,118,101,100, 46, 10, 32, 32, 32, 32,118,101, 99, 52, 32, 99,111,108,111,114, 32, 61, 32,116,101,
-120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,110,111,114,109, 97,108, 32,
- 61, 32, 50, 46, 48, 42, 40,118,101, 99, 51, 40, 45, 99,111,108,111,114, 46,114, 44, 32, 99,111,108,111,114, 46,103, 44, 32, 99,
-111,108,111,114, 46, 98, 41, 32, 45, 32,118,101, 99, 51, 40, 45, 48, 46, 53, 44, 32, 48, 46, 53, 44, 32, 48, 46, 53, 41, 41, 59,
- 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,110,111,114,109, 97,108,115, 95,105,110,105,116, 40,
- 32,118,101, 99, 51, 32,118, 78, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78,111,114,103, 44, 32,111,117,116, 32,118,101,
- 99, 51, 32,118, 78, 97, 99, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,
-100,101, 32, 41, 10,123, 10, 9,118, 78,111,114,103, 32, 61, 32,118, 78, 59, 10, 9,118, 78, 97, 99, 99, 32, 61, 32,118, 78, 59,
- 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10, 47, 42, 42, 32,104,
-101,108,112,101,114, 32,109,101,116,104,111,100, 32,116,111, 32,101,120,116,114, 97, 99,116, 32,116,104,101, 32,117,112,112,101,
-114, 32,108,101,102,116, 32, 51,120, 51, 32,109, 97,116,114,105,120, 32,102,114,111,109, 32, 97, 32, 52,120, 52, 32,109, 97,116,
-114,105,120, 32, 42, 47, 10,109, 97,116, 51, 32,116,111, 95,109, 97,116, 51, 40,109, 97,116, 52, 32,109, 52, 41, 10,123, 10, 9,
-109, 97,116, 51, 32,109, 51, 59, 10, 9,109, 51, 91, 48, 93, 32, 61, 32,109, 52, 91, 48, 93, 46,120,121,122, 59, 10, 9,109, 51,
- 91, 49, 93, 32, 61, 32,109, 52, 91, 49, 93, 46,120,121,122, 59, 10, 9,109, 51, 91, 50, 93, 32, 61, 32,109, 52, 91, 50, 93, 46,
-120,121,122, 59, 10, 9,114,101,116,117,114,110, 32,109, 51, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,
-109,112, 95,105,110,105,116, 95,111, 98,106,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44,
- 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,109, 97,116, 52, 32,109,
- 86,105,101,119, 44, 32,109, 97,116, 52, 32,109, 86,105,101,119, 73,110,118, 44, 32,109, 97,116, 52, 32,109, 79, 98,106, 44, 32,
-109, 97,116, 52, 32,109, 79, 98,106, 73,110,118, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,102,108,111, 97,116, 32,102, 80,
-114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10,
- 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,
-101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10, 9, 9, 9, 9,
- 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44,
- 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,109, 97,116, 51, 32,111, 98,106, 50,118,
-105,101,119, 32, 61, 32,116,111, 95,109, 97,116, 51, 40,109, 86,105,101,119, 32, 42, 32,109, 79, 98,106, 41, 59, 10, 9,109, 97,
-116, 51, 32,118,105,101,119, 50,111, 98,106, 32, 61, 32,116,111, 95,109, 97,116, 51, 40,109, 79, 98,106, 73,110,118, 32, 42, 32,
-109, 86,105,101,119, 73,110,118, 41, 59, 10, 9, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,118,105,101,
-119, 50,111, 98,106, 32, 42, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,
-118, 83,105,103,109, 97, 84, 32, 61, 32,118,105,101,119, 50,111, 98,106, 32, 42, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,
-112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,115,117,114,
-102, 95,110,111,114,109, 32, 42, 32,111, 98,106, 50,118,105,101,119, 32, 41, 59, 10, 10, 9,118, 82, 49, 32, 61, 32, 99,114,111,
-115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40,
- 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 59, 10, 9,102, 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118,
- 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 32, 41, 59, 10, 9, 10, 9, 47, 42, 32,112,114,101,116,114, 97,110,115,102,111,114,
-109, 32,118, 78, 97, 99, 99, 32, 40,105,110, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 41, 32,117,115,105,
-110,103, 32,116,104,101, 32,105,110,118,101,114,115,101, 32,116,114, 97,110,115,112,111,115,101,100, 32, 42, 47, 10, 9,118, 82,
- 49, 32, 61, 32,118, 82, 49, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10, 9,118, 82, 50, 32, 61, 32,118, 82, 50, 32, 42,
- 32,118,105,101,119, 50,111, 98,106, 59, 10, 9,118, 78, 32, 61, 32,118, 78, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10,
- 9, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 32,
- 42, 32,108,101,110,103,116,104, 40,118, 78, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99,
- 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,
-100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77,
- 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116,
- 95,116,101,120,116,117,114,101,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101,
- 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,102,108,111, 97,116, 32,102,
- 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44,
- 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,
-117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10, 9, 9,
- 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,
- 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 51, 32,118, 83,
-105,103,109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,
-118, 83,105,103,109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99,
- 51, 32,118, 78, 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110,111,114,109, 97,108,105,122,101,100, 32,
-105,110,116,101,114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,120, 32,110,111,114,109, 97,108, 32, 42, 47, 10, 9, 10,
- 9,118, 82, 49, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84,
- 44, 32,118, 78, 32, 41, 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32, 99,114,111,115,
-115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 41, 59, 10, 9,102, 68,101,116, 32, 61, 32,115,105,103,110,
- 40, 32,100,111,116, 40,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 41, 32, 41, 59, 10, 9, 10, 9,102,108,111, 97,116, 32,
-102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,
-117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,
-114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,
-101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120,
- 95, 98,117,109,112, 95,105,110,105,116, 95,118,105,101,119,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,
-112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,
-102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78,
- 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,
-118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,
-117,116, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116,
- 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,
-118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59,
- 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32,
- 41, 59, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110,111,114,109,
- 97,108,105,122,101,100, 32,105,110,116,101,114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,120, 32,110,111,114,109, 97,
-108, 32, 42, 47, 10, 9, 10, 9,118, 82, 49, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78,
- 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32,
- 59, 10, 9,102, 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 32, 41, 59, 10,
- 9, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59,
- 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,
-116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,
-118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,
-118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, 51, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44,
- 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 10, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,
-115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 50, 32, 83, 84,108,108,
- 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 10, 9,118,101, 99, 50, 32, 83, 84,108,114, 32, 61, 32,116,101,120, 99,111, 46,
-120,121, 32, 43, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,117,108,
- 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 10, 9,
- 10, 9,102,108,111, 97,116, 32, 72,108,108, 44, 72,108,114, 44, 72,117,108, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,
-101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,108, 41, 44, 32, 72,108,108, 32, 41, 59, 10, 9,114,103, 98,
-116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,114, 41, 44, 32, 72,108,114, 32,
- 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117,108,
- 41, 44, 32, 72,117,108, 32, 41, 59, 10, 9, 10, 9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,108,114,
- 32, 45, 32, 72,108,108, 41, 59, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,117,108, 32, 45, 32,
- 72,108,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, 53, 40, 32,118,101,
- 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104,
- 83, 99, 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116,
- 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10, 9,
-118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,118,101,
- 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 10, 9,118,101, 99,
- 50, 32, 83, 84, 99, 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 10, 9,118,101, 99, 50, 32, 83, 84,108, 32, 61, 32,116,101,
-120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,114,
- 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10, 9,118,101, 99,
- 50, 32, 83, 84,100, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,121, 32, 59,
- 10, 9,118,101, 99, 50, 32, 83, 84,117, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,
-120, 68,121, 32, 59, 10, 9, 10, 9,102,108,111, 97,116, 32, 72, 99, 44, 72,108, 44, 72,114, 44, 72,100, 44, 72,117, 59, 10, 9,
-114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84, 99, 41, 44, 32, 72, 99,
- 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,
- 41, 44, 32, 72,108, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97,
- 44, 32, 83, 84,114, 41, 44, 32, 72,114, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50,
- 68, 40,105,109, 97, 44, 32, 83, 84,100, 41, 44, 32, 72,100, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,
-116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117, 41, 44, 32, 72,117, 32, 41, 59, 10, 9, 10, 9,100, 66,115, 32, 61,
- 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,114, 32, 45, 32, 72,108, 41, 59, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,
-108,101, 32, 42, 32, 40, 72,117, 32, 45, 32, 72,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,
-112, 95,100,101,114,105,118, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,
-109, 97, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121, 44, 32,102,108,
-111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41,
- 32, 10,123, 10, 9,102,108,111, 97,116, 32,115, 32, 61, 32, 49, 46, 48, 59, 9, 9, 47, 47, 32,110,101,103, 97,116,101, 32,116,
-104,105,115, 32,105,102, 32,102,108,105,112,112,101,100, 32,116,101,120,116,117,114,101, 32, 99,111,111,114,100,105,110, 97,116,
-101, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10,
- 9,118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9, 10,
- 9, 47, 47, 32,116,104,105,115, 32,118, 97,114,105, 97,110,116, 32,117,115,105,110,103, 32, 97, 32,100,101,114,105,118, 97,116,
-105,118,101, 32,109, 97,112, 32,105,115, 32,100,101,115, 99,114,105, 98,101,100, 32,104,101,114,101, 10, 9, 47, 47, 32,104,116,
-116,112, 58, 47, 47,109,109,105,107,107,101,108,115,101,110, 51,100, 46, 98,108,111,103,115,112,111,116, 46, 99,111,109, 47, 50,
- 48, 49, 49, 47, 48, 55, 47,100,101,114,105,118, 97,116,105,118,101, 45,109, 97,112,115, 46,104,116,109,108, 10, 9,118,101, 99,
- 50, 32,100,105,109, 32, 61, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 44, 32,105,109, 97, 95,121, 41, 59, 10, 9,118,101, 99,
- 50, 32,100, 66,100,117,118, 32, 61, 32,104, 83, 99, 97,108,101, 42,100,105,109, 42, 40, 50, 46, 48, 42,116,101,120,116,117,114,
-101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 46,120,121, 45, 49, 46, 48, 41, 59, 10, 9, 10, 9,100,
- 66,115, 32, 61, 32,100, 66,100,117,118, 46,120, 42, 84,101,120, 68,120, 46,120, 32, 43, 32,115, 42,100, 66,100,117,118, 46,121,
- 42, 84,101,120, 68,120, 46,121, 59, 10, 9,100, 66,116, 32, 61, 32,100, 66,100,117,118, 46,120, 42, 84,101,120, 68,121, 46,120,
- 32, 43, 32,115, 42,100, 66,100,117,118, 46,121, 42, 84,101,120, 68,121, 46,121, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,
-101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32,102,108,111, 97,116,
- 32,100, 66,115, 44, 32,102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,118,101, 99, 51, 32,
-118, 82, 50, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,
-101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,
-100, 95,110,111,114,109, 32, 41, 32, 10,123, 10, 9,118,101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,
-103,110, 40,102, 68,101,116, 41, 32, 42, 32, 40, 32,100, 66,115, 32, 42, 32,118, 82, 49, 32, 43, 32,100, 66,116, 32, 42, 32,118,
- 82, 50, 32, 41, 59, 10, 9, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,
-118, 83,117,114,102, 71,114, 97,100, 59, 10, 9,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,
-109, 97,108,105,122,101, 40, 32,118, 78, 97, 99, 99, 95,111,117,116, 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,
-120, 95, 98,117,109,112, 95, 97,112,112,108,121, 95,116,101,120,115,112, 97, 99,101, 40, 32,102,108,111, 97,116, 32,102, 68,101,
-116, 44, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82,
- 49, 44, 32,118,101, 99, 51, 32,118, 82, 50, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,118,101, 99, 51, 32,
-116,101,120, 99,111, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121, 44,
- 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118,101,
- 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,100,
- 95,110,111,114,109, 32, 41, 32, 10,123, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,
-120, 99,111, 46,120,121, 41, 59, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,
-111, 46,120,121, 41, 59, 10, 10, 9,118,101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,103,110, 40,102,
- 68,101,116, 41, 32, 42, 32, 40, 32, 10, 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,115, 32, 47, 32,108,101,110,
-103,116,104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,120, 46,120, 44, 32,105,109, 97, 95,121, 42, 84,
-101,120, 68,120, 46,121, 41, 32, 41, 32, 42, 32,118, 82, 49, 32, 43, 32, 10, 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
-100, 66,116, 32, 47, 32,108,101,110,103,116,104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,121, 46,120,
- 44, 32,105,109, 97, 95,121, 42, 84,101,120, 68,121, 46,121, 41, 32, 41, 32, 42, 32,118, 82, 50, 32, 41, 59, 10, 9, 9, 9, 9,
- 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71,114,
- 97,100, 59, 10, 9,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,
- 32,118, 78, 97, 99, 99, 95,111,117,116, 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,101,103, 97,116,
-101, 95,116,101,120,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99,
- 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, 51,
- 40, 45,110,111,114,109, 97,108, 46,120, 44, 32, 45,110,111,114,109, 97,108, 46,121, 44, 32,110,111,114,109, 97,108, 46,122, 41,
- 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,115,112, 97, 99,101, 95,116, 97,110,103,101,110,116, 40,118,101,
- 99, 52, 32,116, 97,110,103,101,110,116, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,116,101,
-120,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,
-118,101, 99, 51, 32, 66, 32, 61, 32,116, 97,110,103,101,110,116, 46,119, 32, 42, 32, 99,114,111,115,115, 40,110,111,114,109, 97,
-108, 44, 32,116, 97,110,103,101,110,116, 46,120,121,122, 41, 59, 10, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,116,
-101,120,110,111,114,109, 97,108, 46,120, 42,116, 97,110,103,101,110,116, 46,120,121,122, 32, 43, 32,116,101,120,110,111,114,109,
- 97,108, 46,121, 42, 66, 32, 43, 32,116,101,120,110,111,114,109, 97,108, 46,122, 42,110,111,114,109, 97,108, 59, 10, 9,111,117,
-116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, 41, 59, 10,
-125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,108,101,110,100, 95,110,111,114,109, 97,108, 40,102,108,111, 97,116, 32,
-110,111,114,102, 97, 99, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,110,101,119,110,111,114,
-109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,111,117,116,110,
-111,114,109, 97,108, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32,110,111,114,102, 97, 99, 41, 42,110,111,114,109, 97,108, 32, 43, 32,
-110,111,114,102, 97, 99, 42,110,101,119,110,111,114,109, 97,108, 59, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,
-111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42,
- 32, 77, 65, 84, 69, 82, 73, 65, 76, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,
-118,105,115,105, 98,105,108,105,116,121, 95,115,117,110, 95,104,101,109,105, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99,
- 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,108,118, 32, 61, 32,108, 97,109,112,118,101,
- 99, 59, 10, 9,100,105,115,116, 32, 61, 32, 49, 46, 48, 59, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,
-125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,111,116,104,101,114, 40,118,101,
- 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,118, 44,
- 32,111,117,116, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102,
- 97, 99, 41, 10,123, 10, 9,108,118, 32, 61, 32, 99,111, 32, 45, 32,108, 97,109,112, 99,111, 59, 10, 9,100,105,115,116, 32, 61,
- 32,108,101,110,103,116,104, 40,108,118, 41, 59, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118, 41,
- 59, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102,
- 97,108,108,111,102,102, 95,105,110,118,108,105,110,101, 97,114, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44,
- 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,
-123, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32,
- 43, 32,100,105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95,105,110,
-118,115,113,117, 97,114,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,100,105,
-115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,118,105,115,105,102, 97,
- 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,100,105,115,116, 42,100,105,
-115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95,115,108,105,100,101,114,
-115, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,108,100, 49, 44, 32,102,108,111,
- 97,116, 32,108,100, 50, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,
-115,105,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116,107,119, 32, 61, 32,108, 97,109,
-112,100,105,115,116, 42,108, 97,109,112,100,105,115,116, 59, 10, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,
-100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,108,100, 49, 42,100,105,115,116, 41, 59, 10, 9,118,105,115,
-105,102, 97, 99, 32, 42, 61, 32,108, 97,109,112,100,105,115,116,107,119, 47, 40,108, 97,109,112,100,105,115,116,107,119, 32, 43,
- 32,108,100, 50, 42,100,105,115,116, 42,100,105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,
-108,108,111,102,102, 95, 99,117,114,118,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,115, 97,109,112,
-108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,
-102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,116,101,120,116,
-117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,100,105,115,116, 47,108, 97,109,112,100,105,115,116, 41, 46,120,
+ 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108,
+ 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100,
+ 32,109,116,101,120, 95,118, 97,108,117,101, 95,100,105,118, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,
+111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97,
+ 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97,
+ 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44,
+ 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,102, 40,116,101,120, 99,111,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9,105,110,
+ 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 47,
+116,101,120, 99,111,108, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,
+118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100,105,102,102, 40,102,108,111, 97,116, 32,111,117,116, 99,111,
+108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111,
+ 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111,
+ 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,
+102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,
+111,108, 32, 43, 32,102, 97, 99,116, 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,
+125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,111,117,
+116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,
+102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,
+102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,
+116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97,
+ 99,116, 42,116,101,120, 99,111,108, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,
+111,108, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125,
+ 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,111,117,
+116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,
+102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,
+102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,
+116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97,
+ 99,116, 42,116,101,120, 99,111,108, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,
+111,108, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125,
+ 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 99,108, 97,109,112, 95,112,111,115,105,116,105,118,101,
+ 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10,
+ 9,111,117,116,102, 97, 99, 32, 61, 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100,
+ 32,109,116,101,120, 95,118, 97,108,117,101, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116,
+ 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,111,117,116,102, 97, 99, 32, 61, 32, 99,108, 97,109,112,
+ 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,
+114, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,104, 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,
+116,104, 97,114, 41, 10,123, 10, 9,111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 47, 49, 50, 56, 46, 48, 59, 10,125, 10, 10,
+118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,109,117,108,116,105,112,108,121, 95, 99,108, 97,109,112, 40,102,108,111,
+ 97,116, 32,104, 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,104, 97,114,
+ 32, 42, 61, 32, 49, 50, 56, 46, 48, 59, 10, 10, 9,105,102, 40,104, 97,114, 32, 60, 32, 49, 46, 48, 41, 32,111,117,116,104, 97,
+114, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,104, 97,114, 32, 62, 32, 53, 49, 49, 46, 48, 41, 32,111,
+117,116,104, 97,114, 32, 61, 32, 53, 49, 49, 46, 48, 59, 10, 9,101,108,115,101, 32,111,117,116,104, 97,114, 32, 61, 32,104, 97,
+114, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,102,114,111,109, 95, 99,111,108, 40,118,
+101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 41, 10,123, 10, 9, 97,108,112,
+104, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,116,
+111, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116,
+ 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 99,
+111,108, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98,
+116,111,105,110,116, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,116,101,110,115,
+105,116,121, 41, 10,123, 10, 9,105,110,116,101,110,115,105,116,121, 32, 61, 32,100,111,116, 40,118,101, 99, 51, 40, 48, 46, 51,
+ 53, 44, 32, 48, 46, 52, 53, 44, 32, 48, 46, 50, 41, 44, 32,114,103, 98, 46,114,103, 98, 41, 59, 10,125, 10, 10,118,111,105,100,
+ 32,109,116,101,120, 95,118, 97,108,117,101, 95,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,105,110,118, 97,108,117,101,
+ 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,117,101, 41, 10,123, 10, 9,111,117,116,118, 97,108,117,
+101, 32, 61, 32, 49, 46, 48, 32, 45, 32,105,110,118, 97,108,117,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,
+114,103, 98, 95,105,110,118,101,114,116, 40,118,101, 99, 52, 32,105,110,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,
+111,117,116,114,103, 98, 41, 10,123, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,118,101, 99, 51, 40, 49, 46,
+ 48, 41, 32, 45, 32,105,110,114,103, 98, 46,114,103, 98, 44, 32,105,110,114,103, 98, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,
+100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,
+105,108, 44, 32,102,108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
+117,116,115,116,101,110, 99,105,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,105,110,116,101,110,115,105,116,
+121, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,105,110,116,101,110,115,105,116,121, 59, 10, 9,111,
+117,116,105,110,116,101,110,115,105,116,121, 32, 61, 32,105,110,116,101,110,115,105,116,121, 42,115,116,101,110, 99,105,108, 59,
+ 10, 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 10,125, 10, 10,
+118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110,
+ 99,105,108, 44, 32,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110,
+ 99,105,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102,
+ 97, 99,116, 32, 61, 32,114,103, 98, 46, 97, 59, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,
+114,103, 98, 44, 32,114,103, 98, 46, 97, 42,115,116,101,110, 99,105,108, 41, 59, 10, 9,111,117,116,115,116,101,110, 99,105,108,
+ 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,
+112,112,105,110,103, 95,111,102,115, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,118,101, 99, 51, 32,111,102,115, 44, 32,
+111,117,116, 32,118,101, 99, 51, 32,111,117,116,116,101,120, 99,111, 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61,
+ 32,116,101,120, 99,111, 32, 43, 32,111,102,115, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,
+110,103, 95,115,105,122,101, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,118,101, 99, 51, 32,115,105,122,101, 44, 32,111,
+117,116, 32,118,101, 99, 51, 32,111,117,116,116,101,120, 99,111, 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,
+115,105,122,101, 42,116,101,120, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,
+105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123,
+ 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40,118,101, 99, 46,120,121, 42, 48, 46, 53, 32, 43, 32,118,101, 99,
+ 50, 40, 48, 46, 53, 44, 32, 48, 46, 53, 41, 44, 32,118,101, 99, 46,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,
+120, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109,
+ 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,
+111,114, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,101,
+120, 99,111, 46,120,121, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,
+116,101,120, 95,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68,
+ 32,105,109, 97, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9, 47, 47, 32, 84,104,101,
+ 32,105,110,118,101,114,116, 32,111,102, 32,116,104,101, 32,114,101,100, 32, 99,104, 97,110,110,101,108, 32,105,115, 32,116,111,
+ 32,109, 97,107,101, 10, 9, 47, 47, 32,116,104,101, 32,110,111,114,109, 97,108, 32,109, 97,112, 32, 99,111,109,112,108,105, 97,
+110,116, 32,119,105,116,104, 32,116,104,101, 32,111,117,116,115,105,100,101, 32,119,111,114,108,100, 46, 10, 9, 47, 47, 32, 73,
+116, 32,110,101,101,100,115, 32,116,111, 32, 98,101, 32,100,111,110,101, 32, 98,101, 99, 97,117,115,101, 32,105,110, 32, 66,108,
+101,110,100,101,114, 10, 9, 47, 47, 32,116,104,101, 32,110,111,114,109, 97,108, 32,117,115,101,100, 32,112,111,105,110,116,115,
+ 32,105,110,119, 97,114,100, 46, 10, 9, 47, 47, 32, 83,104,111,117,108,100, 32,116,104,105,115, 32,101,118,101,114, 32, 99,104,
+ 97,110,103,101, 32,116,104,105,115, 32,110,101,103, 97,116,101, 32,109,117,115,116, 32, 98,101, 32,114,101,109,111,118,101,100,
+ 46, 10, 32, 32, 32, 32,118,101, 99, 52, 32, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97,
+ 44, 32,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32, 50, 46, 48, 42, 40,118,101, 99, 51,
+ 40, 45, 99,111,108,111,114, 46,114, 44, 32, 99,111,108,111,114, 46,103, 44, 32, 99,111,108,111,114, 46, 98, 41, 32, 45, 32,118,
+101, 99, 51, 40, 45, 48, 46, 53, 44, 32, 48, 46, 53, 44, 32, 48, 46, 53, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,
+101,120, 95, 98,117,109,112, 95,110,111,114,109, 97,108,115, 95,105,110,105,116, 40, 32,118,101, 99, 51, 32,118, 78, 44, 32,111,
+117,116, 32,118,101, 99, 51, 32,118, 78,111,114,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 44, 32,111,
+117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 32, 41, 10,123, 10, 9,118, 78,111,
+114,103, 32, 61, 32,118, 78, 59, 10, 9,118, 78, 97, 99, 99, 32, 61, 32,118, 78, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,
+105,116,117,100,101, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10, 47, 42, 42, 32,104,101,108,112,101,114, 32,109,101,116,104,111,
+100, 32,116,111, 32,101,120,116,114, 97, 99,116, 32,116,104,101, 32,117,112,112,101,114, 32,108,101,102,116, 32, 51,120, 51, 32,
+109, 97,116,114,105,120, 32,102,114,111,109, 32, 97, 32, 52,120, 52, 32,109, 97,116,114,105,120, 32, 42, 47, 10,109, 97,116, 51,
+ 32,116,111, 95,109, 97,116, 51, 40,109, 97,116, 52, 32,109, 52, 41, 10,123, 10, 9,109, 97,116, 51, 32,109, 51, 59, 10, 9,109,
+ 51, 91, 48, 93, 32, 61, 32,109, 52, 91, 48, 93, 46,120,121,122, 59, 10, 9,109, 51, 91, 49, 93, 32, 61, 32,109, 52, 91, 49, 93,
+ 46,120,121,122, 59, 10, 9,109, 51, 91, 50, 93, 32, 61, 32,109, 52, 91, 50, 93, 46,120,121,122, 59, 10, 9,114,101,116,117,114,
+110, 32,109, 51, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116, 95,111, 98,106,
+115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,
+110,111,114,109, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,109, 97,116, 52, 32,109, 86,105,101,119, 44, 32,109, 97,116, 52, 32,
+109, 86,105,101,119, 73,110,118, 44, 32,109, 97,116, 52, 32,109, 79, 98,106, 44, 32,109, 97,116, 52, 32,109, 79, 98,106, 73,110,
+118, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,
+101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,
+116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,
+118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,101,
+ 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
+102, 68,101,116, 32, 41, 32, 10,123, 10, 9,109, 97,116, 51, 32,111, 98,106, 50,118,105,101,119, 32, 61, 32,116,111, 95,109, 97,
+116, 51, 40,109, 86,105,101,119, 32, 42, 32,109, 79, 98,106, 41, 59, 10, 9,109, 97,116, 51, 32,118,105,101,119, 50,111, 98,106,
+ 32, 61, 32,116,111, 95,109, 97,116, 51, 40,109, 79, 98,106, 73,110,118, 32, 42, 32,109, 86,105,101,119, 73,110,118, 41, 59, 10,
+ 9, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,118,105,101,119, 50,111, 98,106, 32, 42, 32,100, 70,100,
+120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,118,
+105,101,119, 50,111, 98,106, 32, 42, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99,
+ 51, 32,118, 78, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,115,117,114,102, 95,110,111,114,109, 32, 42, 32,111, 98,
+106, 50,118,105,101,119, 32, 41, 59, 10, 10, 9,118, 82, 49, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84,
+ 44, 32,118, 78, 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97,
+ 83, 32, 41, 32, 59, 10, 9,102, 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49,
+ 32, 41, 59, 10, 9, 10, 9, 47, 42, 32,112,114,101,116,114, 97,110,115,102,111,114,109, 32,118, 78, 97, 99, 99, 32, 40,105,110,
+ 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 41, 32,117,115,105,110,103, 32,116,104,101, 32,105,110,118,101,
+114,115,101, 32,116,114, 97,110,115,112,111,115,101,100, 32, 42, 47, 10, 9,118, 82, 49, 32, 61, 32,118, 82, 49, 32, 42, 32,118,
+105,101,119, 50,111, 98,106, 59, 10, 9,118, 82, 50, 32, 61, 32,118, 82, 50, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10,
+ 9,118, 78, 32, 61, 32,118, 78, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10, 9, 10, 9,102,108,111, 97,116, 32,102, 77,
+ 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 32, 42, 32,108,101,110,103,116,104, 40,118, 78,
+ 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,
+110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10, 9,102, 80,
+114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125,
+ 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116, 95,116,101,120,116,117,114,101,115,112, 97,
+ 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,
+109, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,
+100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,
+111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,
+116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116,
+ 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111,
+ 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,100, 70,100,
+120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,100,
+ 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,115,117,114,102,
+ 95,110,111,114,109, 59, 32, 47, 42, 32,110,111,114,109, 97,108,105,122,101,100, 32,105,110,116,101,114,112,111,108, 97,116,101,
+100, 32,118,101,114,116,101,120, 32,110,111,114,109, 97,108, 32, 42, 47, 10, 9, 10, 9,118, 82, 49, 32, 61, 32,110,111,114,109,
+ 97,108,105,122,101, 40, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 32, 41, 59, 10, 9,
+118, 82, 50, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,
+109, 97, 83, 32, 41, 32, 41, 59, 10, 9,102, 68,101,116, 32, 61, 32,115,105,103,110, 40, 32,100,111,116, 40,118, 83,105,103,109,
+ 97, 83, 44, 32,118, 82, 49, 41, 32, 41, 59, 10, 9, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32,
+ 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,
+105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,
+101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,
+103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116, 95,
+118,105,101,119,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115,
+117,114,102, 95,110,111,114,109, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118,
+ 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9,
+ 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,
+111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10, 9, 9, 9, 9, 9, 9,
+ 9, 32, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,
+111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97,
+ 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 83,105,103,
+109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 78,
+ 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110,111,114,109, 97,108,105,122,101,100, 32,105,110,116,101,
+114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,120, 32,110,111,114,109, 97,108, 32, 42, 47, 10, 9, 10, 9,118, 82, 49,
+ 32, 61, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32,
+ 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 59, 10, 9,102, 68,101,116, 32, 61, 32,100,
+111,116, 32, 40, 32,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 32, 41, 59, 10, 9, 10, 9,102,108,111, 97,116, 32,102, 77,
+ 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,117,116,
+ 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,
+118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,
+111,117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,
+117,109,112, 95,116, 97,112, 51, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,
+105,109, 97, 44, 32,102,108,111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,
+116, 32,100, 66,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 50, 32, 83, 84,108,108, 32, 61, 32,116,101,120, 99,111, 46,120,121,
+ 59, 10, 9,118,101, 99, 50, 32, 83, 84,108,114, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32,100, 70,100,120, 40,116,
+101,120, 99,111, 46,120,121, 41, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,117,108, 32, 61, 32,116,101,120, 99,111, 46,120,121,
+ 32, 43, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 10, 9, 10, 9,102,108,111, 97,116, 32, 72,108,108,
+ 44, 72,108,114, 44, 72,117,108, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109,
+ 97, 44, 32, 83, 84,108,108, 41, 44, 32, 72,108,108, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,
+114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,114, 41, 44, 32, 72,108,114, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119,
+ 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117,108, 41, 44, 32, 72,117,108, 32, 41, 59, 10, 9,
+ 10, 9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,108,114, 32, 45, 32, 72,108,108, 41, 59, 10, 9,100,
+ 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,117,108, 32, 45, 32, 72,108,108, 41, 59, 10,125, 10, 10,118,111,
+105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, 53, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115,
+ 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 10, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,115, 44,
+ 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32,
+ 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,
+100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 10, 9,118,101, 99, 50, 32, 83, 84, 99, 32, 61, 32,116,101,120,
+ 99,111, 46,120,121, 59, 10, 9,118,101, 99, 50, 32, 83, 84,108, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 45, 32, 48, 46,
+ 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,114, 32, 61, 32,116,101,120, 99,111, 46,120,121,
+ 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,100, 32, 61, 32,116,101,120,
+ 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,121, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,117, 32,
+ 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,121, 32, 59, 10, 9, 10, 9,102,108,
+111, 97,116, 32, 72, 99, 44, 72,108, 44, 72,114, 44, 72,100, 44, 72,117, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,
+120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84, 99, 41, 44, 32, 72, 99, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,
+119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108, 41, 44, 32, 72,108, 32, 41, 59, 10, 9,114,
+103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,114, 41, 44, 32, 72,114, 32,
+ 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,100, 41,
+ 44, 32, 72,100, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44,
+ 32, 83, 84,117, 41, 44, 32, 72,117, 32, 41, 59, 10, 9, 10, 9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40,
+ 72,114, 32, 45, 32, 72,108, 41, 59, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,117, 32, 45, 32,
+ 72,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,100,101,114,105,118, 40, 32,118,101,
+ 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,105,
+109, 97, 95,120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121, 44, 32,102,108,111, 97,116, 32,104, 83, 99, 97,108,101, 44,
+ 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,108,111, 97,116,
+ 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10, 9,102,108,111, 97,116, 32,
+115, 32, 61, 32, 49, 46, 48, 59, 9, 9, 47, 47, 32,110,101,103, 97,116,101, 32,116,104,105,115, 32,105,102, 32,102,108,105,112,
+112,101,100, 32,116,101,120,116,117,114,101, 32, 99,111,111,114,100,105,110, 97,116,101, 10, 9,118,101, 99, 50, 32, 84,101,120,
+ 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,121,
+ 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9, 10, 9, 47, 47, 32,116,104,105,115, 32,118, 97,
+114,105, 97,110,116, 32,117,115,105,110,103, 32, 97, 32,100,101,114,105,118, 97,116,105,118,101, 32,109, 97,112, 32,105,115, 32,
+100,101,115, 99,114,105, 98,101,100, 32,104,101,114,101, 10, 9, 47, 47, 32,104,116,116,112, 58, 47, 47,109,109,105,107,107,101,
+108,115,101,110, 51,100, 46, 98,108,111,103,115,112,111,116, 46, 99,111,109, 47, 50, 48, 49, 49, 47, 48, 55, 47,100,101,114,105,
+118, 97,116,105,118,101, 45,109, 97,112,115, 46,104,116,109,108, 10, 9,118,101, 99, 50, 32,100,105,109, 32, 61, 32,118,101, 99,
+ 50, 40,105,109, 97, 95,120, 44, 32,105,109, 97, 95,121, 41, 59, 10, 9,118,101, 99, 50, 32,100, 66,100,117,118, 32, 61, 32,104,
+ 83, 99, 97,108,101, 42,100,105,109, 42, 40, 50, 46, 48, 42,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,101,
+120, 99,111, 46,120,121, 41, 46,120,121, 45, 49, 46, 48, 41, 59, 10, 9, 10, 9,100, 66,115, 32, 61, 32,100, 66,100,117,118, 46,
+120, 42, 84,101,120, 68,120, 46,120, 32, 43, 32,115, 42,100, 66,100,117,118, 46,121, 42, 84,101,120, 68,120, 46,121, 59, 10, 9,
+100, 66,116, 32, 61, 32,100, 66,100,117,118, 46,120, 42, 84,101,120, 68,121, 46,120, 32, 43, 32,115, 42,100, 66,100,117,118, 46,
+121, 42, 84,101,120, 68,121, 46,121, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112,
+108,121, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,102,108,111, 97,116,
+ 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,118,101, 99, 51, 32,118,
+ 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,
+117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 41, 32, 10,123,
+ 10, 9,118,101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,103,110, 40,102, 68,101,116, 41, 32, 42, 32,
+ 40, 32,100, 66,115, 32, 42, 32,118, 82, 49, 32, 43, 32,100, 66,116, 32, 42, 32,118, 82, 50, 32, 41, 59, 10, 9, 10, 9,118, 78,
+ 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71,114, 97,100, 59, 10,
+ 9,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,118, 78, 97,
+ 99, 99, 95,111,117,116, 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112,108,
+121, 95,116,101,120,115,112, 97, 99,101, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32,102,108,111, 97,116, 32,100, 66,
+115, 44, 32,102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,118,101, 99, 51, 32,118, 82, 50,
+ 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,102,108,111, 97,
+116, 32,105,109, 97, 95,120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99,
+ 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,
+116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 41, 32, 10,123, 10,
+ 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,118,
+101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 10, 9,118,101,
+ 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,103,110, 40,102, 68,101,116, 41, 32, 42, 32, 40, 32, 10, 9,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,115, 32, 47, 32,108,101,110,103,116,104, 40, 32,118,101, 99, 50, 40,105,
+109, 97, 95,120, 42, 84,101,120, 68,120, 46,120, 44, 32,105,109, 97, 95,121, 42, 84,101,120, 68,120, 46,121, 41, 32, 41, 32, 42,
+ 32,118, 82, 49, 32, 43, 32, 10, 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,116, 32, 47, 32,108,101,110,103,116,
+104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,121, 46,120, 44, 32,105,109, 97, 95,121, 42, 84,101,120,
+ 68,121, 46,121, 41, 32, 41, 32, 42, 32,118, 82, 50, 32, 41, 59, 10, 9, 9, 9, 9, 10, 9,118, 78, 97, 99, 99, 95,111,117,116,
+ 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71,114, 97,100, 59, 10, 9,112,101,114,116,117,114,
+ 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,118, 78, 97, 99, 99, 95,111,117,116, 32,
+ 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,101,103, 97,116,101, 95,116,101,120,110,111,114,109, 97,108,
+ 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108,
+ 41, 10,123, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, 51, 40, 45,110,111,114,109, 97,108, 46,120, 44,
+ 32, 45,110,111,114,109, 97,108, 46,121, 44, 32,110,111,114,109, 97,108, 46,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,
+116,101,120, 95,110,115,112, 97, 99,101, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 52, 32,116, 97,110,103,101,110,116, 44,
+ 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,116,101,120,110,111,114,109, 97,108, 44, 32,111,117,
+116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,118,101, 99, 51, 32, 66, 32, 61, 32,116, 97,
+110,103,101,110,116, 46,119, 32, 42, 32, 99,114,111,115,115, 40,110,111,114,109, 97,108, 44, 32,116, 97,110,103,101,110,116, 46,
+120,121,122, 41, 59, 10, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,116,101,120,110,111,114,109, 97,108, 46,120, 42,
+116, 97,110,103,101,110,116, 46,120,121,122, 32, 43, 32,116,101,120,110,111,114,109, 97,108, 46,121, 42, 66, 32, 43, 32,116,101,
+120,110,111,114,109, 97,108, 46,122, 42,110,111,114,109, 97,108, 59, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,
+111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,
+120, 95, 98,108,101,110,100, 95,110,111,114,109, 97,108, 40,102,108,111, 97,116, 32,110,111,114,102, 97, 99, 44, 32,118,101, 99,
+ 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,110,101,119,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101,
+ 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32, 40, 49, 46,
+ 48, 32, 45, 32,110,111,114,102, 97, 99, 41, 42,110,111,114,109, 97,108, 32, 43, 32,110,111,114,102, 97, 99, 42,110,101,119,110,
+111,114,109, 97,108, 59, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,
+116,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 32, 77, 65, 84, 69, 82, 73, 65, 76, 32, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,
+115,117,110, 95,104,101,109,105, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
+108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,
+115,105,102, 97, 99, 41, 10,123, 10, 9,108,118, 32, 61, 32,108, 97,109,112,118,101, 99, 59, 10, 9,100,105,115,116, 32, 61, 32,
+ 49, 46, 48, 59, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,
+112, 95,118,105,115,105, 98,105,108,105,116,121, 95,111,116,104,101,114, 40,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51,
+ 32,108, 97,109,112, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
+100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,108,118, 32, 61,
+ 32, 99,111, 32, 45, 32,108, 97,109,112, 99,111, 59, 10, 9,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40,108,118, 41,
+ 59, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118, 41, 59, 10, 9,118,105,115,105,102, 97, 99, 32,
+ 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95,105,110,118,108,
+105,110,101, 97,114, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,100,105,115,116,
+ 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,118,105,115,105,102, 97, 99, 32,
+ 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,100,105,115,116, 41, 59, 10,125, 10,
+ 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95,105,110,118,115,113,117, 97,114,101, 40,102,108,111,
+ 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111,
+ 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,
+116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,100,105,115,116, 42,100,105,115,116, 41, 59, 10,125, 10, 10,118,111,105,
+100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95,115,108,105,100,101,114,115, 40,102,108,111, 97,116, 32,108, 97,109,
+112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,108,100, 49, 44, 32,102,108,111, 97,116, 32,108,100, 50, 44, 32,102,108,111,
+ 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,102,
+108,111, 97,116, 32,108, 97,109,112,100,105,115,116,107,119, 32, 61, 32,108, 97,109,112,100,105,115,116, 42,108, 97,109,112,100,
+105,115,116, 59, 10, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,
+105,115,116, 32, 43, 32,108,100, 49, 42,100,105,115,116, 41, 59, 10, 9,118,105,115,105,102, 97, 99, 32, 42, 61, 32,108, 97,109,
+112,100,105,115,116,107,119, 47, 40,108, 97,109,112,100,105,115,116,107,119, 32, 43, 32,108,100, 50, 42,100,105,115,116, 42,100,
+105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95, 99,117,114,118,101,
+ 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32, 99,117,114,118,101,
+109, 97,112, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102,
+ 97, 99, 41, 10,123, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,
+109, 97,112, 44, 32,118,101, 99, 50, 40,100,105,115,116, 47,108, 97,109,112,100,105,115,116, 44, 32, 48, 46, 48, 41, 41, 46,120,
59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112,104,101,114,101,
40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,102,108,111,
97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,102, 97, 99,
diff --git a/source/blender/imbuf/intern/cineon/cineonlib.c b/source/blender/imbuf/intern/cineon/cineonlib.c
index 922cfcf9629..b4da39ac41e 100644
--- a/source/blender/imbuf/intern/cineon/cineonlib.c
+++ b/source/blender/imbuf/intern/cineon/cineonlib.c
@@ -36,6 +36,9 @@
#include <netinet/in.h> /* htonl() */
#endif
#include <string.h> /* memset */
+
+#include "BLI_utildefines.h"
+
#include "cin_debug_stuff.h"
#include "logmemfile.h"
@@ -288,7 +291,7 @@ initCineonGenericHeader(CineonFile* cineon, CineonGenericHeader* header, const c
}
static void
-dumpCineonGenericHeader(CineonGenericHeader* header) {
+UNUSED_FUNCTION(dumpCineonGenericHeader)(CineonGenericHeader* header) {
dumpCineonFileInfo(&header->fileInfo);
dumpCineonImageInfo(&header->imageInfo);
dumpCineonFormatInfo(&header->formatInfo);
diff --git a/source/blender/imbuf/intern/cineon/logImageCore.h b/source/blender/imbuf/intern/cineon/logImageCore.h
index f05c19c4f47..cbc7cb9d64a 100644
--- a/source/blender/imbuf/intern/cineon/logImageCore.h
+++ b/source/blender/imbuf/intern/cineon/logImageCore.h
@@ -38,8 +38,12 @@ extern "C" {
#endif
#include "BLO_sys_types.h" // for intptr_t support
+
+#ifdef _MSC_VER
#undef ntohl
#undef htonl
+#endif
+
typedef int (GetRowFn)(LogImageFile* logImage, unsigned short* row, int lineNum);
typedef int (SetRowFn)(LogImageFile* logImage, const unsigned short* row, int lineNum);
typedef void (CloseFn)(LogImageFile* logImage);
diff --git a/source/blender/makesdna/DNA_actuator_types.h b/source/blender/makesdna/DNA_actuator_types.h
index 93db8340aac..239903208ec 100644
--- a/source/blender/makesdna/DNA_actuator_types.h
+++ b/source/blender/makesdna/DNA_actuator_types.h
@@ -230,6 +230,20 @@ typedef struct bArmatureActuator {
struct Object *subtarget;
} bArmatureActuator;
+typedef struct bSteeringActuator {
+ char pad[5];
+ char flag;
+ short facingaxis;
+ int type; /* 0=seek, 1=flee, 2=path following */
+ float dist;
+ float velocity;
+ float acceleration;
+ float turnspeed;
+ int updateTime;
+ struct Object *target;
+ struct Object *navmesh;
+} bSteeringActuator;
+
typedef struct bActuator {
struct bActuator *next, *prev, *mynew;
short type;
@@ -295,6 +309,7 @@ typedef struct bActuator {
#define ACT_SHAPEACTION 21
#define ACT_STATE 22
#define ACT_ARMATURE 23
+#define ACT_STEERING 24
/* actuator flag */
#define ACT_SHOW 1
@@ -511,6 +526,16 @@ typedef struct bActuator {
#define ACT_CAMERA_X (float)'x'
#define ACT_CAMERA_Y (float)'y'
+/* steeringactuator->type */
+#define ACT_STEERING_SEEK 0
+#define ACT_STEERING_FLEE 1
+#define ACT_STEERING_PATHFOLLOWING 2
+/* steeringactuator->flag */
+#define ACT_STEERING_SELFTERMINATED 1
+#define ACT_STEERING_ENABLEVISUALIZATION 2
+#define ACT_STEERING_AUTOMATICFACING 4
+#define ACT_STEERING_NORMALUP 8
+
#endif
diff --git a/source/blender/makesdna/DNA_customdata_types.h b/source/blender/makesdna/DNA_customdata_types.h
index cdfcf465c6c..b721dc60e73 100644
--- a/source/blender/makesdna/DNA_customdata_types.h
+++ b/source/blender/makesdna/DNA_customdata_types.h
@@ -92,7 +92,8 @@ typedef struct CustomData {
#define CD_ID_MCOL 21
#define CD_TEXTURE_MCOL 22
#define CD_CLOTH_ORCO 23
-#define CD_NUMTYPES 24
+#define CD_RECAST 24
+#define CD_NUMTYPES 25
/* Bits for CustomDataMask */
#define CD_MASK_MVERT (1 << CD_MVERT)
@@ -117,6 +118,7 @@ typedef struct CustomData {
#define CD_MASK_MDISPS (1 << CD_MDISPS)
#define CD_MASK_WEIGHT_MCOL (1 << CD_WEIGHT_MCOL)
#define CD_MASK_CLOTH_ORCO (1 << CD_CLOTH_ORCO)
+#define CD_MASK_RECAST (1 << CD_RECAST)
/* CustomData.flag */
diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h
index e3510b3a25a..61c4a660992 100644
--- a/source/blender/makesdna/DNA_meshdata_types.h
+++ b/source/blender/makesdna/DNA_meshdata_types.h
@@ -184,6 +184,10 @@ typedef struct PartialVisibility {
unsigned int totface, totedge, totvert, pad;
} PartialVisibility;
+typedef struct MRecast{
+ int i;
+} MRecast;
+
/* mvert->flag (1=SELECT) */
#define ME_SPHERETEST 2
#define ME_VERT_TMP_TAG 4
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 053f3b38168..ed060d58123 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -71,6 +71,10 @@ typedef enum ModifierType {
eModifierType_Solidify,
eModifierType_Screw,
eModifierType_Warp,
+ eModifierType_WeightVGEdit,
+ eModifierType_WeightVGMix,
+ eModifierType_WeightVGProximity,
+ eModifierType_NavMesh,
NUM_MODIFIER_TYPES
} ModifierType;
@@ -675,7 +679,6 @@ typedef struct ShrinkwrapModifierData {
#define MOD_SHRINKWRAP_PROJECT_OVER_Z_AXIS (1<<2)
#define MOD_SHRINKWRAP_PROJECT_OVER_NORMAL 0 /* projection over normal is used if no axis is selected */
-
typedef struct SimpleDeformModifierData {
ModifierData modifier;
@@ -747,6 +750,10 @@ typedef struct ScrewModifierData {
#define MOD_SCREW_OBJECT_OFFSET (1<<2)
// #define MOD_SCREW_OBJECT_ANGLE (1<<4)
+typedef struct NavMeshModifierData {
+ ModifierData modifier;
+} NavMeshModifierData;
+
typedef struct WarpModifierData {
ModifierData modifier;
@@ -785,4 +792,173 @@ typedef enum {
/* PROP_RANDOM not used */
} WarpModifierFalloff;
+typedef struct WeightVGEditModifierData {
+ ModifierData modifier;
+
+ /* Note: I tried to keep everything logically ordered - provided the
+ * alignment constraints... */
+
+ char defgrp_name[32]; /* Name of vertex group to edit. */
+
+ short edit_flags; /* Using MOD_WVG_EDIT_* flags. */
+ short falloff_type; /* Using MOD_WVG_MAPPING_* defines. */
+ float default_weight; /* Weight for vertices not in vgroup. */
+
+ /* Mapping stuff. */
+ struct CurveMapping *cmap_curve; /* The custom mapping curve! */
+
+ /* The add/remove vertices weight thresholds. */
+ float add_threshold, rem_threshold;
+
+ /* Masking options. */
+ float mask_constant; /* The global "influence", if no vgroup nor tex is used as mask. */
+ /* Name of mask vertex group from which to get weight factors. */
+ char mask_defgrp_name[32];
+
+ /* Texture masking. */
+ int mask_tex_use_channel; /* Which channel to use as weightf. */
+ struct Tex *mask_texture; /* The texture. */
+ struct Object *mask_tex_map_obj; /* Name of the map object. */
+ /* How to map the texture (using MOD_DISP_MAP_* constants). */
+ int mask_tex_mapping;
+ char mask_tex_uvlayer_name[32]; /* Name of the UV layer. */
+
+ /* Padding... */
+ int pad_i1;
+} WeightVGEditModifierData;
+
+/* WeightVGEdit flags. */
+/* Use parametric mapping. */
+//#define MOD_WVG_EDIT_MAP (1 << 0)
+/* Use curve mapping. */
+//#define MOD_WVG_EDIT_CMAP (1 << 1)
+/* Reverse weights (in the [0.0, 1.0] standard range). */
+//#define MOD_WVG_EDIT_REVERSE_WEIGHTS (1 << 2)
+/* Add vertices with higher weight than threshold to vgroup. */
+#define MOD_WVG_EDIT_ADD2VG (1 << 3)
+/* Remove vertices with lower weight than threshold from vgroup. */
+#define MOD_WVG_EDIT_REMFVG (1 << 4)
+/* Clamp weights. */
+//#define MOD_WVG_EDIT_CLAMP (1 << 5)
+
+typedef struct WeightVGMixModifierData {
+ ModifierData modifier;
+
+ /* XXX Note: I tried to keep everything logically ordered – provided the
+ * alignment constraints... */
+
+ char defgrp_name_a[32]; /* Name of vertex group to modify/weight. */
+ char defgrp_name_b[32]; /* Name of other vertex group to mix in. */
+ float default_weight_a; /* Default weight value for first vgroup. */
+ float default_weight_b; /* Default weight value to mix in. */
+ char mix_mode; /* How second vgroups weights affect first ones */
+ char mix_set; /* What vertices to affect. */
+
+ char pad_c1[6];
+
+ /* Masking options. */
+ float mask_constant; /* The global "influence", if no vgroup nor tex is used as mask. */
+ /* Name of mask vertex group from which to get weight factors. */
+ char mask_defgrp_name[32];
+
+ /* Texture masking. */
+ int mask_tex_use_channel; /* Which channel to use as weightf. */
+ struct Tex *mask_texture; /* The texture. */
+ struct Object *mask_tex_map_obj; /* Name of the map object. */
+ int mask_tex_mapping; /* How to map the texture! */
+ char mask_tex_uvlayer_name[32]; /* Name of the UV layer. */
+
+ /* Padding... */
+ int pad_i1;
+} WeightVGMixModifierData;
+
+/* How second vgroup's weights affect first ones. */
+#define MOD_WVG_MIX_SET 1 /* Second weights replace weights. */
+#define MOD_WVG_MIX_ADD 2 /* Second weights are added to weights. */
+#define MOD_WVG_MIX_SUB 3 /* Second weights are subtracted from weights. */
+#define MOD_WVG_MIX_MUL 4 /* Second weights are multiplied with weights. */
+#define MOD_WVG_MIX_DIV 5 /* Second weights divide weights. */
+#define MOD_WVG_MIX_DIF 6 /* Difference between second weights and weights. */
+#define MOD_WVG_MIX_AVG 7 /* Average of both weights. */
+
+/* What vertices to affect. */
+#define MOD_WVG_SET_ALL 1 /* Affect all vertices. */
+#define MOD_WVG_SET_A 2 /* Affect only vertices in first vgroup. */
+#define MOD_WVG_SET_B 3 /* Affect only vertices in second vgroup. */
+#define MOD_WVG_SET_OR 4 /* Affect only vertices in one vgroup or the other. */
+#define MOD_WVG_SET_AND 5 /* Affect only vertices in both vgroups. */
+
+typedef struct WeightVGProximityModifierData {
+ ModifierData modifier;
+
+ /* Note: I tried to keep everything logically ordered - provided the
+ * alignment constraints... */
+
+ char defgrp_name[32]; /* Name of vertex group to modify/weight. */
+
+ /* Proximity modes. */
+ int proximity_mode;
+ int proximity_flags;
+
+ /* Target object from which to calculate vertices distances. */
+ struct Object *proximity_ob_target;
+
+ /* Masking options. */
+ float mask_constant; /* The global "influence", if no vgroup nor tex is used as mask. */
+ /* Name of mask vertex group from which to get weight factors. */
+ char mask_defgrp_name[32];
+
+ /* Texture masking. */
+ int mask_tex_use_channel; /* Which channel to use as weightf. */
+ struct Tex *mask_texture; /* The texture. */
+ struct Object *mask_tex_map_obj; /* Name of the map object. */
+ int mask_tex_mapping; /* How to map the texture! */
+ char mask_tex_uvlayer_name[32]; /* Name of the UV layer. */
+
+ float min_dist, max_dist; /* Distances mapping to 0.0/1.0 weights. */
+
+ /* Put here to avoid breaking existing struct... */
+ short falloff_type; /* Using MOD_WVG_MAPPING_* defines. */
+
+ /* Padding... */
+ short pad_s1;
+} WeightVGProximityModifierData;
+
+/* Modes of proximity weighting. */
+/* Dist from target object to affected object. */
+#define MOD_WVG_PROXIMITY_OBJECT 1 /* source vertex to other location */
+/* Dist from target object to vertex. */
+#define MOD_WVG_PROXIMITY_GEOMETRY 2 /* source vertex to other geometry */
+
+/* Flags options for proximity weighting. */
+/* Use nearest vertices of target obj, in MOD_WVG_PROXIMITY_GEOMETRY mode. */
+#define MOD_WVG_PROXIMITY_GEOM_VERTS (1 << 0)
+/* Use nearest edges of target obj, in MOD_WVG_PROXIMITY_GEOMETRY mode. */
+#define MOD_WVG_PROXIMITY_GEOM_EDGES (1 << 1)
+/* Use nearest faces of target obj, in MOD_WVG_PROXIMITY_GEOMETRY mode. */
+#define MOD_WVG_PROXIMITY_GEOM_FACES (1 << 2)
+
+/* Defines common to all WeightVG modifiers. */
+/* Mapping modes. */
+#define MOD_WVG_MAPPING_NONE 0
+#define MOD_WVG_MAPPING_CURVE 1
+#define MOD_WVG_MAPPING_SHARP 2 /* PROP_SHARP */
+#define MOD_WVG_MAPPING_SMOOTH 3 /* PROP_SMOOTH */
+#define MOD_WVG_MAPPING_ROOT 4 /* PROP_ROOT */
+/* PROP_LIN not used (same as NONE, here...). */
+/* PROP_CONST not used. */
+#define MOD_WVG_MAPPING_SPHERE 7 /* PROP_SPHERE */
+#define MOD_WVG_MAPPING_RANDOM 8 /* PROP_RANDOM */
+#define MOD_WVG_MAPPING_STEP 9 /* Median Step. */
+
+/* Tex channel to be used as mask. */
+#define MOD_WVG_MASK_TEX_USE_INT 1
+#define MOD_WVG_MASK_TEX_USE_RED 2
+#define MOD_WVG_MASK_TEX_USE_GREEN 3
+#define MOD_WVG_MASK_TEX_USE_BLUE 4
+#define MOD_WVG_MASK_TEX_USE_HUE 5
+#define MOD_WVG_MASK_TEX_USE_SAT 6
+#define MOD_WVG_MASK_TEX_USE_VAL 7
+#define MOD_WVG_MASK_TEX_USE_ALPHA 8
+
#endif
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index efaf30b02f6..bac1e3cd8ca 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -38,26 +38,29 @@
#include "DNA_vec_types.h"
#include "DNA_listBase.h"
+struct ID;
struct ListBase;
struct SpaceNode;
struct bNodeLink;
struct bNodeType;
-struct bNodeGroup;
+struct bNodeTreeExec;
struct AnimData;
struct bGPdata;
struct uiBlock;
#define NODE_MAXSTR 32
-
typedef struct bNodeStack {
float vec[4];
- float min, max; /* min/max for values (UI writes it, execute might use it) */
+ float min, max;
void *data;
short hasinput; /* when input has link, tagged before executing */
short hasoutput; /* when output is linked, tagged before executing */
short datatype; /* type of data pointer */
short sockettype; /* type of socket stack comes from, to remap linking different sockets */
+ short is_copy; /* data is a copy of external data (no freeing) */
+ short external; /* data is used by external nodes (no freeing) */
+ short pad[2];
} bNodeStack;
/* ns->datatype, shadetree only */
@@ -68,50 +71,58 @@ typedef struct bNodeSocket {
struct bNodeSocket *next, *prev, *new_sock;
char name[32];
- bNodeStack ns; /* custom data for inputs, only UI writes in this */
+
+ void *storage; /* custom storage */
short type, flag;
short limit; /* max. number of links */
-
- /* stack data info (only during execution!) */
- short stack_type; /* type of stack reference */
- /* XXX only one of stack_ptr or stack_index is used (depending on stack_type).
- * could store the index in the pointer with SET_INT_IN_POINTER (a bit ugly).
- * (union won't work here, not supported by DNA)
- */
- struct bNodeStack *stack_ptr; /* constant input value */
- short stack_index; /* local stack index or external input number */
short pad1;
float locx, locy;
- /* internal data to retrieve relations and groups */
+ void *default_value; /* default input value used for unlinked sockets */
+
+ /* execution data */
+ short stack_index; /* local stack index */
+ short stack_type; /* deprecated, kept for forward compatibility */
+ int pad3;
+ void *cache; /* cached data from execution */
+ /* internal data to retrieve relations and groups */
int own_index; /* group socket identifiers, to find matching pairs after reading files */
- struct bNodeSocket *groupsock;
int to_index; /* XXX deprecated, only used for restoring old group node links */
- int pad2;
+ struct bNodeSocket *groupsock;
- struct bNodeLink *link; /* a link pointer, set in nodeSolveOrder() */
+ struct bNodeLink *link; /* a link pointer, set in ntreeUpdateTree */
+
+ /* DEPRECATED only needed for do_versions */
+ bNodeStack ns; /* custom data for inputs, only UI writes in this */
} bNodeSocket;
/* sock->type */
-#define SOCK_VALUE 0
-#define SOCK_VECTOR 1
-#define SOCK_RGBA 2
+#define SOCK_FLOAT 0
+#define SOCK_VECTOR 1
+#define SOCK_RGBA 2
+#define SOCK_INT 3
+#define SOCK_BOOLEAN 4
+#define SOCK_MESH 5
+#define NUM_SOCKET_TYPES 6 /* must be last! */
+
+/* socket side (input/output) */
+#define SOCK_IN 1
+#define SOCK_OUT 2
/* sock->flag, first bit is select */
- /* hidden is user defined, to hide unused */
+ /* hidden is user defined, to hide unused */
#define SOCK_HIDDEN 2
- /* only used now for groups... */
-#define SOCK_IN_USE 4
- /* unavailable is for dynamic sockets */
+ /* only used now for groups... */
+#define SOCK_IN_USE 4 /* XXX deprecated */
+ /* unavailable is for dynamic sockets */
#define SOCK_UNAVAIL 8
-
-/* sock->stack_type */
-#define SOCK_STACK_LOCAL 1 /* part of the local tree stack */
-#define SOCK_STACK_EXTERN 2 /* use input stack pointer */
-#define SOCK_STACK_CONST 3 /* use pointer to constant input value */
+ /* dynamic socket (can be modified by user) */
+#define SOCK_DYNAMIC 16
+ /* group socket should not be exposed */
+#define SOCK_INTERNAL 32
typedef struct bNodePreview {
unsigned char *rect;
@@ -119,7 +130,6 @@ typedef struct bNodePreview {
int pad;
} bNodePreview;
-
/* limit data in bNode to what we want to see saved? */
typedef struct bNode {
struct bNode *next, *prev, *new_node;
@@ -132,11 +142,14 @@ typedef struct bNode {
short nr; /* number of this node in list, used for UI exec events */
ListBase inputs, outputs;
+ struct bNode *parent; /* parent node */
struct ID *id; /* optional link to libdata */
void *storage; /* custom data, must be struct, for storage in file */
float locx, locy; /* root offset for drawing */
- float width, miniwidth;
+ float width, height; /* node custom width and height */
+ float miniwidth; /* node width if hidden */
+ int pad;
char label[32]; /* custom user-defined label */
short custom1, custom2; /* to be abused for buttons */
float custom3, custom4;
@@ -151,7 +164,6 @@ typedef struct bNode {
struct uiBlock *block; /* runtime during drawing */
struct bNodeType *typeinfo; /* lookup of callbacks and defaults */
-
} bNode;
/* node->flag */
@@ -163,11 +175,17 @@ typedef struct bNode {
#define NODE_ACTIVE_ID 32
#define NODE_DO_OUTPUT 64
#define NODE_GROUP_EDIT 128
- /* free test flag, undefined */
+ /* free test flag, undefined */
#define NODE_TEST 256
- /* composite: don't do node but pass on buffer(s) */
+ /* composite: don't do node but pass on buffer(s) */
#define NODE_MUTED 512
-#define NODE_CUSTOM_NAME 1024 /* deprecated! */
+#define NODE_CUSTOM_NAME 1024 /* deprecated! */
+ /* group node types: use const outputs by default */
+#define NODE_CONST_OUTPUT (1<<11)
+ /* node is always behind others */
+#define NODE_BACKGROUND (1<<12)
+ /* automatic flag for nodes included in transforms */
+#define NODE_TRANSFORM (1<<13)
typedef struct bNodeLink {
struct bNodeLink *next, *prev;
@@ -175,13 +193,13 @@ typedef struct bNodeLink {
bNode *fromnode, *tonode;
bNodeSocket *fromsock, *tosock;
- int flag, pad;
-
+ int flag;
+ int pad;
} bNodeLink;
-
/* link->flag */
-#define NODE_LINKFLAG_HILITE 1
+#define NODE_LINKFLAG_HILITE 1 /* link has been successfully validated */
+#define NODE_LINK_VALID 2
/* the basis for a Node tree, all links and nodes reside internal here */
/* only re-usable node trees are in the library though, materials and textures allocate own tree struct */
@@ -193,19 +211,24 @@ typedef struct bNodeTree {
ListBase nodes, links;
- bNodeStack *stack; /* stack is only while executing, no read/write in file */
- struct ListBase *threadstack; /* same as above */
-
int type, init; /* set init on fileread */
- int stacksize; /* amount of elements in stack */
int cur_index; /* sockets in groups have unique identifiers, adding new sockets always
will increase this counter */
- int flag, pad;
+ int flag;
+ int update; /* update flags */
+
+ int nodetype; /* specific node type this tree is used for */
- ListBase alltypes; /* type definitions */
ListBase inputs, outputs; /* external sockets for group nodes */
-
- int pad2[2];
+
+ /* execution data */
+ /* XXX It would be preferable to completely move this data out of the underlying node tree,
+ * so node tree execution could finally run independent of the tree itself. This would allow node trees
+ * to be merely linked by other data (materials, textures, etc.), as ID data is supposed to.
+ * Execution data is generated from the tree once at execution start and can then be used
+ * as long as necessary, even while the tree is being modified.
+ */
+ struct bNodeTreeExec *execdata;
/* callbacks */
void (*progress)(void *, float progress);
@@ -216,20 +239,59 @@ typedef struct bNodeTree {
} bNodeTree;
/* ntree->type, index */
-#define NTREE_SHADER 0
-#define NTREE_COMPOSIT 1
-#define NTREE_TEXTURE 2
+#define NTREE_SHADER 0
+#define NTREE_COMPOSIT 1
+#define NTREE_TEXTURE 2
+#define NUM_NTREE_TYPES 3
/* ntree->init, flag */
-#define NTREE_TYPE_INIT 1
-#define NTREE_EXEC_INIT 2
+#define NTREE_TYPE_INIT 1
/* ntree->flag */
#define NTREE_DS_EXPAND 1 /* for animation editors */
-/* XXX not nice, but needed as a temporary flag
+/* XXX not nice, but needed as a temporary flags
* for group updates after library linking.
*/
-#define NTREE_DO_VERSIONS 1024
+#define NTREE_DO_VERSIONS_GROUP_EXPOSE 1024
+
+/* ntree->update */
+#define NTREE_UPDATE 0xFFFF /* generic update flag (includes all others) */
+#define NTREE_UPDATE_LINKS 1 /* links have been added or removed */
+#define NTREE_UPDATE_NODES 2 /* nodes or sockets have been added or removed */
+#define NTREE_UPDATE_GROUP_IN 16 /* group inputs have changed */
+#define NTREE_UPDATE_GROUP_OUT 32 /* group outputs have changed */
+#define NTREE_UPDATE_GROUP 48 /* group has changed (generic flag including all other group flags) */
+
+
+/* socket value structs for input buttons */
+
+typedef struct bNodeSocketValueInt {
+ int subtype; /* RNA subtype */
+ int value;
+ int min, max;
+} bNodeSocketValueInt;
+
+typedef struct bNodeSocketValueFloat {
+ int subtype; /* RNA subtype */
+ float value;
+ float min, max;
+} bNodeSocketValueFloat;
+
+typedef struct bNodeSocketValueBoolean {
+ char value;
+ char pad[3];
+} bNodeSocketValueBoolean;
+
+typedef struct bNodeSocketValueVector {
+ int subtype; /* RNA subtype */
+ float value[3];
+ float min, max;
+} bNodeSocketValueVector;
+
+typedef struct bNodeSocketValueRGBA {
+ float value[4];
+} bNodeSocketValueRGBA;
+
/* data structs, for node->storage */
@@ -354,7 +416,6 @@ typedef struct TexNodeOutput {
char name[32];
} TexNodeOutput;
-
/* comp channel matte */
#define CMP_NODE_CHANNEL_MATTE_CS_RGB 1
#define CMP_NODE_CHANNEL_MATTE_CS_HSV 2
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index ffa82092ef1..8750ee9e906 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -189,6 +189,8 @@ typedef struct Object {
float max_vel; /* clamp the maximum velocity 0.0 is disabled */
float min_vel; /* clamp the maximum velocity 0.0 is disabled */
float m_contactProcessingThreshold;
+ float obstacleRad;
+ char pad0[4];
short rotmode; /* rotation mode - uses defines set out in DNA_action_types.h for PoseChannel rotations... */
@@ -473,6 +475,8 @@ typedef struct DupliObject {
#define OB_SOFT_BODY 0x20000
#define OB_OCCLUDER 0x40000
#define OB_SENSOR 0x80000
+#define OB_NAVMESH 0x100000
+#define OB_HASOBSTACLE 0x200000
/* ob->gameflag2 */
#define OB_NEVER_DO_ACTIVITY_CULLING 1
@@ -493,6 +497,7 @@ typedef struct DupliObject {
#define OB_BODY_TYPE_SOFT 4
#define OB_BODY_TYPE_OCCLUDER 5
#define OB_BODY_TYPE_SENSOR 6
+#define OB_BODY_TYPE_NAVMESH 7
/* ob->scavisflag */
#define OB_VIS_SENS 1
diff --git a/source/blender/makesdna/DNA_outliner_types.h b/source/blender/makesdna/DNA_outliner_types.h
index c44f10efde8..af19aa490ae 100644
--- a/source/blender/makesdna/DNA_outliner_types.h
+++ b/source/blender/makesdna/DNA_outliner_types.h
@@ -51,6 +51,8 @@ typedef struct TreeStore {
#define TSE_CLOSED 1
#define TSE_SELECTED 2
#define TSE_TEXTBUT 4
+#define TSE_CHILDSEARCH 8
+#define TSE_SEARCHMATCH 16
/* TreeStoreElem types in BIF_outliner.h */
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index be2a78ac774..5f20432d6f8 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -426,8 +426,38 @@ typedef struct GameFraming {
#define SCE_GAMEFRAMING_EXTEND 1
#define SCE_GAMEFRAMING_SCALE 2
+typedef struct RecastData
+{
+ float cellsize;
+ float cellheight;
+ float agentmaxslope;
+ float agentmaxclimb;
+ float agentheight;
+ float agentradius;
+ float edgemaxlen;
+ float edgemaxerror;
+ float regionminsize;
+ float regionmergesize;
+ int vertsperpoly;
+ float detailsampledist;
+ float detailsamplemaxerror;
+} RecastData;
+
typedef struct GameData {
+ /* standalone player */
+ struct GameFraming framing;
+ short fullscreen, xplay, yplay, freqplay;
+ short depth, attrib, rt1, rt2;
+
+ /* stereo/dome mode */
+ struct GameDome dome;
+ short stereoflag, stereomode;
+ short pad2, pad3;
+ float eyeseparation, pad1;
+ RecastData recastData;
+
+
/* physics (it was in world)*/
float gravity; /*Gravitation constant for the game world*/
@@ -440,21 +470,12 @@ typedef struct GameData {
* bit 3: (gameengine): Activity culling is enabled.
* bit 5: (gameengine) : enable Bullet DBVT tree for view frustrum culling
*/
- short mode, flag, matmode, pad[3];
+ short mode, flag, matmode, pad[2];
short occlusionRes; /* resolution of occlusion Z buffer in pixel */
short physicsEngine;
short ticrate, maxlogicstep, physubstep, maxphystep;
-
- /* standalone player */
- struct GameFraming framing;
- short fullscreen, xplay, yplay, freqplay;
- short depth, attrib, rt1, rt2;
-
- /* stereo/dome mode */
- struct GameDome dome;
- short stereoflag, stereomode;
- short pad2, pad3;
- float eyeseparation, pad1;
+ short obstacleSimulation;
+ float levelHeight;
} GameData;
#define STEREO_NOSTEREO 1
@@ -478,6 +499,11 @@ typedef struct GameData {
#define WOPHY_ODE 4
#define WOPHY_BULLET 5
+/* obstacleSimulation */
+#define OBSTSIMULATION_NONE 0
+#define OBSTSIMULATION_TOI_rays 1
+#define OBSTSIMULATION_TOI_cells 2
+
/* GameData.flag */
#define GAME_RESTRICT_ANIM_UPDATES (1 << 0)
#define GAME_ENABLE_ALL_FRAMES (1 << 1)
@@ -494,6 +520,7 @@ typedef struct GameData {
#define GAME_IGNORE_DEPRECATION_WARNINGS (1 << 12)
#define GAME_ENABLE_ANIMATION_RECORD (1 << 13)
#define GAME_SHOW_MOUSE (1 << 14)
+#define GAME_SHOW_OBSTACLE_SIMULATION (1 << 15)
#define GAME_GLSL_NO_COLOR_MANAGEMENT (1 << 15)
/* Note: GameData.flag is a short (max 16 flags). To add more flags, GameData.flag needs to be an int */
diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h
index 588e8458de1..3ec26cdadb4 100644
--- a/source/blender/makesdna/DNA_sequence_types.h
+++ b/source/blender/makesdna/DNA_sequence_types.h
@@ -238,6 +238,8 @@ typedef struct SpeedControlVars {
int lastValidFrame;
} SpeedControlVars;
+#define MAXSEQ 32
+
#define SELECT 1
/* Editor->over_flag */
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index 66b10bcbf21..1627d4d2acb 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -861,6 +861,7 @@ enum {
/* outliner search flags (SpaceOops->search_flags) */
#define SO_FIND_CASE_SENSITIVE (1<<0)
#define SO_FIND_COMPLETE (1<<1)
+#define SO_SEARCH_RECURSIVE (1<<2)
/* headerbuttons: 450-499 */
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index 43dc532d4f6..d3ac09dc812 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -607,6 +607,12 @@ extern UserDef U; /* from blenkernel blender.c */
/* zoom is up/down if this flag is set (otherwise forward/backward) */
#define NDOF_ZOOM_UPDOWN (1 << 7)
#define NDOF_ZOOM_INVERT (1 << 8)
+#define NDOF_ROTATE_INVERT_AXIS (1 << 9)
+#define NDOF_TILT_INVERT_AXIS (1 << 10)
+#define NDOF_ROLL_INVERT_AXIS (1 << 11)
+#define NDOF_PANX_INVERT_AXIS (1 << 12)
+#define NDOF_PANY_INVERT_AXIS (1 << 13)
+#define NDOF_PANZ_INVERT_AXIS (1 << 14)
#ifdef __cplusplus
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index 92dbc42e91d..38f5e9af466 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -333,10 +333,13 @@ extern StructRNA RNA_NearSensor;
extern StructRNA RNA_NlaStrip;
extern StructRNA RNA_NlaTrack;
extern StructRNA RNA_Node;
+extern StructRNA RNA_NodeForLoop;
extern StructRNA RNA_NodeGroup;
extern StructRNA RNA_NodeLink;
extern StructRNA RNA_NodeSocket;
+extern StructRNA RNA_NodeSocketPanel;
extern StructRNA RNA_NodeTree;
+extern StructRNA RNA_NodeWhileLoop;
extern StructRNA RNA_NoiseTexture;
extern StructRNA RNA_NorController;
extern StructRNA RNA_Object;
@@ -382,7 +385,6 @@ extern StructRNA RNA_PropertyGroupItem;
extern StructRNA RNA_PropertySensor;
extern StructRNA RNA_PythonConstraint;
extern StructRNA RNA_PythonController;
-extern StructRNA RNA_RGBANodeSocket;
extern StructRNA RNA_RadarSensor;
extern StructRNA RNA_RandomSensor;
extern StructRNA RNA_RaySensor;
@@ -560,9 +562,7 @@ extern StructRNA RNA_UserPreferencesInput;
extern StructRNA RNA_UserPreferencesSystem;
extern StructRNA RNA_UserPreferencesView;
extern StructRNA RNA_UserSolidLight;
-extern StructRNA RNA_ValueNodeSocket;
extern StructRNA RNA_VectorFont;
-extern StructRNA RNA_VectorNodeSocket;
extern StructRNA RNA_VertexGroup;
extern StructRNA RNA_VertexGroupElement;
extern StructRNA RNA_VertexPaint;
@@ -571,6 +571,9 @@ extern StructRNA RNA_VoxelData;
extern StructRNA RNA_VoxelDataTexture;
extern StructRNA RNA_WarpModifier;
extern StructRNA RNA_WaveModifier;
+extern StructRNA RNA_WeightVGEditModifier;
+extern StructRNA RNA_WeightVGMixModifier;
+extern StructRNA RNA_WeightVGProximityModifier;
extern StructRNA RNA_Window;
extern StructRNA RNA_WindowManager;
extern StructRNA RNA_WipeSequence;
@@ -612,6 +615,8 @@ extern const PointerRNA PointerRNA_NULL;
/* Structs */
+StructRNA *RNA_struct_find(const char *identifier);
+
const char *RNA_struct_identifier(StructRNA *type);
const char *RNA_struct_ui_name(StructRNA *type);
const char *RNA_struct_ui_description(StructRNA *type);
@@ -982,7 +987,15 @@ int RNA_function_call_direct_va_lookup(struct bContext *C, struct ReportList *re
short RNA_type_to_ID_code(StructRNA *type);
StructRNA *ID_code_to_RNA_type(short idcode);
-void RNA_warning(const char *format, ...)
+
+/* macro which inserts the function name */
+#ifdef __GNUC__
+# define RNA_warning(format, args...) _RNA_warning("%s: " format "\n", __func__, ##args)
+#else /* MSVC doesnt support variable length args in macros */
+# define RNA_warning _RNA_warning
+#endif
+
+void _RNA_warning(const char *format, ...)
#ifdef __GNUC__
__attribute__ ((format (printf, 1, 2)))
#endif
diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h
index 0b63bb02436..2300b72910d 100644
--- a/source/blender/makesrna/RNA_enum_types.h
+++ b/source/blender/makesrna/RNA_enum_types.h
@@ -102,10 +102,12 @@ extern EnumPropertyItem transform_mode_types[];
extern EnumPropertyItem posebone_rotmode_items[];
extern EnumPropertyItem property_type_items[];
+extern EnumPropertyItem property_subtype_items[];
extern EnumPropertyItem property_unit_items[];
extern EnumPropertyItem viewport_shade_items[];
+extern EnumPropertyItem nodetree_type_items[];
extern EnumPropertyItem node_socket_type_items[];
extern EnumPropertyItem node_math_items[];
diff --git a/source/blender/makesrna/RNA_types.h b/source/blender/makesrna/RNA_types.h
index f8199074f27..4a18518dde9 100644
--- a/source/blender/makesrna/RNA_types.h
+++ b/source/blender/makesrna/RNA_types.h
@@ -99,7 +99,10 @@ typedef enum PropertyUnit {
#define RNA_ENUM_BITFLAG_SIZE 32
-/* also update enums in bpy_props.c when adding items here */
+/* also update enums in bpy_props.c when adding items here
+ * watch it: these values are written to files as part of
+ * node socket button subtypes!
+ */
typedef enum PropertySubType {
PROP_NONE = 0,
diff --git a/source/blender/makesrna/SConscript b/source/blender/makesrna/SConscript
index 1cb24630fbe..10b20fc795a 100644
--- a/source/blender/makesrna/SConscript
+++ b/source/blender/makesrna/SConscript
@@ -9,6 +9,7 @@ objs += o
incs = '#/intern/guardedalloc #/intern/memutil #/intern/audaspace/intern ../blenkernel ../blenlib ../makesdna intern .'
incs += ' ../windowmanager ../editors/include ../gpu ../imbuf ../ikplugin ../blenfont ../blenloader'
incs += ' ../render/extern/include'
+incs += ' ../nodes'
incs += ' #/extern/glew/include'
defs = []
diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt
index 0307b5222d7..c2b46a3b69a 100644
--- a/source/blender/makesrna/intern/CMakeLists.txt
+++ b/source/blender/makesrna/intern/CMakeLists.txt
@@ -200,7 +200,7 @@ if(NOT WITH_MOD_FLUID)
endif()
if(WITH_FFTW3)
- add_definitions(-DFFTW3=1)
+ add_definitions(-DWITH_FFTW3)
endif()
if(WITH_SDL)
diff --git a/source/blender/makesrna/intern/SConscript b/source/blender/makesrna/intern/SConscript
index 24c892b96c4..5c2580e4b90 100644
--- a/source/blender/makesrna/intern/SConscript
+++ b/source/blender/makesrna/intern/SConscript
@@ -71,7 +71,7 @@ if env['WITH_BF_GAMEENGINE']:
defs.append('WITH_GAMEENGINE')
if env['WITH_BF_FFTW3']:
- defs.append('FFTW3=1')
+ defs.append('WITH_FFTW3')
if env['WITH_BF_SDL']:
defs.append('WITH_SDL')
diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c
index bc30210bfbb..23100fa8bd7 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -522,11 +522,14 @@ static char *rna_def_property_get_func(FILE *f, StructRNA *srna, PropertyRNA *pr
fprintf(f, " %s(ptr, value);\n", manualfunc);
}
else {
+ const PropertySubType subtype= prop->subtype;
+ const char *string_copy_func= (subtype==PROP_FILEPATH || subtype==PROP_DIRPATH || subtype==PROP_FILENAME) ? "BLI_strncpy" : "BLI_strncpy_utf8";
+
rna_print_data_get(f, dp);
if(sprop->maxlength)
- fprintf(f, " BLI_strncpy(value, data->%s, %d);\n", dp->dnaname, sprop->maxlength);
+ fprintf(f, " %s(value, data->%s, %d);\n", string_copy_func, dp->dnaname, sprop->maxlength);
else
- fprintf(f, " BLI_strncpy(value, data->%s, sizeof(data->%s));\n", dp->dnaname, dp->dnaname);
+ fprintf(f, " %s(value, data->%s, sizeof(data->%s));\n", string_copy_func, dp->dnaname, dp->dnaname);
}
fprintf(f, "}\n\n");
break;
@@ -734,11 +737,14 @@ static char *rna_def_property_set_func(FILE *f, StructRNA *srna, PropertyRNA *pr
fprintf(f, " %s(ptr, value);\n", manualfunc);
}
else {
+ const PropertySubType subtype= prop->subtype;
+ const char *string_copy_func= (subtype==PROP_FILEPATH || subtype==PROP_DIRPATH || subtype==PROP_FILENAME) ? "BLI_strncpy" : "BLI_strncpy_utf8";
+
rna_print_data_get(f, dp);
if(sprop->maxlength)
- fprintf(f, " BLI_strncpy(data->%s, value, %d);\n", dp->dnaname, sprop->maxlength);
+ fprintf(f, " %s(data->%s, value, %d);\n", string_copy_func, dp->dnaname, sprop->maxlength);
else
- fprintf(f, " BLI_strncpy(data->%s, value, sizeof(data->%s));\n", dp->dnaname, dp->dnaname);
+ fprintf(f, " %s(data->%s, value, sizeof(data->%s));\n", string_copy_func, dp->dnaname, dp->dnaname);
}
fprintf(f, "}\n\n");
break;
diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c
index e6a807fc261..63f5b8f8211 100644
--- a/source/blender/makesrna/intern/rna_ID.c
+++ b/source/blender/makesrna/intern/rna_ID.c
@@ -101,7 +101,7 @@ int rna_ID_name_length(PointerRNA *ptr)
void rna_ID_name_set(PointerRNA *ptr, const char *value)
{
ID *id= (ID*)ptr->data;
- BLI_strncpy(id->name+2, value, sizeof(id->name)-2);
+ BLI_strncpy_utf8(id->name+2, value, sizeof(id->name)-2);
test_idbutton(id->name+2);
}
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index 27290929767..92bacfe2a60 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -585,6 +585,17 @@ static const char *rna_ensure_property_name(PropertyRNA *prop)
/* Structs */
+StructRNA *RNA_struct_find(const char *identifier)
+{
+ StructRNA *type;
+ if (identifier) {
+ for (type = BLENDER_RNA.structs.first; type; type = type->cont.next)
+ if (strcmp(type->identifier, identifier)==0)
+ return type;
+ }
+ return NULL;
+}
+
const char *RNA_struct_identifier(StructRNA *type)
{
return type->identifier;
@@ -2326,8 +2337,17 @@ char *RNA_property_string_get_alloc(PointerRNA *ptr, PropertyRNA *prop, char *fi
else
buf= MEM_mallocN(sizeof(char)*(length+1), "RNA_string_get_alloc");
+#ifndef NDEBUG
+ /* safety check to ensure the string is actually set */
+ buf[length]= 255;
+#endif
+
RNA_property_string_get(ptr, prop, buf);
+#ifndef NDEBUG
+ BLI_assert(buf[length] == '\0');
+#endif
+
return buf;
}
@@ -4497,7 +4517,7 @@ char *RNA_property_as_string(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
buf= MEM_mallocN(sizeof(char)*(length+1), "RNA_property_as_string");
buf_esc= MEM_mallocN(sizeof(char)*(length*2+1), "RNA_property_as_string esc");
RNA_property_string_get(ptr, prop, buf);
- BLI_strescape(buf_esc, buf, length*2);
+ BLI_strescape(buf_esc, buf, length*2+1);
MEM_freeN(buf);
BLI_dynstr_appendf(dynstr, "\"%s\"", buf_esc);
MEM_freeN(buf_esc);
@@ -5464,7 +5484,8 @@ int RNA_property_copy(PointerRNA *ptr, PointerRNA *fromptr, PropertyRNA *prop, i
return 0;
}
-void RNA_warning(const char *format, ...)
+/* use RNA_warning macro which includes __func__ suffix */
+void _RNA_warning(const char *format, ...)
{
va_list args;
@@ -5472,6 +5493,11 @@ void RNA_warning(const char *format, ...)
vprintf(format, args);
va_end(args);
+ /* gcc macro adds '\n', but cant use for other compilers */
+#ifndef __GNUC__
+ fputc('\n', stdout);
+#endif
+
#ifdef WITH_PYTHON
{
extern void PyC_LineSpit(void);
diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c
index 5eccba16c3d..7356af05dcb 100644
--- a/source/blender/makesrna/intern/rna_actuator.c
+++ b/source/blender/makesrna/intern/rna_actuator.c
@@ -60,6 +60,7 @@ EnumPropertyItem actuator_type_items[] ={
{ACT_SOUND, "SOUND", 0, "Sound", ""},
{ACT_STATE, "STATE", 0, "State", ""},
{ACT_VISIBILITY, "VISIBILITY", 0, "Visibility", ""},
+ {ACT_STEERING, "STEERING", 0, "Steering", ""},
{0, NULL, 0, NULL, NULL}};
#ifdef RNA_RUNTIME
@@ -103,6 +104,8 @@ static StructRNA* rna_Actuator_refine(struct PointerRNA *ptr)
return &RNA_StateActuator;
case ACT_ARMATURE:
return &RNA_ArmatureActuator;
+ case ACT_STEERING:
+ return &RNA_SteeringActuator;
default:
return &RNA_Actuator;
}
@@ -323,30 +326,6 @@ static void rna_Actuator_constraint_detect_material_set(struct PointerRNA *ptr,
}
}
-static void rna_FcurveActuator_add_set(struct PointerRNA *ptr, int value)
-{
- bActuator *act = (bActuator *)ptr->data;
- bIpoActuator *ia = act->data;
-
- if(value == 1){
- ia->flag &= ~ACT_IPOFORCE;
- ia->flag |= ACT_IPOADD;
- }else
- ia->flag &= ~ACT_IPOADD;
-}
-
-static void rna_FcurveActuator_force_set(struct PointerRNA *ptr, int value)
-{
- bActuator *act = (bActuator *)ptr->data;
- bIpoActuator *ia = act->data;
-
- if(value == 1){
- ia->flag &= ~ACT_IPOADD;
- ia->flag |= ACT_IPOFORCE;
- }else
- ia->flag &= ~ACT_IPOFORCE;
-}
-
static void rna_ActionActuator_add_set(struct PointerRNA *ptr, int value)
{
bActuator *act = (bActuator *)ptr->data;
@@ -459,6 +438,7 @@ EnumPropertyItem *rna_Actuator_type_itemf(bContext *C, PointerRNA *ptr, Property
RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_PROPERTY);
RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_RANDOM);
RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_SCENE);
+ RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_STEERING);
RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_SOUND);
RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_STATE);
@@ -504,6 +484,18 @@ static void rna_Actuator_Armature_update(Main *bmain, Scene *scene, PointerRNA *
constraint[0] = 0;
}
+static void rna_SteeringActuator_navmesh_set(PointerRNA *ptr, PointerRNA value)
+{
+ bActuator *act = (bActuator*)ptr->data;
+ bSteeringActuator *sa = (bSteeringActuator*) act->data;
+
+ Object* obj = value.data;
+ if (obj && obj->body_type==OB_BODY_TYPE_NAVMESH)
+ sa->navmesh = obj;
+ else
+ sa->navmesh = NULL;
+}
+
/* note: the following set functions exists only to avoid id refcounting */
static void rna_Actuator_editobject_mesh_set(PointerRNA *ptr, PointerRNA value)
{
@@ -858,77 +850,6 @@ static void rna_def_object_actuator(BlenderRNA *brna)
RNA_def_property_update(prop, NC_LOGIC, NULL);
}
-/* The fcurve actuator has been replace with the action actuator, so this is no longer used */
-static void rna_def_fcurve_actuator(BlenderRNA *brna)
-{
- StructRNA *srna;
- PropertyRNA *prop;
-
- static EnumPropertyItem prop_type_items[] ={
- {ACT_IPO_PLAY, "PLAY", 0, "Play", ""},
- {ACT_IPO_PINGPONG, "PINGPONG", 0, "Ping Pong", ""},
- {ACT_IPO_FLIPPER, "FLIPPER", 0, "Flipper", ""},
- {ACT_IPO_LOOP_STOP, "STOP", 0, "Loop Stop", ""},
- {ACT_IPO_LOOP_END, "END", 0, "Loop End", ""},
-// {ACT_IPO_KEY2KEY, "IPOCHILD", 0, "Key to Key", ""},
- {ACT_IPO_FROM_PROP, "PROP", 0, "Property", ""},
- {0, NULL, 0, NULL, NULL}};
-
- srna= RNA_def_struct(brna, "FCurveActuator", "Actuator");
- RNA_def_struct_ui_text(srna, "F-Curve Actuator", "Actuator to animate the object");
- RNA_def_struct_sdna_from(srna, "bIpoActuator", "data");
-
- prop= RNA_def_property(srna, "play_type", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "type");
- RNA_def_property_enum_items(prop, prop_type_items);
- RNA_def_property_ui_text(prop, "F-Curve Type", "Specify the way you want to play the animation");
- RNA_def_property_update(prop, NC_LOGIC, NULL);
-
- prop= RNA_def_property(srna, "frame_start", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "sta");
- RNA_def_property_ui_range(prop, 1.0, MAXFRAME, 100, 2);
- RNA_def_property_ui_text(prop, "Start Frame", "");
- RNA_def_property_update(prop, NC_SCENE, NULL);
-
- prop= RNA_def_property(srna, "frame_end", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "end");
- RNA_def_property_ui_range(prop, 1.0, MAXFRAME, 100, 2);
- RNA_def_property_ui_text(prop, "End Frame", "");
- RNA_def_property_update(prop, NC_LOGIC, NULL);
-
- prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE);
- RNA_def_property_string_sdna(prop, NULL, "name");
- RNA_def_property_ui_text(prop, "Property", "Use this property to define the F-Curve position");
- RNA_def_property_update(prop, NC_LOGIC, NULL);
-
- prop= RNA_def_property(srna, "frame_property", PROP_STRING, PROP_NONE);
- RNA_def_property_string_sdna(prop, NULL, "frameProp");
- RNA_def_property_ui_text(prop, "Frame Property", "Assign the action's current frame number to this property");
-
- /* booleans */
- prop= RNA_def_property(srna, "use_additive", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_IPOADD);
- RNA_def_property_boolean_funcs(prop, NULL, "rna_FcurveActuator_add_set");
- RNA_def_property_ui_text(prop, "Add", "F-Curve is added to the current loc/rot/scale in global or local coordinate according to Local flag");
- RNA_def_property_update(prop, NC_LOGIC, NULL);
-
- prop= RNA_def_property(srna, "use_force", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_IPOFORCE);
- RNA_def_property_boolean_funcs(prop, NULL, "rna_FcurveActuator_force_set");
- RNA_def_property_ui_text(prop, "Force", "Apply F-Curve as a global or local force depending on the local option (dynamic objects only)");
- RNA_def_property_update(prop, NC_LOGIC, NULL);
-
- prop= RNA_def_property(srna, "use_local", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_IPOLOCAL);
- RNA_def_property_ui_text(prop, "L", "Let the F-Curve act in local coordinates, used in Force and Add mode");
- RNA_def_property_update(prop, NC_LOGIC, NULL);
-
- prop= RNA_def_property(srna, "apply_to_children", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_IPOCHILD);
- RNA_def_property_ui_text(prop, "Child", "Update F-Curve on all children Objects as well");
- RNA_def_property_update(prop, NC_LOGIC, NULL);
-}
-
static void rna_def_camera_actuator(BlenderRNA *brna)
{
StructRNA *srna;
@@ -1995,6 +1916,108 @@ static void rna_def_armature_actuator(BlenderRNA *brna)
RNA_def_property_update(prop, NC_LOGIC, NULL);
}
+static void rna_def_steering_actuator(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ static EnumPropertyItem prop_type_items[] ={
+ {ACT_STEERING_SEEK, "SEEK", 0, "Seek", ""},
+ {ACT_STEERING_FLEE, "FLEE", 0, "Flee", ""},
+ {ACT_STEERING_PATHFOLLOWING, "PATHFOLLOWING", 0, "Path following", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem facingaxis_items[] ={
+ {1, "X", 0, "X", ""},
+ {2, "Y", 0, "Y", ""},
+ {3, "Z", 0, "Z", ""},
+ {4, "-X", 0, "-X", ""},
+ {5, "-Y", 0, "-Y", ""},
+ {6, "-Z", 0, "-Z", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ srna= RNA_def_struct(brna, "SteeringActuator", "Actuator");
+ RNA_def_struct_ui_text(srna, "Steering Actuator", "");
+ RNA_def_struct_sdna_from(srna, "bSteeringActuator", "data");
+
+ prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "type");
+ RNA_def_property_enum_items(prop, prop_type_items);
+ RNA_def_property_ui_text(prop, "Behavior", "");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "velocity", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "velocity");
+ RNA_def_property_range(prop, 0.0, 1000.0);
+ RNA_def_property_ui_text(prop, "Velocity", "Velocity magnitude");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "acceleration", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "acceleration");
+ RNA_def_property_range(prop, 0.0, 1000.0);
+ RNA_def_property_ui_text(prop, "Acceleration", "Max acceleration");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "turn_speed", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "turnspeed");
+ RNA_def_property_range(prop, 0.0, 720.0);
+ RNA_def_property_ui_text(prop, "Turn Speed", "Max turn speed");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "dist");
+ RNA_def_property_range(prop, 0.0, 1000.0);
+ RNA_def_property_ui_text(prop, "Dist", "Relax distance");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "Object");
+ RNA_def_property_pointer_sdna(prop, NULL, "target");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Target Object", "Set target object");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "self_terminated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_STEERING_SELFTERMINATED);
+ RNA_def_property_ui_text(prop, "Self Terminated", "Terminate when target is reached");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "show_visualization", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_STEERING_ENABLEVISUALIZATION);
+ RNA_def_property_ui_text(prop, "Visualize", "Enable debug visualization");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "update_period", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "updateTime");
+ RNA_def_property_ui_range(prop, -1, 100000, 1, 1);
+ RNA_def_property_ui_text(prop, "Update period", "Path update period");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "navmesh", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "Object");
+ RNA_def_property_pointer_sdna(prop, NULL, "navmesh");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Navigation Mesh Object", "Navigation mesh");
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_SteeringActuator_navmesh_set", NULL, NULL);
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "facing", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_STEERING_AUTOMATICFACING);
+ RNA_def_property_ui_text(prop, "Facing", "Enable automatic facing");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "facing_axis", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "facingaxis");
+ RNA_def_property_enum_items(prop, facingaxis_items);
+ RNA_def_property_ui_text(prop, "Axis", "Axis for automatic facing");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
+ prop= RNA_def_property(srna, "normal_up", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_STEERING_NORMALUP);
+ RNA_def_property_ui_text(prop, "N", "Use normal of the navmesh to set \"UP\" vector");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+}
+
void RNA_def_actuator(BlenderRNA *brna)
{
rna_def_actuator(brna);
@@ -2016,6 +2039,7 @@ void RNA_def_actuator(BlenderRNA *brna)
rna_def_shape_action_actuator(brna);
rna_def_state_actuator(brna);
rna_def_armature_actuator(brna);
+ rna_def_steering_actuator(brna);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_fluidsim.c b/source/blender/makesrna/intern/rna_fluidsim.c
index 1ba2e32502f..ccb24d7dd9b 100644
--- a/source/blender/makesrna/intern/rna_fluidsim.c
+++ b/source/blender/makesrna/intern/rna_fluidsim.c
@@ -184,7 +184,11 @@ static void rna_DomainFluidSettings_memory_estimate_get(PointerRNA *ptr, char *v
static int rna_DomainFluidSettings_memory_estimate_length(PointerRNA *ptr)
{
- return 32;
+#ifdef DISABLE_ELBEEM
+ return 0;
+#else
+ return 31;
+#endif
}
static char *rna_FluidSettings_path(PointerRNA *ptr)
diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h
index 9e98f166875..78b8c67d92c 100644
--- a/source/blender/makesrna/intern/rna_internal.h
+++ b/source/blender/makesrna/intern/rna_internal.h
@@ -261,6 +261,7 @@ void RNA_api_wm(struct StructRNA *srna);
void RNA_api_sensor(struct StructRNA *srna);
void RNA_api_controller(struct StructRNA *srna);
void RNA_api_actuator(struct StructRNA *srna);
+void RNA_api_texture(struct StructRNA *srna);
void RNA_api_environment_map(struct StructRNA *srna);
/* main collection functions */
diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c
index d69cb2063ab..1ba6905ea37 100644
--- a/source/blender/makesrna/intern/rna_main_api.c
+++ b/source/blender/makesrna/intern/rna_main_api.c
@@ -214,9 +214,7 @@ void rna_Main_materials_remove(Main *bmain, ReportList *reports, struct Material
struct bNodeTree *rna_Main_nodetree_new(Main *UNUSED(bmain), const char *name, int type)
{
- bNodeTree *tree = ntreeAddTree(name, type, TRUE);
-
-// ntreeMakeGroupSockets(tree);
+ bNodeTree *tree = ntreeAddTree(name, type, NODE_GROUP);
id_us_min(&tree->id);
return tree;
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 28f2d76f7ed..e7ab9d04b78 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -56,43 +56,48 @@
#include "WM_types.h"
EnumPropertyItem modifier_type_items[] ={
- {0, "", 0, N_("Generate"), ""},
- {eModifierType_Array, "ARRAY", ICON_MOD_ARRAY, N_("Array"), ""},
- {eModifierType_Bevel, "BEVEL", ICON_MOD_BEVEL, N_("Bevel"), ""},
- {eModifierType_Boolean, "BOOLEAN", ICON_MOD_BOOLEAN, N_("Boolean"), ""},
- {eModifierType_Build, "BUILD", ICON_MOD_BUILD, N_("Build"), ""},
- {eModifierType_Decimate, "DECIMATE", ICON_MOD_DECIM, N_("Decimate"), ""},
- {eModifierType_EdgeSplit, "EDGE_SPLIT", ICON_MOD_EDGESPLIT, N_("Edge Split"), ""},
- {eModifierType_Mask, "MASK", ICON_MOD_MASK, N_("Mask"), ""},
- {eModifierType_Mirror, "MIRROR", ICON_MOD_MIRROR, N_("Mirror"), ""},
- {eModifierType_Multires, "MULTIRES", ICON_MOD_MULTIRES, N_("Multiresolution"), ""},
- {eModifierType_Screw, "SCREW", ICON_MOD_SCREW, N_("Screw"), ""},
- {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, N_("Solidify"), ""},
- {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, N_("Subdivision Surface"), ""},
- {eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, N_("UV Project"), ""},
- {0, "", 0, N_("Deform"), ""},
- {eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, N_("Armature"), ""},
- {eModifierType_Cast, "CAST", ICON_MOD_CAST, N_("Cast"), ""},
- {eModifierType_Curve, "CURVE", ICON_MOD_CURVE, N_("Curve"), ""},
- {eModifierType_Displace, "DISPLACE", ICON_MOD_DISPLACE, N_("Displace"), ""},
- {eModifierType_Hook, "HOOK", ICON_HOOK, N_("Hook"), ""},
- {eModifierType_Lattice, "LATTICE", ICON_MOD_LATTICE, N_("Lattice"), ""},
- {eModifierType_MeshDeform, "MESH_DEFORM", ICON_MOD_MESHDEFORM, N_("Mesh Deform"), ""},
- {eModifierType_Shrinkwrap, "SHRINKWRAP", ICON_MOD_SHRINKWRAP, N_("Shrinkwrap"), ""},
- {eModifierType_SimpleDeform, "SIMPLE_DEFORM", ICON_MOD_SIMPLEDEFORM, N_("Simple Deform"), ""},
- {eModifierType_Smooth, "SMOOTH", ICON_MOD_SMOOTH, N_("Smooth"), ""},
- {eModifierType_Warp, "WARP", ICON_MOD_SUBSURF, N_("Warp"), ""},
- {eModifierType_Wave, "WAVE", ICON_MOD_WAVE, N_("Wave"), ""},
- {0, "", 0, N_("Simulate"), ""},
- {eModifierType_Cloth, "CLOTH", ICON_MOD_CLOTH, N_("Cloth"), ""},
- {eModifierType_Collision, "COLLISION", ICON_MOD_PHYSICS, N_("Collision"), ""},
- {eModifierType_Explode, "EXPLODE", ICON_MOD_EXPLODE, N_("Explode"), ""},
- {eModifierType_Fluidsim, "FLUID_SIMULATION", ICON_MOD_FLUIDSIM, N_("Fluid Simulation"), ""},
- {eModifierType_ParticleInstance, "PARTICLE_INSTANCE", ICON_MOD_PARTICLES, N_("Particle Instance"), ""},
- {eModifierType_ParticleSystem, "PARTICLE_SYSTEM", ICON_MOD_PARTICLES, N_("Particle System"), ""},
- {eModifierType_Smoke, "SMOKE", ICON_MOD_SMOKE, N_("Smoke"), ""},
- {eModifierType_Softbody, "SOFT_BODY", ICON_MOD_SOFT, N_("Soft Body"), ""},
- {eModifierType_Surface, "SURFACE", ICON_MOD_PHYSICS, N_("Surface"), ""},
+ {0, "", 0, "Generate", ""},
+ {eModifierType_Array, "ARRAY", ICON_MOD_ARRAY, "Array", ""},
+ {eModifierType_Bevel, "BEVEL", ICON_MOD_BEVEL, "Bevel", ""},
+ {eModifierType_Boolean, "BOOLEAN", ICON_MOD_BOOLEAN, "Boolean", ""},
+ {eModifierType_Build, "BUILD", ICON_MOD_BUILD, "Build", ""},
+ {eModifierType_Decimate, "DECIMATE", ICON_MOD_DECIM, "Decimate", ""},
+ {eModifierType_EdgeSplit, "EDGE_SPLIT", ICON_MOD_EDGESPLIT, "Edge Split", ""},
+ {eModifierType_Mask, "MASK", ICON_MOD_MASK, "Mask", ""},
+ {eModifierType_Mirror, "MIRROR", ICON_MOD_MIRROR, "Mirror", ""},
+ {eModifierType_Multires, "MULTIRES", ICON_MOD_MULTIRES, "Multiresolution", ""},
+ {eModifierType_Screw, "SCREW", ICON_MOD_SCREW, "Screw", ""},
+ {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", ""},
+ {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""},
+ {0, "", 0, "Modify", ""},
+ {eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""},
+ {eModifierType_WeightVGEdit, "VERTEX_WEIGHT_EDIT", ICON_MOD_VERTEX_WEIGHT, "Vertex Weight Edit", ""},
+ {eModifierType_WeightVGMix, "VERTEX_WEIGHT_MIX", ICON_MOD_VERTEX_WEIGHT, "Vertex Weight Mix", ""},
+ {eModifierType_WeightVGProximity, "VERTEX_WEIGHT_PROXIMITY", ICON_MOD_VERTEX_WEIGHT, "Vertex Weight Proximity", ""},
+ {0, "", 0, "Deform", ""},
+ {eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, "Armature", ""},
+ {eModifierType_Cast, "CAST", ICON_MOD_CAST, "Cast", ""},
+ {eModifierType_Curve, "CURVE", ICON_MOD_CURVE, "Curve", ""},
+ {eModifierType_Displace, "DISPLACE", ICON_MOD_DISPLACE, "Displace", ""},
+ {eModifierType_Hook, "HOOK", ICON_HOOK, "Hook", ""},
+ {eModifierType_Lattice, "LATTICE", ICON_MOD_LATTICE, "Lattice", ""},
+ {eModifierType_MeshDeform, "MESH_DEFORM", ICON_MOD_MESHDEFORM, "Mesh Deform", ""},
+ {eModifierType_Shrinkwrap, "SHRINKWRAP", ICON_MOD_SHRINKWRAP, "Shrinkwrap", ""},
+ {eModifierType_SimpleDeform, "SIMPLE_DEFORM", ICON_MOD_SIMPLEDEFORM, "Simple Deform", ""},
+ {eModifierType_Smooth, "SMOOTH", ICON_MOD_SMOOTH, "Smooth", ""},
+ {eModifierType_Warp, "WARP", ICON_MOD_SUBSURF, "Warp", ""},
+ {eModifierType_Wave, "WAVE", ICON_MOD_WAVE, "Wave", ""},
+ {0, "", 0, "Simulate", ""},
+ {eModifierType_Cloth, "CLOTH", ICON_MOD_CLOTH, "Cloth", ""},
+ {eModifierType_Collision, "COLLISION", ICON_MOD_PHYSICS, "Collision", ""},
+ {eModifierType_Explode, "EXPLODE", ICON_MOD_EXPLODE, "Explode", ""},
+ {eModifierType_Fluidsim, "FLUID_SIMULATION", ICON_MOD_FLUIDSIM, "Fluid Simulation", ""},
+ {eModifierType_NavMesh, "NAVMESH", ICON_MOD_PHYSICS, "Navigation mesh", ""},
+ {eModifierType_ParticleInstance, "PARTICLE_INSTANCE", ICON_MOD_PARTICLES, "Particle Instance", ""},
+ {eModifierType_ParticleSystem, "PARTICLE_SYSTEM", ICON_MOD_PARTICLES, "Particle System", ""},
+ {eModifierType_Smoke, "SMOKE", ICON_MOD_SMOKE, "Smoke", ""},
+ {eModifierType_Softbody, "SOFT_BODY", ICON_MOD_SOFT, "Soft Body", ""},
+ {eModifierType_Surface, "SURFACE", ICON_MOD_PHYSICS, "Surface", ""},
{0, NULL, 0, NULL, NULL}};
#ifdef RNA_RUNTIME
@@ -185,6 +190,14 @@ static StructRNA* rna_Modifier_refine(struct PointerRNA *ptr)
return &RNA_ScrewModifier;
case eModifierType_Warp:
return &RNA_WarpModifier;
+ case eModifierType_NavMesh:
+ return &RNA_NavMeshModifier;
+ case eModifierType_WeightVGEdit:
+ return &RNA_VertexWeightEditModifier;
+ case eModifierType_WeightVGMix:
+ return &RNA_VertexWeightMixModifier;
+ case eModifierType_WeightVGProximity:
+ return &RNA_VertexWeightProximityModifier;
default:
return &RNA_Modifier;
}
@@ -377,6 +390,46 @@ static void rna_SolidifyModifier_vgroup_set(PointerRNA *ptr, const char *value)
rna_object_vgroup_name_set(ptr, value, smd->defgrp_name, sizeof(smd->defgrp_name));
}
+static void rna_WeightVGModifier_vgroup_set(PointerRNA *ptr, const char *value)
+{
+ ModifierData *md = (ModifierData*)ptr->data;
+ if (md->type == eModifierType_WeightVGEdit) {
+ WeightVGEditModifierData *wmd= (WeightVGEditModifierData*)md;
+ rna_object_vgroup_name_set(ptr, value, wmd->defgrp_name, sizeof(wmd->defgrp_name));
+ }
+ else if (md->type == eModifierType_WeightVGMix) {
+ WeightVGMixModifierData *wmd= (WeightVGMixModifierData*)md;
+ rna_object_vgroup_name_set(ptr, value, wmd->defgrp_name_a, sizeof(wmd->defgrp_name_a));
+ }
+ else if (md->type == eModifierType_WeightVGProximity) {
+ WeightVGProximityModifierData *wmd= (WeightVGProximityModifierData*)md;
+ rna_object_vgroup_name_set(ptr, value, wmd->defgrp_name, sizeof(wmd->defgrp_name));
+ }
+}
+
+static void rna_WeightVGModifier_mask_vgroup_set(PointerRNA *ptr, const char *value)
+{
+ ModifierData *md = (ModifierData*)ptr->data;
+ if (md->type == eModifierType_WeightVGEdit) {
+ WeightVGEditModifierData *wmd= (WeightVGEditModifierData*)md;
+ rna_object_vgroup_name_set(ptr, value, wmd->mask_defgrp_name, sizeof(wmd->mask_defgrp_name));
+ }
+ else if (md->type == eModifierType_WeightVGMix) {
+ WeightVGMixModifierData *wmd= (WeightVGMixModifierData*)md;
+ rna_object_vgroup_name_set(ptr, value, wmd->mask_defgrp_name, sizeof(wmd->mask_defgrp_name));
+ }
+ else if (md->type == eModifierType_WeightVGProximity) {
+ WeightVGProximityModifierData *wmd= (WeightVGProximityModifierData*)md;
+ rna_object_vgroup_name_set(ptr, value, wmd->mask_defgrp_name, sizeof(wmd->mask_defgrp_name));
+ }
+}
+
+static void rna_WeightVGMixModifier_vgroup2_set(PointerRNA *ptr, const char *value)
+{
+ WeightVGMixModifierData *wmd= (WeightVGMixModifierData*)ptr->data;
+ rna_object_vgroup_name_set(ptr, value, wmd->defgrp_name_b, sizeof(wmd->defgrp_name_b));
+}
+
static void rna_MappingInfo_uvlayer_set(PointerRNA *ptr, const char *value)
{
MappingInfoModifierData *mmd= (MappingInfoModifierData *)ptr->data;
@@ -401,6 +454,23 @@ static void rna_WaveModifier_uvlayer_set(PointerRNA *ptr, const char *value)
rna_object_uvlayer_name_set(ptr, value, wmd->uvlayer_name, sizeof(wmd->uvlayer_name));
}
+static void rna_WeightVGModifier_mask_uvlayer_set(PointerRNA *ptr, const char *value)
+{
+ ModifierData *md = (ModifierData*)ptr->data;
+ if (md->type == eModifierType_WeightVGEdit) {
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*)md;
+ rna_object_uvlayer_name_set(ptr, value, wmd->mask_tex_uvlayer_name, sizeof(wmd->mask_tex_uvlayer_name));
+ }
+ else if (md->type == eModifierType_WeightVGMix) {
+ WeightVGMixModifierData *wmd = (WeightVGMixModifierData*)md;
+ rna_object_uvlayer_name_set(ptr, value, wmd->mask_tex_uvlayer_name, sizeof(wmd->mask_tex_uvlayer_name));
+ }
+ else if (md->type == eModifierType_WeightVGProximity) {
+ WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*)md;
+ rna_object_uvlayer_name_set(ptr, value, wmd->mask_tex_uvlayer_name, sizeof(wmd->mask_tex_uvlayer_name));
+ }
+}
+
static void rna_MultiresModifier_level_range(PointerRNA *ptr, int *min, int *max)
{
MultiresModifierData *mmd = (MultiresModifierData*)ptr->data;
@@ -2367,7 +2437,7 @@ static void rna_def_modifier_screw(BlenderRNA *brna)
prop= RNA_def_property(srna, "steps", PROP_INT, PROP_UNSIGNED);
RNA_def_property_range(prop, 2, 10000);
- RNA_def_property_ui_range(prop, 2, 512, 1, 0);
+ RNA_def_property_ui_range(prop, 3, 512, 1, 0);
RNA_def_property_ui_text(prop, "Steps", "Number of steps in the revolution");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -2421,6 +2491,311 @@ static void rna_def_modifier_screw(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Modifier_update");*/
}
+static void rna_def_modifier_navmesh(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ /* PropertyRNA *prop; */ /* UNUSED */
+
+ srna= RNA_def_struct(brna, "NavMeshModifier", "Modifier");
+ RNA_def_struct_ui_text(srna, "NavMesh Modifier", "NavMesh modifier");
+ RNA_def_struct_sdna(srna, "NavMeshModifierData");
+ RNA_def_struct_ui_icon(srna, ICON_MOD_DECIM);
+}
+
+static void rna_def_modifier_weightvg_mask(BlenderRNA *brna, StructRNA *srna)
+{
+ static EnumPropertyItem weightvg_mask_tex_map_items[] = {
+ {MOD_DISP_MAP_LOCAL, "LOCAL", 0, "Local", ""},
+ {MOD_DISP_MAP_GLOBAL, "GLOBAL", 0, "Global", ""},
+ {MOD_DISP_MAP_OBJECT, "OBJECT", 0, "Object", ""},
+ {MOD_DISP_MAP_UV, "UV", 0, "UV", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem weightvg_mask_tex_used_items[] = {
+ {MOD_WVG_MASK_TEX_USE_INT, "INT", 0, "Intensity", ""},
+ {MOD_WVG_MASK_TEX_USE_RED, "RED", 0, "Red", ""},
+ {MOD_WVG_MASK_TEX_USE_GREEN, "GREEN", 0, "Green", ""},
+ {MOD_WVG_MASK_TEX_USE_BLUE, "BLUE", 0, "Blue", ""},
+ {MOD_WVG_MASK_TEX_USE_HUE, "HUE", 0, "Hue", ""},
+ {MOD_WVG_MASK_TEX_USE_SAT, "SAT", 0, "Saturation", ""},
+ {MOD_WVG_MASK_TEX_USE_VAL, "VAL", 0, "Value", ""},
+ {MOD_WVG_MASK_TEX_USE_ALPHA, "ALPHA", 0, "Alpha", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ PropertyRNA *prop;
+
+ prop= RNA_def_property(srna, "mask_constant", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0);
+ RNA_def_property_ui_text(prop, "Influence", "Global influence of current modifications on vgroup.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "mask_vertex_group", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "mask_defgrp_name");
+ RNA_def_property_ui_text(prop, "Mask VGroup", "Masking vertex group name.");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_mask_vgroup_set");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "mask_texture", PROP_POINTER, PROP_NONE);
+ RNA_def_property_ui_text(prop, "Masking Tex", "Masking texture.");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "mask_tex_use_channel", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, weightvg_mask_tex_used_items);
+ RNA_def_property_ui_text(prop, "Use Channel", "Which texture channel to use for masking.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "mask_tex_mapping", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, weightvg_mask_tex_map_items);
+ RNA_def_property_ui_text(prop, "Texture Coordinates", "Which texture coordinates "
+ "to use for mapping.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
+
+ prop= RNA_def_property(srna, "mask_tex_uv_layer", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "mask_tex_uvlayer_name");
+ RNA_def_property_ui_text(prop, "UV Layer", "UV layer name");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_mask_uvlayer_set");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "mask_tex_map_object", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "mask_tex_map_obj");
+ RNA_def_property_ui_text(prop, "Texture Coordinate Object", "Which object to take texture "
+ "coordinates from.");
+ RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
+}
+
+static void rna_def_modifier_weightvgedit(BlenderRNA *brna)
+{
+ static EnumPropertyItem weightvg_edit_falloff_type_items[] = {
+ {MOD_WVG_MAPPING_NONE, "LINEAR", ICON_LINCURVE, "Linear", ""},
+ {MOD_WVG_MAPPING_CURVE, "CURVE", ICON_RNDCURVE, "Custom Curve", ""},
+ {MOD_WVG_MAPPING_SHARP, "SHARP", ICON_SHARPCURVE, "Sharp", ""},
+ {MOD_WVG_MAPPING_SMOOTH, "SMOOTH", ICON_SMOOTHCURVE, "Smooth", ""},
+ {MOD_WVG_MAPPING_ROOT, "ROOT", ICON_ROOTCURVE, "Root", ""},
+ {MOD_WVG_MAPPING_SPHERE, "ICON_SPHERECURVE", ICON_SPHERECURVE, "Sphere", ""},
+ {MOD_WVG_MAPPING_RANDOM, "RANDOM", ICON_RNDCURVE, "Random", ""},
+ {MOD_WVG_MAPPING_STEP, "STEP", ICON_NOCURVE, "Median Step", ""}, /* Would need a better icon... */
+ {0, NULL, 0, NULL, NULL}};
+
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "VertexWeightEditModifier", "Modifier");
+ RNA_def_struct_ui_text(srna, "WeightVG Edit Modifier",
+ "Edit the weights of vertices in a group.");
+ RNA_def_struct_sdna(srna, "WeightVGEditModifierData");
+ RNA_def_struct_ui_icon(srna, ICON_MOD_VERTEX_WEIGHT);
+
+ prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
+ RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name.");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_vgroup_set");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "falloff_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, weightvg_edit_falloff_type_items);
+ RNA_def_property_ui_text(prop, "Falloff Type", "How weights are mapped to there new values.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "use_add", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_ADD2VG);
+ RNA_def_property_ui_text(prop, "Group Add", "Add vertices with weight over threshold "
+ "to vgroup.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "use_remove", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_REMFVG);
+ RNA_def_property_ui_text(prop, "Group Remove", "Remove vertices with weight below threshold "
+ "from vgroup.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "default_weight", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 1.0f);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0);
+ RNA_def_property_ui_text(prop, "Default Weight", "Default weight a vertex will have if "
+ "it is not in the vgroup.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "map_curve", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "cmap_curve");
+ RNA_def_property_ui_text(prop, "Mapping Curve", "Custom mapping curve.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "add_threshold", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "add_threshold");
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0);
+ RNA_def_property_ui_text(prop, "Add Threshold", "Lower bound for a vertex's weight "
+ "to be added to the vgroup.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "remove_threshold", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "rem_threshold");
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0);
+ RNA_def_property_ui_text(prop, "Rem Threshold", "Upper bound for a vertex's weight "
+ "to be removed from the vgroup.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ /* Common masking properties. */
+ rna_def_modifier_weightvg_mask(brna, srna);
+}
+
+static void rna_def_modifier_weightvgmix(BlenderRNA *brna)
+{
+ static EnumPropertyItem weightvg_mix_modes_items[] = {
+ {MOD_WVG_MIX_SET, "SET", 0, "Replace weights", ""},
+ {MOD_WVG_MIX_ADD, "ADD", 0, "Add to weights", ""},
+ {MOD_WVG_MIX_SUB, "SUB", 0, "Subtract from weights", ""},
+ {MOD_WVG_MIX_MUL, "MUL", 0, "Multiply weights", ""},
+ {MOD_WVG_MIX_DIV, "DIV", 0, "Divide weights", ""},
+ {MOD_WVG_MIX_DIF, "DIF", 0, "Difference", ""},
+ {MOD_WVG_MIX_AVG, "AVG", 0, "Average", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem weightvg_mix_set_items[] = {
+ {MOD_WVG_SET_ALL, "ALL", 0, "All vertices", ""},
+ {MOD_WVG_SET_A, "A", 0, "Vertices from group A", ""},
+ {MOD_WVG_SET_B, "B", 0, "Vertices from group B", ""},
+ {MOD_WVG_SET_OR, "OR", 0, "Vertices from one group", ""},
+ {MOD_WVG_SET_AND, "AND", 0, "Vertices from both groups", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "VertexWeightMixModifier", "Modifier");
+ RNA_def_struct_ui_text(srna, "WeightVG Mix Modifier",
+ "Mix the weights of two vertex groups.");
+ RNA_def_struct_sdna(srna, "WeightVGMixModifierData");
+ RNA_def_struct_ui_icon(srna, ICON_MOD_VERTEX_WEIGHT);
+
+ prop= RNA_def_property(srna, "vertex_group_a", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "defgrp_name_a");
+ RNA_def_property_ui_text(prop, "Vertex Group A", "First vertex group name.");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_vgroup_set");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "vertex_group_b", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "defgrp_name_b");
+ RNA_def_property_ui_text(prop, "Vertex Group B", "Second vertex group name.");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGMixModifier_vgroup2_set");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "default_weight_a", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 1.0f);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0);
+ RNA_def_property_ui_text(prop, "Default Weight A", "Default weight a vertex will have if "
+ "it is not in the first vgroup.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "default_weight_b", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, 1.0f);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0);
+ RNA_def_property_ui_text(prop, "Default Weight B", "Default weight a vertex will have if "
+ "it is not in the second vgroup.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "mix_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, weightvg_mix_modes_items);
+ RNA_def_property_ui_text(prop, "Mix Mode", "How weights from vgroup 2 affect weights "
+ "of vgroup 1.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "mix_set", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, weightvg_mix_set_items);
+ RNA_def_property_ui_text(prop, "Vertex Set", "Which vertices should be affected.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ /* Common masking properties. */
+ rna_def_modifier_weightvg_mask(brna, srna);
+}
+
+static void rna_def_modifier_weightvgproximity(BlenderRNA *brna)
+{
+ static EnumPropertyItem weightvg_proximity_modes_items[] = {
+ {MOD_WVG_PROXIMITY_OBJECT, "OBJECT", 0, "Object Distance",
+ "Use distance between affected and target objects."},
+ {MOD_WVG_PROXIMITY_GEOMETRY, "GEOMETRY", 0, "Geometry Distance",
+ "Use distance between affected object's vertices and target object, or target object's geometry."},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem proximity_geometry_items[] = {
+ {MOD_WVG_PROXIMITY_GEOM_VERTS, "VERTEX", ICON_VERTEXSEL, "Vertex", "Compute distance to nearest vertex."},
+ {MOD_WVG_PROXIMITY_GEOM_EDGES, "EDGE", ICON_EDGESEL, "Edge", "Compute distance to nearest edge."},
+ {MOD_WVG_PROXIMITY_GEOM_FACES, "FACE", ICON_FACESEL, "Face", "Compute distance to nearest face."},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem weightvg_proximity_falloff_type_items[] = {
+ {MOD_WVG_MAPPING_NONE, "LINEAR", ICON_LINCURVE, "Linear", ""},
+ /* No curve mapping here! */
+ {MOD_WVG_MAPPING_SHARP, "SHARP", ICON_SHARPCURVE, "Sharp", ""},
+ {MOD_WVG_MAPPING_SMOOTH, "SMOOTH", ICON_SMOOTHCURVE, "Smooth", ""},
+ {MOD_WVG_MAPPING_ROOT, "ROOT", ICON_ROOTCURVE, "Root", ""},
+ {MOD_WVG_MAPPING_SPHERE, "ICON_SPHERECURVE", ICON_SPHERECURVE, "Sphere", ""},
+ {MOD_WVG_MAPPING_RANDOM, "RANDOM", ICON_RNDCURVE, "Random", ""},
+ {MOD_WVG_MAPPING_STEP, "STEP", ICON_NOCURVE, "Median Step", ""}, /* Would need a better icon... */
+ {0, NULL, 0, NULL, NULL}};
+
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "VertexWeightProximityModifier", "Modifier");
+ RNA_def_struct_ui_text(srna, "WeightVG Proximity Modifier",
+ "Set the weights of vertices in a group from a target object's "
+ "distance.");
+ RNA_def_struct_sdna(srna, "WeightVGProximityModifierData");
+ RNA_def_struct_ui_icon(srna, ICON_MOD_VERTEX_WEIGHT);
+
+ prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
+ RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name.");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_vgroup_set");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "proximity_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, weightvg_proximity_modes_items);
+ RNA_def_property_ui_text(prop, "Proximity Mode", "Which distances to target object to use.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "proximity_geometry", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "proximity_flags");
+ RNA_def_property_enum_items(prop, proximity_geometry_items);
+ RNA_def_property_flag(prop, PROP_ENUM_FLAG); /* important to run before default set */
+ RNA_def_property_ui_text(prop, "Proximity Geometry",
+ "Use the shortest computed distance to target object's geometry "
+ "as weight.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "proximity_ob_target");
+ RNA_def_property_ui_text(prop, "Target Object", "Object to calculate vertices distances from.");
+ RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
+
+ prop= RNA_def_property(srna, "min_dist", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, FLT_MAX);
+ RNA_def_property_ui_range(prop, 0.0, 1000.0, 10, 0);
+ RNA_def_property_ui_text(prop, "Lowest Dist", "Distance mapping to weight 0.0 (or weight 1.0 if above Highest Dist).");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "max_dist", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0, FLT_MAX);
+ RNA_def_property_ui_range(prop, 0.0, 1000.0, 10, 0);
+ RNA_def_property_ui_text(prop, "Highest Dist", "Distance mapping to weight 1.0 (or weight 0.0 if below Lowest Dist).");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "falloff_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, weightvg_proximity_falloff_type_items);
+ RNA_def_property_ui_text(prop, "Falloff Type", "How weights are mapped to there new values.");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ /* Common masking properties. */
+ rna_def_modifier_weightvg_mask(brna, srna);
+}
+
void RNA_def_modifier(BlenderRNA *brna)
{
StructRNA *srna;
@@ -2518,6 +2893,10 @@ void RNA_def_modifier(BlenderRNA *brna)
rna_def_modifier_smoke(brna);
rna_def_modifier_solidify(brna);
rna_def_modifier_screw(brna);
+ rna_def_modifier_navmesh(brna);
+ rna_def_modifier_weightvgedit(brna);
+ rna_def_modifier_weightvgmix(brna);
+ rna_def_modifier_weightvgproximity(brna);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 56492a52da9..0554e4d00ad 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -30,13 +30,17 @@
#include <stdlib.h>
#include <string.h>
+#include "RNA_access.h"
#include "RNA_define.h"
#include "RNA_enum_types.h"
#include "rna_internal.h"
+#include "rna_internal_types.h"
#include "DNA_material_types.h"
+#include "DNA_mesh_types.h"
#include "DNA_node_types.h"
+#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_texture_types.h"
@@ -53,9 +57,16 @@
#include "MEM_guardedalloc.h"
+EnumPropertyItem nodetree_type_items[] = {
+ {NTREE_SHADER, "MATERIAL", ICON_MATERIAL, "Material", "Material nodes" },
+ {NTREE_TEXTURE, "TEXTURE", ICON_TEXTURE, "Texture", "Texture nodes" },
+ {NTREE_COMPOSIT, "COMPOSITING", ICON_RENDERLAYERS, "Compositing", "Compositing nodes" },
+ {0, NULL, 0, NULL, NULL}
+};
+
EnumPropertyItem node_socket_type_items[] = {
- {SOCK_VALUE, "VALUE", 0, "Value", ""},
+ {SOCK_FLOAT, "VALUE", 0, "Value", ""},
{SOCK_VECTOR, "VECTOR", 0, "Vector", ""},
{SOCK_RGBA, "RGBA", 0, "RGBA", ""},
{0, NULL, 0, NULL, NULL}};
@@ -99,6 +110,41 @@ EnumPropertyItem node_filter_items[] = {
{6, "SHADOW", 0, "Shadow", ""},
{0, NULL, 0, NULL, NULL}};
+
+/* Add any new socket value subtype here.
+ * When adding a new subtype here, make sure you also add it
+ * to the subtype definitions in DNA_node_types.h.
+ * This macro is used by the RNA and the internal converter functions
+ * to define all socket subtypes. The SUBTYPE macro must be defined
+ * before using this macro, and undefined afterwards.
+ */
+#define NODE_DEFINE_SUBTYPES_INT \
+SUBTYPE(INT, Int, NONE, None) \
+SUBTYPE(INT, Int, UNSIGNED, Unsigned)
+
+#define NODE_DEFINE_SUBTYPES_FLOAT \
+SUBTYPE(FLOAT, Float, NONE, None) \
+SUBTYPE(FLOAT, Float, UNSIGNED, Unsigned) \
+SUBTYPE(FLOAT, Float, PERCENTAGE, Percentage) \
+SUBTYPE(FLOAT, Float, FACTOR, Factor) \
+SUBTYPE(FLOAT, Float, ANGLE, Angle) \
+SUBTYPE(FLOAT, Float, TIME, Time) \
+SUBTYPE(FLOAT, Float, DISTANCE, Distance)
+
+#define NODE_DEFINE_SUBTYPES_VECTOR \
+SUBTYPE(VECTOR, Vector, NONE, None) \
+SUBTYPE(VECTOR, Vector, TRANSLATION, Translation) \
+SUBTYPE(VECTOR, Vector, DIRECTION, Direction) \
+SUBTYPE(VECTOR, Vector, VELOCITY, Velocity) \
+SUBTYPE(VECTOR, Vector, ACCELERATION, Acceleration) \
+SUBTYPE(VECTOR, Vector, EULER, Euler) \
+SUBTYPE(VECTOR, Vector, XYZ, XYZ)
+
+#define NODE_DEFINE_SUBTYPES \
+NODE_DEFINE_SUBTYPES_INT \
+NODE_DEFINE_SUBTYPES_FLOAT \
+NODE_DEFINE_SUBTYPES_VECTOR
+
#ifdef RNA_RUNTIME
#include "BLI_linklist.h"
@@ -121,32 +167,18 @@ static StructRNA *rna_Node_refine(struct PointerRNA *ptr)
#include "rna_nodetree_types.h"
- #undef DefNode
-
case NODE_GROUP:
return &RNA_NodeGroup;
+ case NODE_FORLOOP:
+ return &RNA_NodeForLoop;
+ case NODE_WHILELOOP:
+ return &RNA_NodeWhileLoop;
default:
return &RNA_Node;
}
}
-static StructRNA *rna_NodeSocketType_refine(struct PointerRNA *ptr)
-{
- bNodeSocket *ns= (bNodeSocket*)ptr->data;
-
- switch(ns->type) {
- case SOCK_VALUE:
- return &RNA_ValueNodeSocket;
- case SOCK_VECTOR:
- return &RNA_VectorNodeSocket;
- case SOCK_RGBA:
- return &RNA_RGBANodeSocket;
- default:
- return &RNA_UnknownType;
- }
-}
-
static StructRNA *rna_NodeTree_refine(struct PointerRNA *ptr)
{
bNodeTree *ntree= (bNodeTree*)ptr->data;
@@ -170,6 +202,46 @@ static char *rna_Node_path(PointerRNA *ptr)
return BLI_sprintfN("nodes[\"%s\"]", node->name);
}
+static StructRNA *rna_NodeSocket_refine(PointerRNA *ptr)
+{
+ bNodeSocket *sock= (bNodeSocket*)ptr->data;
+
+ if (sock->default_value) {
+ /* This returns the refined socket type with the full definition
+ * of the default input value with type and subtype.
+ */
+
+ #define SUBTYPE(socktype, stypename, id, idname) \
+ { \
+ bNodeSocketValue##stypename *value= (bNodeSocketValue##stypename*)sock->default_value; \
+ if (value->subtype==PROP_##id) \
+ return &RNA_NodeSocket##stypename##idname; \
+ }
+
+ switch (sock->type) {
+ case SOCK_FLOAT:
+ NODE_DEFINE_SUBTYPES_FLOAT
+ break;
+ case SOCK_INT:
+ NODE_DEFINE_SUBTYPES_INT
+ break;
+ case SOCK_BOOLEAN:
+ return &RNA_NodeSocketBoolean;
+ break;
+ case SOCK_VECTOR:
+ NODE_DEFINE_SUBTYPES_VECTOR
+ break;
+ case SOCK_RGBA:
+ return &RNA_NodeSocketRGBA;
+ break;
+ }
+
+ #undef SUBTYPE
+ }
+
+ return &RNA_NodeSocket;
+}
+
static char *rna_NodeSocket_path(PointerRNA *ptr)
{
bNodeTree *ntree= (bNodeTree*)ptr->id.data;
@@ -275,7 +347,7 @@ static void rna_NodeGroup_update(Main *bmain, Scene *scene, PointerRNA *ptr)
bNodeTree *ntree= (bNodeTree*)ptr->id.data;
bNode *node= (bNode*)ptr->data;
- nodeGroupVerify((bNodeTree *)node->id);
+ ntreeUpdateTree((bNodeTree *)node->id);
node_update(bmain, scene, ntree, node);
}
@@ -313,18 +385,42 @@ static void rna_NodeGroupSocket_update(Main *bmain, Scene *scene, PointerRNA *pt
bNodeSocket *sock= (bNodeSocket*)ptr->data;
bNode *node;
- nodeGroupVerify(ntree);
+ ntreeUpdateTree(ntree);
if (nodeFindNode(ntree, sock, &node, NULL, NULL))
node_update(bmain, scene, ntree, node);
}
-static void rna_NodeSocket_defvalue_range(PointerRNA *ptr, float *min, float *max)
+static void rna_NodeLink_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ bNodeTree *ntree= (bNodeTree*)ptr->id.data;
+
+ ntree->update |= NTREE_UPDATE_LINKS;
+ ntreeUpdateTree(ntree);
+}
+
+static void rna_NodeSocketInt_range(PointerRNA *ptr, int *min, int *max)
{
bNodeSocket *sock= (bNodeSocket*)ptr->data;
+ bNodeSocketValueInt *val= (bNodeSocketValueInt*)sock->default_value;
+ *min = val->min;
+ *max = val->max;
+}
- *min = sock->ns.min;
- *max = sock->ns.max;
+static void rna_NodeSocketFloat_range(PointerRNA *ptr, float *min, float *max)
+{
+ bNodeSocket *sock= (bNodeSocket*)ptr->data;
+ bNodeSocketValueFloat *val= (bNodeSocketValueFloat*)sock->default_value;
+ *min = val->min;
+ *max = val->max;
+}
+
+static void rna_NodeSocketVector_range(PointerRNA *ptr, float *min, float *max)
+{
+ bNodeSocket *sock= (bNodeSocket*)ptr->data;
+ bNodeSocketValueVector *val= (bNodeSocketValueVector*)sock->default_value;
+ *min = val->min;
+ *max = val->max;
}
static void rna_Node_mapping_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -454,18 +550,22 @@ static EnumPropertyItem *rna_Node_channel_itemf(bContext *UNUSED(C), PointerRNA
static bNode *rna_NodeTree_node_new(bNodeTree *ntree, bContext *UNUSED(C), ReportList *reports, int type, bNodeTree *group)
{
bNode *node;
+ bNodeTemplate ntemp;
if (type == NODE_GROUP && group == NULL) {
BKE_reportf(reports, RPT_ERROR, "node type \'GROUP\' missing group argument");
return NULL;
}
- node = nodeAddNodeType(ntree, type, group, NULL);
-
+
+ ntemp.type = type;
+ ntemp.ngroup = group;
+ node = nodeAddNode(ntree, &ntemp);
+
if (node == NULL) {
BKE_reportf(reports, RPT_ERROR, "Unable to create node");
}
else {
- nodeGroupVerify(ntree); /* update group node socket links*/
+ ntreeUpdateTree(ntree); /* update group node socket links*/
NodeTagChanged(ntree, node);
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
@@ -495,7 +595,7 @@ static bNode *rna_NodeTree_node_composite_new(bNodeTree *ntree, bContext *C, Rep
}
ntreeCompositForceHidden(ntree, CTX_data_scene(C));
- ntreeSolveOrder(ntree);
+ ntreeUpdateTree(ntree);
}
return node;
@@ -523,7 +623,7 @@ static void rna_NodeTree_node_remove(bNodeTree *ntree, ReportList *reports, bNod
id_us_min(node->id);
nodeFreeNode(ntree, node);
- nodeGroupVerify(ntree); /* update group node socket links*/
+ ntreeUpdateTree(ntree); /* update group node socket links*/
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
}
@@ -551,9 +651,7 @@ static bNodeLink *rna_NodeTree_link_new(bNodeTree *ntree, ReportList *reports, b
if(ret) {
NodeTagChanged(ntree, tonode);
- nodeGroupVerify(ntree); /* update group node socket links*/
-
- ntreeSolveOrder(ntree);
+ ntreeUpdateTree(ntree);
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
}
@@ -567,8 +665,7 @@ static void rna_NodeTree_link_remove(bNodeTree *ntree, ReportList *reports, bNod
}
else {
nodeRemLink(ntree, link);
- ntreeSolveOrder(ntree);
- nodeGroupVerify(ntree); /* update group node socket links*/
+ ntreeUpdateTree(ntree);
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
}
@@ -577,9 +674,10 @@ static void rna_NodeTree_link_remove(bNodeTree *ntree, ReportList *reports, bNod
static bNodeSocket *rna_NodeTree_input_new(bNodeTree *ntree, ReportList *UNUSED(reports), const char *name, int type)
{
/* XXX should check if tree is a group here! no good way to do this currently. */
- bNodeSocket *gsock= nodeGroupAddSocket(ntree, name, type, SOCK_IN);
+ bNodeSocket *gsock= node_group_add_socket(ntree, name, type, SOCK_IN);
- nodeGroupVerify(ntree); /* update group node socket links*/
+ ntree->update |= NTREE_UPDATE_GROUP_IN;
+ ntreeUpdateTree(ntree);
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
return gsock;
}
@@ -587,9 +685,10 @@ static bNodeSocket *rna_NodeTree_input_new(bNodeTree *ntree, ReportList *UNUSED(
static bNodeSocket *rna_NodeTree_output_new(bNodeTree *ntree, ReportList *UNUSED(reports), const char *name, int type)
{
/* XXX should check if tree is a group here! no good way to do this currently. */
- bNodeSocket *gsock= nodeGroupAddSocket(ntree, name, type, SOCK_OUT);
+ bNodeSocket *gsock= node_group_add_socket(ntree, name, type, SOCK_OUT);
- nodeGroupVerify(ntree); /* update group node socket links*/
+ ntree->update |= NTREE_UPDATE_GROUP_OUT;
+ ntreeUpdateTree(ntree);
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
return gsock;
}
@@ -606,11 +705,12 @@ static bNodeSocket *rna_NodeTree_input_expose(bNodeTree *ntree, ReportList *repo
BKE_reportf(reports, RPT_ERROR, "Socket is not an input");
else {
/* XXX should check if tree is a group here! no good way to do this currently. */
- gsock = nodeGroupAddSocket(ntree, sock->name, sock->type, SOCK_IN);
+ gsock = node_group_add_socket(ntree, sock->name, sock->type, SOCK_IN);
if (add_link)
nodeAddLink(ntree, NULL, gsock, node, sock);
- nodeGroupVerify(ntree); /* update group node socket links*/
+ ntree->update |= NTREE_UPDATE_GROUP_IN;
+ ntreeUpdateTree(ntree);
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
return gsock;
}
@@ -629,11 +729,12 @@ static bNodeSocket *rna_NodeTree_output_expose(bNodeTree *ntree, ReportList *rep
BKE_reportf(reports, RPT_ERROR, "Socket is not an output");
else {
/* XXX should check if tree is a group here! no good way to do this currently. */
- gsock = nodeGroupAddSocket(ntree, sock->name, sock->type, SOCK_OUT);
+ gsock = node_group_add_socket(ntree, sock->name, sock->type, SOCK_OUT);
if (add_link)
nodeAddLink(ntree, node, sock, NULL, gsock);
- nodeGroupVerify(ntree); /* update group node socket links*/
+ ntree->update |= NTREE_UPDATE_GROUP_OUT;
+ ntreeUpdateTree(ntree);
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
return gsock;
}
@@ -668,14 +769,16 @@ static EnumPropertyItem node_ycc_items[] = {
{ 2, "JFIF", 0, "Jpeg", ""},
{0, NULL, 0, NULL, NULL}};
-#define MaxNodes 1000
+#define MaxNodes 50000
enum
{
Category_GroupNode,
+ Category_LoopNode,
+ Category_LayoutNode,
Category_ShaderNode,
Category_CompositorNode,
- Category_TextureNode
+ Category_TextureNode,
};
typedef struct NodeInfo
@@ -715,9 +818,10 @@ static void init(void)
#include "rna_nodetree_types.h"
- #undef DefNode
-
reg_node(NODE_GROUP, Category_GroupNode, "GROUP", "NodeGroup", "Node", "Group", "");
+ reg_node(NODE_FORLOOP, Category_LoopNode, "FORLOOP", "NodeForLoop", "Node", "ForLoop", "");
+ reg_node(NODE_WHILELOOP, Category_LoopNode, "WHILELOOP", "NodeWhileLoop", "Node", "WhileLoop", "");
+ reg_node(NODE_FRAME, Category_LayoutNode, "FRAME", "NodeFrame", "Node", "Frame", "");
}
static StructRNA* def_node(BlenderRNA *brna, int node_id)
@@ -793,6 +897,41 @@ static void def_group(StructRNA *srna)
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeGroup_update");
}
+static void def_forloop(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ prop = RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "id");
+ RNA_def_property_struct_type(prop, "NodeTree");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Node Tree", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeGroup_update");
+}
+
+static void def_whileloop(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ prop = RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "id");
+ RNA_def_property_struct_type(prop, "NodeTree");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Node Tree", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeGroup_update");
+
+ prop = RNA_def_property(srna, "max_iterations", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "custom1");
+ RNA_def_property_range(prop, 0.0f, SHRT_MAX);
+ RNA_def_property_ui_text(prop, "Max. Iterations", "Limit for number of iterations");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeGroup_update");
+}
+
+static void def_frame(StructRNA *srna)
+{
+// PropertyRNA *prop;
+
+}
static void def_math(StructRNA *srna)
{
@@ -2510,94 +2649,112 @@ static void rna_def_node_socket(BlenderRNA *brna)
srna = RNA_def_struct(brna, "NodeSocket", NULL);
RNA_def_struct_ui_text(srna, "Node Socket", "Input or output socket of a node");
- RNA_def_struct_refine_func(srna, "rna_NodeSocketType_refine");
RNA_def_struct_sdna(srna, "bNodeSocket");
+ RNA_def_struct_refine_func(srna, "rna_NodeSocket_refine");
RNA_def_struct_ui_icon(srna, ICON_PLUG);
RNA_def_struct_path_func(srna, "rna_NodeSocket_path");
+ prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "type");
+ RNA_def_property_enum_items(prop, node_socket_type_items);
+ RNA_def_property_enum_default(prop, 0);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Type", "Node Socket type");
+
prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
/* XXX must be editable for group sockets. if necessary use a special rna definition for these */
// RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Name", "Socket name");
RNA_def_struct_name_property(srna, prop);
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeGroupSocket_update");
-
- /* can add back if there is any use in reading them */
-#if 0
- prop = RNA_def_property(srna, "min", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "ns.min");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Minimum Value", "");
- RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
-
- prop = RNA_def_property(srna, "max", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "ns.max");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Maximum Value", "");
- RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
-#endif
-
- prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_enum_items(prop, node_socket_type_items);
- RNA_def_property_ui_text(prop, "Type", "Node Socket type");
}
-static void rna_def_node_socket_value(BlenderRNA *brna)
+static void rna_def_node_socket_subtype(BlenderRNA *brna, int type, int subtype, const char *name, const char *ui_name)
{
StructRNA *srna;
- PropertyRNA *prop;
-
- srna = RNA_def_struct(brna, "ValueNodeSocket", "NodeSocket");
- RNA_def_struct_ui_text(srna, "Value Node Socket", "Input or output socket of a node");
+ PropertyRNA *prop=NULL;
+ PropertySubType propsubtype= PROP_NONE;
+
+ #define SUBTYPE(socktype, stypename, id, idname) { PROP_##id, #id, 0, #idname, ""},
+ static EnumPropertyItem subtype_items[] = {
+ NODE_DEFINE_SUBTYPES
+ {0, NULL, 0, NULL, NULL}
+ };
+ #undef SUBTYPE
+
+ #define SUBTYPE(socktype, stypename, id, idname) if (subtype==PROP_##id) propsubtype = PROP_##id;
+ NODE_DEFINE_SUBTYPES
+ #undef SUBTYPE
+
+ srna = RNA_def_struct(brna, name, "NodeSocket");
+ RNA_def_struct_ui_text(srna, ui_name, "Input or output socket of a node");
RNA_def_struct_sdna(srna, "bNodeSocket");
RNA_def_struct_ui_icon(srna, ICON_PLUG);
RNA_def_struct_path_func(srna, "rna_NodeSocket_path");
-
- prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "ns.vec");
- RNA_def_property_array(prop, 1);
- RNA_def_property_ui_text(prop, "Default Value", "Default value of the socket when no link is attached");
- RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
- RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocket_defvalue_range");
-}
-
-static void rna_def_node_socket_vector(BlenderRNA *brna)
-{
- StructRNA *srna;
- PropertyRNA *prop;
-
- srna = RNA_def_struct(brna, "VectorNodeSocket", "NodeSocket");
- RNA_def_struct_ui_text(srna, "Vector Node Socket", "Input or output socket of a node");
- RNA_def_struct_sdna(srna, "bNodeSocket");
- RNA_def_struct_ui_icon(srna, ICON_PLUG);
- RNA_def_struct_path_func(srna, "rna_NodeSocket_path");
-
- prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_XYZ);
- RNA_def_property_float_sdna(prop, NULL, "ns.vec");
- RNA_def_property_array(prop, 3);
- RNA_def_property_ui_text(prop, "Default Value", "Default value of the socket when no link is attached");
- RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
- RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocket_defvalue_range");
-}
-
-static void rna_def_node_socket_rgba(BlenderRNA *brna)
-{
- StructRNA *srna;
- PropertyRNA *prop;
-
- srna = RNA_def_struct(brna, "RGBANodeSocket", "NodeSocket");
- RNA_def_struct_ui_text(srna, "RGBA Node Socket", "Input or output socket of a node");
- RNA_def_struct_sdna(srna, "bNodeSocket");
- RNA_def_struct_ui_icon(srna, ICON_PLUG);
- RNA_def_struct_path_func(srna, "rna_NodeSocket_path");
-
- prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_COLOR);
- RNA_def_property_float_sdna(prop, NULL, "ns.vec");
- RNA_def_property_array(prop, 4);
- RNA_def_property_ui_text(prop, "Default Value", "Default value of the socket when no link is attached");
- RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
- RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocket_defvalue_range");
+
+ switch (type) {
+ case SOCK_INT:
+ RNA_def_struct_sdna_from(srna, "bNodeSocketValueInt", "default_value");
+
+ prop = RNA_def_property(srna, "subtype", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "subtype");
+ RNA_def_property_enum_items(prop, subtype_items);
+ RNA_def_property_ui_text(prop, "Subtype", "Subtype defining the socket value details");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
+
+ prop = RNA_def_property(srna, "default_value", PROP_INT, propsubtype);
+ RNA_def_property_int_sdna(prop, NULL, "value");
+ RNA_def_property_int_funcs(prop, NULL, NULL, "rna_NodeSocketInt_range");
+ RNA_def_property_ui_text(prop, "Default Value", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
+ break;
+ case SOCK_FLOAT:
+ RNA_def_struct_sdna_from(srna, "bNodeSocketValueFloat", "default_value");
+
+ prop = RNA_def_property(srna, "subtype", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "subtype");
+ RNA_def_property_enum_items(prop, subtype_items);
+ RNA_def_property_ui_text(prop, "Subtype", "Subtype defining the socket value details");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
+
+ prop = RNA_def_property(srna, "default_value", PROP_FLOAT, propsubtype);
+ RNA_def_property_float_sdna(prop, NULL, "value");
+ RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocketFloat_range");
+ RNA_def_property_ui_text(prop, "Default Value", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
+ break;
+ case SOCK_BOOLEAN:
+ RNA_def_struct_sdna_from(srna, "bNodeSocketValueBoolean", "default_value");
+
+ prop = RNA_def_property(srna, "default_value", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "value", 1);
+ RNA_def_property_ui_text(prop, "Default Value", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
+ break;
+ case SOCK_VECTOR:
+ RNA_def_struct_sdna_from(srna, "bNodeSocketValueVector", "default_value");
+
+ prop = RNA_def_property(srna, "subtype", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "subtype");
+ RNA_def_property_enum_items(prop, subtype_items);
+ RNA_def_property_ui_text(prop, "Subtype", "Subtype defining the socket value details");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
+
+ prop = RNA_def_property(srna, "default_value", PROP_FLOAT, propsubtype);
+ RNA_def_property_float_sdna(prop, NULL, "value");
+ RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocketVector_range");
+ RNA_def_property_ui_text(prop, "Default Value", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
+ break;
+ case SOCK_RGBA:
+ RNA_def_struct_sdna_from(srna, "bNodeSocketValueRGBA", "default_value");
+
+ prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_COLOR);
+ RNA_def_property_float_sdna(prop, NULL, "value");
+ RNA_def_property_ui_text(prop, "Default Value", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
+ break;
+ }
}
static void rna_def_node(BlenderRNA *brna)
@@ -2625,6 +2782,11 @@ static void rna_def_node(BlenderRNA *brna)
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Node_name_set");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+ prop = RNA_def_property(srna, "label", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "label");
+ RNA_def_property_ui_text(prop, "Label", "Optional custom node label");
+ RNA_def_property_update(prop, NC_NODE, "rna_Node_update");
+
prop = RNA_def_property(srna, "inputs", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "inputs", NULL);
RNA_def_property_struct_type(prop, "NodeSocket");
@@ -2634,18 +2796,19 @@ static void rna_def_node(BlenderRNA *brna)
RNA_def_property_collection_sdna(prop, NULL, "outputs", NULL);
RNA_def_property_struct_type(prop, "NodeSocket");
RNA_def_property_ui_text(prop, "Outputs", "");
-
- prop = RNA_def_property(srna, "label", PROP_STRING, PROP_NONE);
- RNA_def_property_string_sdna(prop, NULL, "label");
- RNA_def_property_ui_text(prop, "Label", "Optional custom node label");
- RNA_def_property_update(prop, NC_NODE, "rna_Node_update");
+
+ prop = RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "parent");
+ RNA_def_property_struct_type(prop, "Node");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Parent", "Parent this node is attached to");
}
static void rna_def_node_link(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
-
+
srna = RNA_def_struct(brna, "NodeLink", NULL);
RNA_def_struct_ui_text(srna, "NodeLink", "Link between nodes in a node tree");
RNA_def_struct_sdna(srna, "bNodeLink");
@@ -2687,7 +2850,7 @@ static void rna_def_group_sockets_api(BlenderRNA *brna, PropertyRNA *cprop, int
RNA_def_function_ui_description(func, "Add a socket to the group tree.");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_string(func, "name", "Socket", 32, "Name", "Name of the socket");
- RNA_def_enum(func, "type", node_socket_type_items, SOCK_VALUE, "Type", "Type of socket");
+ RNA_def_enum(func, "type", node_socket_type_items, SOCK_FLOAT, "Type", "Type of socket");
/* return value */
parm= RNA_def_pointer(func, "socket", "NodeSocket", "", "New socket.");
RNA_def_function_return(func, parm);
@@ -2708,12 +2871,6 @@ static void rna_def_nodetree(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- static EnumPropertyItem nodetree_type_items[] = {
- {NTREE_SHADER, "SHADER", 0, "Shader", ""},
- {NTREE_COMPOSIT, "COMPOSITE", 0, "Composite", ""},
- {NTREE_TEXTURE, "TEXTURE", 0, "Texture", ""},
- {0, NULL, 0, NULL, NULL}};
-
srna = RNA_def_struct(brna, "NodeTree", "ID");
RNA_def_struct_ui_text(srna, "Node Tree", "Node tree consisting of linked nodes used for materials, textures and compositing");
RNA_def_struct_sdna(srna, "bNodeTree");
@@ -2736,6 +2893,7 @@ static void rna_def_nodetree(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "GreasePencil");
RNA_def_property_ui_text(prop, "Grease Pencil Data", "Grease Pencil datablock");
+ RNA_def_property_update(prop, NC_NODE, NULL);
prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
@@ -2825,15 +2983,23 @@ void RNA_def_nodetree(BlenderRNA *brna)
{
init();
rna_def_nodetree(brna);
+
rna_def_node_socket(brna);
- rna_def_node_socket_value(brna);
- rna_def_node_socket_vector(brna);
- rna_def_node_socket_rgba(brna);
+
+ /* Generate RNA definitions for all socket subtypes */
+ #define SUBTYPE(socktype, stypename, id, idname) \
+ rna_def_node_socket_subtype(brna, SOCK_##socktype, PROP_##id, "NodeSocket"#stypename#idname, #idname" "#stypename" Node Socket");
+ NODE_DEFINE_SUBTYPES
+ #undef SUBTYPE
+ rna_def_node_socket_subtype(brna, SOCK_BOOLEAN, 0, "NodeSocketBoolean", "Boolean Node Socket");
+ rna_def_node_socket_subtype(brna, SOCK_RGBA, 0, "NodeSocketRGBA", "RGBA Node Socket");
+
rna_def_node(brna);
rna_def_node_link(brna);
rna_def_shader_node(brna);
rna_def_compositor_node(brna);
rna_def_texture_node(brna);
+
rna_def_composite_nodetree(brna);
rna_def_shader_nodetree(brna);
rna_def_texture_nodetree(brna);
@@ -2842,10 +3008,14 @@ void RNA_def_nodetree(BlenderRNA *brna)
#include "rna_nodetree_types.h"
- #undef DefNode
-
define_specific_node(brna, NODE_GROUP, def_group);
+ define_specific_node(brna, NODE_FORLOOP, def_forloop);
+ define_specific_node(brna, NODE_WHILELOOP, def_whileloop);
+ define_specific_node(brna, NODE_FRAME, def_frame);
}
+/* clean up macro definition */
+#undef NODE_DEFINE_SUBTYPES
+
#endif
diff --git a/source/blender/makesrna/intern/rna_nodetree_types.h b/source/blender/makesrna/intern/rna_nodetree_types.h
index d48df85697a..a624d1d6403 100644
--- a/source/blender/makesrna/intern/rna_nodetree_types.h
+++ b/source/blender/makesrna/intern/rna_nodetree_types.h
@@ -26,7 +26,12 @@
* \ingroup RNA
*/
-
+
+/* Empty definitions for undefined macros to avoid warnings */
+#ifndef DefNode
+#define DefNode(Category, ID, DefFunc, EnumName, StructName, UIName, UIDesc)
+#endif
+
/* Tree type Node ID RNA def function Enum name Struct name UI Name UI Description */
DefNode( ShaderNode, SH_NODE_OUTPUT, 0, "OUTPUT", Output, "Output", "" )
DefNode( ShaderNode, SH_NODE_MATERIAL, def_sh_material, "MATERIAL", Material, "Material", "" )
@@ -138,3 +143,6 @@ DefNode( TextureNode, TEX_NODE_DECOMPOSE, 0, "DECOM
DefNode( TextureNode, TEX_NODE_VALTONOR, 0, "VALTONOR", ValToNor, "Val to Nor", "" )
DefNode( TextureNode, TEX_NODE_SCALE, 0, "SCALE", Scale, "Scale", "" )
+
+/* undefine macros */
+#undef DefNode
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c
index 1ad5da1ae8e..2d46e1adc91 100644
--- a/source/blender/makesrna/intern/rna_object.c
+++ b/source/blender/makesrna/intern/rna_object.c
@@ -133,6 +133,7 @@ EnumPropertyItem object_type_curve_items[] = {
#include "DNA_key_types.h"
#include "DNA_constraint_types.h"
#include "DNA_lattice_types.h"
+#include "DNA_node_types.h"
#include "BKE_armature.h"
#include "BKE_bullet.h"
@@ -858,6 +859,8 @@ static int rna_GameObjectSettings_physics_type_get(PointerRNA *ptr)
if (!(ob->gameflag & OB_COLLISION)) {
if (ob->gameflag & OB_OCCLUDER) {
ob->body_type = OB_BODY_TYPE_OCCLUDER;
+ } else if (ob->gameflag & OB_NAVMESH){
+ ob->body_type = OB_BODY_TYPE_NAVMESH;
} else {
ob->body_type = OB_BODY_TYPE_NO_COLLISION;
}
@@ -887,31 +890,35 @@ static void rna_GameObjectSettings_physics_type_set(PointerRNA *ptr, int value)
switch (ob->body_type) {
case OB_BODY_TYPE_SENSOR:
ob->gameflag |= OB_SENSOR|OB_COLLISION|OB_GHOST;
- ob->gameflag &= ~(OB_OCCLUDER|OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_ACTOR|OB_ANISOTROPIC_FRICTION|OB_DO_FH|OB_ROT_FH|OB_COLLISION_RESPONSE);
+ ob->gameflag &= ~(OB_OCCLUDER|OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_ACTOR|OB_ANISOTROPIC_FRICTION|OB_DO_FH|OB_ROT_FH|OB_COLLISION_RESPONSE|OB_NAVMESH);
break;
case OB_BODY_TYPE_OCCLUDER:
ob->gameflag |= OB_OCCLUDER;
- ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_DYNAMIC);
+ ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_DYNAMIC|OB_NAVMESH);
+ break;
+ case OB_BODY_TYPE_NAVMESH:
+ ob->gameflag |= OB_NAVMESH;
+ ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_DYNAMIC|OB_OCCLUDER);
break;
case OB_BODY_TYPE_NO_COLLISION:
- ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_OCCLUDER|OB_DYNAMIC);
+ ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_OCCLUDER|OB_DYNAMIC|OB_NAVMESH);
break;
case OB_BODY_TYPE_STATIC:
ob->gameflag |= OB_COLLISION;
- ob->gameflag &= ~(OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR);
+ ob->gameflag &= ~(OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR|OB_NAVMESH);
break;
case OB_BODY_TYPE_DYNAMIC:
ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_ACTOR;
- ob->gameflag &= ~(OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR);
+ ob->gameflag &= ~(OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR|OB_NAVMESH);
break;
case OB_BODY_TYPE_RIGID:
ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_RIGID_BODY|OB_ACTOR;
- ob->gameflag &= ~(OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR);
+ ob->gameflag &= ~(OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR|OB_NAVMESH);
break;
default:
case OB_BODY_TYPE_SOFT:
ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_SOFT_BODY|OB_ACTOR;
- ob->gameflag &= ~(OB_RIGID_BODY|OB_OCCLUDER|OB_SENSOR);
+ ob->gameflag &= ~(OB_RIGID_BODY|OB_OCCLUDER|OB_SENSOR|OB_NAVMESH);
/* assume triangle mesh, if no bounds chosen for soft body */
if ((ob->gameflag & OB_BOUNDS) && (ob->boundtype<OB_BOUND_POLYH))
@@ -1343,6 +1350,7 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
{OB_BODY_TYPE_SOFT, "SOFT_BODY", 0, N_("Soft Body"), N_("Soft body")},
{OB_BODY_TYPE_OCCLUDER, "OCCLUDE", 0, N_("Occlude"), N_("Occluder for optimizing scene rendering")},
{OB_BODY_TYPE_SENSOR, "SENSOR", 0, N_("Sensor"), N_("Collision Sensor, detects static and dynamic objects but not the other collision sensor objects")},
+ {OB_BODY_TYPE_NAVMESH, "NAVMESH", 0, "Navigation Mesh", "Navigation mesh"},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "GameObjectSettings", NULL);
@@ -1512,6 +1520,15 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
RNA_def_property_pointer_sdna(prop, NULL, "bsoft");
RNA_def_property_ui_text(prop, "Soft Body Settings", "Settings for Bullet soft body simulation");
+ prop= RNA_def_property(srna, "create_obstacle", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_HASOBSTACLE);
+ RNA_def_property_ui_text(prop, "Create obstacle", "Create representation for obstacle simulation");
+
+ prop= RNA_def_property(srna, "obstacle_radius", PROP_FLOAT, PROP_NONE|PROP_UNIT_LENGTH);
+ RNA_def_property_float_sdna(prop, NULL, "obstacleRad");
+ RNA_def_property_range(prop, 0.0, 1000.0);
+ RNA_def_property_ui_text(prop, "Obstacle Radius", "Radius of object representation in obstacle simulation");
+
/* state */
prop= RNA_def_property(srna, "states_visible", PROP_BOOLEAN, PROP_LAYER_MEMBER);
@@ -2036,18 +2053,19 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Matrix", "Inverse of object's parent matrix at time of parenting");
RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update");
- /* collections */
+ /* modifiers */
+ prop= RNA_def_property(srna, "modifiers", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_struct_type(prop, "Modifier");
+ RNA_def_property_ui_text(prop, "Modifiers", "Modifiers affecting the geometric data of the object");
+ rna_def_object_modifiers(brna, prop);
+
+ /* constraints */
prop= RNA_def_property(srna, "constraints", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "Constraint");
RNA_def_property_ui_text(prop, N_("Constraints"), N_("Constraints affecting the transformation of the object"));
// RNA_def_property_collection_funcs(prop, 0, 0, 0, 0, 0, 0, 0, "constraints__add", "constraints__remove");
rna_def_object_constraints(brna, prop);
- prop= RNA_def_property(srna, "modifiers", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_struct_type(prop, "Modifier");
- RNA_def_property_ui_text(prop, N_("Modifiers"), N_("Modifiers affecting the geometric data of the object"));
- rna_def_object_modifiers(brna, prop);
-
/* game engine */
prop= RNA_def_property(srna, "game", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
@@ -2298,6 +2316,7 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "GreasePencil");
RNA_def_property_ui_text(prop, N_("Grease Pencil Data"), N_("Grease Pencil datablock"));
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
/* pose */
prop= RNA_def_property(srna, "pose_library", PROP_POINTER, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c
index be5b486f08c..108fbf2cbb0 100644
--- a/source/blender/makesrna/intern/rna_particle.c
+++ b/source/blender/makesrna/intern/rna_particle.c
@@ -53,34 +53,34 @@
#include "WM_types.h"
#include "WM_api.h"
-static EnumPropertyItem part_from_items[] = {
+EnumPropertyItem part_from_items[] = {
{PART_FROM_VERT, "VERT", 0, "Verts", ""},
{PART_FROM_FACE, "FACE", 0, "Faces", ""},
{PART_FROM_VOLUME, "VOLUME", 0, "Volume", ""},
{0, NULL, 0, NULL, NULL}
};
-static EnumPropertyItem part_reactor_from_items[] = {
+EnumPropertyItem part_reactor_from_items[] = {
{PART_FROM_VERT, "VERT", 0, "Verts", ""},
{PART_FROM_FACE, "FACE", 0, "Faces", ""},
{PART_FROM_VOLUME, "VOLUME", 0, "Volume", ""},
{0, NULL, 0, NULL, NULL}
};
-static EnumPropertyItem part_dist_items[] = {
+EnumPropertyItem part_dist_items[] = {
{PART_DISTR_JIT, "JIT", 0, "Jittered", ""},
{PART_DISTR_RAND, "RAND", 0, "Random", ""},
{PART_DISTR_GRID, "GRID", 0, "Grid", ""},
{0, NULL, 0, NULL, NULL}
};
-static EnumPropertyItem part_hair_dist_items[] = {
+EnumPropertyItem part_hair_dist_items[] = {
{PART_DISTR_JIT, "JIT", 0, "Jittered", ""},
{PART_DISTR_RAND, "RAND", 0, "Random", ""},
{0, NULL, 0, NULL, NULL}
};
-static EnumPropertyItem part_draw_as_items[] = {
+EnumPropertyItem part_draw_as_items[] = {
{PART_DRAW_NOT, "NONE", 0, "None", ""},
{PART_DRAW_REND, "RENDER", 0, "Rendered", ""},
{PART_DRAW_DOT, "DOT", 0, "Point", ""},
@@ -90,14 +90,14 @@ static EnumPropertyItem part_draw_as_items[] = {
{0, NULL, 0, NULL, NULL}
};
-static EnumPropertyItem part_hair_draw_as_items[] = {
+EnumPropertyItem part_hair_draw_as_items[] = {
{PART_DRAW_NOT, "NONE", 0, "None", ""},
{PART_DRAW_REND, "RENDER", 0, "Rendered", ""},
{PART_DRAW_PATH, "PATH", 0, "Path", ""},
{0, NULL, 0, NULL, NULL}
};
-static EnumPropertyItem part_ren_as_items[] = {
+EnumPropertyItem part_ren_as_items[] = {
{PART_DRAW_NOT, "NONE", 0, "None", ""},
{PART_DRAW_HALO, "HALO", 0, "Halo", ""},
{PART_DRAW_LINE, "LINE", 0, "Line", ""},
@@ -108,7 +108,7 @@ static EnumPropertyItem part_ren_as_items[] = {
{0, NULL, 0, NULL, NULL}
};
-static EnumPropertyItem part_hair_ren_as_items[] = {
+EnumPropertyItem part_hair_ren_as_items[] = {
{PART_DRAW_NOT, "NONE", 0, "None", ""},
{PART_DRAW_PATH, "PATH", 0, "Path", ""},
{PART_DRAW_OB, "OBJECT", 0, "Object", ""},
diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c
index e063f8ec85a..7f85a2fa1d7 100644
--- a/source/blender/makesrna/intern/rna_rna.c
+++ b/source/blender/makesrna/intern/rna_rna.c
@@ -46,6 +46,42 @@ EnumPropertyItem property_type_items[] = {
{PROP_COLLECTION, "COLLECTION", 0, "Collection", ""},
{0, NULL, 0, NULL, NULL}};
+EnumPropertyItem property_subtype_items[] = {
+ {PROP_NONE, "NONE", 0, "None", ""},
+
+ /* strings */
+ {PROP_FILEPATH, "FILEPATH", 0, "File Path", ""},
+ {PROP_DIRPATH, "DIRPATH", 0, "Directory Path", ""},
+ {PROP_FILENAME, "FILENAME", 0, "File Name", ""},
+
+ /* numbers */
+ {PROP_UNSIGNED, "UNSIGNED", 0, "Unsigned", ""},
+ {PROP_PERCENTAGE, "PERCENTAGE", 0, "Percentage", ""},
+ {PROP_FACTOR, "FACTOR", 0, "Factor", ""},
+ {PROP_ANGLE, "ANGLE", 0, "Angle", ""},
+ {PROP_TIME, "TIME", 0, "Time", ""},
+ {PROP_DISTANCE, "DISTANCE", 0, "Distance", ""},
+
+ /* number arrays */
+ {PROP_COLOR, "COLOR", 0, "Color", ""},
+ {PROP_TRANSLATION, "TRANSLATION", 0, "Translation", ""},
+ {PROP_DIRECTION, "DIRECTION", 0, "Direction", ""},
+ {PROP_VELOCITY, "VELOCITY", 0, "Velocity", ""},
+ {PROP_ACCELERATION, "ACCELERATION", 0, "Acceleration", ""},
+ {PROP_MATRIX, "MATRIX", 0, "Matrix", ""},
+ {PROP_EULER, "EULER", 0, "Euler Angles", ""},
+ {PROP_QUATERNION, "QUATERNION", 0, "Quaternion", ""},
+ {PROP_AXISANGLE, "AXISANGLE", 0, "Axis-Angle", ""},
+ {PROP_XYZ, "XYZ", 0, "XYZ", ""},
+ {PROP_XYZ_LENGTH, "XYZ_LENGTH", 0, "XYZ Length", ""},
+ {PROP_COLOR_GAMMA, "COLOR_GAMMA", 0, "Color", ""},
+ {PROP_COORDS, "COORDS", 0, "Coordinates", ""},
+
+ /* booleans */
+ {PROP_LAYER, "LAYER", 0, "Layer", ""},
+ {PROP_LAYER_MEMBER, "LAYER_MEMBER", 0, "Layer Member", ""},
+ {0, NULL, 0, NULL, NULL}};
+
EnumPropertyItem property_unit_items[] = {
{PROP_UNIT_NONE, "NONE", 0, "None", ""},
{PROP_UNIT_LENGTH, "LENGTH", 0, "Length", ""},
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 71da2438df6..ae9576d1789 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -39,6 +39,7 @@
#include "DNA_particle_types.h"
#include "DNA_scene_types.h"
#include "DNA_userdef_types.h"
+#include "BLI_math.h"
/* Include for Bake Options */
#include "RE_pipeline.h"
@@ -440,11 +441,10 @@ static void rna_Scene_preview_range_end_frame_set(PointerRNA *ptr, int value)
data->r.pefra= value;
}
-static void rna_Scene_frame_update(bContext *C, PointerRNA *UNUSED(ptr))
+static void rna_Scene_frame_update(Main *bmain, Scene *UNUSED(current_scene), PointerRNA *ptr)
{
- //Scene *scene= ptr->id.data;
- //ED_update_for_newframe(C);
- sound_seek_scene(C);
+ Scene *scene= (Scene*)ptr->id.data;
+ sound_seek_scene(bmain, scene);
}
static PointerRNA rna_Scene_active_keying_set_get(PointerRNA *ptr)
@@ -1671,6 +1671,96 @@ void rna_def_render_layer_common(StructRNA *srna, int scene)
else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
}
+static void rna_def_scene_game_recast_data(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "SceneGameRecastData", NULL);
+ RNA_def_struct_sdna(srna, "RecastData");
+ RNA_def_struct_nested(brna, srna, "Scene");
+ RNA_def_struct_ui_text(srna, "Recast Data", "Recast data for a Game datablock");
+
+ prop= RNA_def_property(srna, "cell_size", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "cellsize");
+ RNA_def_property_ui_range(prop, 0.1, 1, 1, 2);
+ RNA_def_property_ui_text(prop, "Cell Size", "Rasterized cell size");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "cell_height", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "cellheight");
+ RNA_def_property_ui_range(prop, 0.1, 1, 1, 2);
+ RNA_def_property_ui_text(prop, "Cell Height", "Rasterized cell height");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "agent_height", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "agentheight");
+ RNA_def_property_ui_range(prop, 0.1, 5, 1, 2);
+ RNA_def_property_ui_text(prop, "Agent Height", "Minimum height where the agent can still walk");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "agent_radius", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "agentradius");
+ RNA_def_property_ui_range(prop, 0.1, 5, 1, 2);
+ RNA_def_property_ui_text(prop, "Agent Radius", "Radius of the agent");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "max_climb", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "agentmaxclimb");
+ RNA_def_property_ui_range(prop, 0.1, 5, 1, 2);
+ RNA_def_property_ui_text(prop, "Max Climb", "Maximum height between grid cells the agent can climb");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "max_slope", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_float_sdna(prop, NULL, "agentmaxslope");
+ RNA_def_property_range(prop, 0, M_PI/2);
+ RNA_def_property_ui_text(prop, "Max Slope", "Maximum walkable slope angle in degrees");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+
+ prop= RNA_def_property(srna, "region_min_size", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "regionminsize");
+ RNA_def_property_ui_range(prop, 0, 150, 1, 2);
+ RNA_def_property_ui_text(prop, "Min Region Size", "Minimum regions size. Smaller regions will be deleted");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "region_merge_size", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "regionmergesize");
+ RNA_def_property_ui_range(prop, 0, 150, 1, 2);
+ RNA_def_property_ui_text(prop, "Merged Region Size", "Minimum regions size. Smaller regions will be merged");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "edge_max_len", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "edgemaxlen");
+ RNA_def_property_ui_range(prop, 0, 50, 1, 2);
+ RNA_def_property_ui_text(prop, "Max Edge Length", "Maximum contour edge length");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "edge_max_error", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "edgemaxerror");
+ RNA_def_property_ui_range(prop, 0.1, 3.0, 1, 2);
+ RNA_def_property_ui_text(prop, "Max Edge Error", "Maximum distance error from contour to cells");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "verts_per_poly", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "vertsperpoly");
+ RNA_def_property_ui_range(prop, 3, 12, 1, 0);
+ RNA_def_property_ui_text(prop, "Verts Per Poly", "Max number of vertices per polygon");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "sample_dist", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "detailsampledist");
+ RNA_def_property_ui_range(prop, 0.0, 16.0, 1, 2);
+ RNA_def_property_ui_text(prop, "Sample Distance", "Detail mesh sample spacing");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "sample_max_error", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "detailsamplemaxerror");
+ RNA_def_property_ui_range(prop, 0.0, 16.0, 1, 2);
+ RNA_def_property_ui_text(prop, "Max Sample Error", "Detail mesh simplification max sample error");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+}
+
static void rna_def_scene_game_data(BlenderRNA *brna)
{
StructRNA *srna;
@@ -1720,6 +1810,12 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
{GAME_MAT_GLSL, "GLSL", 0, "GLSL", "OpenGL shading language shaders"},
{0, NULL, 0, NULL, NULL}};
+ static EnumPropertyItem obstacle_simulation_items[] = {
+ {OBSTSIMULATION_NONE, "NONE", 0, "None", ""},
+ {OBSTSIMULATION_TOI_rays, "RVO (rays)", 0, "RVO (rays)", ""},
+ {OBSTSIMULATION_TOI_cells, "RVO (cells)", 0, "RVO (cells)", ""},
+ {0, NULL, 0, NULL, NULL}};
+
srna= RNA_def_struct(brna, "SceneGameData", NULL);
RNA_def_struct_sdna(srna, "GameData");
RNA_def_struct_nested(brna, srna, "Scene");
@@ -1972,6 +2068,33 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GAME_GLSL_NO_EXTRA_TEX);
RNA_def_property_ui_text(prop, "GLSL Extra Textures", "Use extra textures like normal or specular maps for GLSL rendering");
RNA_def_property_update(prop, NC_SCENE|NA_EDITED, "rna_Scene_glsl_update");
+
+ /* obstacle simulation */
+ prop= RNA_def_property(srna, "obstacle_simulation", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "obstacleSimulation");
+ RNA_def_property_enum_items(prop, obstacle_simulation_items);
+ RNA_def_property_ui_text(prop, "Obstacle simulation", "Simulation used for obstacle avoidance in the game engine");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "level_height", PROP_FLOAT, PROP_ACCELERATION);
+ RNA_def_property_float_sdna(prop, NULL, "levelHeight");
+ RNA_def_property_range(prop, 0.0f, 200.0f);
+ RNA_def_property_ui_text(prop, "Level height", "Max difference in heights of obstacles to enable their interaction");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "show_obstacle_simulation", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GAME_SHOW_OBSTACLE_SIMULATION);
+ RNA_def_property_ui_text(prop, "Visualization", "Enable debug visualization for obstacle simulation");
+
+ /* Recast Settings */
+ prop= RNA_def_property(srna, "recast_data", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ RNA_def_property_pointer_sdna(prop, NULL, "recastData");
+ RNA_def_property_struct_type(prop, "SceneGameRecastData");
+ RNA_def_property_ui_text(prop, "Recast Data", "");
+
+ /* Nestled Data */
+ rna_def_scene_game_recast_data(brna);
}
static void rna_def_scene_render_layer(BlenderRNA *brna)
@@ -3299,7 +3422,6 @@ void RNA_def_scene(BlenderRNA *brna)
RNA_def_property_range(prop, MINAFRAME, MAXFRAME);
RNA_def_property_int_funcs(prop, NULL, "rna_Scene_current_frame_set", NULL);
RNA_def_property_ui_text(prop, N_("Current Frame"), N_("Current Frame, to update animation data from python frame_set() instead"));
- RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
RNA_def_property_update(prop, NC_SCENE|ND_FRAME, "rna_Scene_frame_update");
prop= RNA_def_property(srna, "frame_subframe", PROP_FLOAT, PROP_TIME);
@@ -3518,6 +3640,7 @@ void RNA_def_scene(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "GreasePencil");
RNA_def_property_ui_text(prop, N_("Grease Pencil Data"), N_("Grease Pencil datablock"));
+ RNA_def_property_update(prop, NC_SCENE, NULL);
/* Transform Orientations */
prop= RNA_def_property(srna, "orientations", PROP_COLLECTION, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_scene_api.c b/source/blender/makesrna/intern/rna_scene_api.c
index 1220c4f34a1..fd7987c18a2 100644
--- a/source/blender/makesrna/intern/rna_scene_api.c
+++ b/source/blender/makesrna/intern/rna_scene_api.c
@@ -111,7 +111,7 @@ void RNA_api_scene(StructRNA *srna)
#ifdef WITH_COLLADA
/* don't remove this, as COLLADA exporting cannot be done through operators in render() callback. */
func= RNA_def_function(srna, "collada_export", "rna_Scene_collada_export");
- parm= RNA_def_string(func, "filepath", "", FILE_MAX, "File Path", "File path to write Collada file.");
+ RNA_def_string(func, "filepath", "", FILE_MAX, "File Path", "File path to write Collada file.");
parm= RNA_def_boolean(func, "selected", 0, "Export only selected", "Export only selected elements.");
RNA_def_property_flag(parm, PROP_REQUIRED);
RNA_def_property_subtype(parm, PROP_FILEPATH); /* allow non utf8 */
diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c
index be4adb405e2..bd1021f038a 100644
--- a/source/blender/makesrna/intern/rna_screen.c
+++ b/source/blender/makesrna/intern/rna_screen.c
@@ -72,7 +72,8 @@ static void rna_Screen_scene_update(bContext *C, PointerRNA *ptr)
{
bScreen *sc= (bScreen*)ptr->data;
- /* exception: can't set screens inside of area/region handers */
+ /* exception: can't set screens inside of area/region handers, and must
+ use context so notifier gets to the right window */
if(sc->newscene) {
WM_event_add_notifier(C, NC_SCENE|ND_SCENEBROWSE, sc->newscene);
sc->newscene= NULL;
diff --git a/source/blender/makesrna/intern/rna_smoke.c b/source/blender/makesrna/intern/rna_smoke.c
index d439c2551f1..93ffa62a4c6 100644
--- a/source/blender/makesrna/intern/rna_smoke.c
+++ b/source/blender/makesrna/intern/rna_smoke.c
@@ -121,7 +121,7 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
static EnumPropertyItem prop_noise_type_items[] = {
{MOD_SMOKE_NOISEWAVE, "NOISEWAVE", 0, "Wavelet", ""},
-#if FFTW3 == 1
+#ifdef WITH_FFTW3
{MOD_SMOKE_NOISEFFT, "NOISEFFT", 0, "FFT", ""},
#endif
/* {MOD_SMOKE_NOISECURL, "NOISECURL", 0, "Curl", ""}, */
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index 1ed12bd688f..9467d84f42f 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -45,11 +45,14 @@
#include "DNA_node_types.h"
#include "DNA_object_types.h"
#include "DNA_space_types.h"
+#include "DNA_sequence_types.h"
#include "DNA_view3d_types.h"
#include "WM_api.h"
#include "WM_types.h"
+#include "RNA_enum_types.h"
+
EnumPropertyItem space_type_items[] = {
{SPACE_EMPTY, "EMPTY", 0, N_("Empty"), ""},
{SPACE_VIEW3D, "VIEW_3D", 0, N_("3D View"), ""},
@@ -121,6 +124,7 @@ EnumPropertyItem viewport_shade_items[] = {
#include "BKE_paint.h"
#include "ED_image.h"
+#include "ED_node.h"
#include "ED_screen.h"
#include "ED_view3d.h"
#include "ED_sequencer.h"
@@ -593,7 +597,8 @@ static void rna_SpaceTextEditor_text_set(PointerRNA *ptr, PointerRNA value)
SpaceText *st= (SpaceText*)(ptr->data);
st->text= value.data;
- st->top= 0;
+
+ WM_main_add_notifier(NC_TEXT|NA_SELECTED, st->text);
}
static void rna_SpaceTextEditor_updateEdited(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
@@ -806,10 +811,9 @@ static void rna_SpaceDopeSheetEditor_mode_update(Main *UNUSED(bmain), Scene *sce
/* Space Graph Editor */
-static void rna_SpaceGraphEditor_display_mode_update(bContext *C, PointerRNA *UNUSED(ptr))
+static void rna_SpaceGraphEditor_display_mode_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
{
- //SpaceIpo *sipo= (SpaceIpo*)(ptr->data);
- ScrArea *sa= CTX_wm_area(C);
+ ScrArea *sa= rna_area_from_space(ptr);
/* after changing view mode, must force recalculation of F-Curve colors
* which can only be achieved using refresh as opposed to redraw
@@ -823,11 +827,10 @@ static int rna_SpaceGraphEditor_has_ghost_curves_get(PointerRNA *ptr)
return (sipo->ghostCurves.first != NULL);
}
-static void rna_Sequencer_display_mode_update(bContext *C, PointerRNA *ptr)
+static void rna_Sequencer_view_type_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
{
- int view = RNA_enum_get(ptr, "view_type");
-
- ED_sequencer_update_view(C, view);
+ ScrArea *sa= rna_area_from_space(ptr);
+ ED_area_tag_refresh(sa);
}
static float rna_BackgroundImage_opacity_get(PointerRNA *ptr)
@@ -842,6 +845,24 @@ static void rna_BackgroundImage_opacity_set(PointerRNA *ptr, float value)
bgpic->blend = 1.0f - value;
}
+/* Space Node Editor */
+
+static int rna_SpaceNodeEditor_node_tree_poll(PointerRNA *ptr, PointerRNA value)
+{
+ SpaceNode *snode= (SpaceNode*)ptr->data;
+ bNodeTree *ntree= (bNodeTree*)value.data;
+
+ /* exclude group trees, only trees of the active type */
+ return (ntree->nodetype==0 && ntree->type == snode->treetype);
+}
+
+static void rna_SpaceNodeEditor_node_tree_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ SpaceNode *snode= (SpaceNode*)ptr->data;
+
+ ED_node_tree_update(snode, scene);
+}
+
static EnumPropertyItem *rna_SpaceProperties_texture_context_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free)
{
Scene *scene = CTX_data_scene(C);
@@ -1623,6 +1644,7 @@ static void rna_def_space_image(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "GreasePencil");
RNA_def_property_ui_text(prop, N_("Grease Pencil"), N_("Grease pencil data for this space"));
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
prop= RNA_def_property(srna, "use_grease_pencil", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DISPGP);
@@ -1689,8 +1711,7 @@ static void rna_def_space_sequencer(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "view");
RNA_def_property_enum_items(prop, view_type_items);
RNA_def_property_ui_text(prop, N_("View Type"), N_("The type of the Sequencer view (sequencer, preview or both)"));
- RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
- RNA_def_property_update(prop, 0, "rna_Sequencer_display_mode_update");
+ RNA_def_property_update(prop, 0, "rna_Sequencer_view_type_update");
/* display type, fairly important */
prop= RNA_def_property(srna, "display_mode", PROP_ENUM, PROP_NONE);
@@ -1740,7 +1761,7 @@ static void rna_def_space_sequencer(BlenderRNA *brna)
prop= RNA_def_property(srna, "display_channel", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "chanshown");
RNA_def_property_ui_text(prop, N_("Display Channel"), N_("The channel number shown in the image preview. 0 is the result of all strips combined"));
- RNA_def_property_range(prop, -5, 32); // MAXSEQ --- todo, move from BKE_sequencer.h, allow up to 5 layers up the metastack. Should be dynamic...
+ RNA_def_property_range(prop, -5, MAXSEQ);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL);
prop= RNA_def_property(srna, "draw_overexposed", PROP_INT, PROP_NONE);
@@ -1987,7 +2008,6 @@ static void rna_def_space_graph(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "mode");
RNA_def_property_enum_items(prop, mode_items);
RNA_def_property_ui_text(prop, N_("Mode"), N_("Editing context being displayed"));
- RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, "rna_SpaceGraphEditor_display_mode_update");
/* display */
@@ -2418,12 +2438,6 @@ static void rna_def_space_node(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- static EnumPropertyItem tree_type_items[] = {
- {NTREE_SHADER, "MATERIAL", ICON_MATERIAL, N_("Material"), N_("Material nodes")},
- {NTREE_TEXTURE, "TEXTURE", ICON_TEXTURE, N_("Texture"), N_("Texture nodes")},
- {NTREE_COMPOSIT, "COMPOSITING", ICON_RENDERLAYERS, N_("Compositing"), N_("Compositing nodes")},
- {0, NULL, 0, NULL, NULL}};
-
static EnumPropertyItem texture_type_items[] = {
{SNODE_TEX_OBJECT, "OBJECT", ICON_OBJECT_DATA, N_("Object"), N_("Edit texture nodes from Object")},
{SNODE_TEX_WORLD, "WORLD", ICON_WORLD_DATA, N_("World"), N_("Edit texture nodes from World")},
@@ -2442,7 +2456,7 @@ static void rna_def_space_node(BlenderRNA *brna)
prop= RNA_def_property(srna, "tree_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "treetype");
- RNA_def_property_enum_items(prop, tree_type_items);
+ RNA_def_property_enum_items(prop, nodetree_type_items);
RNA_def_property_ui_text(prop, N_("Tree Type"), N_("Node tree type to display and edit"));
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE, NULL);
@@ -2463,8 +2477,10 @@ static void rna_def_space_node(BlenderRNA *brna)
prop= RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "nodetree");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_SpaceNodeEditor_node_tree_poll");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, N_("Node Tree"), N_("Node tree being displayed and edited"));
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE, "rna_SpaceNodeEditor_node_tree_update");
prop= RNA_def_property(srna, "show_backdrop", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SNODE_BACKDRAW);
diff --git a/source/blender/makesrna/intern/rna_texture.c b/source/blender/makesrna/intern/rna_texture.c
index 01261adfc6a..0ddeae6c184 100644
--- a/source/blender/makesrna/intern/rna_texture.c
+++ b/source/blender/makesrna/intern/rna_texture.c
@@ -49,7 +49,7 @@
#include "BKE_node.h"
-static EnumPropertyItem texture_filter_items[] = {
+EnumPropertyItem texture_filter_items[] = {
{TXF_BOX, "BOX", 0, "Box", ""},
{TXF_EWA, "EWA", 0, "EWA", ""},
{TXF_FELINE, "FELINE", 0, "FELINE", ""},
@@ -1821,6 +1821,8 @@ static void rna_def_texture(BlenderRNA *brna)
rna_def_texture_pointdensity(brna);
rna_def_texture_voxeldata(brna);
/* XXX add more types here .. */
+
+ RNA_api_texture(srna);
}
void RNA_def_texture(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_texture_api.c b/source/blender/makesrna/intern/rna_texture_api.c
index 8a726cad7ac..bbadbd4f683 100755
--- a/source/blender/makesrna/intern/rna_texture_api.c
+++ b/source/blender/makesrna/intern/rna_texture_api.c
@@ -43,6 +43,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "RE_pipeline.h"
+#include "RE_shader_ext.h"
void save_envmap(struct EnvMap *env, bContext *C, ReportList *reports, const char* filepath, struct Scene *scene, float layout[12])
{
@@ -67,30 +68,59 @@ void clear_envmap(struct EnvMap *env, bContext *C)
}
}
+void texture_evaluate(struct Tex *tex, float value[3], float color_r[3])
+{
+ TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL};
+ multitex_ext(tex, value, NULL, NULL, 1, &texres);
+
+ color_r[0] = texres.tr;
+ color_r[1] = texres.tg;
+ color_r[2] = texres.tb;
+ color_r[3] = texres.tin;
+}
+
#else
+void RNA_api_texture(StructRNA *srna)
+{
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ func= RNA_def_function(srna, "evaluate", "texture_evaluate");
+ RNA_def_function_ui_description(func, "Evaluate the texture at the coordinates given");
+
+ parm= RNA_def_float_vector(func, "value", 3, NULL, -FLT_MAX, FLT_MAX, "", "", -1e4, 1e4);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ /* return location and normal */
+ parm= RNA_def_float_vector(func, "result", 4, NULL, -FLT_MAX, FLT_MAX, "Result", NULL, -1e4, 1e4);
+ RNA_def_property_flag(parm, PROP_THICK_WRAP);
+ RNA_def_function_output(func, parm);
+
+}
+
void RNA_api_environment_map(StructRNA *srna)
{
FunctionRNA *func;
PropertyRNA *parm;
-
+
static const float default_layout[] = { 0,0, 1,0, 2,0, 0,1, 1,1, 2,1 };
-
+
func= RNA_def_function(srna, "clear", "clear_envmap");
- RNA_def_function_ui_description(func, "Discard the environment map and free it from memory.");
- RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+ RNA_def_function_ui_description(func, "Discard the environment map and free it from memory.");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT);
func= RNA_def_function(srna,"save", "save_envmap");
- RNA_def_function_ui_description(func, "Save the environment map to disc using the scene render settings.");
- RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
-
- parm= RNA_def_string_file_name(func,"filepath","",FILE_MAX,"File path","Location of the output file");
- RNA_def_property_flag(parm, PROP_REQUIRED);
-
- RNA_def_pointer(func, "scene", "Scene", "", "Overrides the scene from which image parameters are taken.");
+ RNA_def_function_ui_description(func, "Save the environment map to disc using the scene render settings.");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
+
+ parm= RNA_def_string_file_name(func,"filepath","",FILE_MAX,"File path","Location of the output file");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ RNA_def_pointer(func, "scene", "Scene", "", "Overrides the scene from which image parameters are taken.");
- parm = RNA_def_float_array(func, "layout", 12, default_layout, 0.0f, 0.0f, "File layout", "Flat array describing the X,Y position of each cube face in the output image, where 1 is the size of a face. Order is [+Z -Z +Y -X -Y +X]. Use -1 to skip a face.", 0.0f, 0.0f);
+ parm = RNA_def_float_array(func, "layout", 12, default_layout, 0.0f, 0.0f, "File layout", "Flat array describing the X,Y position of each cube face in the output image, where 1 is the size of a face. Order is [+Z -Z +Y -X -Y +X]. Use -1 to skip a face.", 0.0f, 0.0f);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c
index d4ac9880290..92c93f41dfc 100644
--- a/source/blender/makesrna/intern/rna_ui_api.c
+++ b/source/blender/makesrna/intern/rna_ui_api.c
@@ -46,7 +46,7 @@ static void rna_uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname,
int flag= 0;
if(!prop) {
- RNA_warning("rna_uiItemR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname);
return;
}
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index e6abdc9bf34..a17de02afb7 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -1960,6 +1960,7 @@ static void rna_def_userdef_solidlight(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
+ static float default_dir[3] = {0.f, 1.f, 0.f};
srna= RNA_def_struct(brna, "UserSolidLight", NULL);
RNA_def_struct_sdna(srna, "SolidLight");
@@ -1973,6 +1974,7 @@ static void rna_def_userdef_solidlight(BlenderRNA *brna)
prop= RNA_def_property(srna, "direction", PROP_FLOAT, PROP_DIRECTION);
RNA_def_property_float_sdna(prop, NULL, "vec");
RNA_def_property_array(prop, 3);
+ RNA_def_property_float_array_default(prop, default_dir);
RNA_def_property_ui_text(prop, "Direction", "The direction that the OpenGL light is shining");
RNA_def_property_update(prop, 0, "rna_UserDef_viewport_lights_update");
@@ -2796,6 +2798,36 @@ static void rna_def_userdef_input(BlenderRNA *brna)
RNA_def_property_ui_text(prop, N_("Invert Axes"), N_("Toggle between moving the viewpoint or moving the scene being viewed"));
/* in 3Dx docs, this is called 'object mode' vs. 'target camera mode' */
+ /* 3D view: roll */
+ prop= RNA_def_property(srna, "ndof_roll_invert_axis", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_ROLL_INVERT_AXIS);
+ RNA_def_property_ui_text(prop, "Invert roll Axis", "Invert roll axis");
+
+ /* 3D view: tilt */
+ prop= RNA_def_property(srna, "ndof_tilt_invert_axis", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_TILT_INVERT_AXIS);
+ RNA_def_property_ui_text(prop, "Invert tilt Axis", "Invert tilt axis");
+
+ /* 3D view: rotate */
+ prop= RNA_def_property(srna, "ndof_rotate_invert_axis", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_ROTATE_INVERT_AXIS);
+ RNA_def_property_ui_text(prop, "Invert rotation Axis", "Invert rotation axis");
+
+ /* 3D view: pan x */
+ prop= RNA_def_property(srna, "ndof_panx_invert_axis", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_PANX_INVERT_AXIS);
+ RNA_def_property_ui_text(prop, "Invert x Axis", "Invert x axis");
+
+ /* 3D view: pan y */
+ prop= RNA_def_property(srna, "ndof_pany_invert_axis", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_PANY_INVERT_AXIS);
+ RNA_def_property_ui_text(prop, "Invert y Axis", "Invert y axis");
+
+ /* 3D view: pan z */
+ prop= RNA_def_property(srna, "ndof_panz_invert_axis", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_PANZ_INVERT_AXIS);
+ RNA_def_property_ui_text(prop, "Invert z Axis", "Invert z axis");
+
/* 3D view: fly */
prop= RNA_def_property(srna, "ndof_lock_horizon", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_LOCK_HORIZON);
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index 1aeb8da8262..a69adb4b6b6 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -488,7 +488,8 @@ static void rna_Window_screen_update(bContext *C, PointerRNA *ptr)
{
wmWindow *win= (wmWindow*)ptr->data;
- /* exception: can't set screens inside of area/region handers */
+ /* exception: can't set screens inside of area/region handers, and must
+ use context so notifier gets to the right window */
if(win->newscreen) {
WM_event_add_notifier(C, NC_SCREEN|ND_SCREENBROWSE, win->newscreen);
win->newscreen= NULL;
@@ -682,20 +683,14 @@ static void rna_wmKeyMapItem_name_get(PointerRNA *ptr, char *value)
{
wmKeyMapItem *kmi= ptr->data;
wmOperatorType *ot= WM_operatortype_find(kmi->idname, 1);
-
- if (ot)
- strcpy(value, ot->name);
+ strcpy(value, ot ? ot->name : kmi->idname);
}
static int rna_wmKeyMapItem_name_length(PointerRNA *ptr)
{
wmKeyMapItem *kmi= ptr->data;
wmOperatorType *ot= WM_operatortype_find(kmi->idname, 1);
-
- if (ot)
- return strlen(ot->name);
- else
- return 0;
+ return strlen(ot ? ot->name : kmi->idname);
}
static int rna_KeyMapItem_userdefined_get(PointerRNA *ptr)
@@ -1654,7 +1649,9 @@ static void rna_def_keyconfig(BlenderRNA *brna)
RNA_def_property_string_funcs(prop, "rna_wmKeyMapItem_idname_get", "rna_wmKeyMapItem_idname_length", "rna_wmKeyMapItem_idname_set");
RNA_def_struct_name_property(srna, prop);
RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
-
+
+ /* this is infact the operator name, but if the operator can't be found we
+ * fallback on the operator ID */
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, N_("Name"), N_("Name of operator to call on input event"));
diff --git a/source/blender/makesrna/intern/rna_world.c b/source/blender/makesrna/intern/rna_world.c
index eafc78099f6..895eeb67032 100644
--- a/source/blender/makesrna/intern/rna_world.c
+++ b/source/blender/makesrna/intern/rna_world.c
@@ -361,7 +361,7 @@ static void rna_def_lighting(BlenderRNA *brna)
prop= RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "aosamp");
- RNA_def_property_range(prop, 1, 32);
+ RNA_def_property_range(prop, 1, 128);
RNA_def_property_ui_text(prop, N_("Samples"), N_("Amount of ray samples. Higher values give smoother results and longer rendering times"));
RNA_def_property_update(prop, 0, "rna_World_update");
diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt
index d1f153265ac..d8344a9e19b 100644
--- a/source/blender/modifiers/CMakeLists.txt
+++ b/source/blender/modifiers/CMakeLists.txt
@@ -32,6 +32,7 @@ set(INC
../blenlib
../blenloader
../makesdna
+ ../makesrna
../render/extern/include
../../../intern/elbeem/extern
../../../intern/guardedalloc
@@ -39,6 +40,7 @@ set(INC
set(INC_SYS
${ZLIB_INCLUDE_DIRS}
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
@@ -63,6 +65,7 @@ set(SRC
intern/MOD_meshdeform.c
intern/MOD_mirror.c
intern/MOD_multires.c
+ intern/MOD_navmesh.cpp
intern/MOD_none.c
intern/MOD_particleinstance.c
intern/MOD_particlesystem.c
@@ -80,11 +83,16 @@ set(SRC
intern/MOD_uvproject.c
intern/MOD_warp.c
intern/MOD_wave.c
+ intern/MOD_weightvg_util.c
+ intern/MOD_weightvgedit.c
+ intern/MOD_weightvgmix.c
+ intern/MOD_weightvgproximity.c
MOD_modifiertypes.h
intern/MOD_boolean_util.h
intern/MOD_fluidsim_util.h
intern/MOD_util.h
+ intern/MOD_weightvg_util.h
)
if(WITH_MOD_BOOLEAN)
@@ -108,4 +116,13 @@ if(NOT WITH_MOD_FLUID)
add_definitions(-DDISABLE_ELBEEM)
endif()
+if(WITH_GAMEENGINE)
+ # for MOD_navmesh.cpp
+ add_definitions(-DWITH_GAMEENGINE)
+ list(APPEND INC
+ ../gpu
+ ../../../extern/recastnavigation/Recast/Include
+ )
+endif()
+
blender_add_lib(bf_modifiers "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/blender/modifiers/MOD_modifiertypes.h b/source/blender/modifiers/MOD_modifiertypes.h
index 4e44a226c64..0ae9768c0e6 100644
--- a/source/blender/modifiers/MOD_modifiertypes.h
+++ b/source/blender/modifiers/MOD_modifiertypes.h
@@ -72,6 +72,10 @@ extern ModifierTypeInfo modifierType_ShapeKey;
extern ModifierTypeInfo modifierType_Solidify;
extern ModifierTypeInfo modifierType_Screw;
extern ModifierTypeInfo modifierType_Warp;
+extern ModifierTypeInfo modifierType_NavMesh;
+extern ModifierTypeInfo modifierType_WeightVGEdit;
+extern ModifierTypeInfo modifierType_WeightVGMix;
+extern ModifierTypeInfo modifierType_WeightVGProximity;
/* MOD_util.c */
void modifier_type_init(ModifierTypeInfo *types[]);
diff --git a/source/blender/modifiers/SConscript b/source/blender/modifiers/SConscript
index d1bb95761ff..da37539e950 100644
--- a/source/blender/modifiers/SConscript
+++ b/source/blender/modifiers/SConscript
@@ -1,12 +1,13 @@
#!/usr/bin/python
Import ('env')
-sources = env.Glob('intern/*.c')
+sources = env.Glob('intern/*.c') + env.Glob('intern/*.cpp')
incs = '. ./intern'
-incs += ' #/intern/guardedalloc #/intern/decimation/extern #/intern/bsp/extern #/intern/elbeem/extern'
+incs += ' #/intern/guardedalloc #/intern/decimation/extern #/intern/bsp/extern #/intern/elbeem/extern #/extern/glew/include'
incs += ' ../render/extern/include ../blenloader'
-incs += ' ../include ../blenlib ../makesdna ../blenkernel ../blenkernel/intern'
+incs += ' ../include ../blenlib ../makesdna ../makesrna ../blenkernel ../blenkernel/intern'
+incs += ' ../gpu'
incs += ' ' + env['BF_ZLIB_INC']
@@ -19,6 +20,10 @@ defs += ['WITH_MOD_DECIMATE']
if env['BF_NO_ELBEEM']:
defs.append('DISABLE_ELBEEM')
+if env['WITH_BF_GAMEENGINE']:
+ incs += ' #/extern/recastnavigation/Recast/Include'
+ defs.append('WITH_GAMEENGINE')
+
env.BlenderLib ( libname = 'bf_modifiers', sources = sources,
includes = Split(incs), defines=defs,
libtype=['core','player'], priority = [80, 40] )
diff --git a/source/blender/modifiers/intern/MOD_navmesh.cpp b/source/blender/modifiers/intern/MOD_navmesh.cpp
new file mode 100644
index 00000000000..927085033fc
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_navmesh.cpp
@@ -0,0 +1,300 @@
+/*
+* $Id$
+*
+* ***** BEGIN GPL LICENSE BLOCK *****
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+* The Original Code is Copyright (C) 2005 by the Blender Foundation.
+* All rights reserved.
+*
+* Contributor(s):
+*
+* ***** END GPL LICENSE BLOCK *****
+*
+*/
+#include <math.h>
+
+#ifdef WITH_GAMEENGINE
+# include "Recast.h"
+#endif
+
+extern "C"{
+
+#ifdef WITH_GAMEENGINE
+# include "BKE_navmesh_conversion.h"
+# include "GL/glew.h"
+# include "GPU_buffers.h"
+# include "GPU_draw.h"
+#endif
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_cdderivedmesh.h"
+#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_particle.h"
+#include "BKE_customdata.h"
+#include "MEM_guardedalloc.h"
+
+inline int bit(int a, int b)
+{
+ return (a & (1 << b)) >> b;
+}
+
+inline void intToCol(int i, float* col)
+{
+ int r = bit(i, 0) + bit(i, 3) * 2 + 1;
+ int g = bit(i, 1) + bit(i, 4) * 2 + 1;
+ int b = bit(i, 2) + bit(i, 5) * 2 + 1;
+ col[0] = 1 - r*63.0f/255.0f;
+ col[1] = 1 - g*63.0f/255.0f;
+ col[2] = 1 - b*63.0f/255.0f;
+}
+
+
+static void initData(ModifierData *md)
+{
+ /* NavMeshModifierData *nmmd = (NavMeshModifierData*) md; */ /* UNUSED */
+}
+
+static void copyData(ModifierData *md, ModifierData *target)
+{
+ /* NavMeshModifierData *nmmd = (NavMeshModifierData*) md; */
+ /* NavMeshModifierData *tnmmd = (NavMeshModifierData*) target; */
+
+ //.todo - deep copy
+}
+
+/*
+static void (*drawFacesSolid_original)(DerivedMesh *dm, float (*partial_redraw_planes)[4],
+ int fast, int (*setMaterial)(int, void *attribs)) = NULL;*/
+
+#ifdef WITH_GAMEENGINE
+
+static void drawNavMeshColored(DerivedMesh *dm)
+{
+ int a, glmode;
+ MVert *mvert = (MVert *)CustomData_get_layer(&dm->vertData, CD_MVERT);
+ MFace *mface = (MFace *)CustomData_get_layer(&dm->faceData, CD_MFACE);
+ int* polygonIdx = (int*)CustomData_get_layer(&dm->faceData, CD_RECAST);
+ if (!polygonIdx)
+ return;
+ const float BLACK_COLOR[3] = {0.f, 0.f, 0.f};
+ float col[3];
+ /*
+ //UI_ThemeColor(TH_WIRE);
+ glDisable(GL_LIGHTING);
+ glLineWidth(2.0);
+ dm->drawEdges(dm, 0, 1);
+ glLineWidth(1.0);
+ glEnable(GL_LIGHTING);*/
+
+ glDisable(GL_LIGHTING);
+ if(GPU_buffer_legacy(dm) ) {
+ DEBUG_VBO( "Using legacy code. drawNavMeshColored\n" );
+ //glShadeModel(GL_SMOOTH);
+ glBegin(glmode = GL_QUADS);
+ for(a = 0; a < dm->numFaceData; a++, mface++) {
+ int new_glmode = mface->v4?GL_QUADS:GL_TRIANGLES;
+ int polygonIdx = *(int*)CustomData_get(&dm->faceData, a, CD_RECAST);
+ if (polygonIdx<=0)
+ memcpy(col, BLACK_COLOR, 3*sizeof(float));
+ else
+ intToCol(polygonIdx, col);
+
+ if(new_glmode != glmode) {
+ glEnd();
+ glBegin(glmode = new_glmode);
+ }
+ glColor3fv(col);
+ glVertex3fv(mvert[mface->v1].co);
+ glVertex3fv(mvert[mface->v2].co);
+ glVertex3fv(mvert[mface->v3].co);
+ if(mface->v4) {
+ glVertex3fv(mvert[mface->v4].co);
+ }
+ }
+ glEnd();
+ }
+ glEnable(GL_LIGHTING);
+}
+
+static void navDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, MCol *mcol, int matnr))
+{
+ drawNavMeshColored(dm);
+}
+
+static void navDM_drawFacesSolid(DerivedMesh *dm,
+ float (*partial_redraw_planes)[4],
+ int fast, int (*setMaterial)(int, void *attribs))
+{
+ //drawFacesSolid_original(dm, partial_redraw_planes, fast, setMaterial);
+ drawNavMeshColored(dm);
+}
+#endif /* WITH_GAMEENGINE */
+
+static DerivedMesh *createNavMeshForVisualization(NavMeshModifierData *mmd,DerivedMesh *dm)
+{
+#ifdef WITH_GAMEENGINE
+ DerivedMesh *result;
+ int maxFaces = dm->getNumFaces(dm);
+
+ result = CDDM_copy(dm);
+ if (!CustomData_has_layer(&result->faceData, CD_RECAST))
+ {
+ int *sourceRecastData = (int*)CustomData_get_layer(&dm->faceData, CD_RECAST);
+ CustomData_add_layer_named(&result->faceData, CD_RECAST, CD_DUPLICATE,
+ sourceRecastData, maxFaces, "recastData");
+ }
+ int *recastData = (int*)CustomData_get_layer(&result->faceData, CD_RECAST);
+ result->drawFacesTex = navDM_drawFacesTex;
+ result->drawFacesSolid = navDM_drawFacesSolid;
+
+
+ //process mesh
+ int vertsPerPoly=0, nverts=0, ndtris=0, npolys=0;
+ float* verts=NULL;
+ unsigned short *dtris=NULL, *dmeshes=NULL, *polys=NULL;
+ int *dtrisToPolysMap=NULL, *dtrisToTrisMap=NULL, *trisToFacesMap=NULL;
+
+ bool res = buildNavMeshDataByDerivedMesh(dm, vertsPerPoly, nverts, verts, ndtris, dtris,
+ npolys, dmeshes, polys, dtrisToPolysMap, dtrisToTrisMap,
+ trisToFacesMap);
+ if (res)
+ {
+ //invalidate concave polygon
+ for (size_t polyIdx=0; polyIdx<(size_t)npolys; polyIdx++)
+ {
+ unsigned short* poly = &polys[polyIdx*2*vertsPerPoly];
+ if (!polyIsConvex(poly, vertsPerPoly, verts))
+ {
+ //set negative polygon idx to all faces
+ unsigned short *dmesh = &dmeshes[4*polyIdx];
+ unsigned short tbase = dmesh[2];
+ unsigned short tnum = dmesh[3];
+ for (unsigned short ti=0; ti<tnum; ti++)
+ {
+ unsigned short triidx = dtrisToTrisMap[tbase+ti];
+ unsigned short faceidx = trisToFacesMap[triidx];
+ if (recastData[faceidx]>0)
+ recastData[faceidx] = -recastData[faceidx];
+ }
+ }
+ }
+
+ }
+ else
+ {
+ printf("Error during creation polygon infos\n");
+ }
+
+ //clean up
+ if (verts!=NULL)
+ delete verts;
+ if (dtris!=NULL)
+ delete dtris;
+ if (dmeshes!=NULL)
+ delete dmeshes;
+ if (polys!=NULL)
+ delete polys;
+ if (dtrisToPolysMap!=NULL)
+ delete dtrisToPolysMap;
+ if (dtrisToTrisMap!=NULL)
+ delete dtrisToTrisMap;
+ if (trisToFacesMap!=NULL)
+ delete trisToFacesMap;
+
+ return result;
+#else // WITH_GAMEENGINE
+ return dm;
+#endif // WITH_GAMEENGINE
+}
+
+/*
+static int isDisabled(ModifierData *md, int useRenderParams)
+{
+ NavMeshModifierData *amd = (NavMeshModifierData*) md;
+ return false;
+}*/
+
+
+
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData,
+ int useRenderParams, int isFinalCalc)
+{
+ DerivedMesh *result = NULL;
+ NavMeshModifierData *nmmd = (NavMeshModifierData*) md;
+ bool hasRecastData = CustomData_has_layer(&derivedData->faceData, CD_RECAST)>0;
+ if (ob->body_type!=OB_BODY_TYPE_NAVMESH || !hasRecastData )
+ {
+ //convert to nav mesh object:
+ //1)set physics type
+ ob->gameflag &= ~OB_COLLISION;
+ ob->gameflag |= OB_NAVMESH;
+ ob->body_type = OB_BODY_TYPE_NAVMESH;
+ //2)add and init recast data layer
+ if (!hasRecastData)
+ {
+ Mesh* obmesh = (Mesh *)ob->data;
+ if (obmesh)
+ {
+ int numFaces = obmesh->totface;
+ CustomData_add_layer_named(&obmesh->fdata, CD_RECAST, CD_CALLOC, NULL, numFaces, "recastData");
+ int* recastData = (int*)CustomData_get_layer(&obmesh->fdata, CD_RECAST);
+ for (int i=0; i<numFaces; i++)
+ {
+ recastData[i] = i+1;
+ }
+ CustomData_add_layer_named(&derivedData->faceData, CD_RECAST, CD_REFERENCE, recastData, numFaces, "recastData");
+ }
+ }
+ }
+
+ result = createNavMeshForVisualization(nmmd, derivedData);
+
+ return result;
+}
+
+
+ModifierTypeInfo modifierType_NavMesh = {
+ /* name */ "NavMesh",
+ /* structName */ "NavMeshModifierData",
+ /* structSize */ sizeof(NavMeshModifierData),
+ /* type */ eModifierTypeType_Constructive,
+ /* flags */ (ModifierTypeFlag) (eModifierTypeFlag_AcceptsMesh
+ | eModifierTypeFlag_Single),
+ /* copyData */ copyData,
+ /* deformVerts */ 0,
+ /* deformMatrices */ 0,
+ /* deformVertsEM */ 0,
+ /* deformMatricesEM */ 0,
+ /* applyModifier */ applyModifier,
+ /* applyModifierEM */ 0,
+ /* initData */ initData,
+ /* requiredDataMask */ 0,
+ /* freeData */ 0,
+ /* isDisabled */ 0,
+ /* updateDepgraph */ 0,
+ /* dependsOnTime */ 0,
+ /* foreachObjectLink */ 0,
+ /* foreachIDLink */ 0,
+};
+
+};
diff --git a/source/blender/modifiers/intern/MOD_screw.c b/source/blender/modifiers/intern/MOD_screw.c
index c5fdf465a0a..486c98f82a0 100644
--- a/source/blender/modifiers/intern/MOD_screw.c
+++ b/source/blender/modifiers/intern/MOD_screw.c
@@ -275,7 +275,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
if (fabsf(screw_ofs) <= (FLT_EPSILON*100.0f) && fabsf(fabsf(angle) - ((float)M_PI * 2.0f)) <= (FLT_EPSILON*100.0f)) {
close= 1;
step_tot--;
- if(step_tot < 2) step_tot= 2;
+ if(step_tot < 3) step_tot= 3;
maxVerts = totvert * step_tot; /* -1 because we're joining back up */
maxEdges = (totvert * step_tot) + /* these are the edges between new verts */
@@ -286,7 +286,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
}
else {
close= 0;
- if(step_tot < 2) step_tot= 2;
+ if(step_tot < 3) step_tot= 3;
maxVerts = totvert * step_tot; /* -1 because we're joining back up */
maxEdges = (totvert * (step_tot-1)) + /* these are the edges between new verts */
diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c
index e9b835eab81..a2fe947a523 100644
--- a/source/blender/modifiers/intern/MOD_util.c
+++ b/source/blender/modifiers/intern/MOD_util.c
@@ -295,5 +295,9 @@ void modifier_type_init(ModifierTypeInfo *types[])
INIT_TYPE(Solidify);
INIT_TYPE(Screw);
INIT_TYPE(Warp);
+ INIT_TYPE(NavMesh);
+ INIT_TYPE(WeightVGEdit);
+ INIT_TYPE(WeightVGMix);
+ INIT_TYPE(WeightVGProximity);
#undef INIT_TYPE
}
diff --git a/source/blender/modifiers/intern/MOD_warp.c b/source/blender/modifiers/intern/MOD_warp.c
index c1c3604d598..723e77cc6bb 100644
--- a/source/blender/modifiers/intern/MOD_warp.c
+++ b/source/blender/modifiers/intern/MOD_warp.c
@@ -232,8 +232,8 @@ static void warpModifier_do(WarpModifierData *wmd, Object *ob,
dv = &dvert[i];
if(dv) {
- weight = defvert_find_weight(dv, defgrp_index) * wmd->strength;
- if(weight <= 0.0f)
+ weight = defvert_find_weight(dv, defgrp_index) * strength;
+ if(weight <= 0.0f) /* Should never occure... */
continue;
}
}
diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c
new file mode 100644
index 00000000000..98615c70553
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_weightvg_util.c
@@ -0,0 +1,306 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2011 by Bastien Montagne.
+ * All rights reserved.
+ *
+ * Contributor(s): None yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/*
+ * XXX I'd like to make modified weights visible in WeightPaint mode,
+ * but couldn't figure a way to do this...
+ * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)?
+ * Or the WeightPaint mode code itself?
+ */
+
+#include "BLI_math.h"
+#include "BLI_rand.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
+
+#include "DNA_color_types.h" /* CurveMapping. */
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+
+#include "BKE_cdderivedmesh.h"
+#include "BKE_colortools.h" /* CurveMapping. */
+#include "BKE_deform.h"
+#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_texture.h" /* Texture masking. */
+
+#include "depsgraph_private.h"
+#include "MEM_guardedalloc.h"
+#include "MOD_util.h"
+#include "MOD_weightvg_util.h"
+#include "RE_shader_ext.h" /* Texture masking. */
+
+/* Maps new_w weights in place, using either one of the predifined functions, or a custom curve.
+ * Return values are in new_w.
+ * If indices is not NULL, it must be a table of same length as org_w and new_w, mapping to the real
+ * vertex index (in case the weight tables do not cover the whole vertices...).
+ * cmap might be NULL, in which case curve mapping mode will return unmodified data.
+ */
+void weightvg_do_map(int num, float *new_w, short falloff_type, CurveMapping *cmap)
+{
+ int i;
+
+ /* Return immediately, if we have nothing to do! */
+ /* Also security checks... */
+ if(((falloff_type == MOD_WVG_MAPPING_CURVE) && (cmap == NULL))
+ || !ELEM7(falloff_type, MOD_WVG_MAPPING_CURVE, MOD_WVG_MAPPING_SHARP, MOD_WVG_MAPPING_SMOOTH,
+ MOD_WVG_MAPPING_ROOT, MOD_WVG_MAPPING_SPHERE, MOD_WVG_MAPPING_RANDOM,
+ MOD_WVG_MAPPING_STEP))
+ return;
+
+ /* Map each weight (vertex) to its new value, accordingly to the chosen mode. */
+ for(i = 0; i < num; ++i) {
+ float fac = new_w[i];
+
+ /* Code borrowed from the warp modifier. */
+ /* Closely matches PROP_SMOOTH and similar. */
+ switch(falloff_type) {
+ case MOD_WVG_MAPPING_CURVE:
+ fac = curvemapping_evaluateF(cmap, 0, fac);
+ break;
+ case MOD_WVG_MAPPING_SHARP:
+ fac = fac*fac;
+ break;
+ case MOD_WVG_MAPPING_SMOOTH:
+ fac = 3.0f*fac*fac - 2.0f*fac*fac*fac;
+ break;
+ case MOD_WVG_MAPPING_ROOT:
+ fac = (float)sqrt(fac);
+ break;
+ case MOD_WVG_MAPPING_SPHERE:
+ fac = (float)sqrt(2*fac - fac * fac);
+ break;
+ case MOD_WVG_MAPPING_RANDOM:
+ BLI_srand(BLI_rand()); /* random seed */
+ fac = BLI_frand()*fac;
+ break;
+ case MOD_WVG_MAPPING_STEP:
+ fac = (fac >= 0.5f)?1.0f:0.0f;
+ break;
+ }
+
+ new_w[i] = fac;
+ }
+}
+
+/* Applies new_w weights to org_w ones, using either a texture, vgroup or constant value as factor.
+ * Return values are in org_w.
+ * If indices is not NULL, it must be a table of same length as org_w and new_w, mapping to the real
+ * vertex index (in case the weight tables do not cover the whole vertices...).
+ * XXX The standard “factor” value is assumed in [0.0, 1.0] range. Else, weird results might appear.
+ */
+void weightvg_do_mask(int num, const int *indices, float *org_w, const float *new_w,
+ Object *ob, DerivedMesh *dm, float fact, const char defgrp_name[32],
+ Tex *texture, int tex_use_channel, int tex_mapping,
+ Object *tex_map_object, const char *tex_uvlayer_name)
+{
+ int ref_didx;
+ int i;
+
+ /* If influence factor is null, nothing to do! */
+ if (fact == 0.0f) return;
+
+ /* If we want to mask vgroup weights from a texture. */
+ if (texture) {
+ /* The texture coordinates. */
+ float (*tex_co)[3];
+ /* See mapping note below... */
+ MappingInfoModifierData t_map;
+ float (*v_co)[3];
+
+ /* Use new generic get_texture_coords, but do not modify our DNA struct for it...
+ * XXX Why use a ModifierData stuff here ? Why not a simple, generic struct for parameters ?
+ * What e.g. if a modifier wants to use several textures ?
+ * Why use only v_co, and not MVert (or both) ?
+ */
+ t_map.texture = texture;
+ t_map.map_object = tex_map_object;
+ BLI_strncpy(t_map.uvlayer_name, tex_uvlayer_name, sizeof(t_map.uvlayer_name));
+ t_map.texmapping = tex_mapping;
+ v_co = MEM_mallocN(sizeof(*v_co) * num, "WeightVG Modifier, TEX mode, v_co");
+ dm->getVertCos(dm, v_co);
+ tex_co = MEM_callocN(sizeof(*tex_co) * num, "WeightVG Modifier, TEX mode, tex_co");
+ get_texture_coords(&t_map, ob, dm, v_co, tex_co, num);
+ MEM_freeN(v_co);
+
+ /* For each weight (vertex), make the mix between org and new weights. */
+ for(i = 0; i < num; ++i) {
+ int idx = indices ? indices[i] : i;
+ TexResult texres;
+ float h, s, v; /* For HSV color space. */
+
+ texres.nor = NULL;
+ get_texture_value(texture, tex_co[idx], &texres);
+ /* Get the good channel value... */
+ switch(tex_use_channel) {
+ case MOD_WVG_MASK_TEX_USE_INT:
+ org_w[i] = (new_w[i] * texres.tin * fact) + (org_w[i] * (1.0f - (texres.tin*fact)));
+ break;
+ case MOD_WVG_MASK_TEX_USE_RED:
+ org_w[i] = (new_w[i] * texres.tr * fact) + (org_w[i] * (1.0f - (texres.tr*fact)));
+ break;
+ case MOD_WVG_MASK_TEX_USE_GREEN:
+ org_w[i] = (new_w[i] * texres.tg * fact) + (org_w[i] * (1.0f - (texres.tg*fact)));
+ break;
+ case MOD_WVG_MASK_TEX_USE_BLUE:
+ org_w[i] = (new_w[i] * texres.tb * fact) + (org_w[i] * (1.0f - (texres.tb*fact)));
+ break;
+ case MOD_WVG_MASK_TEX_USE_HUE:
+ rgb_to_hsv(texres.tr, texres.tg, texres.tb, &h, &s, &v);
+ org_w[i] = (new_w[i] * h * fact) + (org_w[i] * (1.0f - (h*fact)));
+ break;
+ case MOD_WVG_MASK_TEX_USE_SAT:
+ rgb_to_hsv(texres.tr, texres.tg, texres.tb, &h, &s, &v);
+ org_w[i] = (new_w[i] * s * fact) + (org_w[i] * (1.0f - (s*fact)));
+ break;
+ case MOD_WVG_MASK_TEX_USE_VAL:
+ rgb_to_hsv(texres.tr, texres.tg, texres.tb, &h, &s, &v);
+ org_w[i] = (new_w[i] * v * fact) + (org_w[i] * (1.0f - (v*fact)));
+ break;
+ case MOD_WVG_MASK_TEX_USE_ALPHA:
+ org_w[i] = (new_w[i] * texres.ta * fact) + (org_w[i] * (1.0f - (texres.ta*fact)));
+ break;
+ default:
+ org_w[i] = (new_w[i] * texres.tin * fact) + (org_w[i] * (1.0f - (texres.tin*fact)));
+ break;
+ }
+ }
+
+ MEM_freeN(tex_co);
+ }
+ else if ((ref_didx = defgroup_name_index(ob, defgrp_name)) != -1) {
+ MDeformVert *dvert = NULL;
+
+ /* Check whether we want to set vgroup weights from a constant weight factor or a vertex
+ * group.
+ */
+ /* Get vgroup idx from its name. */
+
+ /* Proceed only if vgroup is valid, else use constant factor. */
+ /* Get actual dverts (ie vertex group data). */
+ dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+ /* Proceed only if vgroup is valid, else assume factor = O. */
+ if (dvert == NULL) return;
+
+ /* For each weight (vertex), make the mix between org and new weights. */
+ for (i = 0; i < num; i++) {
+ int idx = indices ? indices[i] : i;
+ const float f= defvert_find_weight(&dvert[idx], ref_didx) * fact;
+ org_w[i] = (new_w[i] * f) + (org_w[i] * (1.0f-f));
+ /* If that vertex is not in ref vgroup, assume null factor, and hence do nothing! */
+ }
+ }
+ else {
+ /* Default "influence" behavior. */
+ /* For each weight (vertex), make the mix between org and new weights. */
+ const float ifact= 1.0f - fact;
+ for (i = 0; i < num; i++) {
+ org_w[i] = (new_w[i] * fact) + (org_w[i] * ifact);
+ }
+ }
+}
+
+/* Applies weights to given vgroup (defgroup), and optionnaly add/remove vertices from the group.
+ * If indices is not NULL, it must be a table of same length as weights, mapping to the real
+ * vertex index (in case the weight table does not cover the whole vertices...).
+ */
+void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num,
+ const int *indices, const float *weights, int do_add,
+ float add_thresh, int do_rem, float rem_thresh)
+{
+ int i;
+
+ for (i = 0; i < num; i++) {
+ int j;
+ int add2vg = do_add;
+ float w = weights[i];
+ MDeformVert *dv = &dvert[indices ? indices[i] : i];
+ MDeformWeight *newdw;
+
+ /* Never allow weights out of [0.0, 1.0] range. */
+ CLAMP(w, 0.0f, 1.0f);
+
+ /* Let's first check to see if this vert is already in the weight group – if so
+ * let's update it, or remove it if needed.
+ */
+ for (j = 0; j < dv->totweight; j++) {
+ /* If this weight corresponds to the deform group, update the value or,
+ * if lower than rem_threshold, remove the vertex from the vgroup.
+ */
+ if (dv->dw[j].def_nr == defgrp_idx) {
+ /* Remove the vertex from this vgroup if needed. */
+ if (do_rem && w < rem_thresh) {
+ /* TODO, move this into deform.c to make into a generic function */
+
+ dv->totweight--;
+ /* If there are still other deform weights attached to this vert then remove
+ * this deform weight, and reshuffle the others.
+ */
+ if(dv->totweight) {
+ newdw = MEM_mallocN(sizeof(MDeformWeight)*(dv->totweight), "deformWeight");
+ if(dv->dw){
+ memcpy(newdw, dv->dw, sizeof(MDeformWeight)*j);
+ memcpy(newdw+j, dv->dw+j+1, sizeof(MDeformWeight)*(dv->totweight-j));
+ MEM_freeN(dv->dw);
+ }
+ dv->dw = newdw;
+ }
+ /* If there are no other deform weights left then just remove this one. */
+ else {
+ MEM_freeN(dv->dw);
+ dv->dw = NULL;
+ }
+ }
+ /* Else, just set the new computed weight. */
+ else {
+ dv->dw[j].weight = w;
+ }
+ add2vg = FALSE;
+ break;
+ }
+ }
+
+ /* If the vert wasn't in the deform group, add it if needed!
+ */
+ if ((add2vg == TRUE) && w > add_thresh) {
+ /* TODO, mvoe into deform.c and make into a generic function, this assumes the vertex
+ * groups have already been checked, so this has to remain low level */
+ newdw = MEM_callocN(sizeof(MDeformWeight)*(dv->totweight+1), "WeightVGEdit Modifier, deformWeight");
+ if(dv->dw) {
+ memcpy(newdw, dv->dw, sizeof(MDeformWeight)*dv->totweight);
+ MEM_freeN(dv->dw);
+ }
+ dv->dw = newdw;
+ dv->dw[dv->totweight].weight = w;
+ dv->dw[dv->totweight].def_nr = defgrp_idx;
+ dv->totweight++;
+ }
+ }
+}
diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.h b/source/blender/modifiers/intern/MOD_weightvg_util.h
new file mode 100644
index 00000000000..ce3520f1900
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_weightvg_util.h
@@ -0,0 +1,90 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2011 by Bastien Montagne.
+ * All rights reserved.
+ *
+ * Contributor(s): None yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/** \file blender/modifiers/intern/MOD_util.h
+ * \ingroup modifiers
+ */
+
+
+#ifndef MOD_WEIGHTVG_UTIL_H
+#define MOD_WEIGHTVG_UTIL_H
+
+/* so modifier types match their defines */
+#include "MOD_modifiertypes.h"
+
+struct CurveMapping;
+struct DerivedMesh;
+struct Object;
+struct Tex;
+
+/*
+ * XXX I'd like to make modified weights visible in WeightPaint mode,
+ * but couldn't figure a way to do this...
+ * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)?
+ * Or the WeightPaint mode code itself?
+ */
+
+/**************************************
+ * Util functions. *
+ **************************************/
+
+/* We cannot divide by zero (what a surprise...).
+ * So if -MOD_WEIGHTVGROUP_DIVMODE_ZEROFLOOR < weightf < MOD_WEIGHTVGROUP_DIVMODE_ZEROFLOOR,
+ * we clamp weightf to this value (or its negative version).
+ * Also used to avoid null power factor.
+ */
+#define MOD_WVG_ZEROFLOOR 1.0e-32f
+
+/* Maps new_w weights in place, using either one of the predifined functions, or a custom curve.
+ * Return values are in new_w.
+ * If indices is not NULL, it must be a table of same length as org_w and new_w, mapping to the real
+ * vertex index (in case the weight tables do not cover the whole vertices...).
+ * cmap might be NULL, in which case curve mapping mode will return unmodified data.
+ */
+void weightvg_do_map(int num, float *new_w, short mode, struct CurveMapping *cmap);
+
+/* Applies new_w weights to org_w ones, using either a texture, vgroup or constant value as factor.
+ * Return values are in org_w.
+ * If indices is not NULL, it must be a table of same length as org_w and new_w, mapping to the real
+ * vertex index (in case the weight tables do not cover the whole vertices...).
+ * XXX The standard “factor” value is assumed in [0.0, 1.0] range. Else, weird results might appear.
+ */
+void weightvg_do_mask(int num, const int *indices, float *org_w, const float *new_w, Object *ob,
+ DerivedMesh *dm, float fact, const char defgrp_name[32], Tex *texture,
+ int tex_use_channel, int tex_mapping, Object *tex_map_object,
+ const char *tex_uvlayer_name);
+
+/* Applies weights to given vgroup (defgroup), and optionnaly add/remove vertices from the group.
+ * If indices is not NULL, it must be a table of same length as weights, mapping to the real
+ * vertex index (in case the weight table does not cover the whole vertices...).
+ */
+void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num,
+ const int *indices, const float *weights, int do_add,
+ float add_thresh, int do_rem, float rem_thresh);
+
+#endif /* MOD_WEIGHTVG_UTIL_H */
diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c
new file mode 100644
index 00000000000..fb6d4dc10e6
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_weightvgedit.c
@@ -0,0 +1,326 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2011 by Bastien Montagne.
+ * All rights reserved.
+ *
+ * Contributor(s): None yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/*
+ * XXX I'd like to make modified weights visible in WeightPaint mode,
+ * but couldn't figure a way to do this...
+ * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)?
+ * Or the WeightPaint mode code itself?
+ */
+
+#include "BLI_utildefines.h"
+#include "BLI_math.h"
+#include "BLI_string.h"
+
+#include "DNA_color_types.h" /* CurveMapping. */
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+
+#include "BKE_cdderivedmesh.h"
+#include "BKE_colortools.h" /* CurveMapping. */
+#include "BKE_deform.h"
+#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_texture.h" /* Texture masking. */
+
+#include "depsgraph_private.h"
+#include "MEM_guardedalloc.h"
+#include "MOD_util.h"
+#include "MOD_weightvg_util.h"
+
+/**************************************
+ * Modifiers functions. *
+ **************************************/
+static void initData(ModifierData *md)
+{
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+ wmd->edit_flags = 0;
+ wmd->falloff_type = MOD_WVG_MAPPING_NONE;
+ wmd->default_weight = 0.0f;
+
+ wmd->cmap_curve = curvemapping_add(1, 0.0, 0.0, 1.0, 1.0);
+ curvemapping_initialize(wmd->cmap_curve);
+
+ wmd->rem_threshold = 0.01f;
+ wmd->add_threshold = 0.01f;
+
+ wmd->mask_constant = 1.0f;
+ wmd->mask_tex_use_channel = MOD_WVG_MASK_TEX_USE_INT; /* Use intensity by default. */
+ wmd->mask_tex_mapping = MOD_DISP_MAP_LOCAL;
+}
+
+static void freeData(ModifierData *md)
+{
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+ curvemapping_free(wmd->cmap_curve);
+}
+
+static void copyData(ModifierData *md, ModifierData *target)
+{
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+ WeightVGEditModifierData *twmd = (WeightVGEditModifierData*) target;
+
+ BLI_strncpy(twmd->defgrp_name, wmd->defgrp_name, sizeof(twmd->defgrp_name));
+
+ twmd->edit_flags = wmd->edit_flags;
+ twmd->falloff_type = wmd->falloff_type;
+ twmd->default_weight = wmd->default_weight;
+
+ twmd->cmap_curve = curvemapping_copy(wmd->cmap_curve);
+
+ twmd->add_threshold = wmd->add_threshold;
+ twmd->rem_threshold = wmd->rem_threshold;
+
+ twmd->mask_constant = wmd->mask_constant;
+ BLI_strncpy(twmd->mask_defgrp_name, wmd->mask_defgrp_name, sizeof(twmd->mask_defgrp_name));
+ twmd->mask_texture = wmd->mask_texture;
+ twmd->mask_tex_use_channel = wmd->mask_tex_use_channel;
+ twmd->mask_tex_mapping = wmd->mask_tex_mapping;
+ twmd->mask_tex_map_obj = wmd->mask_tex_map_obj;
+ BLI_strncpy(twmd->mask_tex_uvlayer_name, wmd->mask_tex_uvlayer_name, sizeof(twmd->mask_tex_uvlayer_name));
+}
+
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
+{
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+ CustomDataMask dataMask = 0;
+
+ /* We need vertex groups! */
+ dataMask |= CD_MASK_MDEFORMVERT;
+
+ /* Ask for UV coordinates if we need them. */
+ if(wmd->mask_tex_mapping == MOD_DISP_MAP_UV)
+ dataMask |= CD_MASK_MTFACE;
+
+ return dataMask;
+}
+
+static int dependsOnTime(ModifierData *md)
+{
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+
+ if(wmd->mask_texture)
+ return BKE_texture_dependsOnTime(wmd->mask_texture);
+ return 0;
+}
+
+static void foreachObjectLink(ModifierData *md, Object *ob,
+ void (*walk)(void *userData, Object *ob, Object **obpoin),
+ void *userData)
+{
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+ walk(userData, ob, &wmd->mask_tex_map_obj);
+}
+
+static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
+{
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+
+ walk(userData, ob, (ID **)&wmd->mask_texture);
+
+ foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData);
+}
+
+static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData)
+{
+ walk(userData, ob, md, "mask_texture");
+}
+
+static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *UNUSED(scene),
+ Object *UNUSED(ob), DagNode *obNode)
+{
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+ DagNode *curNode;
+
+ if(wmd->mask_tex_map_obj && wmd->mask_tex_mapping == MOD_DISP_MAP_OBJECT) {
+ curNode = dag_get_node(forest, wmd->mask_tex_map_obj);
+
+ dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA,
+ "WeightVGEdit Modifier");
+ }
+
+ if(wmd->mask_tex_mapping == MOD_DISP_MAP_GLOBAL)
+ dag_add_relation(forest, obNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA,
+ "WeightVGEdit Modifier");
+}
+
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
+{
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+ /* If no vertex group, bypass. */
+ return (wmd->defgrp_name[0] == '\0');
+}
+
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData,
+ int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
+{
+ WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+ DerivedMesh *dm = derivedData, *ret = NULL;
+#if 0
+ Mesh *ob_m = NULL;
+#endif
+ MDeformVert *dvert = NULL;
+ float *org_w; /* Array original weights. */
+ float *new_w; /* Array new weights. */
+ int numVerts;
+ int defgrp_idx;
+ int i;
+ char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */
+ /* Flags. */
+ int do_add = (wmd->edit_flags & MOD_WVG_EDIT_ADD2VG) != 0;
+ int do_rem = (wmd->edit_flags & MOD_WVG_EDIT_REMFVG) != 0;
+
+ /* Get number of verts. */
+ numVerts = dm->getNumVerts(dm);
+
+ /* Check if we can just return the original mesh.
+ * Must have verts and therefore verts assigned to vgroups to do anything useful!
+ */
+ if ((numVerts == 0) || (ob->defbase.first == NULL))
+ return dm;
+
+ /* Get vgroup idx from its name. */
+ defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name);
+ if (defgrp_idx < 0)
+ return dm;
+
+ /* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute
+ * time! See scene 5 of the WeighVG test file...
+ */
+#if 0
+ /* Get actual dverts (ie vertex group data). */
+ dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+ /* If no dverts, return unmodified data... */
+ if (dvert == NULL)
+ return dm;
+
+ /* Get org mesh, only to test whether affected cdata layer has already been copied
+ * somewhere up in the modifiers stack.
+ */
+ ob_m = get_mesh(ob);
+ if (ob_m == NULL)
+ return dm;
+
+ /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */
+ if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) {
+ /* XXX Seems to create problems with weightpaint mode???
+ * I'm missing something here, I guess...
+ */
+// DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */
+ ret = CDDM_copy(dm);
+ dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
+ if (dvert == NULL) {
+ ret->release(ret);
+ return dm;
+ }
+ rel_ret = 1;
+ }
+ else
+ ret = dm;
+#else
+ ret = CDDM_copy(dm);
+ rel_ret = 1;
+ dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
+ if (dvert == NULL) {
+ if (rel_ret)
+ ret->release(ret);
+ return dm;
+ }
+#endif
+
+ /* Get org weights, assuming 0.0 for vertices not in given vgroup. */
+ org_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, org_w");
+ new_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, org_w");
+ for (i = 0; i < numVerts; i++) {
+ MDeformWeight *dw= defvert_find_index(&dvert[i], defgrp_idx);
+ org_w[i] = new_w[i] = wmd->default_weight;
+
+ if(dw) {
+ org_w[i] = new_w[i] = dw->weight;
+ }
+ }
+
+ /* Do mapping. */
+ if (wmd->falloff_type != MOD_WVG_MAPPING_NONE) {
+ weightvg_do_map(numVerts, new_w, wmd->falloff_type, wmd->cmap_curve);
+ }
+
+ /* Do masking. */
+ weightvg_do_mask(numVerts, NULL, org_w, new_w, ob, ret, wmd->mask_constant,
+ wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel,
+ wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name);
+
+ /* Update/add/remove from vgroup. */
+ weightvg_update_vg(dvert, defgrp_idx, numVerts, NULL, org_w, do_add, wmd->add_threshold,
+ do_rem, wmd->rem_threshold);
+
+ /* Freeing stuff. */
+ MEM_freeN(org_w);
+ MEM_freeN(new_w);
+
+ /* Return the vgroup-modified mesh. */
+ return ret;
+}
+
+static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *derivedData)
+{
+ return applyModifier(md, ob, derivedData, 0, 1);
+}
+
+
+ModifierTypeInfo modifierType_WeightVGEdit = {
+ /* name */ "VertexWeightEdit",
+ /* structName */ "WeightVGEditModifierData",
+ /* structSize */ sizeof(WeightVGEditModifierData),
+ /* type */ eModifierTypeType_Nonconstructive,
+ /* flags */ eModifierTypeFlag_AcceptsMesh
+/* |eModifierTypeFlag_SupportsMapping*/
+ |eModifierTypeFlag_SupportsEditmode,
+
+ /* copyData */ copyData,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ applyModifier,
+ /* applyModifierEM */ applyModifierEM,
+ /* initData */ initData,
+ /* requiredDataMask */ requiredDataMask,
+ /* freeData */ freeData,
+ /* isDisabled */ isDisabled,
+ /* updateDepgraph */ updateDepgraph,
+ /* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ foreachObjectLink,
+ /* foreachIDLink */ foreachIDLink,
+ /* foreachTexLink */ foreachTexLink,
+};
diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c
new file mode 100644
index 00000000000..f1422a342eb
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_weightvgmix.c
@@ -0,0 +1,466 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2011 by Bastien Montagne.
+ * All rights reserved.
+ *
+ * Contributor(s): None yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/*
+ * XXX I'd like to make modified weights visible in WeightPaint mode,
+ * but couldn't figure a way to do this...
+ * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)?
+ * Or the WeightPaint mode code itself?
+ */
+
+#include "BLI_utildefines.h"
+#include "BLI_math.h"
+#include "BLI_string.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+
+#include "BKE_cdderivedmesh.h"
+#include "BKE_deform.h"
+#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_texture.h" /* Texture masking. */
+
+#include "depsgraph_private.h"
+#include "MEM_guardedalloc.h"
+#include "MOD_util.h"
+#include "MOD_weightvg_util.h"
+
+
+/**
+ * This mixes the old weight with the new weight factor.
+ */
+static float mix_weight(float weight, float weight2, char mix_mode)
+{
+#if 0
+ /*
+ * XXX Don't know why, but the switch version takes many CPU time,
+ * and produces lag in realtime playback...
+ */
+ switch (mix_mode)
+ {
+ case MOD_WVG_MIX_ADD:
+ return (weight + weight2);
+ case MOD_WVG_MIX_SUB:
+ return (weight - weight2);
+ case MOD_WVG_MIX_MUL:
+ return (weight * weight2);
+ case MOD_WVG_MIX_DIV:
+ /* Avoid dividing by zero (or really small values). */
+ if (0.0 <= weight2 < MOD_WVG_ZEROFLOOR)
+ weight2 = MOD_WVG_ZEROFLOOR;
+ else if (-MOD_WVG_ZEROFLOOR < weight2)
+ weight2 = -MOD_WVG_ZEROFLOOR;
+ return (weight / weight2);
+ case MOD_WVG_MIX_DIF:
+ return (weight < weight2 ? weight2 - weight : weight - weight2);
+ case MOD_WVG_MIX_AVG:
+ return (weight + weight2) / 2.0;
+ case MOD_WVG_MIX_SET:
+ default:
+ return weight2;
+ }
+#endif
+ if (mix_mode == MOD_WVG_MIX_SET)
+ return weight2;
+ else if (mix_mode == MOD_WVG_MIX_ADD)
+ return (weight + weight2);
+ else if (mix_mode == MOD_WVG_MIX_SUB)
+ return (weight - weight2);
+ else if (mix_mode == MOD_WVG_MIX_MUL)
+ return (weight * weight2);
+ else if (mix_mode == MOD_WVG_MIX_DIV) {
+ /* Avoid dividing by zero (or really small values). */
+ if (weight2 < 0.0f && weight2 > -MOD_WVG_ZEROFLOOR)
+ weight2 = -MOD_WVG_ZEROFLOOR;
+ else if (weight2 >= 0.0f && weight2 < MOD_WVG_ZEROFLOOR)
+ weight2 = MOD_WVG_ZEROFLOOR;
+ return (weight / weight2);
+ }
+ else if (mix_mode == MOD_WVG_MIX_DIF)
+ return (weight < weight2 ? weight2 - weight : weight - weight2);
+ else if (mix_mode == MOD_WVG_MIX_AVG)
+ return (weight + weight2) * 0.5f;
+ else return weight2;
+}
+
+/**************************************
+ * Modifiers functions. *
+ **************************************/
+static void initData(ModifierData *md)
+{
+ WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
+
+ wmd->default_weight_a = 0.0f;
+ wmd->default_weight_b = 0.0f;
+ wmd->mix_mode = MOD_WVG_MIX_SET;
+ wmd->mix_set = MOD_WVG_SET_AND;
+
+ wmd->mask_constant = 1.0f;
+ wmd->mask_tex_use_channel = MOD_WVG_MASK_TEX_USE_INT; /* Use intensity by default. */
+ wmd->mask_tex_mapping = MOD_DISP_MAP_LOCAL;
+}
+
+static void copyData(ModifierData *md, ModifierData *target)
+{
+ WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
+ WeightVGMixModifierData *twmd = (WeightVGMixModifierData*) target;
+
+ BLI_strncpy(twmd->defgrp_name_a, wmd->defgrp_name_a, sizeof(twmd->defgrp_name_a));
+ BLI_strncpy(twmd->defgrp_name_b, wmd->defgrp_name_b, sizeof(twmd->defgrp_name_b));
+ twmd->default_weight_a = wmd->default_weight_a;
+ twmd->default_weight_b = wmd->default_weight_b;
+ twmd->mix_mode = wmd->mix_mode;
+ twmd->mix_set = wmd->mix_set;
+
+ twmd->mask_constant = wmd->mask_constant;
+ BLI_strncpy(twmd->mask_defgrp_name, wmd->mask_defgrp_name, sizeof(twmd->mask_defgrp_name));
+ twmd->mask_texture = wmd->mask_texture;
+ twmd->mask_tex_use_channel = wmd->mask_tex_use_channel;
+ twmd->mask_tex_mapping = wmd->mask_tex_mapping;
+ twmd->mask_tex_map_obj = wmd->mask_tex_map_obj;
+ BLI_strncpy(twmd->mask_tex_uvlayer_name, wmd->mask_tex_uvlayer_name, sizeof(twmd->mask_tex_uvlayer_name));
+}
+
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
+{
+ WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
+ CustomDataMask dataMask = 0;
+
+ /* We need vertex groups! */
+ dataMask |= CD_MASK_MDEFORMVERT;
+
+ /* Ask for UV coordinates if we need them. */
+ if(wmd->mask_tex_mapping == MOD_DISP_MAP_UV)
+ dataMask |= CD_MASK_MTFACE;
+
+ return dataMask;
+}
+
+static int dependsOnTime(ModifierData *md)
+{
+ WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
+
+ if(wmd->mask_texture)
+ return BKE_texture_dependsOnTime(wmd->mask_texture);
+ return 0;
+}
+
+static void foreachObjectLink(ModifierData *md, Object *ob,
+ void (*walk)(void *userData, Object *ob, Object **obpoin),
+ void *userData)
+{
+ WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
+ walk(userData, ob, &wmd->mask_tex_map_obj);
+}
+
+static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
+{
+ WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
+
+ walk(userData, ob, (ID **)&wmd->mask_texture);
+
+ foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData);
+}
+
+static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData)
+{
+ walk(userData, ob, md, "mask_texture");
+}
+
+static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *UNUSED(scene),
+ Object *UNUSED(ob), DagNode *obNode)
+{
+ WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
+ DagNode *curNode;
+
+ if(wmd->mask_tex_map_obj && wmd->mask_tex_mapping == MOD_DISP_MAP_OBJECT) {
+ curNode = dag_get_node(forest, wmd->mask_tex_map_obj);
+
+ dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA,
+ "WeightVGMix Modifier");
+ }
+
+ if(wmd->mask_tex_mapping == MOD_DISP_MAP_GLOBAL)
+ dag_add_relation(forest, obNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA,
+ "WeightVGMix Modifier");
+}
+
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
+{
+ WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
+ /* If no vertex group, bypass. */
+ return (wmd->defgrp_name_a[0] == '\0');
+}
+
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData,
+ int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
+{
+ WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
+ DerivedMesh *dm = derivedData, *ret = NULL;
+#if 0
+ Mesh *ob_m = NULL;
+#endif
+ MDeformVert *dvert = NULL;
+ int numVerts;
+ int defgrp_idx, defgrp_idx2 = -1;
+ float *org_w;
+ float *new_w;
+ int *tidx, *indices = NULL;
+ int numIdx = 0;
+ int i, j;
+ char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */
+
+ /* Get number of verts. */
+ numVerts = dm->getNumVerts(dm);
+
+ /* Check if we can just return the original mesh.
+ * Must have verts and therefore verts assigned to vgroups to do anything useful!
+ */
+ if ((numVerts == 0) || (ob->defbase.first == NULL))
+ return dm;
+
+ /* Get vgroup idx from its name. */
+ defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name_a);
+ if (defgrp_idx < 0)
+ return dm;
+ /* Get seconf vgroup idx from its name, if given. */
+ if (wmd->defgrp_name_b[0] != (char)0) {
+ defgrp_idx2 = defgroup_name_index(ob, wmd->defgrp_name_b);
+ if (defgrp_idx2 < 0)
+ return dm;
+ }
+
+ /* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute
+ * time! See scene 5 of the WeighVG test file...
+ */
+#if 0
+ /* Get actual dverts (ie vertex group data). */
+ dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+ /* If no dverts, return unmodified data... */
+ if (dvert == NULL)
+ return dm;
+
+ /* Get org mesh, only to test whether affected cdata layer has already been copied
+ * somewhere up in the modifiers stack.
+ */
+ ob_m = get_mesh(ob);
+ if (ob_m == NULL)
+ return dm;
+
+ /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */
+ if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) {
+ /* XXX Seems to create problems with weightpaint mode???
+ * I'm missing something here, I guess...
+ */
+// DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */
+ ret = CDDM_copy(dm);
+ dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
+ if (dvert == NULL) {
+ ret->release(ret);
+ return dm;
+ }
+ rel_ret = 1;
+ }
+ else
+ ret = dm;
+#else
+ ret = CDDM_copy(dm);
+ rel_ret = 1;
+ dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
+ if (dvert == NULL) {
+ if (rel_ret)
+ ret->release(ret);
+ return dm;
+ }
+#endif
+
+ /* Find out which vertices to work on. */
+ tidx = MEM_mallocN(sizeof(int) * numVerts, "WeightVGMix Modifier, tidx");
+ switch (wmd->mix_set) {
+ case MOD_WVG_SET_A:
+ /* All vertices in first vgroup. */
+ for (i = 0; i < numVerts; i++) {
+ for (j = 0; j < dvert[i].totweight; j++) {
+ if(dvert[i].dw[j].def_nr == defgrp_idx) {
+ tidx[numIdx++] = i;
+ break;
+ }
+ }
+ }
+ break;
+ case MOD_WVG_SET_B:
+ /* All vertices in second vgroup. */
+ for (i = 0; i < numVerts; i++) {
+ for (j = 0; j < dvert[i].totweight; j++) {
+ if(dvert[i].dw[j].def_nr == defgrp_idx2) {
+ tidx[numIdx++] = i;
+ break;
+ }
+ }
+ }
+ break;
+ case MOD_WVG_SET_OR:
+ /* All vertices in one vgroup or the other. */
+ for (i = 0; i < numVerts; i++) {
+ for (j = 0; j < dvert[i].totweight; j++) {
+ if(dvert[i].dw[j].def_nr == defgrp_idx || dvert[i].dw[j].def_nr == defgrp_idx2) {
+ tidx[numIdx++] = i;
+ break;
+ }
+ }
+ }
+ break;
+ case MOD_WVG_SET_AND:
+ /* All vertices in both vgroups. */
+ for (i = 0; i < numVerts; i++) {
+ int idx1 = FALSE;
+ int idx2 = FALSE;
+ for (j = 0; j < dvert[i].totweight; j++) {
+ if(dvert[i].dw[j].def_nr == defgrp_idx) {
+ if (idx2 == TRUE) {
+ tidx[numIdx++] = i;
+ break;
+ }
+ else {
+ idx1 = TRUE;
+ }
+ }
+ else if(dvert[i].dw[j].def_nr == defgrp_idx2) {
+ if (idx1 == TRUE) {
+ tidx[numIdx++] = i;
+ break;
+ }
+ else {
+ idx2 = TRUE;
+ }
+ }
+ }
+ }
+ break;
+ case MOD_WVG_SET_ALL:
+ default:
+ /* Use all vertices, no need to do anything here. */
+ break;
+ }
+ if (numIdx) {
+ indices = MEM_mallocN(sizeof(int) * numIdx, "WeightVGMix Modifier, indices");
+ memcpy(indices, tidx, sizeof(int) * numIdx);
+ }
+ else
+ numIdx = numVerts;
+ MEM_freeN(tidx);
+
+ org_w = MEM_mallocN(sizeof(float) * numIdx, "WeightVGMix Modifier, org_w");
+ new_w = MEM_mallocN(sizeof(float) * numIdx, "WeightVGMix Modifier, new_w");
+
+ /* Mix weights. */
+ for (i = 0; i < numIdx; i++) {
+ float weight2 = 0.0;
+ int w1 = FALSE;
+ int w2 = FALSE;
+ int idx = indices ? indices[i] : i;
+ for (j = 0; j < dvert[idx].totweight; j++) {
+ if(dvert[idx].dw[j].def_nr == defgrp_idx) {
+ org_w[i] = dvert[idx].dw[j].weight;
+ w1 = TRUE;
+ if (w2 == TRUE)
+ break;
+ }
+ else if(dvert[idx].dw[j].def_nr == defgrp_idx2) {
+ weight2 = dvert[idx].dw[j].weight;
+ w2 = TRUE;
+ if (w1 == TRUE)
+ break;
+ }
+ }
+ if (w1 == FALSE)
+ org_w[i] = wmd->default_weight_a;
+ if (w2 == FALSE)
+ weight2 = wmd->default_weight_b;
+ new_w[i] = mix_weight(org_w[i], weight2, wmd->mix_mode);
+ }
+
+ /* Do masking. */
+ weightvg_do_mask(numIdx, indices, org_w, new_w, ob, ret, wmd->mask_constant,
+ wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel,
+ wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name);
+
+ /* Update (add to) vgroup.
+ * XXX Depending on the MOD_WVG_SET_xxx option chosen, we might have to add vertices to vgroup.
+ */
+ weightvg_update_vg(dvert, defgrp_idx, numIdx, indices, org_w, TRUE, -FLT_MAX, 0, 0.0f);
+
+ /* Freeing stuff. */
+ MEM_freeN(org_w);
+ MEM_freeN(new_w);
+
+ if (indices)
+ MEM_freeN(indices);
+
+ /* Return the vgroup-modified mesh. */
+ return ret;
+}
+
+static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *derivedData)
+{
+ return applyModifier(md, ob, derivedData, 0, 1);
+}
+
+
+ModifierTypeInfo modifierType_WeightVGMix = {
+ /* name */ "VertexWeightMix",
+ /* structName */ "WeightVGMixModifierData",
+ /* structSize */ sizeof(WeightVGMixModifierData),
+ /* type */ eModifierTypeType_Nonconstructive,
+ /* flags */ eModifierTypeFlag_AcceptsMesh
+/* |eModifierTypeFlag_SupportsMapping*/
+ |eModifierTypeFlag_SupportsEditmode,
+
+ /* copyData */ copyData,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ applyModifier,
+ /* applyModifierEM */ applyModifierEM,
+ /* initData */ initData,
+ /* requiredDataMask */ requiredDataMask,
+ /* freeData */ NULL,
+ /* isDisabled */ isDisabled,
+ /* updateDepgraph */ updateDepgraph,
+ /* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ foreachObjectLink,
+ /* foreachIDLink */ foreachIDLink,
+ /* foreachTexLink */ foreachTexLink,
+};
diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c
new file mode 100644
index 00000000000..2daa3f797c3
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c
@@ -0,0 +1,557 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2011 by Bastien Montagne.
+ * All rights reserved.
+ *
+ * Contributor(s): None yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/*
+ * XXX I'd like to make modified weights visible in WeightPaint mode,
+ * but couldn't figure a way to do this...
+ * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)?
+ * Or the WeightPaint mode code itself?
+ */
+
+#include "BLI_editVert.h"
+#include "BLI_math.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+
+#include "BKE_cdderivedmesh.h"
+#include "BKE_deform.h"
+#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_shrinkwrap.h" /* For SpaceTransform stuff. */
+#include "BKE_texture.h" /* Texture masking. */
+
+#include "depsgraph_private.h"
+#include "MEM_guardedalloc.h"
+#include "MOD_util.h"
+#include "MOD_weightvg_util.h"
+
+/**************************************
+ * Util functions. *
+ **************************************/
+
+/* Util macro. */
+#define OUT_OF_MEMORY() ((void)printf("WeightVGProximity: Out of memory.\n"))
+
+/**
+ * Find nearest vertex and/or edge and/or face, for each vertex (adapted from shrinkwrap.c).
+ */
+static void get_vert2geom_distance(int numVerts, float (*v_cos)[3],
+ float *dist_v, float *dist_e, float *dist_f,
+ DerivedMesh *target, const SpaceTransform *loc2trgt)
+{
+ int i;
+ BVHTreeFromMesh treeData_v = NULL_BVHTreeFromMesh;
+ BVHTreeFromMesh treeData_e = NULL_BVHTreeFromMesh;
+ BVHTreeFromMesh treeData_f = NULL_BVHTreeFromMesh;
+ BVHTreeNearest nearest_v = NULL_BVHTreeNearest;
+ BVHTreeNearest nearest_e = NULL_BVHTreeNearest;
+ BVHTreeNearest nearest_f = NULL_BVHTreeNearest;
+
+ if (dist_v) {
+ /* Create a bvh-tree of the given target's verts. */
+ bvhtree_from_mesh_verts(&treeData_v, target, 0.0, 2, 6);
+ if(treeData_v.tree == NULL) {
+ OUT_OF_MEMORY();
+ return;
+ }
+ }
+ if (dist_e) {
+ /* Create a bvh-tree of the given target's edges. */
+ bvhtree_from_mesh_edges(&treeData_e, target, 0.0, 2, 6);
+ if(treeData_e.tree == NULL) {
+ OUT_OF_MEMORY();
+ return;
+ }
+ }
+ if (dist_f) {
+ /* Create a bvh-tree of the given target's faces. */
+ bvhtree_from_mesh_faces(&treeData_f, target, 0.0, 2, 6);
+ if(treeData_f.tree == NULL) {
+ OUT_OF_MEMORY();
+ return;
+ }
+ }
+
+ /* Setup nearest. */
+ nearest_v.index = nearest_e.index = nearest_f.index = -1;
+ /*nearest_v.dist = nearest_e.dist = nearest_f.dist = FLT_MAX;*/
+ /* Find the nearest vert/edge/face. */
+#ifndef __APPLE__
+#pragma omp parallel for default(none) private(i) firstprivate(nearest_v,nearest_e,nearest_f) \
+ shared(treeData_v,treeData_e,treeData_f,numVerts,v_cos,dist_v,dist_e, \
+ dist_f,loc2trgt) \
+ schedule(static)
+#endif
+ for (i = 0; i < numVerts; ++i) {
+ float tmp_co[3];
+
+ /* Convert the vertex to tree coordinates. */
+ copy_v3_v3(tmp_co, v_cos[i]);
+ space_transform_apply(loc2trgt, tmp_co);
+
+ /* Use local proximity heuristics (to reduce the nearest search).
+ *
+ * If we already had an hit before, we assume this vertex is going to have a close hit to
+ * that other vertex, so we can initiate the "nearest.dist" with the expected value to that
+ * last hit.
+ * This will lead in prunning of the search tree.
+ */
+ if (dist_v) {
+ nearest_v.dist = nearest_v.index != -1 ? len_squared_v3v3(tmp_co, nearest_v.co) : FLT_MAX;
+ /* Compute and store result. If invalid (-1 idx), keep FLT_MAX dist. */
+ BLI_bvhtree_find_nearest(treeData_v.tree, tmp_co, &nearest_v, treeData_v.nearest_callback, &treeData_v);
+ dist_v[i] = sqrtf(nearest_v.dist);
+ }
+ if (dist_e) {
+ nearest_e.dist = nearest_e.index != -1 ? len_squared_v3v3(tmp_co, nearest_e.co) : FLT_MAX;
+ /* Compute and store result. If invalid (-1 idx), keep FLT_MAX dist. */
+ BLI_bvhtree_find_nearest(treeData_e.tree, tmp_co, &nearest_e, treeData_e.nearest_callback, &treeData_e);
+ dist_e[i] = sqrtf(nearest_e.dist);
+ }
+ if (dist_f) {
+ nearest_f.dist = nearest_f.index != -1 ? len_squared_v3v3(tmp_co, nearest_f.co) : FLT_MAX;
+ /* Compute and store result. If invalid (-1 idx), keep FLT_MAX dist. */
+ BLI_bvhtree_find_nearest(treeData_f.tree, tmp_co, &nearest_f, treeData_f.nearest_callback, &treeData_f);
+ dist_f[i] = sqrtf(nearest_f.dist);
+ }
+ }
+
+ if (dist_v)
+ free_bvhtree_from_mesh(&treeData_v);
+ if (dist_e)
+ free_bvhtree_from_mesh(&treeData_e);
+ if (dist_f)
+ free_bvhtree_from_mesh(&treeData_f);
+}
+
+/**
+ * Returns the real distance between a vertex and another reference object.
+ * Note that it works in final world space (i.e. with constraints etc. applied).
+ */
+static void get_vert2ob_distance(int numVerts, float (*v_cos)[3], float *dist,
+ Object* ob, Object* obr)
+{
+ /* Vertex and ref object coordinates. */
+ float v_wco[3];
+ unsigned int i= numVerts;
+
+ while(i-- > 0) {
+ /* Get world-coordinates of the vertex (constraints and anim included). */
+ mul_v3_m4v3(v_wco, ob->obmat, v_cos[i]);
+ /* Return distance between both coordinates. */
+ dist[i] = len_v3v3(v_wco, obr->obmat[3]);
+ }
+}
+
+/**
+ * Returns the real distance between an object and another reference object.
+ * Note that it works in final world space (i.e. with constraints etc. applied).
+ */
+static float get_ob2ob_distance(const Object* ob, const Object* obr)
+{
+ return len_v3v3(ob->obmat[3], obr->obmat[3]);
+}
+
+/**
+ * Maps distances to weights, with an optionnal “smoothing” mapping.
+ */
+void do_map(float *weights, const int nidx, const float min_d, const float max_d, short mode)
+{
+ const float range_inv= 1.0f / (max_d - min_d); /* invert since multiplication is faster */
+ unsigned int i= nidx;
+ if(max_d == min_d) {
+ while (i-- > 0) {
+ weights[i] = (weights[i] >= max_d) ? 1.0f : 0.0f; /* "Step" behavior... */
+ }
+ }
+ else if(max_d > min_d) {
+ while (i-- > 0) {
+ if (weights[i] >= max_d) weights[i]= 1.0f; /* most likely case first */
+ else if(weights[i] <= min_d) weights[i]= 0.0f;
+ else weights[i]= (weights[i] - min_d) * range_inv;
+ }
+ }
+ else {
+ while (i-- > 0) {
+ if (weights[i] <= max_d) weights[i]= 1.0f; /* most likely case first */
+ else if(weights[i] >= min_d) weights[i]= 0.0f;
+ else weights[i]= (weights[i] - min_d) * range_inv;
+ }
+ }
+
+ if(!ELEM(mode, MOD_WVG_MAPPING_NONE, MOD_WVG_MAPPING_CURVE)) {
+ weightvg_do_map(nidx, weights, mode, NULL);
+ }
+}
+
+/**************************************
+ * Modifiers functions. *
+ **************************************/
+static void initData(ModifierData *md)
+{
+ WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
+
+ wmd->proximity_mode = MOD_WVG_PROXIMITY_OBJECT;
+ wmd->proximity_flags = MOD_WVG_PROXIMITY_GEOM_VERTS;
+
+ wmd->falloff_type = MOD_WVG_MAPPING_NONE;
+
+ wmd->mask_constant = 1.0f;
+ wmd->mask_tex_use_channel = MOD_WVG_MASK_TEX_USE_INT; /* Use intensity by default. */
+ wmd->mask_tex_mapping = MOD_DISP_MAP_LOCAL;
+ wmd->max_dist = 1.0f; /* vert arbitrary distance, but don't use 0 */
+}
+
+static void copyData(ModifierData *md, ModifierData *target)
+{
+ WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
+ WeightVGProximityModifierData *twmd = (WeightVGProximityModifierData*) target;
+
+ BLI_strncpy(twmd->defgrp_name, wmd->defgrp_name, sizeof(twmd->defgrp_name));
+ twmd->proximity_mode = wmd->proximity_mode;
+ twmd->proximity_flags = wmd->proximity_flags;
+ twmd->proximity_ob_target = wmd->proximity_ob_target;
+
+ twmd->falloff_type = wmd->falloff_type;
+
+ twmd->mask_constant = wmd->mask_constant;
+ BLI_strncpy(twmd->mask_defgrp_name, wmd->mask_defgrp_name, sizeof(twmd->mask_defgrp_name));
+ twmd->mask_texture = wmd->mask_texture;
+ twmd->mask_tex_use_channel = wmd->mask_tex_use_channel;
+ twmd->mask_tex_mapping = wmd->mask_tex_mapping;
+ twmd->mask_tex_map_obj = wmd->mask_tex_map_obj;
+ BLI_strncpy(twmd->mask_tex_uvlayer_name, wmd->mask_tex_uvlayer_name, sizeof(twmd->mask_tex_uvlayer_name));
+ twmd->min_dist = wmd->min_dist;
+ twmd->max_dist = wmd->max_dist;
+}
+
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
+{
+ WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
+ CustomDataMask dataMask = 0;
+
+ /* We need vertex groups! */
+ dataMask |= CD_MASK_MDEFORMVERT;
+
+ /* Ask for UV coordinates if we need them. */
+ if(wmd->mask_tex_mapping == MOD_DISP_MAP_UV)
+ dataMask |= CD_MASK_MTFACE;
+
+ return dataMask;
+}
+
+static int dependsOnTime(ModifierData *md)
+{
+ WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
+
+ if(wmd->mask_texture)
+ return BKE_texture_dependsOnTime(wmd->mask_texture);
+ return 0;
+}
+
+static void foreachObjectLink(ModifierData *md, Object *ob,
+ void (*walk)(void *userData, Object *ob, Object **obpoin),
+ void *userData)
+{
+ WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
+ walk(userData, ob, &wmd->proximity_ob_target);
+ walk(userData, ob, &wmd->mask_tex_map_obj);
+}
+
+static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
+{
+ WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
+
+ walk(userData, ob, (ID **)&wmd->mask_texture);
+
+ foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData);
+}
+
+static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData)
+{
+ walk(userData, ob, md, "mask_texture");
+}
+
+static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *UNUSED(scene),
+ Object *UNUSED(ob), DagNode *obNode)
+{
+ WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
+ DagNode *curNode;
+
+ if (wmd->proximity_ob_target) {
+ curNode = dag_get_node(forest, wmd->proximity_ob_target);
+ dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA,
+ "WeightVGProximity Modifier");
+ }
+
+ if(wmd->mask_tex_map_obj && wmd->mask_tex_mapping == MOD_DISP_MAP_OBJECT) {
+ curNode = dag_get_node(forest, wmd->mask_tex_map_obj);
+
+ dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA,
+ "WeightVGProximity Modifier");
+ }
+
+ if(wmd->mask_tex_mapping == MOD_DISP_MAP_GLOBAL)
+ dag_add_relation(forest, obNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA,
+ "WeightVGProximity Modifier");
+}
+
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
+{
+ WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
+ /* If no vertex group, bypass. */
+ if (wmd->defgrp_name[0] == '\0') return 1;
+ /* If no target object, bypass. */
+ return (wmd->proximity_ob_target == NULL);
+}
+
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData,
+ int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
+{
+ WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
+ DerivedMesh *dm = derivedData, *ret = NULL;
+#if 0
+ Mesh *ob_m = NULL;
+#endif
+ MDeformVert *dvert = NULL;
+ int numVerts;
+ float (*v_cos)[3] = NULL; /* The vertices coordinates. */
+ Object *obr = NULL; /* Our target object. */
+ int defgrp_idx;
+ float *tw = NULL;
+ float *org_w = NULL;
+ float *new_w =NULL;
+ int *tidx, *indices = NULL;
+ int numIdx = 0;
+ int i, j;
+ char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */
+
+ /* Get number of verts. */
+ numVerts = dm->getNumVerts(dm);
+
+ /* Check if we can just return the original mesh.
+ * Must have verts and therefore verts assigned to vgroups to do anything useful!
+ */
+ if ((numVerts == 0) || (ob->defbase.first == NULL))
+ return dm;
+
+ /* Get our target object. */
+ obr = wmd->proximity_ob_target;
+ if (obr == NULL)
+ return dm;
+
+ /* Get vgroup idx from its name. */
+ defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name);
+ if (defgrp_idx < 0)
+ return dm;
+
+ /* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute
+ * time! See scene 5 of the WeighVG test file...
+ */
+#if 0
+ /* Get actual dverts (ie vertex group data). */
+ dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+ /* If no dverts, return unmodified data... */
+ if (dvert == NULL)
+ return dm;
+
+ /* Get org mesh, only to test whether affected cdata layer has already been copied
+ * somewhere up in the modifiers stack.
+ */
+ ob_m = get_mesh(ob);
+ if (ob_m == NULL)
+ return dm;
+
+ /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */
+ if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) {
+ /* XXX Seems to create problems with weightpaint mode???
+ * I'm missing something here, I guess...
+ */
+// DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */
+ ret = CDDM_copy(dm);
+ dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
+ if (dvert == NULL) {
+ ret->release(ret);
+ return dm;
+ }
+ rel_ret = 1;
+ }
+ else
+ ret = dm;
+#else
+ ret = CDDM_copy(dm);
+ rel_ret = 1;
+ dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT);
+ if (dvert == NULL) {
+ if (rel_ret)
+ ret->release(ret);
+ return dm;
+ }
+#endif
+
+ /* Find out which vertices to work on (all vertices in vgroup), and get their relevant weight.
+ */
+ tidx = MEM_mallocN(sizeof(int) * numVerts, "WeightVGProximity Modifier, tidx");
+ tw = MEM_mallocN(sizeof(float) * numVerts, "WeightVGProximity Modifier, tw");
+ for (i = 0; i < numVerts; i++) {
+ for (j = 0; j < dvert[i].totweight; j++) {
+ if(dvert[i].dw[j].def_nr == defgrp_idx) {
+ tidx[numIdx] = i;
+ tw[numIdx++] = dvert[i].dw[j].weight;
+ break;
+ }
+ }
+ }
+ indices = MEM_mallocN(sizeof(int) * numIdx, "WeightVGProximity Modifier, indices");
+ memcpy(indices, tidx, sizeof(int) * numIdx);
+ org_w = MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, org_w");
+ new_w = MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, new_w");
+ memcpy(org_w, tw, sizeof(float) * numIdx);
+ MEM_freeN(tidx);
+ MEM_freeN(tw);
+
+ /* Get our vertex coordinates. */
+ v_cos = MEM_mallocN(sizeof(float[3]) * numIdx, "WeightVGProximity Modifier, v_cos");
+ for (i = 0; i < numIdx; i++)
+ ret->getVertCo(ret, indices[i], v_cos[i]);
+
+ /* Compute wanted distances. */
+ if (wmd->proximity_mode == MOD_WVG_PROXIMITY_OBJECT) {
+ float dist = get_ob2ob_distance(ob, obr);
+ for(i = 0; i < numIdx; i++)
+ new_w[i] = dist;
+ }
+ else if (wmd->proximity_mode == MOD_WVG_PROXIMITY_GEOMETRY) {
+ const short use_trgt_verts = (wmd->proximity_flags & MOD_WVG_PROXIMITY_GEOM_VERTS);
+ const short use_trgt_edges = (wmd->proximity_flags & MOD_WVG_PROXIMITY_GEOM_EDGES);
+ const short use_trgt_faces = (wmd->proximity_flags & MOD_WVG_PROXIMITY_GEOM_FACES);
+
+ if (use_trgt_verts || use_trgt_edges || use_trgt_faces) {
+ DerivedMesh *target_dm = obr->derivedFinal;
+ if (!target_dm) {
+ if (ELEM3(obr->type, OB_CURVE, OB_SURF, OB_FONT))
+ target_dm = CDDM_from_curve(obr);
+ else if (obr->type == OB_MESH) {
+ Mesh *me = (Mesh*)obr->data;
+ if (me->edit_mesh)
+ target_dm = CDDM_from_editmesh((EditMesh*)me->edit_mesh, me);
+ else
+ target_dm = CDDM_from_mesh(me, obr);
+ }
+ }
+
+ /* We must check that we do have a valid target_dm! */
+ if (target_dm) {
+ SpaceTransform loc2trgt;
+ float *dists_v = use_trgt_verts ? MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, dists_v") : NULL;
+ float *dists_e = use_trgt_edges ? MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, dists_e") : NULL;
+ float *dists_f = use_trgt_faces ? MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, dists_f") : NULL;
+
+ space_transform_setup(&loc2trgt, ob, obr);
+ get_vert2geom_distance(numIdx, v_cos, dists_v, dists_e, dists_f,
+ target_dm, &loc2trgt);
+ for(i = 0; i < numIdx; i++) {
+ new_w[i] = dists_v ? dists_v[i] : FLT_MAX;
+ new_w[i] = dists_e ? minf(dists_e[i], new_w[i]) : new_w[i];
+ new_w[i] = dists_f ? minf(dists_f[i], new_w[i]) : new_w[i];
+ }
+ if(dists_v) MEM_freeN(dists_v);
+ if(dists_e) MEM_freeN(dists_e);
+ if(dists_f) MEM_freeN(dists_f);
+ }
+ /* Else, fall back to default obj2vert behavior. */
+ else {
+ get_vert2ob_distance(numIdx, v_cos, new_w, ob, obr);
+ }
+ }
+ else {
+ get_vert2ob_distance(numIdx, v_cos, new_w, ob, obr);
+ }
+ }
+
+ /* Map distances to weights. */
+ do_map(new_w, numIdx, wmd->min_dist, wmd->max_dist, wmd->falloff_type);
+
+ /* Do masking. */
+ weightvg_do_mask(numIdx, indices, org_w, new_w, ob, ret, wmd->mask_constant,
+ wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel,
+ wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name);
+
+ /* Update vgroup. Note we never add nor remove vertices from vgroup here. */
+ weightvg_update_vg(dvert, defgrp_idx, numIdx, indices, org_w, 0, 0.0f, 0, 0.0f);
+
+ /* Freeing stuff. */
+ MEM_freeN(org_w);
+ MEM_freeN(new_w);
+ MEM_freeN(indices);
+ MEM_freeN(v_cos);
+
+ /* Return the vgroup-modified mesh. */
+ return ret;
+}
+
+static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *derivedData)
+{
+ return applyModifier(md, ob, derivedData, 0, 1);
+}
+
+
+ModifierTypeInfo modifierType_WeightVGProximity = {
+ /* name */ "VertexWeightProximity",
+ /* structName */ "WeightVGProximityModifierData",
+ /* structSize */ sizeof(WeightVGProximityModifierData),
+ /* type */ eModifierTypeType_Nonconstructive,
+ /* flags */ eModifierTypeFlag_AcceptsMesh
+/* |eModifierTypeFlag_SupportsMapping*/
+ |eModifierTypeFlag_SupportsEditmode,
+
+ /* copyData */ copyData,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ applyModifier,
+ /* applyModifierEM */ applyModifierEM,
+ /* initData */ initData,
+ /* requiredDataMask */ requiredDataMask,
+ /* freeData */ NULL,
+ /* isDisabled */ isDisabled,
+ /* updateDepgraph */ updateDepgraph,
+ /* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ foreachObjectLink,
+ /* foreachIDLink */ foreachIDLink,
+ /* foreachTexLink */ foreachTexLink,
+};
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index c3bd37c18ee..82848c6a5d7 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -38,117 +38,137 @@ set(INC
set(INC_SYS
${GLEW_INCLUDE_PATH}
+ intern
+ composite
+ shader
+ texture
)
set(SRC
- intern/CMP_nodes/CMP_alphaOver.c
- intern/CMP_nodes/CMP_bilateralblur.c
- intern/CMP_nodes/CMP_blur.c
- intern/CMP_nodes/CMP_brightness.c
- intern/CMP_nodes/CMP_channelMatte.c
- intern/CMP_nodes/CMP_chromaMatte.c
- intern/CMP_nodes/CMP_colorMatte.c
- intern/CMP_nodes/CMP_colorSpill.c
- intern/CMP_nodes/CMP_colorbalance.c
- intern/CMP_nodes/CMP_composite.c
- intern/CMP_nodes/CMP_crop.c
- intern/CMP_nodes/CMP_curves.c
- intern/CMP_nodes/CMP_defocus.c
- intern/CMP_nodes/CMP_diffMatte.c
- intern/CMP_nodes/CMP_dilate.c
- intern/CMP_nodes/CMP_directionalblur.c
- intern/CMP_nodes/CMP_displace.c
- intern/CMP_nodes/CMP_distanceMatte.c
- intern/CMP_nodes/CMP_filter.c
- intern/CMP_nodes/CMP_flip.c
- intern/CMP_nodes/CMP_gamma.c
- intern/CMP_nodes/CMP_glare.c
- intern/CMP_nodes/CMP_hueSatVal.c
- intern/CMP_nodes/CMP_huecorrect.c
- intern/CMP_nodes/CMP_idMask.c
- intern/CMP_nodes/CMP_image.c
- intern/CMP_nodes/CMP_invert.c
- intern/CMP_nodes/CMP_lensdist.c
- intern/CMP_nodes/CMP_levels.c
- intern/CMP_nodes/CMP_lummaMatte.c
- intern/CMP_nodes/CMP_mapUV.c
- intern/CMP_nodes/CMP_mapValue.c
- intern/CMP_nodes/CMP_math.c
- intern/CMP_nodes/CMP_mixrgb.c
- intern/CMP_nodes/CMP_normal.c
- intern/CMP_nodes/CMP_normalize.c
- intern/CMP_nodes/CMP_outputFile.c
- intern/CMP_nodes/CMP_premulkey.c
- intern/CMP_nodes/CMP_rgb.c
- intern/CMP_nodes/CMP_rotate.c
- intern/CMP_nodes/CMP_scale.c
- intern/CMP_nodes/CMP_sepcombHSVA.c
- intern/CMP_nodes/CMP_sepcombRGBA.c
- intern/CMP_nodes/CMP_sepcombYCCA.c
- intern/CMP_nodes/CMP_sepcombYUVA.c
- intern/CMP_nodes/CMP_setalpha.c
- intern/CMP_nodes/CMP_splitViewer.c
- intern/CMP_nodes/CMP_texture.c
- intern/CMP_nodes/CMP_tonemap.c
- intern/CMP_nodes/CMP_translate.c
- intern/CMP_nodes/CMP_valToRgb.c
- intern/CMP_nodes/CMP_value.c
- intern/CMP_nodes/CMP_vecBlur.c
- intern/CMP_nodes/CMP_viewer.c
- intern/CMP_nodes/CMP_zcombine.c
- intern/CMP_util.c
- intern/SHD_nodes/SHD_camera.c
- intern/SHD_nodes/SHD_curves.c
- intern/SHD_nodes/SHD_dynamic.c
- intern/SHD_nodes/SHD_geom.c
- intern/SHD_nodes/SHD_hueSatVal.c
- intern/SHD_nodes/SHD_invert.c
- intern/SHD_nodes/SHD_mapping.c
- intern/SHD_nodes/SHD_material.c
- intern/SHD_nodes/SHD_math.c
- intern/SHD_nodes/SHD_mixRgb.c
- intern/SHD_nodes/SHD_normal.c
- intern/SHD_nodes/SHD_output.c
- intern/SHD_nodes/SHD_rgb.c
- intern/SHD_nodes/SHD_sepcombRGB.c
- intern/SHD_nodes/SHD_squeeze.c
- intern/SHD_nodes/SHD_texture.c
- intern/SHD_nodes/SHD_valToRgb.c
- intern/SHD_nodes/SHD_value.c
- intern/SHD_nodes/SHD_vectMath.c
- intern/SHD_util.c
- intern/TEX_nodes/TEX_at.c
- intern/TEX_nodes/TEX_bricks.c
- intern/TEX_nodes/TEX_checker.c
- intern/TEX_nodes/TEX_compose.c
- intern/TEX_nodes/TEX_coord.c
- intern/TEX_nodes/TEX_curves.c
- intern/TEX_nodes/TEX_decompose.c
- intern/TEX_nodes/TEX_distance.c
- intern/TEX_nodes/TEX_hueSatVal.c
- intern/TEX_nodes/TEX_image.c
- intern/TEX_nodes/TEX_invert.c
- intern/TEX_nodes/TEX_math.c
- intern/TEX_nodes/TEX_mixRgb.c
- intern/TEX_nodes/TEX_output.c
- intern/TEX_nodes/TEX_proc.c
- intern/TEX_nodes/TEX_rotate.c
- intern/TEX_nodes/TEX_scale.c
- intern/TEX_nodes/TEX_texture.c
- intern/TEX_nodes/TEX_translate.c
- intern/TEX_nodes/TEX_valToNor.c
- intern/TEX_nodes/TEX_valToRgb.c
- intern/TEX_nodes/TEX_viewer.c
- intern/TEX_util.c
+ composite/nodes/node_composite_alphaOver.c
+ composite/nodes/node_composite_bilateralblur.c
+ composite/nodes/node_composite_blur.c
+ composite/nodes/node_composite_brightness.c
+ composite/nodes/node_composite_channelMatte.c
+ composite/nodes/node_composite_chromaMatte.c
+ composite/nodes/node_composite_colorMatte.c
+ composite/nodes/node_composite_colorSpill.c
+ composite/nodes/node_composite_colorbalance.c
+ composite/nodes/node_composite_common.c
+ composite/nodes/node_composite_composite.c
+ composite/nodes/node_composite_crop.c
+ composite/nodes/node_composite_curves.c
+ composite/nodes/node_composite_defocus.c
+ composite/nodes/node_composite_diffMatte.c
+ composite/nodes/node_composite_dilate.c
+ composite/nodes/node_composite_directionalblur.c
+ composite/nodes/node_composite_displace.c
+ composite/nodes/node_composite_distanceMatte.c
+ composite/nodes/node_composite_filter.c
+ composite/nodes/node_composite_flip.c
+ composite/nodes/node_composite_gamma.c
+ composite/nodes/node_composite_glare.c
+ composite/nodes/node_composite_hueSatVal.c
+ composite/nodes/node_composite_huecorrect.c
+ composite/nodes/node_composite_idMask.c
+ composite/nodes/node_composite_image.c
+ composite/nodes/node_composite_invert.c
+ composite/nodes/node_composite_lensdist.c
+ composite/nodes/node_composite_levels.c
+ composite/nodes/node_composite_lummaMatte.c
+ composite/nodes/node_composite_mapUV.c
+ composite/nodes/node_composite_mapValue.c
+ composite/nodes/node_composite_math.c
+ composite/nodes/node_composite_mixrgb.c
+ composite/nodes/node_composite_normal.c
+ composite/nodes/node_composite_normalize.c
+ composite/nodes/node_composite_outputFile.c
+ composite/nodes/node_composite_premulkey.c
+ composite/nodes/node_composite_rgb.c
+ composite/nodes/node_composite_rotate.c
+ composite/nodes/node_composite_scale.c
+ composite/nodes/node_composite_sepcombHSVA.c
+ composite/nodes/node_composite_sepcombRGBA.c
+ composite/nodes/node_composite_sepcombYCCA.c
+ composite/nodes/node_composite_sepcombYUVA.c
+ composite/nodes/node_composite_setalpha.c
+ composite/nodes/node_composite_splitViewer.c
+ composite/nodes/node_composite_texture.c
+ composite/nodes/node_composite_tonemap.c
+ composite/nodes/node_composite_translate.c
+ composite/nodes/node_composite_valToRgb.c
+ composite/nodes/node_composite_value.c
+ composite/nodes/node_composite_vecBlur.c
+ composite/nodes/node_composite_viewer.c
+ composite/nodes/node_composite_zcombine.c
+ composite/node_composite_tree.c
+ composite/node_composite_util.c
+
+ shader/nodes/node_shader_camera.c
+ shader/nodes/node_shader_common.c
+ shader/nodes/node_shader_curves.c
+ shader/nodes/node_shader_dynamic.c
+ shader/nodes/node_shader_geom.c
+ shader/nodes/node_shader_hueSatVal.c
+ shader/nodes/node_shader_invert.c
+ shader/nodes/node_shader_mapping.c
+ shader/nodes/node_shader_material.c
+ shader/nodes/node_shader_math.c
+ shader/nodes/node_shader_mixRgb.c
+ shader/nodes/node_shader_normal.c
+ shader/nodes/node_shader_output.c
+ shader/nodes/node_shader_rgb.c
+ shader/nodes/node_shader_sepcombRGB.c
+ shader/nodes/node_shader_squeeze.c
+ shader/nodes/node_shader_texture.c
+ shader/nodes/node_shader_valToRgb.c
+ shader/nodes/node_shader_value.c
+ shader/nodes/node_shader_vectMath.c
+ shader/node_shader_tree.c
+ shader/node_shader_util.c
+
+ texture/nodes/node_texture_at.c
+ texture/nodes/node_texture_bricks.c
+ texture/nodes/node_texture_checker.c
+ texture/nodes/node_texture_common.c
+ texture/nodes/node_texture_compose.c
+ texture/nodes/node_texture_coord.c
+ texture/nodes/node_texture_curves.c
+ texture/nodes/node_texture_decompose.c
+ texture/nodes/node_texture_distance.c
+ texture/nodes/node_texture_hueSatVal.c
+ texture/nodes/node_texture_image.c
+ texture/nodes/node_texture_invert.c
+ texture/nodes/node_texture_math.c
+ texture/nodes/node_texture_mixRgb.c
+ texture/nodes/node_texture_output.c
+ texture/nodes/node_texture_proc.c
+ texture/nodes/node_texture_rotate.c
+ texture/nodes/node_texture_scale.c
+ texture/nodes/node_texture_texture.c
+ texture/nodes/node_texture_translate.c
+ texture/nodes/node_texture_valToNor.c
+ texture/nodes/node_texture_valToRgb.c
+ texture/nodes/node_texture_viewer.c
+ texture/node_texture_tree.c
+ texture/node_texture_util.c
+
intern/node_util.c
+ intern/node_exec.c
+ intern/node_common.c
+ intern/node_socket.c
+
+ composite/node_composite_util.h
+ shader/node_shader_util.h
+ texture/node_texture_util.h
- CMP_node.h
- SHD_node.h
- TEX_node.h
- intern/CMP_util.h
- intern/SHD_util.h
- intern/TEX_util.h
+ NOD_composite.h
+ NOD_shader.h
+ NOD_texture.h
+ NOD_socket.h
intern/node_util.h
+ intern/node_exec.h
+ intern/node_common.h
)
if(WITH_PYTHON)
diff --git a/source/blender/nodes/CMP_node.h b/source/blender/nodes/NOD_composite.h
index 65c9236710f..11ffcc9027f 100644
--- a/source/blender/nodes/CMP_node.h
+++ b/source/blender/nodes/NOD_composite.h
@@ -30,18 +30,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file CMP_node.h
+/** \file NOD_composite.h
* \ingroup nodes
*/
-#ifndef CMP_NODE_H
-#define CMP_NODE_H
+#ifndef NOD_composite_H
+#define NOD_composite_H
#include "BKE_node.h"
+extern bNodeTreeType ntreeType_Composite;
+
/* ****************** types array for all composite nodes ****************** */
+void register_node_type_cmp_group(ListBase *lb);
+void register_node_type_cmp_forloop(ListBase *lb);
+void register_node_type_cmp_whileloop(ListBase *lb);
+
void register_node_type_cmp_rlayers(ListBase *lb);
void register_node_type_cmp_image(ListBase *lb);
void register_node_type_cmp_texture(ListBase *lb);
diff --git a/source/blender/nodes/SHD_node.h b/source/blender/nodes/NOD_shader.h
index 80e5eec6893..6c5ea79e1ee 100644
--- a/source/blender/nodes/SHD_node.h
+++ b/source/blender/nodes/NOD_shader.h
@@ -30,19 +30,25 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file SHD_node.h
+/** \file NOD_shader.h
* \ingroup nodes
*/
-#ifndef SHD_NODE_H
-#define SHD_NODE_H
+#ifndef NOD_SHADER_H
+#define NOD_SHADER_H
#include "BKE_node.h"
+extern struct bNodeTreeType ntreeType_Shader;
+
/* the type definitions array */
/* ****************** types array for all shaders ****************** */
+void register_node_type_sh_group(ListBase *lb);
+void register_node_type_sh_forloop(ListBase *lb);
+void register_node_type_sh_whileloop(ListBase *lb);
+
void register_node_type_sh_output(ListBase *lb);
void register_node_type_sh_material(ListBase *lb);
void register_node_type_sh_camera(ListBase *lb);
diff --git a/source/blender/nodes/NOD_socket.h b/source/blender/nodes/NOD_socket.h
new file mode 100644
index 00000000000..9ddf159cd9c
--- /dev/null
+++ b/source/blender/nodes/NOD_socket.h
@@ -0,0 +1,90 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Lukas Toenne
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file NOD_socket.h
+ * \ingroup nodes
+ */
+
+
+#ifndef NOD_SOCKET_H_
+#define NOD_SOCKET_H_
+
+#include "DNA_listBase.h"
+
+#include "BLI_utildefines.h"
+
+#include "BKE_node.h"
+
+#include "RNA_types.h"
+
+struct bNodeTree;
+struct bNode;
+struct bNodeStack;
+
+void node_socket_type_init(struct bNodeSocketType *types[]);
+
+struct bNodeSocket *nodeAddInputInt(struct bNodeTree *ntree, struct bNode *node, const char *name, PropertySubType subtype, int value, int min, int max);
+struct bNodeSocket *nodeAddOutputInt(struct bNodeTree *ntree, struct bNode *node, const char *name);
+
+struct bNodeSocket *nodeAddInputFloat(struct bNodeTree *ntree, struct bNode *node, const char *name, PropertySubType subtype, float value, float min, float max);
+struct bNodeSocket *nodeAddOutputFloat(struct bNodeTree *ntree, struct bNode *node, const char *name);
+
+struct bNodeSocket *nodeAddInputBoolean(struct bNodeTree *ntree, struct bNode *node, const char *name, char value);
+struct bNodeSocket *nodeAddOutputBoolean(struct bNodeTree *ntree, struct bNode *node, const char *name);
+
+struct bNodeSocket *nodeAddInputVector(struct bNodeTree *ntree, struct bNode *node, const char *name, PropertySubType subtype, float x, float y, float z, float min, float max);
+struct bNodeSocket *nodeAddOutputVector(struct bNodeTree *ntree, struct bNode *node, const char *name);
+
+struct bNodeSocket *nodeAddInputRGBA(struct bNodeTree *ntree, struct bNode *node, const char *name, float r, float g, float b, float a);
+struct bNodeSocket *nodeAddOutputRGBA(struct bNodeTree *ntree, struct bNode *node, const char *name);
+
+struct bNodeSocket *nodeAddInputMesh(struct bNodeTree *ntree, struct bNode *node, const char *name);
+struct bNodeSocket *nodeAddOutputMesh(struct bNodeTree *ntree, struct bNode *node, const char *name);
+
+struct bNodeSocket *node_add_input_from_template(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocketTemplate *stemp);
+struct bNodeSocket *node_add_output_from_template(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocketTemplate *stemp);
+
+void node_verify_socket_templates(struct bNodeTree *ntree, struct bNode *node);
+
+
+/* Socket Converters */
+
+#define SOCK_VECTOR_X 1
+#define SOCK_VECTOR_Y 2
+#define SOCK_VECTOR_Z 3
+
+#define SOCK_RGBA_R 1
+#define SOCK_RGBA_G 2
+#define SOCK_RGBA_B 3
+#define SOCK_RGBA_A 4
+
+#define SOCK_MESH_VERT_CO 1
+#define SOCK_MESH_VERT_NO 2
+
+#endif
diff --git a/source/blender/nodes/TEX_node.h b/source/blender/nodes/NOD_texture.h
index 23a6b4427af..d098c241583 100644
--- a/source/blender/nodes/TEX_node.h
+++ b/source/blender/nodes/NOD_texture.h
@@ -30,18 +30,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file TEX_node.h
+/** \file NOD_texture.h
* \ingroup nodes
*/
-#ifndef TEX_NODE_H
-#define TEX_NODE_H
+#ifndef NOD_TEXTURE_H
+#define NOD_TEXTURE_H
#include "BKE_node.h"
+extern bNodeTreeType ntreeType_Texture;
+
/* ****************** types array for all texture nodes ****************** */
+void register_node_type_tex_group(ListBase *lb);
+void register_node_type_tex_forloop(ListBase *lb);
+void register_node_type_tex_whileloop(ListBase *lb);
+
void register_node_type_tex_math(ListBase *lb);
void register_node_type_tex_mix_rgb(ListBase *lb);
void register_node_type_tex_valtorgb(ListBase *lb);
diff --git a/source/blender/nodes/SConscript b/source/blender/nodes/SConscript
index 8d17c6f5e16..0cbc7b80933 100644
--- a/source/blender/nodes/SConscript
+++ b/source/blender/nodes/SConscript
@@ -2,11 +2,11 @@
Import ('env')
sources = env.Glob('intern/*.c')
-cmpsources = env.Glob('intern/CMP_nodes/*.c')
-shdsources = env.Glob('intern/SHD_nodes/*.c')
-texsources = env.Glob('intern/TEX_nodes/*.c')
-
+cmpsources = env.Glob('composite/*.c') + env.Glob('composite/nodes/*.c')
+shdsources = env.Glob('shader/*.c') + env.Glob('shader/nodes/*.c')
+texsources = env.Glob('texture/*.c') + env.Glob('texture/nodes/*.c')
incs = '. ./intern '
+incs += './composite ./shader ./texture '
incs += '#/intern/guardedalloc ../editors/include ../blenlib ../makesdna'
incs += ' ../render/extern/include ../makesrna '
incs += ' ../imbuf ../avi '
diff --git a/source/blender/nodes/composite/node_composite_tree.c b/source/blender/nodes/composite/node_composite_tree.c
new file mode 100644
index 00000000000..01e46ed3df9
--- /dev/null
+++ b/source/blender/nodes/composite/node_composite_tree.c
@@ -0,0 +1,837 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s):
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/composite/node_composite_tree.c
+ * \ingroup nodes
+ */
+
+
+#include <stdio.h>
+
+#include "DNA_anim_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_node_types.h"
+
+#include "BLI_listbase.h"
+#include "BLI_threads.h"
+
+#include "BKE_animsys.h"
+#include "BKE_colortools.h"
+#include "BKE_fcurve.h"
+#include "BKE_global.h"
+#include "BKE_main.h"
+#include "BKE_node.h"
+#include "BKE_utildefines.h"
+
+#include "node_exec.h"
+#include "node_util.h"
+
+#include "PIL_time.h"
+
+#include "RNA_access.h"
+
+#include "NOD_composite.h"
+#include "node_composite_util.h"
+
+static void foreach_nodetree(Main *main, void *calldata, bNodeTreeCallback func)
+{
+ Scene *sce;
+ for(sce= main->scene.first; sce; sce= sce->id.next) {
+ if(sce->nodetree) {
+ func(calldata, &sce->id, sce->nodetree);
+ }
+ }
+}
+
+static void free_node_cache(bNodeTree *UNUSED(ntree), bNode *node)
+{
+ bNodeSocket *sock;
+
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ if(sock->cache) {
+ free_compbuf(sock->cache);
+ sock->cache= NULL;
+ }
+ }
+}
+
+static void free_cache(bNodeTree *ntree)
+{
+ bNode *node;
+ for(node= ntree->nodes.first; node; node= node->next)
+ free_node_cache(ntree, node);
+}
+
+static void update_node(bNodeTree *ntree, bNode *node)
+{
+ bNodeSocket *sock;
+
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ if(sock->cache) {
+ //free_compbuf(sock->cache);
+ //sock->cache= NULL;
+ }
+ }
+ node->need_exec= 1;
+
+ /* individual node update call */
+ if (node->typeinfo->updatefunc)
+ node->typeinfo->updatefunc(ntree, node);
+}
+
+/* local tree then owns all compbufs */
+static void localize(bNodeTree *UNUSED(localtree), bNodeTree *ntree)
+{
+ bNode *node;
+ bNodeSocket *sock;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ /* ensure new user input gets handled ok */
+ node->need_exec= 0;
+
+ /* move over the compbufs */
+ /* right after ntreeCopyTree() oldsock pointers are valid */
+
+ if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
+ if(node->id) {
+ if(node->flag & NODE_DO_OUTPUT)
+ node->new_node->id= (ID *)copy_image((Image *)node->id);
+ else
+ node->new_node->id= NULL;
+ }
+ }
+
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ sock->new_sock->cache= sock->cache;
+ compbuf_set_node(sock->new_sock->cache, node->new_node);
+
+ sock->cache= NULL;
+ sock->new_sock->new_sock= sock;
+ }
+ }
+}
+
+static void local_sync(bNodeTree *localtree, bNodeTree *ntree)
+{
+ bNode *lnode;
+
+ /* move over the compbufs and previews */
+ for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
+ if( (lnode->exec & NODE_READY) && !(lnode->exec & NODE_SKIPPED) ) {
+ if(ntreeNodeExists(ntree, lnode->new_node)) {
+
+ if(lnode->preview && lnode->preview->rect) {
+ nodeFreePreview(lnode->new_node);
+ lnode->new_node->preview= lnode->preview;
+ lnode->preview= NULL;
+ }
+ }
+ }
+ }
+}
+
+static void local_merge(bNodeTree *localtree, bNodeTree *ntree)
+{
+ bNode *lnode;
+ bNodeSocket *lsock;
+
+ /* move over the compbufs and previews */
+ for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
+ if(ntreeNodeExists(ntree, lnode->new_node)) {
+ if(ELEM(lnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
+ if(lnode->id && (lnode->flag & NODE_DO_OUTPUT)) {
+ /* image_merge does sanity check for pointers */
+ BKE_image_merge((Image *)lnode->new_node->id, (Image *)lnode->id);
+ }
+ }
+
+ for(lsock= lnode->outputs.first; lsock; lsock= lsock->next) {
+ if(ntreeOutputExists(lnode->new_node, lsock->new_sock)) {
+ lsock->new_sock->cache= lsock->cache;
+ compbuf_set_node(lsock->new_sock->cache, lnode->new_node);
+ lsock->cache= NULL;
+ lsock->new_sock= NULL;
+ }
+ }
+ }
+ }
+}
+
+bNodeTreeType ntreeType_Composite = {
+ /* type */ NTREE_COMPOSIT,
+ /* idname */ "NTCompositing Nodetree",
+
+ /* node_types */ { NULL, NULL },
+
+ /* free_cache */ free_cache,
+ /* free_node_cache */ free_node_cache,
+ /* foreach_nodetree */ foreach_nodetree,
+ /* localize */ localize,
+ /* local_sync */ local_sync,
+ /* local_merge */ local_merge,
+ /* update */ NULL,
+ /* update_node */ update_node
+};
+
+
+/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes.
+ * If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees.
+ */
+struct bNodeTreeExec *ntreeCompositBeginExecTree(bNodeTree *ntree, int use_tree_data)
+{
+ bNodeTreeExec *exec;
+ bNode *node;
+ bNodeSocket *sock;
+
+ if (use_tree_data) {
+ /* XXX hack: prevent exec data from being generated twice.
+ * this should be handled by the renderer!
+ */
+ if (ntree->execdata)
+ return ntree->execdata;
+ }
+
+ /* ensures only a single output node is enabled */
+ ntreeSetOutput(ntree);
+
+ exec = ntree_exec_begin(ntree);
+
+ for(node= exec->nodetree->nodes.first; node; node= node->next) {
+ /* initialize needed for groups */
+ node->exec= 0;
+
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ bNodeStack *ns= node_get_socket_stack(exec->stack, sock);
+ if(ns && sock->cache) {
+ ns->data= sock->cache;
+ sock->cache= NULL;
+ }
+ }
+ /* cannot initialize them while using in threads */
+ if(ELEM4(node->type, CMP_NODE_TIME, CMP_NODE_CURVE_VEC, CMP_NODE_CURVE_RGB, CMP_NODE_HUECORRECT)) {
+ curvemapping_initialize(node->storage);
+ if(node->type==CMP_NODE_CURVE_RGB)
+ curvemapping_premultiply(node->storage, 0);
+ }
+ }
+
+ if (use_tree_data) {
+ /* XXX this should not be necessary, but is still used for cmp/sha/tex nodes,
+ * which only store the ntree pointer. Should be fixed at some point!
+ */
+ ntree->execdata = exec;
+ }
+
+ return exec;
+}
+
+/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes.
+ * If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees.
+ */
+void ntreeCompositEndExecTree(bNodeTreeExec *exec, int use_tree_data)
+{
+ if(exec) {
+ bNodeTree *ntree= exec->nodetree;
+ bNode *node;
+ bNodeStack *ns;
+
+ for(node= exec->nodetree->nodes.first; node; node= node->next) {
+ bNodeSocket *sock;
+
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ ns = node_get_socket_stack(exec->stack, sock);
+ if(ns && ns->data) {
+ sock->cache= ns->data;
+ ns->data= NULL;
+ }
+ }
+ if(node->type==CMP_NODE_CURVE_RGB)
+ curvemapping_premultiply(node->storage, 1);
+
+ node->need_exec= 0;
+ }
+
+ ntree_exec_end(exec);
+
+ if (use_tree_data) {
+ /* XXX clear nodetree backpointer to exec data, same problem as noted in ntreeBeginExecTree */
+ ntree->execdata = NULL;
+ }
+ }
+}
+
+/* ***************************** threaded version for execute composite nodes ************* */
+/* these are nodes without input, only giving values */
+/* or nodes with only value inputs */
+static int node_only_value(bNode *node)
+{
+ bNodeSocket *sock;
+
+ if(ELEM3(node->type, CMP_NODE_TIME, CMP_NODE_VALUE, CMP_NODE_RGB))
+ return 1;
+
+ /* doing this for all node types goes wrong. memory free errors */
+ if(node->inputs.first && node->type==CMP_NODE_MAP_VALUE) {
+ int retval= 1;
+ for(sock= node->inputs.first; sock; sock= sock->next) {
+ if(sock->link)
+ retval &= node_only_value(sock->link->fromnode);
+ }
+ return retval;
+ }
+ return 0;
+}
+
+/* not changing info, for thread callback */
+typedef struct ThreadData {
+ bNodeStack *stack;
+ RenderData *rd;
+} ThreadData;
+
+static void *exec_composite_node(void *nodeexec_v)
+{
+ bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
+ bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
+ bNodeExec *nodeexec= nodeexec_v;
+ bNode *node= nodeexec->node;
+ ThreadData *thd= (ThreadData *)node->threaddata;
+
+ node_get_stack(node, thd->stack, nsin, nsout);
+
+ if((node->flag & NODE_MUTED) && (!node_only_value(node))) {
+ /* viewers we execute, for feedback to user */
+ if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))
+ node->typeinfo->execfunc(thd->rd, node, nsin, nsout);
+ else
+ node_compo_pass_on(node, nsin, nsout);
+ }
+ else if(node->typeinfo->execfunc)
+ node->typeinfo->execfunc(thd->rd, node, nsin, nsout);
+ else if (node->typeinfo->newexecfunc)
+ node->typeinfo->newexecfunc(thd->rd, 0, node, nodeexec->data, nsin, nsout);
+
+ node->exec |= NODE_READY;
+ return 0;
+}
+
+/* return total of executable nodes, for timecursor */
+static int setExecutableNodes(bNodeTreeExec *exec, ThreadData *thd)
+{
+ bNodeTree *ntree = exec->nodetree;
+ bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
+ bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
+ bNodeExec *nodeexec;
+ bNode *node;
+ bNodeSocket *sock;
+ int n, totnode= 0, group_edit= 0;
+
+ /* if we are in group edit, viewer nodes get skipped when group has viewer */
+ for(node= ntree->nodes.first; node; node= node->next)
+ if(node->type==NODE_GROUP && (node->flag & NODE_GROUP_EDIT))
+ if(ntreeHasType((bNodeTree *)node->id, CMP_NODE_VIEWER))
+ group_edit= 1;
+
+ /* NB: using the exec data list here to have valid dependency sort */
+ for(n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
+ int a;
+ node = nodeexec->node;
+
+ node_get_stack(node, exec->stack, nsin, nsout);
+
+ /* test the outputs */
+ /* skip value-only nodes (should be in type!) */
+ if(!node_only_value(node)) {
+ for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) {
+ if(nsout[a]->data==NULL && nsout[a]->hasoutput) {
+ node->need_exec= 1;
+ break;
+ }
+ }
+ }
+
+ /* test the inputs */
+ for(a=0, sock= node->inputs.first; sock; sock= sock->next, a++) {
+ /* skip viewer nodes in bg render or group edit */
+ if( ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) && (G.background || group_edit))
+ node->need_exec= 0;
+ /* is sock in use? */
+ else if(sock->link) {
+ bNodeLink *link= sock->link;
+
+ /* this is the test for a cyclic case */
+ if(link->fromnode==NULL || link->tonode==NULL);
+ else if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF) {
+ if(link->fromnode->need_exec) {
+ node->need_exec= 1;
+ break;
+ }
+ }
+ else {
+ node->need_exec= 0;
+ printf("Node %s skipped, cyclic dependency\n", node->name);
+ }
+ }
+ }
+
+ if(node->need_exec) {
+
+ /* free output buffers */
+ for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) {
+ if(nsout[a]->data) {
+ free_compbuf(nsout[a]->data);
+ nsout[a]->data= NULL;
+ }
+ }
+ totnode++;
+ /* printf("node needs exec %s\n", node->name); */
+
+ /* tag for getExecutableNode() */
+ node->exec= 0;
+ }
+ else {
+ /* tag for getExecutableNode() */
+ node->exec= NODE_READY|NODE_FINISHED|NODE_SKIPPED;
+
+ }
+ }
+
+ /* last step: set the stack values for only-value nodes */
+ /* just does all now, compared to a full buffer exec this is nothing */
+ if(totnode) {
+ for(n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
+ node = nodeexec->node;
+ if(node->need_exec==0 && node_only_value(node)) {
+ if(node->typeinfo->execfunc) {
+ node_get_stack(node, exec->stack, nsin, nsout);
+ node->typeinfo->execfunc(thd->rd, node, nsin, nsout);
+ }
+ }
+ }
+ }
+
+ return totnode;
+}
+
+/* while executing tree, free buffers from nodes that are not needed anymore */
+static void freeExecutableNode(bNodeTreeExec *exec)
+{
+ /* node outputs can be freed when:
+ - not a render result or image node
+ - when node outputs go to nodes all being set NODE_FINISHED
+ */
+ bNodeTree *ntree = exec->nodetree;
+ bNodeExec *nodeexec;
+ bNode *node;
+ bNodeSocket *sock;
+ int n;
+
+ /* set exec flag for finished nodes that might need freed */
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->type!=CMP_NODE_R_LAYERS)
+ if(node->exec & NODE_FINISHED)
+ node->exec |= NODE_FREEBUFS;
+ }
+ /* clear this flag for input links that are not done yet.
+ * Using the exec data for valid dependency sort.
+ */
+ for(n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
+ node = nodeexec->node;
+ if((node->exec & NODE_FINISHED)==0) {
+ for(sock= node->inputs.first; sock; sock= sock->next)
+ if(sock->link)
+ sock->link->fromnode->exec &= ~NODE_FREEBUFS;
+ }
+ }
+ /* now we can free buffers */
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->exec & NODE_FREEBUFS) {
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ bNodeStack *ns= node_get_socket_stack(exec->stack, sock);
+ if(ns && ns->data) {
+ free_compbuf(ns->data);
+ ns->data= NULL;
+ // printf("freed buf node %s \n", node->name);
+ }
+ }
+ }
+ }
+}
+
+static bNodeExec *getExecutableNode(bNodeTreeExec *exec)
+{
+ bNodeExec *nodeexec;
+ bNodeSocket *sock;
+ int n;
+
+ for(n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
+ if(nodeexec->node->exec==0) {
+ /* input sockets should be ready */
+ for(sock= nodeexec->node->inputs.first; sock; sock= sock->next) {
+ if(sock->link && sock->link->fromnode)
+ if((sock->link->fromnode->exec & NODE_READY)==0)
+ break;
+ }
+ if(sock==NULL)
+ return nodeexec;
+ }
+ }
+ return NULL;
+}
+
+/* check if texture nodes need exec or end */
+static void ntree_composite_texnode(bNodeTree *ntree, int init)
+{
+ bNode *node;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->type==CMP_NODE_TEXTURE && node->id) {
+ Tex *tex= (Tex *)node->id;
+ if(tex->nodetree && tex->use_nodes) {
+ /* has internal flag to detect it only does it once */
+ if(init) {
+ if (!tex->nodetree->execdata)
+ tex->nodetree->execdata = ntreeTexBeginExecTree(tex->nodetree, 1);
+ }
+ else
+ ntreeTexEndExecTree(tex->nodetree->execdata, 1);
+ tex->nodetree->execdata = NULL;
+ }
+ }
+ }
+
+}
+
+/* optimized tree execute test for compositing */
+void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview)
+{
+ bNodeExec *nodeexec;
+ bNode *node;
+ ListBase threads;
+ ThreadData thdata;
+ int totnode, curnode, rendering= 1, n;
+ bNodeTreeExec *exec= ntree->execdata;
+
+ if(ntree==NULL) return;
+
+ if(do_preview)
+ ntreeInitPreview(ntree, 0, 0);
+
+ if (!ntree->execdata) {
+ /* XXX this is the top-level tree, so we use the ntree->execdata pointer. */
+ exec = ntreeCompositBeginExecTree(ntree, 1);
+ }
+ ntree_composite_texnode(ntree, 1);
+
+ /* prevent unlucky accidents */
+ if(G.background)
+ rd->scemode &= ~R_COMP_CROP;
+
+ /* setup callerdata for thread callback */
+ thdata.rd= rd;
+ thdata.stack= exec->stack;
+
+ /* fixed seed, for example noise texture */
+ BLI_srandom(rd->cfra);
+
+ /* sets need_exec tags in nodes */
+ curnode = totnode= setExecutableNodes(exec, &thdata);
+
+ BLI_init_threads(&threads, exec_composite_node, rd->threads);
+
+ while(rendering) {
+
+ if(BLI_available_threads(&threads)) {
+ nodeexec= getExecutableNode(exec);
+ if(nodeexec) {
+ node = nodeexec->node;
+ if(ntree->progress && totnode)
+ ntree->progress(ntree->prh, (1.0 - curnode/(float)totnode));
+ if(ntree->stats_draw) {
+ char str[64];
+ sprintf(str, "Compositing %d %s", curnode, node->name);
+ ntree->stats_draw(ntree->sdh, str);
+ }
+ curnode--;
+
+ node->threaddata = &thdata;
+ node->exec= NODE_PROCESSING;
+ BLI_insert_thread(&threads, nodeexec);
+ }
+ else
+ PIL_sleep_ms(50);
+ }
+ else
+ PIL_sleep_ms(50);
+
+ rendering= 0;
+ /* test for ESC */
+ if(ntree->test_break && ntree->test_break(ntree->tbh)) {
+ for(node= ntree->nodes.first; node; node= node->next)
+ node->exec |= NODE_READY;
+ }
+
+ /* check for ready ones, and if we need to continue */
+ for(n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
+ node = nodeexec->node;
+ if(node->exec & NODE_READY) {
+ if((node->exec & NODE_FINISHED)==0) {
+ BLI_remove_thread(&threads, nodeexec); /* this waits for running thread to finish btw */
+ node->exec |= NODE_FINISHED;
+
+ /* freeing unused buffers */
+ if(rd->scemode & R_COMP_FREE)
+ freeExecutableNode(exec);
+ }
+ }
+ else rendering= 1;
+ }
+ }
+
+ BLI_end_threads(&threads);
+
+ /* XXX top-level tree uses the ntree->execdata pointer */
+ ntreeCompositEndExecTree(exec, 1);
+}
+
+/* *********************************************** */
+
+/* clumsy checking... should do dynamic outputs once */
+static void force_hidden_passes(bNode *node, int passflag)
+{
+ bNodeSocket *sock;
+
+ for(sock= node->outputs.first; sock; sock= sock->next)
+ sock->flag &= ~SOCK_UNAVAIL;
+
+ sock= BLI_findlink(&node->outputs, RRES_OUT_Z);
+ if(!(passflag & SCE_PASS_Z)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_NORMAL);
+ if(!(passflag & SCE_PASS_NORMAL)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_VEC);
+ if(!(passflag & SCE_PASS_VECTOR)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_UV);
+ if(!(passflag & SCE_PASS_UV)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_RGBA);
+ if(!(passflag & SCE_PASS_RGBA)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_DIFF);
+ if(!(passflag & SCE_PASS_DIFFUSE)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_SPEC);
+ if(!(passflag & SCE_PASS_SPEC)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_SHADOW);
+ if(!(passflag & SCE_PASS_SHADOW)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_AO);
+ if(!(passflag & SCE_PASS_AO)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_REFLECT);
+ if(!(passflag & SCE_PASS_REFLECT)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_REFRACT);
+ if(!(passflag & SCE_PASS_REFRACT)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_INDIRECT);
+ if(!(passflag & SCE_PASS_INDIRECT)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXOB);
+ if(!(passflag & SCE_PASS_INDEXOB)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXMA);
+ if(!(passflag & SCE_PASS_INDEXMA)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_MIST);
+ if(!(passflag & SCE_PASS_MIST)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_EMIT);
+ if(!(passflag & SCE_PASS_EMIT)) sock->flag |= SOCK_UNAVAIL;
+ sock= BLI_findlink(&node->outputs, RRES_OUT_ENV);
+ if(!(passflag & SCE_PASS_ENVIRONMENT)) sock->flag |= SOCK_UNAVAIL;
+
+}
+
+/* based on rules, force sockets hidden always */
+void ntreeCompositForceHidden(bNodeTree *ntree, Scene *curscene)
+{
+ bNode *node;
+
+ if(ntree==NULL) return;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if( node->type==CMP_NODE_R_LAYERS) {
+ Scene *sce= node->id?(Scene *)node->id:curscene;
+ SceneRenderLayer *srl= BLI_findlink(&sce->r.layers, node->custom1);
+ if(srl)
+ force_hidden_passes(node, srl->passflag);
+ }
+ else if( node->type==CMP_NODE_IMAGE) {
+ Image *ima= (Image *)node->id;
+ if(ima) {
+ if(ima->rr) {
+ ImageUser *iuser= node->storage;
+ RenderLayer *rl= BLI_findlink(&ima->rr->layers, iuser->layer);
+ if(rl)
+ force_hidden_passes(node, rl->passflag);
+ else
+ force_hidden_passes(node, 0);
+ }
+ else if(ima->type!=IMA_TYPE_MULTILAYER) { /* if ->rr not yet read we keep inputs */
+ force_hidden_passes(node, RRES_OUT_Z);
+ }
+ else
+ force_hidden_passes(node, 0);
+ }
+ else
+ force_hidden_passes(node, 0);
+ }
+ }
+
+}
+
+/* called from render pipeline, to tag render input and output */
+/* need to do all scenes, to prevent errors when you re-render 1 scene */
+void ntreeCompositTagRender(Scene *curscene)
+{
+ Scene *sce;
+
+ for(sce= G.main->scene.first; sce; sce= sce->id.next) {
+ if(sce->nodetree) {
+ bNode *node;
+
+ for(node= sce->nodetree->nodes.first; node; node= node->next) {
+ if(node->id==(ID *)curscene || node->type==CMP_NODE_COMPOSITE)
+ NodeTagChanged(sce->nodetree, node);
+ else if(node->type==CMP_NODE_TEXTURE) /* uses scene sizex/sizey */
+ NodeTagChanged(sce->nodetree, node);
+ }
+ }
+ }
+}
+
+static int node_animation_properties(bNodeTree *ntree, bNode *node)
+{
+ bNodeSocket *sock;
+ const ListBase *lb;
+ Link *link;
+ PointerRNA ptr;
+ PropertyRNA *prop;
+
+ /* check to see if any of the node's properties have fcurves */
+ RNA_pointer_create((ID *)ntree, &RNA_Node, node, &ptr);
+ lb = RNA_struct_type_properties(ptr.type);
+
+ for (link=lb->first; link; link=link->next) {
+ int driven, len=1, index;
+ prop = (PropertyRNA *)link;
+
+ if (RNA_property_array_check(prop))
+ len = RNA_property_array_length(&ptr, prop);
+
+ for (index=0; index<len; index++) {
+ if (rna_get_fcurve(&ptr, prop, index, NULL, &driven)) {
+ NodeTagChanged(ntree, node);
+ return 1;
+ }
+ }
+ }
+
+ /* now check node sockets */
+ for (sock = node->inputs.first; sock; sock=sock->next) {
+ int driven, len=1, index;
+
+ RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &ptr);
+ prop = RNA_struct_find_property(&ptr, "default_value");
+ if (prop) {
+ if (RNA_property_array_check(prop))
+ len = RNA_property_array_length(&ptr, prop);
+
+ for (index=0; index<len; index++) {
+ if (rna_get_fcurve(&ptr, prop, index, NULL, &driven)) {
+ NodeTagChanged(ntree, node);
+ return 1;
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+/* tags nodes that have animation capabilities */
+int ntreeCompositTagAnimated(bNodeTree *ntree)
+{
+ bNode *node;
+ int tagged= 0;
+
+ if(ntree==NULL) return 0;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+
+ tagged = node_animation_properties(ntree, node);
+
+ /* otherwise always tag these node types */
+ if(node->type==CMP_NODE_IMAGE) {
+ Image *ima= (Image *)node->id;
+ if(ima && ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
+ NodeTagChanged(ntree, node);
+ tagged= 1;
+ }
+ }
+ else if(node->type==CMP_NODE_TIME) {
+ NodeTagChanged(ntree, node);
+ tagged= 1;
+ }
+ /* here was tag render layer, but this is called after a render, so re-composites fail */
+ else if(node->type==NODE_GROUP) {
+ if( ntreeCompositTagAnimated((bNodeTree *)node->id) ) {
+ NodeTagChanged(ntree, node);
+ }
+ }
+ }
+
+ return tagged;
+}
+
+
+/* called from image window preview */
+void ntreeCompositTagGenerators(bNodeTree *ntree)
+{
+ bNode *node;
+
+ if(ntree==NULL) return;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if( ELEM(node->type, CMP_NODE_R_LAYERS, CMP_NODE_IMAGE))
+ NodeTagChanged(ntree, node);
+ }
+}
+
+/* XXX after render animation system gets a refresh, this call allows composite to end clean */
+void ntreeClearTags(bNodeTree *ntree)
+{
+ bNode *node;
+
+ if(ntree==NULL) return;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ node->need_exec= 0;
+ if(node->type==NODE_GROUP)
+ ntreeClearTags((bNodeTree *)node->id);
+ }
+}
diff --git a/source/blender/nodes/intern/CMP_util.c b/source/blender/nodes/composite/node_composite_util.c
index a763f34a644..78f97c5289e 100644
--- a/source/blender/nodes/intern/CMP_util.c
+++ b/source/blender/nodes/composite/node_composite_util.c
@@ -27,12 +27,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_util.c
+/** \file blender/nodes/composite/node_composite_util.c
* \ingroup nodes
*/
-#include "CMP_util.h"
+#include "node_composite_util.h"
CompBuf *alloc_compbuf(int sizex, int sizey, int type, int alloc)
{
@@ -67,7 +67,7 @@ CompBuf *dupalloc_compbuf(CompBuf *cbuf)
{
CompBuf *dupbuf= alloc_compbuf(cbuf->x, cbuf->y, cbuf->type, 1);
if(dupbuf) {
- memmove(dupbuf->rect, cbuf->rect, cbuf->type*sizeof(float)*cbuf->x*cbuf->y);
+ memcpy(dupbuf->rect, cbuf->rect, cbuf->type*sizeof(float)*cbuf->x*cbuf->y);
dupbuf->xof= cbuf->xof;
dupbuf->yof= cbuf->yof;
@@ -156,7 +156,7 @@ void node_compo_pass_on(bNode *node, bNodeStack **nsin, bNodeStack **nsout)
if(valbuf || colbuf || vecbuf) {
for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) {
if(nsout[a]->hasoutput) {
- if(sock->type==SOCK_VALUE && valbuf) {
+ if(sock->type==SOCK_FLOAT && valbuf) {
nsout[a]->data= pass_on_compbuf(valbuf);
valbuf= NULL;
}
@@ -1325,7 +1325,7 @@ void IIR_gauss(CompBuf* src, float sigma, int chan, int xy)
if (src->x < 3) xy &= ~(int) 1;
if (src->y < 3) xy &= ~(int) 2;
if (xy < 1) return;
-
+
// see "Recursive Gabor Filtering" by Young/VanVliet
// all factors here in double.prec. Required, because for single.prec it seems to blow up if sigma > ~200
if (sigma >= 3.556)
diff --git a/source/blender/nodes/intern/CMP_util.h b/source/blender/nodes/composite/node_composite_util.h
index 3f37eae2af9..57ebe2191dd 100644
--- a/source/blender/nodes/intern/CMP_util.h
+++ b/source/blender/nodes/composite/node_composite_util.h
@@ -27,13 +27,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_util.h
+/** \file blender/nodes/composite/node_composite_util.h
* \ingroup nodes
*/
-#ifndef CMP_NODE_UTILS_H_
-#define CMP_NODE_UTILS_H_
+#ifndef NODE_COMPOSITE_UTIL_H_
+#define NODE_COMPOSITE_UTIL_H_
#include <stdlib.h>
#include <string.h>
@@ -70,7 +70,6 @@
#include "BKE_library.h"
#include "BKE_object.h"
-#include "../CMP_node.h"
#include "node_util.h"
#include "IMB_imbuf_types.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c b/source/blender/nodes/composite/nodes/node_composite_alphaOver.c
index 9dcdfaf21e6..551f716e72b 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c
+++ b/source/blender/nodes/composite/nodes/node_composite_alphaOver.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_alphaOver.c
+/** \file blender/nodes/composite/nodes/node_composite_alphaOver.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** ALPHAOVER ******************** */
-static bNodeSocketType cmp_node_alphaover_in[]= {
- { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_alphaover_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_alphaover_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_alphaover_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -140,7 +140,7 @@ static void node_composit_exec_alphaover(void *UNUSED(data), bNode *node, bNodeS
}
}
-static void node_alphaover_init(bNode* node)
+static void node_alphaover_init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= MEM_callocN(sizeof(NodeTwoFloats), "NodeTwoFloats");
}
@@ -149,8 +149,8 @@ void register_node_type_cmp_alphaover(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_ALPHAOVER, "AlphaOver", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- cmp_node_alphaover_in, cmp_node_alphaover_out);
+ node_type_base(&ntype, CMP_NODE_ALPHAOVER, "AlphaOver", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_alphaover_in, cmp_node_alphaover_out);
node_type_size(&ntype, 80, 40, 120);
node_type_init(&ntype, node_alphaover_init);
node_type_storage(&ntype, "NodeTwoFloats", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c b/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c
index c106b437e17..e8e6e164983 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c
+++ b/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c
@@ -1,5 +1,5 @@
/*
- *
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c
+/** \file blender/nodes/composite/nodes/node_composite_bilateralblur.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** BILATERALBLUR ******************** */
-static bNodeSocketType cmp_node_bilateralblur_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Determinator", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_bilateralblur_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Determinator", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_bilateralblur_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_bilateralblur_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -247,7 +247,7 @@ static void node_composit_exec_bilateralblur(void *UNUSED(data), bNode *node, bN
free_compbuf(new);
}
-static void node_composit_init_bilateralblur(bNode* node)
+static void node_composit_init_bilateralblur(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeBilateralBlurData *nbbd= MEM_callocN(sizeof(NodeBilateralBlurData), "node bilateral blur data");
node->storage= nbbd;
@@ -259,8 +259,8 @@ void register_node_type_cmp_bilateralblur(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_BILATERALBLUR, "Bilateral Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- cmp_node_bilateralblur_in, cmp_node_bilateralblur_out);
+ node_type_base(&ntype, CMP_NODE_BILATERALBLUR, "Bilateral Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_bilateralblur_in, cmp_node_bilateralblur_out);
node_type_size(&ntype, 150, 120, 200);
node_type_init(&ntype, node_composit_init_bilateralblur);
node_type_storage(&ntype, "NodeBilateralBlurData", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_blur.c b/source/blender/nodes/composite/nodes/node_composite_blur.c
index 718578a921b..cd37404e677 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_blur.c
+++ b/source/blender/nodes/composite/nodes/node_composite_blur.c
@@ -28,21 +28,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_blur.c
+/** \file blender/nodes/composite/nodes/node_composite_blur.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** BLUR ******************** */
-static bNodeSocketType cmp_node_blur_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Size", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_blur_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "Size", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_blur_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_blur_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -713,7 +713,7 @@ static void node_composit_exec_blur(void *data, bNode *node, bNodeStack **in, bN
generate_preview(data, node, out[0]->data);
}
-static void node_composit_init_blur(bNode* node)
+static void node_composit_init_blur(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= MEM_callocN(sizeof(NodeBlurData), "node blur data");
}
@@ -722,8 +722,8 @@ void register_node_type_cmp_blur(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_BLUR, "Blur", NODE_CLASS_OP_FILTER, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_blur_in, cmp_node_blur_out);
+ node_type_base(&ntype, CMP_NODE_BLUR, "Blur", NODE_CLASS_OP_FILTER, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_blur_in, cmp_node_blur_out);
node_type_size(&ntype, 120, 80, 200);
node_type_init(&ntype, node_composit_init_blur);
node_type_storage(&ntype, "NodeBlurData", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_brightness.c b/source/blender/nodes/composite/nodes/node_composite_brightness.c
index 50a8d05b03d..55d890e6d31 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_brightness.c
+++ b/source/blender/nodes/composite/nodes/node_composite_brightness.c
@@ -28,24 +28,24 @@
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_brightness.c
+/** \file blender/nodes/composite/nodes/node_composite_brightness.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Brigh and contrsast ******************** */
-static bNodeSocketType cmp_node_brightcontrast_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Bright", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f},
- { SOCK_VALUE, 1, "Contrast", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f},
+static bNodeSocketTemplate cmp_node_brightcontrast_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "Bright", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Contrast", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_brightcontrast_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_brightcontrast_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -100,8 +100,8 @@ void register_node_type_cmp_brightcontrast(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_BRIGHTCONTRAST, "Bright/Contrast", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- cmp_node_brightcontrast_in, cmp_node_brightcontrast_out);
+ node_type_base(&ntype, CMP_NODE_BRIGHTCONTRAST, "Bright/Contrast", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_brightcontrast_in, cmp_node_brightcontrast_out);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, node_composit_exec_brightcontrast);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c b/source/blender/nodes/composite/nodes/node_composite_channelMatte.c
index e395716f36d..1e3992a7185 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_channelMatte.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_channelMatte.c
+/** \file blender/nodes/composite/nodes/node_composite_channelMatte.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* ******************* Channel Matte Node ********************************* */
-static bNodeSocketType cmp_node_channel_matte_in[]={
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_channel_matte_in[]={
+ {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
{-1,0,""}
};
-static bNodeSocketType cmp_node_channel_matte_out[]={
- {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_channel_matte_out[]={
+ {SOCK_RGBA,0,"Image"},
+ {SOCK_FLOAT,0,"Matte"},
{-1,0,""}
};
@@ -187,7 +187,7 @@ static void node_composit_exec_channel_matte(void *data, bNode *node, bNodeStack
}
-static void node_composit_init_channel_matte(bNode *node)
+static void node_composit_init_channel_matte(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma");
node->storage=c;
@@ -206,8 +206,8 @@ void register_node_type_cmp_channel_matte(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_CHANNEL_MATTE, "Channel Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_channel_matte_in, cmp_node_channel_matte_out);
+ node_type_base(&ntype, CMP_NODE_CHANNEL_MATTE, "Channel Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_channel_matte_in, cmp_node_channel_matte_out);
node_type_size(&ntype, 200, 80, 250);
node_type_init(&ntype, node_composit_init_channel_matte);
node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c b/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c
index 03230f2e212..49c90e85621 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
+/** \file blender/nodes/composite/nodes/node_composite_chromaMatte.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* ******************* Chroma Key ********************************************************** */
-static bNodeSocketType cmp_node_chroma_in[]={
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_chroma_in[]={
+ {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f},
{-1,0,""}
};
-static bNodeSocketType cmp_node_chroma_out[]={
- {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_chroma_out[]={
+ {SOCK_RGBA,0,"Image"},
+ {SOCK_FLOAT,0,"Matte"},
{-1,0,""}
};
@@ -178,7 +178,7 @@ static void node_composit_exec_chroma_matte(void *data, bNode *node, bNodeStack
}
-static void node_composit_init_chroma_matte(bNode *node)
+static void node_composit_init_chroma_matte(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma");
node->storage= c;
@@ -193,8 +193,8 @@ void register_node_type_cmp_chroma_matte(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_CHROMA_MATTE, "Chroma Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_chroma_in, cmp_node_chroma_out);
+ node_type_base(&ntype, CMP_NODE_CHROMA_MATTE, "Chroma Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_chroma_in, cmp_node_chroma_out);
node_type_size(&ntype, 200, 80, 300);
node_type_init(&ntype, node_composit_init_chroma_matte);
node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c b/source/blender/nodes/composite/nodes/node_composite_colorMatte.c
index 55d77a902b9..b17052ed542 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_colorMatte.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_colorMatte.c
+/** \file blender/nodes/composite/nodes/node_composite_colorMatte.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* ******************* Color Key ********************************************************** */
-static bNodeSocketType cmp_node_color_in[]={
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_color_in[]={
+ {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f},
{-1,0,""}
};
-static bNodeSocketType cmp_node_color_out[]={
- {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_color_out[]={
+ {SOCK_RGBA,0,"Image"},
+ {SOCK_FLOAT,0,"Matte"},
{-1,0,""}
};
@@ -114,7 +114,7 @@ static void node_composit_exec_color_matte(void *data, bNode *node, bNodeStack *
free_compbuf(cbuf);
}
-static void node_composit_init_color_matte(bNode *node)
+static void node_composit_init_color_matte(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node color");
node->storage= c;
@@ -129,8 +129,8 @@ void register_node_type_cmp_color_matte(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_COLOR_MATTE, "Color Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_color_in, cmp_node_color_out);
+ node_type_base(&ntype, CMP_NODE_COLOR_MATTE, "Color Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_color_in, cmp_node_color_out);
node_type_size(&ntype, 200, 80, 300);
node_type_init(&ntype, node_composit_init_color_matte);
node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c b/source/blender/nodes/composite/nodes/node_composite_colorSpill.c
index 905d97709c3..418d6802cec 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c
+++ b/source/blender/nodes/composite/nodes/node_composite_colorSpill.c
@@ -27,25 +27,25 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_colorSpill.c
+/** \file blender/nodes/composite/nodes/node_composite_colorSpill.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
#define avg(a,b) ((a+b)/2)
/* ******************* Color Spill Supression ********************************* */
-static bNodeSocketType cmp_node_color_spill_in[]={
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_color_spill_in[]={
+ {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ {SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
{-1,0,""}
};
-static bNodeSocketType cmp_node_color_spill_out[]={
- {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_color_spill_out[]={
+ {SOCK_RGBA,0,"Image"},
{-1,0,""}
};
@@ -315,7 +315,7 @@ static void node_composit_exec_color_spill(void *UNUSED(data), bNode *node, bNod
free_compbuf(spillmap);
}
-static void node_composit_init_color_spill(bNode *node)
+static void node_composit_init_color_spill(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeColorspill *ncs= MEM_callocN(sizeof(NodeColorspill), "node colorspill");
node->storage=ncs;
@@ -330,8 +330,8 @@ void register_node_type_cmp_color_spill(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_COLOR_SPILL, "Color Spill", NODE_CLASS_MATTE, NODE_OPTIONS,
- cmp_node_color_spill_in, cmp_node_color_spill_out);
+ node_type_base(&ntype, CMP_NODE_COLOR_SPILL, "Color Spill", NODE_CLASS_MATTE, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_color_spill_in, cmp_node_color_spill_out);
node_type_size(&ntype, 140, 80, 200);
node_type_init(&ntype, node_composit_init_color_spill);
node_type_storage(&ntype, "NodeColorspill", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c b/source/blender/nodes/composite/nodes/node_composite_colorbalance.c
index 4074ea2fa29..6bce18c14ef 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c
+++ b/source/blender/nodes/composite/nodes/node_composite_colorbalance.c
@@ -1,5 +1,5 @@
/*
- *
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -27,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_colorbalance.c
+/** \file blender/nodes/composite/nodes/node_composite_colorbalance.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* ******************* Color Balance ********************************* */
-static bNodeSocketType cmp_node_colorbalance_in[]={
- {SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_colorbalance_in[]={
+ {SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
+ {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
{-1,0,""}
};
-static bNodeSocketType cmp_node_colorbalance_out[]={
- {SOCK_RGBA,0,"Image", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_colorbalance_out[]={
+ {SOCK_RGBA,0,"Image"},
{-1,0,""}
};
@@ -175,7 +175,7 @@ static void node_composit_exec_colorbalance(void *UNUSED(data), bNode *node, bNo
}
}
-static void node_composit_init_colorbalance(bNode *node)
+static void node_composit_init_colorbalance(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeColorBalance *n= node->storage= MEM_callocN(sizeof(NodeColorBalance), "node colorbalance");
@@ -188,8 +188,8 @@ void register_node_type_cmp_colorbalance(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_COLORBALANCE, "Color Balance", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- cmp_node_colorbalance_in, cmp_node_colorbalance_out);
+ node_type_base(&ntype, CMP_NODE_COLORBALANCE, "Color Balance", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_colorbalance_in, cmp_node_colorbalance_out);
node_type_size(&ntype, 400, 200, 400);
node_type_init(&ntype, node_composit_init_colorbalance);
node_type_storage(&ntype, "NodeColorBalance", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/composite/nodes/node_composite_common.c b/source/blender/nodes/composite/nodes/node_composite_common.c
new file mode 100644
index 00000000000..d5ae442c25f
--- /dev/null
+++ b/source/blender/nodes/composite/nodes/node_composite_common.c
@@ -0,0 +1,373 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2006 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Campbell Barton, Alfredo de Greef, David Millan Escriva,
+ * Juho Vepsäläinen
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/composite/nodes/node_composite_common.c
+ * \ingroup cmpnodes
+ */
+
+
+#include "DNA_node_types.h"
+
+#include "BKE_node.h"
+
+#include "node_composite_util.h"
+#include "node_common.h"
+#include "node_exec.h"
+
+#if 0
+static void PRINT_BUFFERS(bNodeTreeExec *exec)
+{
+ bNodeTree *ntree= exec->nodetree;
+ bNode *node;
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int i;
+
+ printf("-------------- DEBUG --------------\n");
+ for (sock=ntree->inputs.first, i=0; sock; sock=sock->next, ++i) {
+ ns = node_get_socket_stack(exec->stack, sock);
+ printf("%d. Tree Input %s", i, sock->name);
+ if (ns->external)
+ printf(" (external)");
+ printf(": data=%p\n", ns->data);
+ }
+ for (sock=ntree->outputs.first, i=0; sock; sock=sock->next, ++i) {
+ ns = node_get_socket_stack(exec->stack, sock);
+ printf("%d. Tree Output %s", i, sock->name);
+ if (ns->external)
+ printf(" (external)");
+ printf(": data=%p\n", ns->data);
+ }
+ for (node=ntree->nodes.first; node; node=node->next) {
+ printf("Node %s:\n", node->name);
+ for (sock=node->inputs.first, i=0; sock; sock=sock->next, ++i) {
+ ns = node_get_socket_stack(exec->stack, sock);
+ printf("\t%d. Input %s", i, sock->name);
+ if (ns->external)
+ printf(" (external)");
+ printf(": data=%p\n", ns->data);
+ }
+ for (sock=node->outputs.first, i=0; sock; sock=sock->next, ++i) {
+ ns = node_get_socket_stack(exec->stack, sock);
+ printf("\t%d. Output %s", i, sock->name);
+ if (ns->external)
+ printf(" (external)");
+ printf(": data=%p\n", ns->data);
+ }
+ }
+}
+#endif
+
+static void copy_stack(bNodeStack *to, bNodeStack *from)
+{
+ if (to != from) {
+ copy_v4_v4(to->vec, from->vec);
+ to->data = from->data;
+ to->datatype = from->datatype;
+
+ /* tag as copy to prevent freeing */
+ to->is_copy = 1;
+ }
+}
+
+static void move_stack(bNodeStack *to, bNodeStack *from)
+{
+ if (to != from) {
+ copy_v4_v4(to->vec, from->vec);
+ to->data = from->data;
+ to->datatype = from->datatype;
+ to->is_copy = from->is_copy;
+
+ zero_v4(from->vec);
+ from->data = NULL;
+ from->datatype = 0;
+ from->is_copy = 0;
+ }
+}
+
+/**** GROUP ****/
+
+static void *group_initexec(bNode *node)
+{
+ bNodeTree *ngroup= (bNodeTree*)node->id;
+ bNodeTreeExec *exec;
+ bNodeSocket *sock;
+ bNodeStack *ns;
+
+ /* initialize the internal node tree execution */
+ exec = ntreeCompositBeginExecTree(ngroup, 0);
+
+ /* tag group outputs as external to prevent freeing */
+ for (sock=ngroup->outputs.first; sock; sock=sock->next) {
+ if (!(sock->flag & SOCK_INTERNAL)) {
+ ns = node_get_socket_stack(exec->stack, sock);
+ ns->external = 1;
+ }
+ }
+
+ return exec;
+}
+
+static void group_freeexec(bNode *UNUSED(node), void *nodedata)
+{
+ bNodeTreeExec *gexec= (bNodeTreeExec*)nodedata;
+
+ ntreeCompositEndExecTree(gexec, 0);
+}
+
+/* Copy inputs to the internal stack.
+ * This is a shallow copy, no buffers are duplicated here!
+ */
+static void group_copy_inputs(bNode *node, bNodeStack **in, bNodeStack *gstack)
+{
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int a;
+ for (sock=node->inputs.first, a=0; sock; sock=sock->next, ++a) {
+ if (sock->groupsock) {
+ ns = node_get_socket_stack(gstack, sock->groupsock);
+ copy_stack(ns, in[a]);
+ }
+ }
+}
+
+/* Copy internal results to the external outputs.
+ */
+static void group_move_outputs(bNode *node, bNodeStack **out, bNodeStack *gstack)
+{
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int a;
+ for (sock=node->outputs.first, a=0; sock; sock=sock->next, ++a) {
+ if (sock->groupsock) {
+ ns = node_get_socket_stack(gstack, sock->groupsock);
+ move_stack(out[a], ns);
+ }
+ }
+}
+
+/* Free internal buffers */
+static void group_free_internal(bNodeTreeExec *gexec) {
+ bNodeStack *ns;
+ int i;
+
+ for (i=0, ns=gexec->stack; i < gexec->stacksize; ++i, ++ns) {
+ if (!ns->external && !ns->is_copy) {
+ if (ns->data) {
+ free_compbuf(ns->data);
+ ns->data = NULL;
+ }
+ }
+ }
+}
+
+static void group_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out)
+{
+ bNodeTreeExec *exec= (bNodeTreeExec*)nodedata;
+
+ /* XXX same behavior as trunk: all nodes inside group are executed.
+ * it's stupid, but just makes it work. compo redesign will do this better.
+ */
+ {
+ bNode *inode;
+ for (inode=exec->nodetree->nodes.first; inode; inode=inode->next)
+ inode->need_exec = 1;
+ }
+
+ group_copy_inputs(node, in, exec->stack);
+ ntreeExecNodes(exec, data, thread);
+ group_free_internal(exec);
+ group_move_outputs(node, out, exec->stack);
+}
+
+void register_node_type_cmp_group(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, NODE_GROUP, "Group", NODE_CLASS_GROUP, NODE_OPTIONS|NODE_CONST_OUTPUT);
+ node_type_socket_templates(&ntype, NULL, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_label(&ntype, node_group_label);
+ node_type_init(&ntype, node_group_init);
+ node_type_valid(&ntype, node_group_valid);
+ node_type_template(&ntype, node_group_template);
+ node_type_update(&ntype, NULL, node_group_verify);
+ node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear);
+ node_type_exec_new(&ntype, group_initexec, group_freeexec, group_execute);
+
+ nodeRegisterType(lb, &ntype);
+}
+
+
+/**** FOR LOOP ****/
+
+#if 0 /* XXX loop nodes don't work nicely with current trees */
+/* Move the results from the previous iteration back to the input sockets. */
+static void loop_iteration_reset(bNodeTree *ngroup, bNodeStack *gstack)
+{
+ bNodeSocket *gin, *gout;
+ bNodeStack *nsin, *nsout;
+
+ gin = ngroup->inputs.first;
+ gout = ngroup->outputs.first;
+
+ while (gin && gout) {
+ /* skip static (non-looping) sockets */
+ while (gin && !(gin->flag & SOCK_DYNAMIC))
+ gin=gin->next;
+ while (gout && !(gout->flag & SOCK_DYNAMIC))
+ gout=gout->next;
+
+ if (gin && gout) {
+ nsin = node_get_socket_stack(gstack, gin);
+ nsout = node_get_socket_stack(gstack, gout);
+
+ move_stack(nsin, nsout);
+
+ gin=gin->next;
+ gout=gout->next;
+ }
+ }
+}
+
+static void forloop_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out)
+{
+ bNodeTreeExec *exec= (bNodeTreeExec*)nodedata;
+ int totiterations= (int)in[0]->vec[0];
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int iteration;
+
+ /* XXX same behavior as trunk: all nodes inside group are executed.
+ * it's stupid, but just makes it work. compo redesign will do this better.
+ */
+ {
+ bNode *inode;
+ for (inode=exec->nodetree->nodes.first; inode; inode=inode->next)
+ inode->need_exec = 1;
+ }
+
+ /* "Iteration" socket */
+ sock = exec->nodetree->inputs.first;
+ ns = node_get_socket_stack(exec->stack, sock);
+
+ group_copy_inputs(node, in, exec->stack);
+ for (iteration=0; iteration < totiterations; ++iteration) {
+ /* first input contains current iteration counter */
+ ns->vec[0] = (float)iteration;
+
+ if (iteration > 0)
+ loop_iteration_reset(exec->nodetree, exec->stack);
+ ntreeExecNodes(exec, data, thread);
+ group_free_internal(exec);
+ }
+ group_move_outputs(node, out, exec->stack);
+}
+
+void register_node_type_cmp_forloop(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, NODE_FORLOOP, "For", NODE_CLASS_GROUP, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_label(&ntype, node_group_label);
+ node_type_init(&ntype, node_forloop_init);
+ node_type_valid(&ntype, node_group_valid);
+ node_type_template(&ntype, node_forloop_template);
+ node_type_update(&ntype, NULL, node_group_verify);
+ node_type_tree(&ntype, node_forloop_init_tree, node_loop_update_tree);
+ node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear);
+ node_type_exec_new(&ntype, group_initexec, group_freeexec, forloop_execute);
+
+ nodeRegisterType(lb, &ntype);
+}
+#endif
+
+
+/**** WHILE LOOP ****/
+
+#if 0 /* XXX loop nodes don't work nicely with current trees */
+static void whileloop_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out)
+{
+ bNodeTreeExec *exec= (bNodeTreeExec*)nodedata;
+ int condition= (in[0]->vec[0] > 0.0f);
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int iteration;
+
+ /* XXX same behavior as trunk: all nodes inside group are executed.
+ * it's stupid, but just makes it work. compo redesign will do this better.
+ */
+ {
+ bNode *inode;
+ for (inode=exec->nodetree->nodes.first; inode; inode=inode->next)
+ inode->need_exec = 1;
+ }
+
+ /* "Condition" socket */
+ sock = exec->nodetree->outputs.first;
+ ns = node_get_socket_stack(exec->stack, sock);
+
+ iteration = 0;
+ group_copy_inputs(node, in, exec->stack);
+ while (condition && iteration < node->custom1) {
+ if (iteration > 0)
+ loop_iteration_reset(exec->nodetree, exec->stack);
+ ntreeExecNodes(exec, data, thread);
+ group_free_internal(exec);
+
+// PRINT_BUFFERS(exec);
+
+ condition = (ns->vec[0] > 0.0f);
+ ++iteration;
+ }
+ group_move_outputs(node, out, exec->stack);
+}
+
+void register_node_type_cmp_whileloop(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, NODE_WHILELOOP, "While", NODE_CLASS_GROUP, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_label(&ntype, node_group_label);
+ node_type_init(&ntype, node_whileloop_init);
+ node_type_valid(&ntype, node_group_valid);
+ node_type_template(&ntype, node_whileloop_template);
+ node_type_update(&ntype, NULL, node_group_verify);
+ node_type_tree(&ntype, node_whileloop_init_tree, node_loop_update_tree);
+ node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear);
+ node_type_exec_new(&ntype, group_initexec, group_freeexec, whileloop_execute);
+
+ nodeRegisterType(lb, &ntype);
+}
+#endif
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_composite.c b/source/blender/nodes/composite/nodes/node_composite_composite.c
index fb68f56ae64..492e5c28459 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_composite.c
+++ b/source/blender/nodes/composite/nodes/node_composite_composite.c
@@ -27,20 +27,20 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_composite.c
+/** \file blender/nodes/composite/nodes/node_composite_composite.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** COMPOSITE ******************** */
-static bNodeSocketType cmp_node_composite_in[]= {
- { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Z", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_composite_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_FLOAT, 1, "Z", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ -1, 0, "" }
};
@@ -103,8 +103,8 @@ void register_node_type_cmp_composite(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_COMPOSITE, "Composite", NODE_CLASS_OUTPUT, NODE_PREVIEW,
- cmp_node_composite_in, NULL);
+ node_type_base(&ntype, CMP_NODE_COMPOSITE, "Composite", NODE_CLASS_OUTPUT, NODE_PREVIEW);
+ node_type_socket_templates(&ntype, cmp_node_composite_in, NULL);
node_type_size(&ntype, 80, 60, 200);
node_type_exec(&ntype, node_composit_exec_composite);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_crop.c b/source/blender/nodes/composite/nodes/node_composite_crop.c
index 0331217f0cb..b8c539b6d66 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_crop.c
+++ b/source/blender/nodes/composite/nodes/node_composite_crop.c
@@ -1,5 +1,5 @@
/*
- *
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_crop.c
+/** \file blender/nodes/composite/nodes/node_composite_crop.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Crop ******************** */
-static bNodeSocketType cmp_node_crop_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_crop_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_crop_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_crop_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -103,7 +103,7 @@ static void node_composit_exec_crop(void *UNUSED(data), bNode *node, bNodeStack
}
}
-static void node_composit_init_crop(bNode* node)
+static void node_composit_init_crop(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeTwoXYs *nxy= MEM_callocN(sizeof(NodeTwoXYs), "node xy data");
node->storage= nxy;
@@ -117,8 +117,8 @@ void register_node_type_cmp_crop(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_CROP, "Crop", NODE_CLASS_DISTORT, NODE_OPTIONS,
- cmp_node_crop_in, cmp_node_crop_out);
+ node_type_base(&ntype, CMP_NODE_CROP, "Crop", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_crop_in, cmp_node_crop_out);
node_type_size(&ntype, 140, 100, 320);
node_type_init(&ntype, node_composit_init_crop);
node_type_storage(&ntype, "NodeTwoXYs", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_curves.c b/source/blender/nodes/composite/nodes/node_composite_curves.c
index 921c5e21fea..58074eaca57 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_curves.c
+++ b/source/blender/nodes/composite/nodes/node_composite_curves.c
@@ -27,19 +27,19 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_curves.c
+/** \file blender/nodes/composite/nodes/node_composite_curves.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** CURVE Time ******************** */
/* custom1 = sfra, custom2 = efra */
-static bNodeSocketType cmp_node_time_out[]= {
- { SOCK_VALUE, 0, "Fac", 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_time_out[]= {
+ { SOCK_FLOAT, 0, "Fac"},
{ -1, 0, "" }
};
@@ -57,7 +57,7 @@ static void node_composit_exec_curves_time(void *data, bNode *node, bNodeStack *
}
-static void node_composit_init_curves_time(bNode* node)
+static void node_composit_init_curves_time(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->custom1= 1;
node->custom2= 250;
@@ -68,8 +68,8 @@ void register_node_type_cmp_curve_time(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_TIME, "Time", NODE_CLASS_INPUT, NODE_OPTIONS,
- NULL, cmp_node_time_out);
+ node_type_base(&ntype, CMP_NODE_TIME, "Time", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, cmp_node_time_out);
node_type_size(&ntype, 140, 100, 320);
node_type_init(&ntype, node_composit_init_curves_time);
node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
@@ -82,13 +82,13 @@ void register_node_type_cmp_curve_time(ListBase *lb)
/* **************** CURVE VEC ******************** */
-static bNodeSocketType cmp_node_curve_vec_in[]= {
- { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_curve_vec_in[]= {
+ { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_curve_vec_out[]= {
- { SOCK_VECTOR, 0, "Vector", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_curve_vec_out[]= {
+ { SOCK_VECTOR, 0, "Vector"},
{ -1, 0, "" }
};
@@ -100,7 +100,7 @@ static void node_composit_exec_curve_vec(void *UNUSED(data), bNode *node, bNodeS
curvemapping_evaluate_premulRGBF(node->storage, out[0]->vec, in[0]->vec);
}
-static void node_composit_init_curve_vec(bNode* node)
+static void node_composit_init_curve_vec(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= curvemapping_add(3, -1.0f, -1.0f, 1.0f, 1.0f);
}
@@ -109,8 +109,8 @@ void register_node_type_cmp_curve_vec(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_CURVE_VEC, "Vector Curves", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- cmp_node_curve_vec_in, cmp_node_curve_vec_out);
+ node_type_base(&ntype, CMP_NODE_CURVE_VEC, "Vector Curves", NODE_CLASS_OP_VECTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_curve_vec_in, cmp_node_curve_vec_out);
node_type_size(&ntype, 200, 140, 320);
node_type_init(&ntype, node_composit_init_curve_vec);
node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
@@ -121,16 +121,16 @@ void register_node_type_cmp_curve_vec(ListBase *lb)
/* **************** CURVE RGB ******************** */
-static bNodeSocketType cmp_node_curve_rgb_in[]= {
- { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_RGBA, 1, "Black Level", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_RGBA, 1, "White Level", 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_curve_rgb_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_RGBA, 1, "Black Level", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_RGBA, 1, "White Level", 1.0f, 1.0f, 1.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_curve_rgb_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_curve_rgb_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -187,7 +187,7 @@ static void node_composit_exec_curve_rgb(void *UNUSED(data), bNode *node, bNodeS
}
-static void node_composit_init_curve_rgb(bNode* node)
+static void node_composit_init_curve_rgb(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f);
}
@@ -196,8 +196,8 @@ void register_node_type_cmp_curve_rgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- cmp_node_curve_rgb_in, cmp_node_curve_rgb_out);
+ node_type_base(&ntype, CMP_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_curve_rgb_in, cmp_node_curve_rgb_out);
node_type_size(&ntype, 200, 140, 320);
node_type_init(&ntype, node_composit_init_curve_rgb);
node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c b/source/blender/nodes/composite/nodes/node_composite_defocus.c
index f249e2cff6c..84a084591c5 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c
+++ b/source/blender/nodes/composite/nodes/node_composite_defocus.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_defocus.c
+/** \file blender/nodes/composite/nodes/node_composite_defocus.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* ************ qdn: Defocus node ****************** */
-static bNodeSocketType cmp_node_defocus_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_defocus_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_defocus_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_defocus_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -857,7 +857,7 @@ static void node_composit_exec_defocus(void *UNUSED(data), bNode *node, bNodeSta
if (zbuf_use && (zbuf_use != zbuf)) free_compbuf(zbuf_use);
}
-static void node_composit_init_defocus(bNode* node)
+static void node_composit_init_defocus(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
/* qdn: defocus node */
NodeDefocus *nbd = MEM_callocN(sizeof(NodeDefocus), "node defocus data");
@@ -878,8 +878,8 @@ void register_node_type_cmp_defocus(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_DEFOCUS, "Defocus", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- cmp_node_defocus_in, cmp_node_defocus_out);
+ node_type_base(&ntype, CMP_NODE_DEFOCUS, "Defocus", NODE_CLASS_OP_FILTER, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_defocus_in, cmp_node_defocus_out);
node_type_size(&ntype, 150, 120, 200);
node_type_init(&ntype, node_composit_init_defocus);
node_type_storage(&ntype, "NodeDefocus", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c b/source/blender/nodes/composite/nodes/node_composite_diffMatte.c
index 296053298da..23bcf57e2bc 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_diffMatte.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
+/** \file blender/nodes/composite/nodes/node_composite_diffMatte.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* ******************* channel Difference Matte ********************************* */
-static bNodeSocketType cmp_node_diff_matte_in[]={
- {SOCK_RGBA,1,"Image 1", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_RGBA,1,"Image 2", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_diff_matte_in[]={
+ {SOCK_RGBA,1,"Image 1", 0.8f, 0.8f, 0.8f, 1.0f},
+ {SOCK_RGBA,1,"Image 2", 0.8f, 0.8f, 0.8f, 1.0f},
{-1,0,""}
};
-static bNodeSocketType cmp_node_diff_matte_out[]={
- {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_diff_matte_out[]={
+ {SOCK_RGBA,0,"Image"},
+ {SOCK_FLOAT,0,"Matte"},
{-1,0,""}
};
@@ -125,7 +125,7 @@ static void node_composit_exec_diff_matte(void *data, bNode *node, bNodeStack **
free_compbuf(imbuf2);
}
-static void node_composit_init_diff_matte(bNode *node)
+static void node_composit_init_diff_matte(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma");
node->storage= c;
@@ -137,8 +137,8 @@ void register_node_type_cmp_diff_matte(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_DIFF_MATTE, "Difference Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_diff_matte_in, cmp_node_diff_matte_out);
+ node_type_base(&ntype, CMP_NODE_DIFF_MATTE, "Difference Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_diff_matte_in, cmp_node_diff_matte_out);
node_type_size(&ntype, 200, 80, 250);
node_type_init(&ntype, node_composit_init_diff_matte);
node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_dilate.c b/source/blender/nodes/composite/nodes/node_composite_dilate.c
index f5d16ff0ab8..c774045a12f 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_dilate.c
+++ b/source/blender/nodes/composite/nodes/node_composite_dilate.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_dilate.c
+/** \file blender/nodes/composite/nodes/node_composite_dilate.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Dilate/Erode ******************** */
-static bNodeSocketType cmp_node_dilateerode_in[]= {
- { SOCK_VALUE, 1, "Mask", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_dilateerode_in[]= {
+ { SOCK_FLOAT, 1, "Mask", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_dilateerode_out[]= {
- { SOCK_VALUE, 0, "Mask", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_dilateerode_out[]= {
+ { SOCK_FLOAT, 0, "Mask"},
{ -1, 0, "" }
};
@@ -152,8 +152,8 @@ void register_node_type_cmp_dilateerode(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_DILATEERODE, "Dilate/Erode", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- cmp_node_dilateerode_in, cmp_node_dilateerode_out);
+ node_type_base(&ntype, CMP_NODE_DILATEERODE, "Dilate/Erode", NODE_CLASS_OP_FILTER, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_dilateerode_in, cmp_node_dilateerode_out);
node_type_size(&ntype, 130, 100, 320);
node_type_exec(&ntype, node_composit_exec_dilateerode);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c b/source/blender/nodes/composite/nodes/node_composite_directionalblur.c
index 2a8bbcc9ad5..1a5e3150f53 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c
+++ b/source/blender/nodes/composite/nodes/node_composite_directionalblur.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,20 +27,20 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_directionalblur.c
+/** \file blender/nodes/composite/nodes/node_composite_directionalblur.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
-static bNodeSocketType cmp_node_dblur_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.f, 0.f, 1.f},
+static bNodeSocketTemplate cmp_node_dblur_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_dblur_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_dblur_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -122,7 +123,7 @@ static void node_composit_exec_dblur(void *UNUSED(data), bNode *node, bNodeStack
out[0]->data= dblur(node, new, ndbd->iter, ndbd->wrap, ndbd->center_x, ndbd->center_y, ndbd->distance, ndbd->angle, ndbd->spin, ndbd->zoom);
}
-static void node_composit_init_dblur(bNode* node)
+static void node_composit_init_dblur(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeDBlurData *ndbd= MEM_callocN(sizeof(NodeDBlurData), "node dblur data");
node->storage= ndbd;
@@ -134,8 +135,8 @@ void register_node_type_cmp_dblur(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_DBLUR, "Directional Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- cmp_node_dblur_in, cmp_node_dblur_out);
+ node_type_base(&ntype, CMP_NODE_DBLUR, "Directional Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_dblur_in, cmp_node_dblur_out);
node_type_size(&ntype, 150, 120, 200);
node_type_init(&ntype, node_composit_init_dblur);
node_type_storage(&ntype, "NodeDBlurData", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c b/source/blender/nodes/composite/nodes/node_composite_displace.c
index 9139edf8560..28d220eb4c9 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c
+++ b/source/blender/nodes/composite/nodes/node_composite_displace.c
@@ -27,25 +27,25 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_displace.c
+/** \file blender/nodes/composite/nodes/node_composite_displace.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Displace ******************** */
-static bNodeSocketType cmp_node_displace_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 1, "Vector", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "X Scale", 0.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f},
- { SOCK_VALUE, 1, "Y Scale", 0.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f},
+static bNodeSocketTemplate cmp_node_displace_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_VECTOR, 1, "Vector", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_TRANSLATION},
+ { SOCK_FLOAT, 1, "X Scale", 0.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f, PROP_FACTOR},
+ { SOCK_FLOAT, 1, "Y Scale", 0.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f, PROP_FACTOR},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_displace_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_displace_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -188,8 +188,8 @@ void register_node_type_cmp_displace(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_DISPLACE, "Displace", NODE_CLASS_DISTORT, NODE_OPTIONS,
- cmp_node_displace_in, cmp_node_displace_out);
+ node_type_base(&ntype, CMP_NODE_DISPLACE, "Displace", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_displace_in, cmp_node_displace_out);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, node_composit_exec_displace);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c b/source/blender/nodes/composite/nodes/node_composite_distanceMatte.c
index 5f7613464c1..b186be5500b 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_distanceMatte.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c
+/** \file blender/nodes/composite/nodes/node_composite_distanceMatte.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* ******************* channel Distance Matte ********************************* */
-static bNodeSocketType cmp_node_distance_matte_in[]={
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_distance_matte_in[]={
+ {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f},
{-1,0,""}
};
-static bNodeSocketType cmp_node_distance_matte_out[]={
- {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_distance_matte_out[]={
+ {SOCK_RGBA,0,"Image"},
+ {SOCK_FLOAT,0,"Matte"},
{-1,0,""}
};
@@ -122,7 +122,7 @@ static void node_composit_exec_distance_matte(void *data, bNode *node, bNodeStac
free_compbuf(inbuf);
}
-static void node_composit_init_distance_matte(bNode *node)
+static void node_composit_init_distance_matte(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma");
node->storage= c;
@@ -134,8 +134,8 @@ void register_node_type_cmp_distance_matte(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_DIST_MATTE, "Distance Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_distance_matte_in, cmp_node_distance_matte_out);
+ node_type_base(&ntype, CMP_NODE_DIST_MATTE, "Distance Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_distance_matte_in, cmp_node_distance_matte_out);
node_type_size(&ntype, 200, 80, 250);
node_type_init(&ntype, node_composit_init_distance_matte);
node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_filter.c b/source/blender/nodes/composite/nodes/node_composite_filter.c
index 915cb01d2d4..64a4c69b671 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_filter.c
+++ b/source/blender/nodes/composite/nodes/node_composite_filter.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_filter.c
+/** \file blender/nodes/composite/nodes/node_composite_filter.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** FILTER ******************** */
-static bNodeSocketType cmp_node_filter_in[]= {
- { SOCK_VALUE, 1, "Fac", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_filter_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_filter_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_filter_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -226,8 +226,8 @@ void register_node_type_cmp_filter(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_FILTER, "Filter", NODE_CLASS_OP_FILTER, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_filter_in, cmp_node_filter_out);
+ node_type_base(&ntype, CMP_NODE_FILTER, "Filter", NODE_CLASS_OP_FILTER, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_filter_in, cmp_node_filter_out);
node_type_size(&ntype, 80, 40, 120);
node_type_label(&ntype, node_filter_label);
node_type_exec(&ntype, node_composit_exec_filter);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_flip.c b/source/blender/nodes/composite/nodes/node_composite_flip.c
index b5fd7b46e03..931aacbe6fd 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_flip.c
+++ b/source/blender/nodes/composite/nodes/node_composite_flip.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_flip.c
+/** \file blender/nodes/composite/nodes/node_composite_flip.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Flip ******************** */
-static bNodeSocketType cmp_node_flip_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_flip_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_flip_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_flip_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -94,8 +94,8 @@ void register_node_type_cmp_flip(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_FLIP, "Flip", NODE_CLASS_DISTORT, NODE_OPTIONS,
- cmp_node_flip_in, cmp_node_flip_out);
+ node_type_base(&ntype, CMP_NODE_FLIP, "Flip", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_flip_in, cmp_node_flip_out);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, node_composit_exec_flip);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c b/source/blender/nodes/composite/nodes/node_composite_gamma.c
index 261257d3b5f..f1dd3d40c09 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c
+++ b/source/blender/nodes/composite/nodes/node_composite_gamma.c
@@ -28,22 +28,22 @@
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_gamma.c
+/** \file blender/nodes/composite/nodes/node_composite_gamma.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Gamma Tools ******************** */
-static bNodeSocketType cmp_node_gamma_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Gamma", 1.0f, 0.0f, 0.0f, 0.0f, 0.001f, 10.0f},
+static bNodeSocketTemplate cmp_node_gamma_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "Gamma", 1.0f, 0.0f, 0.0f, 0.0f, 0.001f, 10.0f, PROP_UNSIGNED},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_gamma_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_gamma_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -81,8 +81,8 @@ void register_node_type_cmp_gamma(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_GAMMA, "Gamma", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- cmp_node_gamma_in, cmp_node_gamma_out);
+ node_type_base(&ntype, CMP_NODE_GAMMA, "Gamma", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_gamma_in, cmp_node_gamma_out);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, node_composit_exec_gamma);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_glare.c b/source/blender/nodes/composite/nodes/node_composite_glare.c
index 2e0822a4511..98a41e4af69 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_glare.c
+++ b/source/blender/nodes/composite/nodes/node_composite_glare.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,19 +27,19 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_glare.c
+/** \file blender/nodes/composite/nodes/node_composite_glare.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
-static bNodeSocketType cmp_node_glare_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_glare_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_glare_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_glare_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -474,7 +475,7 @@ static void node_composit_exec_glare(void *UNUSED(data), bNode *node, bNodeStack
out[0]->data = new;
}
-static void node_composit_init_glare(bNode* node)
+static void node_composit_init_glare(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeGlare *ndg = MEM_callocN(sizeof(NodeGlare), "node glare data");
ndg->quality = 1;
@@ -494,8 +495,8 @@ void register_node_type_cmp_glare(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_GLARE, "Glare", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- cmp_node_glare_in, cmp_node_glare_out);
+ node_type_base(&ntype, CMP_NODE_GLARE, "Glare", NODE_CLASS_OP_FILTER, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_glare_in, cmp_node_glare_out);
node_type_size(&ntype, 150, 120, 200);
node_type_init(&ntype, node_composit_init_glare);
node_type_storage(&ntype, "NodeGlare", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c b/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c
index 7b5511c699c..1d060726b67 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c
+++ b/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c
+/** \file blender/nodes/composite/nodes/node_composite_hueSatVal.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Hue Saturation ******************** */
-static bNodeSocketType cmp_node_hue_sat_in[]= {
- { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_hue_sat_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_hue_sat_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_hue_sat_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -95,7 +95,7 @@ static void node_composit_exec_hue_sat(void *UNUSED(data), bNode *node, bNodeSta
}
}
-static void node_composit_init_hue_sat(bNode* node)
+static void node_composit_init_hue_sat(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeHueSat *nhs= MEM_callocN(sizeof(NodeHueSat), "node hue sat");
node->storage= nhs;
@@ -108,8 +108,8 @@ void register_node_type_cmp_hue_sat(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- cmp_node_hue_sat_in, cmp_node_hue_sat_out);
+ node_type_base(&ntype, CMP_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_hue_sat_in, cmp_node_hue_sat_out);
node_type_size(&ntype, 150, 80, 250);
node_type_init(&ntype, node_composit_init_hue_sat);
node_type_storage(&ntype, "NodeHueSat", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c b/source/blender/nodes/composite/nodes/node_composite_huecorrect.c
index edf6c454285..13a606e2c68 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c
+++ b/source/blender/nodes/composite/nodes/node_composite_huecorrect.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_huecorrect.c
+/** \file blender/nodes/composite/nodes/node_composite_huecorrect.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
-static bNodeSocketType cmp_node_huecorrect_in[]= {
- { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_huecorrect_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_huecorrect_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_huecorrect_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -137,7 +137,7 @@ static void node_composit_exec_huecorrect(void *UNUSED(data), bNode *node, bNode
}
-static void node_composit_init_huecorrect(bNode* node)
+static void node_composit_init_huecorrect(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
CurveMapping *cumapping = node->storage= curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
int c;
@@ -157,8 +157,8 @@ void register_node_type_cmp_huecorrect(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_HUECORRECT, "Hue Correct", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- cmp_node_huecorrect_in, cmp_node_huecorrect_out);
+ node_type_base(&ntype, CMP_NODE_HUECORRECT, "Hue Correct", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_huecorrect_in, cmp_node_huecorrect_out);
node_type_size(&ntype, 320, 140, 400);
node_type_init(&ntype, node_composit_init_huecorrect);
node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c b/source/blender/nodes/composite/nodes/node_composite_idMask.c
index 72d0de7d15e..43f78a90add 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c
+++ b/source/blender/nodes/composite/nodes/node_composite_idMask.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_idMask.c
+/** \file blender/nodes/composite/nodes/node_composite_idMask.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** ID Mask ******************** */
-static bNodeSocketType cmp_node_idmask_in[]= {
- { SOCK_VALUE, 1, "ID value", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_idmask_in[]= {
+ { SOCK_FLOAT, 1, "ID value", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_idmask_out[]= {
- { SOCK_VALUE, 0, "Alpha", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_idmask_out[]= {
+ { SOCK_FLOAT, 0, "Alpha"},
{ -1, 0, "" }
};
@@ -113,8 +113,8 @@ void register_node_type_cmp_idmask(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_ID_MASK, "ID Mask", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- cmp_node_idmask_in, cmp_node_idmask_out);
+ node_type_base(&ntype, CMP_NODE_ID_MASK, "ID Mask", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_idmask_in, cmp_node_idmask_out);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, node_composit_exec_idmask);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_image.c b/source/blender/nodes/composite/nodes/node_composite_image.c
index a5f256054cd..6149947233e 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_image.c
+++ b/source/blender/nodes/composite/nodes/node_composite_image.c
@@ -27,20 +27,20 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_image.c
+/** \file blender/nodes/composite/nodes/node_composite_image.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** IMAGE (and RenderResult, multilayer image) ******************** */
-static bNodeSocketType cmp_node_rlayers_out[]= {
+static bNodeSocketTemplate cmp_node_rlayers_out[]= {
{ SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Z", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Z", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ SOCK_VECTOR, 0, "UV", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ SOCK_VECTOR, 0, "Speed", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
@@ -52,9 +52,9 @@ static bNodeSocketType cmp_node_rlayers_out[]= {
{ SOCK_RGBA, 0, "Reflect", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ SOCK_RGBA, 0, "Refract", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ SOCK_RGBA, 0, "Indirect", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "IndexOB", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "IndexMA", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Mist", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "IndexOB", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "IndexMA", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 0, "Mist", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ SOCK_RGBA, 0, "Emit", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ SOCK_RGBA, 0, "Environment",0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
@@ -74,7 +74,7 @@ static CompBuf *node_composit_get_image(RenderData *rd, Image *ima, ImageUser *i
ibuf= BKE_image_get_ibuf(ima, iuser);
if(ibuf==NULL || (ibuf->rect==NULL && ibuf->rect_float==NULL)) {
- return NULL;
+ return NULL;
}
if (ibuf->rect_float == NULL) {
@@ -213,7 +213,7 @@ static void outputs_multilayer_get(RenderData *rd, RenderLayer *rl, bNodeStack *
if(out[RRES_OUT_INDEXOB]->hasoutput)
out[RRES_OUT_INDEXOB]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXOB);
if(out[RRES_OUT_INDEXMA]->hasoutput)
- out[RRES_OUT_INDEXMA]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXMA);
+ out[RRES_OUT_INDEXMA]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXMA);
if(out[RRES_OUT_MIST]->hasoutput)
out[RRES_OUT_MIST]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_MIST);
if(out[RRES_OUT_EMIT]->hasoutput)
@@ -295,7 +295,7 @@ static void node_composit_exec_image(void *data, bNode *node, bNodeStack **UNUSE
}
}
-static void node_composit_init_image(bNode* node)
+static void node_composit_init_image(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user");
node->storage= iuser;
@@ -309,8 +309,8 @@ void register_node_type_cmp_image(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_IMAGE, "Image", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
- NULL, cmp_node_rlayers_out);
+ node_type_base(&ntype, CMP_NODE_IMAGE, "Image", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, cmp_node_rlayers_out);
node_type_size(&ntype, 120, 80, 300);
node_type_init(&ntype, node_composit_init_image);
node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage);
@@ -440,8 +440,8 @@ void register_node_type_cmp_rlayers(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_R_LAYERS, "Render Layers", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
- NULL, cmp_node_rlayers_out);
+ node_type_base(&ntype, CMP_NODE_R_LAYERS, "Render Layers", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, cmp_node_rlayers_out);
node_type_size(&ntype, 150, 100, 300);
node_type_exec(&ntype, node_composit_exec_rlayers);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_invert.c b/source/blender/nodes/composite/nodes/node_composite_invert.c
index 27b0324dfe0..fa64c9ec1b1 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_invert.c
+++ b/source/blender/nodes/composite/nodes/node_composite_invert.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_invert.c
+/** \file blender/nodes/composite/nodes/node_composite_invert.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** INVERT ******************** */
-static bNodeSocketType cmp_node_invert_in[]= {
- { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_invert_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_invert_out[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_invert_out[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -114,7 +114,7 @@ static void node_composit_exec_invert(void *UNUSED(data), bNode *node, bNodeStac
}
}
-static void node_composit_init_invert(bNode *node)
+static void node_composit_init_invert(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->custom1 |= CMP_CHAN_RGB;
}
@@ -124,8 +124,8 @@ void register_node_type_cmp_invert(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- cmp_node_invert_in, cmp_node_invert_out);
+ node_type_base(&ntype, CMP_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_invert_in, cmp_node_invert_out);
node_type_size(&ntype, 120, 120, 140);
node_type_init(&ntype, node_composit_init_invert);
node_type_exec(&ntype, node_composit_exec_invert);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c b/source/blender/nodes/composite/nodes/node_composite_lensdist.c
index 3a005210c6a..7d6c945a9e3 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c
+++ b/source/blender/nodes/composite/nodes/node_composite_lensdist.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_lensdist.c
+/** \file blender/nodes/composite/nodes/node_composite_lensdist.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
-static bNodeSocketType cmp_node_lensdist_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Distort", 0.f, 0.f, 0.f, 0.f, -0.999f, 1.f},
- { SOCK_VALUE, 1, "Dispersion", 0.f, 0.f, 0.f, 0.f, 0.f, 1.f},
+static bNodeSocketTemplate cmp_node_lensdist_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "Distort", 0.f, 0.f, 0.f, 0.f, -0.999f, 1.f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Dispersion", 0.f, 0.f, 0.f, 0.f, 0.f, 1.f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_lensdist_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_lensdist_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -183,7 +184,7 @@ static void node_composit_exec_lensdist(void *UNUSED(data), bNode *node, bNodeSt
}
-static void node_composit_init_lensdist(bNode* node)
+static void node_composit_init_lensdist(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeLensDist *nld = MEM_callocN(sizeof(NodeLensDist), "node lensdist data");
nld->jit = nld->proj = nld->fit = 0;
@@ -195,8 +196,8 @@ void register_node_type_cmp_lensdist(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_LENSDIST, "Lens Distortion", NODE_CLASS_DISTORT, NODE_OPTIONS,
- cmp_node_lensdist_in, cmp_node_lensdist_out);
+ node_type_base(&ntype, CMP_NODE_LENSDIST, "Lens Distortion", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_lensdist_in, cmp_node_lensdist_out);
node_type_size(&ntype, 150, 120, 200);
node_type_init(&ntype, node_composit_init_lensdist);
node_type_storage(&ntype, "NodeLensDist", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_levels.c b/source/blender/nodes/composite/nodes/node_composite_levels.c
index 2c9f7d97f09..e34788ff62b 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_levels.c
+++ b/source/blender/nodes/composite/nodes/node_composite_levels.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_levels.c
+/** \file blender/nodes/composite/nodes/node_composite_levels.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** LEVELS ******************** */
-static bNodeSocketType cmp_node_view_levels_in[]= {
- { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_view_levels_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_view_levels_out[]={
- {SOCK_VALUE, 0,"Mean",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- {SOCK_VALUE, 0,"Std Dev",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_view_levels_out[]={
+ {SOCK_FLOAT, 0,"Mean"},
+ {SOCK_FLOAT, 0,"Std Dev"},
{-1,0,""}
};
@@ -52,7 +52,7 @@ static void rgb_tobw(float r, float g, float b, float* out)
*out= r*0.35f + g*0.45f + b*0.2f;
}
-static void fill_bins(bNode* node, CompBuf* in, int* bins, int colorcor)
+static void fill_bins(bNode* node, CompBuf* in, int* bins)
{
float value[4];
int ivalue=0;
@@ -68,39 +68,29 @@ static void fill_bins(bNode* node, CompBuf* in, int* bins, int colorcor)
if(value[3] > 0.0) { /* don't count transparent pixels */
switch(node->custom1) {
case 1: { /* all colors */
- if(colorcor)
- linearrgb_to_srgb_v3_v3(&value[0],&value[0]);
rgb_tobw(value[0],value[1],value[2], &value[0]);
value[0]=value[0]*255; /* scale to 0-255 range */
ivalue=(int)value[0];
break;
}
case 2: { /* red channel */
- if(colorcor)
- value[0]=linearrgb_to_srgb(value[0]);
value[0]=value[0]*255; /* scale to 0-255 range */
ivalue=(int)value[0];
break;
}
case 3: { /* green channel */
- if(colorcor)
- value[1]=linearrgb_to_srgb(value[1]);
value[1]=value[1]*255; /* scale to 0-255 range */
ivalue=(int)value[1];
break;
}
case 4: /*blue channel */
{
- if(colorcor)
- value[2]=linearrgb_to_srgb(value[2]);
value[2]=value[2]*255; /* scale to 0-255 range */
ivalue=(int)value[2];
break;
}
case 5: /* luminence */
{
- if(colorcor)
- linearrgb_to_srgb_v3_v3(&value[0],&value[0]);
rgb_to_yuv(value[0],value[1],value[2], &value[0], &value[1], &value[2]);
value[0]=value[0]*255; /* scale to 0-255 range */
ivalue=(int)value[0];
@@ -285,7 +275,6 @@ static void node_composit_exec_view_levels(void *data, bNode *node, bNodeStack *
{
CompBuf* cbuf;
CompBuf* histogram;
- RenderData *rd=data;
float mean, std_dev;
int bins[256];
int x;
@@ -302,7 +291,7 @@ static void node_composit_exec_view_levels(void *data, bNode *node, bNodeStack *
}
/*fill bins */
- fill_bins(node, in[0]->data, bins, rd->color_mgt_flag & R_COLOR_MANAGEMENT);
+ fill_bins(node, in[0]->data, bins);
/* draw the histogram chart */
draw_histogram(node, histogram, bins);
@@ -328,7 +317,7 @@ static void node_composit_exec_view_levels(void *data, bNode *node, bNodeStack *
free_compbuf(histogram);
}
-static void node_composit_init_view_levels(bNode* node)
+static void node_composit_init_view_levels(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->custom1=1; /*All channels*/
}
@@ -337,8 +326,8 @@ void register_node_type_cmp_view_levels(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_VIEW_LEVELS, "Levels", NODE_CLASS_OUTPUT, NODE_OPTIONS|NODE_PREVIEW,
- cmp_node_view_levels_in, cmp_node_view_levels_out);
+ node_type_base(&ntype, CMP_NODE_VIEW_LEVELS, "Levels", NODE_CLASS_OUTPUT, NODE_OPTIONS|NODE_PREVIEW);
+ node_type_socket_templates(&ntype, cmp_node_view_levels_in, cmp_node_view_levels_out);
node_type_size(&ntype, 140, 100, 320);
node_type_init(&ntype, node_composit_init_view_levels);
node_type_storage(&ntype, "ImageUser", NULL, NULL);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c b/source/blender/nodes/composite/nodes/node_composite_lummaMatte.c
index 34e58791932..cac2a386801 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_lummaMatte.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c
+/** \file blender/nodes/composite/nodes/node_composite_lummaMatte.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* ******************* Luma Matte Node ********************************* */
-static bNodeSocketType cmp_node_luma_matte_in[]={
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_luma_matte_in[]={
+ {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
{-1,0,""}
};
-static bNodeSocketType cmp_node_luma_matte_out[]={
- {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- {SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_luma_matte_out[]={
+ {SOCK_RGBA,0,"Image"},
+ {SOCK_FLOAT,0,"Matte"},
{-1,0,""}
};
@@ -100,7 +100,7 @@ static void node_composit_exec_luma_matte(void *data, bNode *node, bNodeStack **
free_compbuf(cbuf);
}
-static void node_composit_init_luma_matte(bNode *node)
+static void node_composit_init_luma_matte(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma");
node->storage=c;
@@ -112,8 +112,8 @@ void register_node_type_cmp_luma_matte(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_LUMA_MATTE, "Luminance Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_luma_matte_in, cmp_node_luma_matte_out);
+ node_type_base(&ntype, CMP_NODE_LUMA_MATTE, "Luminance Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_luma_matte_in, cmp_node_luma_matte_out);
node_type_size(&ntype, 200, 80, 250);
node_type_init(&ntype, node_composit_init_luma_matte);
node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c b/source/blender/nodes/composite/nodes/node_composite_mapUV.c
index 6b2c561b14a..b1cae62274b 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c
+++ b/source/blender/nodes/composite/nodes/node_composite_mapUV.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_mapUV.c
+/** \file blender/nodes/composite/nodes/node_composite_mapUV.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Map UV ******************** */
-static bNodeSocketType cmp_node_mapuv_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 1, "UV", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_mapuv_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_VECTOR, 1, "UV", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_mapuv_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_mapuv_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -168,8 +168,8 @@ void register_node_type_cmp_mapuv(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_MAP_UV, "Map UV", NODE_CLASS_DISTORT, NODE_OPTIONS,
- cmp_node_mapuv_in, cmp_node_mapuv_out);
+ node_type_base(&ntype, CMP_NODE_MAP_UV, "Map UV", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_mapuv_in, cmp_node_mapuv_out);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, node_composit_exec_mapuv);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c b/source/blender/nodes/composite/nodes/node_composite_mapValue.c
index f14e0fbd804..95e0f3dadd1 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c
+++ b/source/blender/nodes/composite/nodes/node_composite_mapValue.c
@@ -27,20 +27,20 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_mapValue.c
+/** \file blender/nodes/composite/nodes/node_composite_mapValue.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** MAP VALUE ******************** */
-static bNodeSocketType cmp_node_map_value_in[]= {
- { SOCK_VALUE, 1, "Value", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_map_value_in[]= {
+ { SOCK_FLOAT, 1, "Value", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_map_value_out[]= {
- { SOCK_VALUE, 0, "Value", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_map_value_out[]= {
+ { SOCK_FLOAT, 0, "Value"},
{ -1, 0, "" }
};
@@ -79,7 +79,7 @@ static void node_composit_exec_map_value(void *UNUSED(data), bNode *node, bNodeS
}
-static void node_composit_init_map_value(bNode* node)
+static void node_composit_init_map_value(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= add_mapping();
}
@@ -88,8 +88,8 @@ void register_node_type_cmp_map_value(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_MAP_VALUE, "Map Value", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- cmp_node_map_value_in, cmp_node_map_value_out);
+ node_type_base(&ntype, CMP_NODE_MAP_VALUE, "Map Value", NODE_CLASS_OP_VECTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_map_value_in, cmp_node_map_value_out);
node_type_size(&ntype, 100, 60, 150);
node_type_init(&ntype, node_composit_init_map_value);
node_type_storage(&ntype, "TexMapping", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_math.c b/source/blender/nodes/composite/nodes/node_composite_math.c
index b7a67f3563b..a8a631bdbad 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_math.c
+++ b/source/blender/nodes/composite/nodes/node_composite_math.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_math.c
+/** \file blender/nodes/composite/nodes/node_composite_math.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** SCALAR MATH ******************** */
-static bNodeSocketType cmp_node_math_in[]= {
- { SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f},
- { SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f},
+static bNodeSocketTemplate cmp_node_math_in[]= {
+ { SOCK_FLOAT, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_math_out[]= {
- { SOCK_VALUE, 0, "Value", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_math_out[]= {
+ { SOCK_FLOAT, 0, "Value"},
{ -1, 0, "" }
};
@@ -145,7 +145,6 @@ static void do_math(bNode *node, float *out, float *in, float *in2)
out[0]= floorf(in[0] / in2[0] + 0.5f) * in2[0];
else
out[0]= floorf(in[0] + 0.5f);
-
}
break;
case 15: /* Less Than */
@@ -201,8 +200,8 @@ void register_node_type_cmp_math(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- cmp_node_math_in, cmp_node_math_out);
+ node_type_base(&ntype, CMP_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_math_in, cmp_node_math_out);
node_type_size(&ntype, 120, 110, 160);
node_type_label(&ntype, node_math_label);
node_type_exec(&ntype, node_composit_exec_math);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c b/source/blender/nodes/composite/nodes/node_composite_mixrgb.c
index d2454b37c29..eaab24d628a 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c
+++ b/source/blender/nodes/composite/nodes/node_composite_mixrgb.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_mixrgb.c
+/** \file blender/nodes/composite/nodes/node_composite_mixrgb.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** MIX RGB ******************** */
-static bNodeSocketType cmp_node_mix_rgb_in[]= {
- { SOCK_VALUE, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 5.0f},
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_mix_rgb_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 5.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_mix_rgb_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_mix_rgb_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -88,8 +88,8 @@ void register_node_type_cmp_mix_rgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_mix_rgb_in, cmp_node_mix_rgb_out);
+ node_type_base(&ntype, CMP_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_mix_rgb_in, cmp_node_mix_rgb_out);
node_type_size(&ntype, 110, 60, 120);
node_type_label(&ntype, node_blend_label);
node_type_exec(&ntype, node_composit_exec_mix_rgb);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_normal.c b/source/blender/nodes/composite/nodes/node_composite_normal.c
index f53d3041947..adf087019dc 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_normal.c
+++ b/source/blender/nodes/composite/nodes/node_composite_normal.c
@@ -27,30 +27,30 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_normal.c
+/** \file blender/nodes/composite/nodes/node_composite_normal.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** NORMAL ******************** */
-static bNodeSocketType cmp_node_normal_in[]= {
- { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_normal_in[]= {
+ { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_DIRECTION},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_normal_out[]= {
- { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_VALUE, 0, "Dot", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_normal_out[]= {
+ { SOCK_VECTOR, 0, "Normal"},
+ { SOCK_FLOAT, 0, "Dot"},
{ -1, 0, "" }
};
static void do_normal(bNode *node, float *out, float *in)
{
bNodeSocket *sock= node->outputs.first;
- float *nor= sock->ns.vec;
+ float *nor= ((bNodeSocketValueVector*)sock->default_value)->value;
/* render normals point inside... the widget points outside */
out[0]= -INPR(nor, in);
@@ -60,12 +60,13 @@ static void do_normal(bNode *node, float *out, float *in)
static void node_composit_exec_normal(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
+ float *nor= ((bNodeSocketValueVector*)sock->default_value)->value;
/* stack order input: normal */
/* stack order output: normal, value */
/* input no image? then only vector op */
if(in[0]->data==NULL) {
- VECCOPY(out[0]->vec, sock->ns.vec);
+ VECCOPY(out[0]->vec, nor);
/* render normals point inside... the widget points outside */
out[1]->vec[0]= -INPR(out[0]->vec, in[0]->vec);
}
@@ -82,12 +83,23 @@ static void node_composit_exec_normal(void *UNUSED(data), bNode *node, bNodeStac
}
+static void init(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp))
+{
+ bNodeSocket *sock= node->outputs.first;
+ float *nor= ((bNodeSocketValueVector*)sock->default_value)->value;
+
+ nor[0] = 0.0f;
+ nor[1] = 0.0f;
+ nor[2] = 1.0f;
+}
+
void register_node_type_cmp_normal(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- cmp_node_normal_in, cmp_node_normal_out);
+ node_type_base(&ntype, CMP_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_normal_in, cmp_node_normal_out);
+ node_type_init(&ntype, init);
node_type_size(&ntype, 100, 60, 200);
node_type_exec(&ntype, node_composit_exec_normal);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c b/source/blender/nodes/composite/nodes/node_composite_normalize.c
index 22ebd924f09..3a913b1a0a2 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c
+++ b/source/blender/nodes/composite/nodes/node_composite_normalize.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_normalize.c
+/** \file blender/nodes/composite/nodes/node_composite_normalize.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** NORMALIZE single channel, useful for Z buffer ******************** */
-static bNodeSocketType cmp_node_normalize_in[]= {
- { SOCK_VALUE, 1, "Value", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_normalize_in[]= {
+ { SOCK_FLOAT, 1, "Value", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_normalize_out[]= {
- { SOCK_VALUE, 0, "Value", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_normalize_out[]= {
+ { SOCK_FLOAT, 0, "Value"},
{ -1, 0, "" }
};
@@ -107,8 +107,8 @@ void register_node_type_cmp_normalize(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_NORMALIZE, "Normalize", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- cmp_node_normalize_in, cmp_node_normalize_out);
+ node_type_base(&ntype, CMP_NODE_NORMALIZE, "Normalize", NODE_CLASS_OP_VECTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_normalize_in, cmp_node_normalize_out);
node_type_size(&ntype, 100, 60, 150);
node_type_exec(&ntype, node_composit_exec_normalize);
node_type_storage(&ntype, "TexMapping", NULL, NULL);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c b/source/blender/nodes/composite/nodes/node_composite_outputFile.c
index 1d52e694ea9..20203f66b5a 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c
+++ b/source/blender/nodes/composite/nodes/node_composite_outputFile.c
@@ -27,17 +27,17 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_outputFile.c
+/** \file blender/nodes/composite/nodes/node_composite_outputFile.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** OUTPUT FILE ******************** */
-static bNodeSocketType cmp_node_output_file_in[]= {
- { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Z", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_output_file_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Z", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
@@ -93,7 +93,7 @@ static void node_composit_exec_output_file(void *data, bNode *node, bNodeStack *
}
}
-static void node_composit_init_output_file(bNode *node)
+static void node_composit_init_output_file(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
Scene *scene= (Scene *)node->id;
NodeImageFile *nif= MEM_callocN(sizeof(NodeImageFile), "node image file");
@@ -113,8 +113,8 @@ void register_node_type_cmp_output_file(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_OUTPUT_FILE, "File Output", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_output_file_in, NULL);
+ node_type_base(&ntype, CMP_NODE_OUTPUT_FILE, "File Output", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_output_file_in, NULL);
node_type_size(&ntype, 140, 80, 300);
node_type_init(&ntype, node_composit_init_output_file);
node_type_storage(&ntype, "NodeImageFile", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c b/source/blender/nodes/composite/nodes/node_composite_premulkey.c
index 15d2ac25180..a3f958e04d9 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c
+++ b/source/blender/nodes/composite/nodes/node_composite_premulkey.c
@@ -28,21 +28,21 @@
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_premulkey.c
+/** \file blender/nodes/composite/nodes/node_composite_premulkey.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Premul and Key Alpha Convert ******************** */
-static bNodeSocketType cmp_node_premulkey_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_premulkey_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_premulkey_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_premulkey_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -67,8 +67,8 @@ void register_node_type_cmp_premulkey(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_PREMULKEY, "Alpha Convert", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- cmp_node_premulkey_in, cmp_node_premulkey_out);
+ node_type_base(&ntype, CMP_NODE_PREMULKEY, "Alpha Convert", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_premulkey_in, cmp_node_premulkey_out);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, node_composit_exec_premulkey);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_rgb.c b/source/blender/nodes/composite/nodes/node_composite_rgb.c
index 36b7988c4e0..b9287a4978e 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_rgb.c
+++ b/source/blender/nodes/composite/nodes/node_composite_rgb.c
@@ -27,33 +27,46 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_rgb.c
+/** \file blender/nodes/composite/nodes/node_composite_rgb.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** RGB ******************** */
-static bNodeSocketType cmp_node_rgb_out[]= {
- { SOCK_RGBA, 0, "RGBA", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_rgb_out[]= {
+ { SOCK_RGBA, 0, "RGBA", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
+static void node_composit_init_rgb(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp))
+{
+ bNodeSocket *sock= node->outputs.first;
+ float *col= ((bNodeSocketValueRGBA*)sock->default_value)->value;
+ /* uses the default value of the output socket, must be initialized here */
+ col[0] = 0.5f;
+ col[1] = 0.5f;
+ col[2] = 0.5f;
+ col[3] = 1.0f;
+}
+
static void node_composit_exec_rgb(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
+ float *col= ((bNodeSocketValueRGBA*)sock->default_value)->value;
- QUATCOPY(out[0]->vec, sock->ns.vec);
+ QUATCOPY(out[0]->vec, col);
}
void register_node_type_cmp_rgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_RGB, "RGB", NODE_CLASS_INPUT, NODE_OPTIONS,
- NULL, cmp_node_rgb_out);
+ node_type_base(&ntype, CMP_NODE_RGB, "RGB", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, cmp_node_rgb_out);
+ node_type_init(&ntype, node_composit_init_rgb);
node_type_size(&ntype, 140, 80, 140);
node_type_exec(&ntype, node_composit_exec_rgb);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c b/source/blender/nodes/composite/nodes/node_composite_rotate.c
index eccac4f0e6d..2bbb77cd1da 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c
+++ b/source/blender/nodes/composite/nodes/node_composite_rotate.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_rotate.c
+/** \file blender/nodes/composite/nodes/node_composite_rotate.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Rotate ******************** */
-static bNodeSocketType cmp_node_rotate_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Degr", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f},
+static bNodeSocketTemplate cmp_node_rotate_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "Degr", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f, PROP_ANGLE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_rotate_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_rotate_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -122,7 +122,7 @@ static void node_composit_exec_rotate(void *UNUSED(data), bNode *node, bNodeStac
}
}
-static void node_composit_init_rotate(bNode *node)
+static void node_composit_init_rotate(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->custom1= 1; /* Bilinear Filter*/
}
@@ -131,8 +131,8 @@ void register_node_type_cmp_rotate(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_ROTATE, "Rotate", NODE_CLASS_DISTORT, NODE_OPTIONS,
- cmp_node_rotate_in, cmp_node_rotate_out);
+ node_type_base(&ntype, CMP_NODE_ROTATE, "Rotate", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_rotate_in, cmp_node_rotate_out);
node_type_size(&ntype, 140, 100, 320);
node_type_init(&ntype, node_composit_init_rotate);
node_type_exec(&ntype, node_composit_exec_rotate);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_scale.c b/source/blender/nodes/composite/nodes/node_composite_scale.c
index b6030cc5a5f..b6ad36f957f 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_scale.c
+++ b/source/blender/nodes/composite/nodes/node_composite_scale.c
@@ -27,25 +27,25 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_scale.c
+/** \file blender/nodes/composite/nodes/node_composite_scale.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Scale ******************** */
#define CMP_SCALE_MAX 12000
-static bNodeSocketType cmp_node_scale_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "X", 1.0f, 0.0f, 0.0f, 0.0f, 0.0001f, CMP_SCALE_MAX},
- { SOCK_VALUE, 1, "Y", 1.0f, 0.0f, 0.0f, 0.0f, 0.0001f, CMP_SCALE_MAX},
+static bNodeSocketTemplate cmp_node_scale_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "X", 1.0f, 0.0f, 0.0f, 0.0f, 0.0001f, CMP_SCALE_MAX, PROP_FACTOR},
+ { SOCK_FLOAT, 1, "Y", 1.0f, 0.0f, 0.0f, 0.0f, 0.0001f, CMP_SCALE_MAX, PROP_FACTOR},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_scale_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_scale_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -118,8 +118,8 @@ void register_node_type_cmp_scale(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_SCALE, "Scale", NODE_CLASS_DISTORT, NODE_OPTIONS,
- cmp_node_scale_in, cmp_node_scale_out);
+ node_type_base(&ntype, CMP_NODE_SCALE, "Scale", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_scale_in, cmp_node_scale_out);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, node_composit_exec_scale);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c
index 87c4ed1dac0..6b1813d2142 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c
+++ b/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c
@@ -27,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c
+/** \file blender/nodes/composite/nodes/node_composite_sepcombHSVA.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** SEPARATE HSVA ******************** */
-static bNodeSocketType cmp_node_sephsva_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_sephsva_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_sephsva_out[]= {
- { SOCK_VALUE, 0, "H", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "S", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "V", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "A", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_sephsva_out[]= {
+ { SOCK_FLOAT, 0, "H"},
+ { SOCK_FLOAT, 0, "S"},
+ { SOCK_FLOAT, 0, "V"},
+ { SOCK_FLOAT, 0, "A"},
{ -1, 0, "" }
};
@@ -105,8 +105,8 @@ void register_node_type_cmp_sephsva(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_SEPHSVA, "Separate HSVA", NODE_CLASS_CONVERTOR, 0,
- cmp_node_sephsva_in, cmp_node_sephsva_out);
+ node_type_base(&ntype, CMP_NODE_SEPHSVA, "Separate HSVA", NODE_CLASS_CONVERTOR, 0);
+ node_type_socket_templates(&ntype, cmp_node_sephsva_in, cmp_node_sephsva_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_composit_exec_sephsva);
@@ -115,15 +115,15 @@ void register_node_type_cmp_sephsva(ListBase *lb)
/* **************** COMBINE HSVA ******************** */
-static bNodeSocketType cmp_node_combhsva_in[]= {
- { SOCK_VALUE, 1, "H", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "S", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "V", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_combhsva_in[]= {
+ { SOCK_FLOAT, 1, "H", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "S", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "V", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_combhsva_out[]= {
- { SOCK_RGBA, 0, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_combhsva_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -175,8 +175,8 @@ void register_node_type_cmp_combhsva(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_COMBHSVA, "Combine HSVA", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- cmp_node_combhsva_in, cmp_node_combhsva_out);
+ node_type_base(&ntype, CMP_NODE_COMBHSVA, "Combine HSVA", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_combhsva_in, cmp_node_combhsva_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_composit_exec_combhsva);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c
index 11afd1eaaef..a60f6b81c95 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c
+++ b/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c
+/** \file blender/nodes/composite/nodes/node_composite_sepcombRGBA.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** SEPARATE RGBA ******************** */
-static bNodeSocketType cmp_node_seprgba_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_seprgba_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_seprgba_out[]= {
- { SOCK_VALUE, 0, "R", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "G", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "B", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "A", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_seprgba_out[]= {
+ { SOCK_FLOAT, 0, "R"},
+ { SOCK_FLOAT, 0, "G"},
+ { SOCK_FLOAT, 0, "B"},
+ { SOCK_FLOAT, 0, "A"},
{ -1, 0, "" }
};
@@ -83,8 +83,8 @@ void register_node_type_cmp_seprgba(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_SEPRGBA, "Separate RGBA", NODE_CLASS_CONVERTOR, 0,
- cmp_node_seprgba_in, cmp_node_seprgba_out);
+ node_type_base(&ntype, CMP_NODE_SEPRGBA, "Separate RGBA", NODE_CLASS_CONVERTOR, 0);
+ node_type_socket_templates(&ntype, cmp_node_seprgba_in, cmp_node_seprgba_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_composit_exec_seprgba);
@@ -94,15 +94,15 @@ void register_node_type_cmp_seprgba(ListBase *lb)
/* **************** COMBINE RGBA ******************** */
-static bNodeSocketType cmp_node_combrgba_in[]= {
- { SOCK_VALUE, 1, "R", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "G", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "B", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_combrgba_in[]= {
+ { SOCK_FLOAT, 1, "R", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "G", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "B", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_combrgba_out[]= {
- { SOCK_RGBA, 0, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_combrgba_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -151,8 +151,8 @@ void register_node_type_cmp_combrgba(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_COMBRGBA, "Combine RGBA", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- cmp_node_combrgba_in, cmp_node_combrgba_out);
+ node_type_base(&ntype, CMP_NODE_COMBRGBA, "Combine RGBA", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_combrgba_in, cmp_node_combrgba_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_composit_exec_combrgba);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c
index 81591602dae..5e042f54fb0 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c
+++ b/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c
@@ -27,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c
+/** \file blender/nodes/composite/nodes/node_composite_sepcombYCCA.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** SEPARATE YCCA ******************** */
-static bNodeSocketType cmp_node_sepycca_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_sepycca_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_sepycca_out[]= {
- { SOCK_VALUE, 0, "Y", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Cb", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Cr", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "A", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_sepycca_out[]= {
+ { SOCK_FLOAT, 0, "Y"},
+ { SOCK_FLOAT, 0, "Cb"},
+ { SOCK_FLOAT, 0, "Cr"},
+ { SOCK_FLOAT, 0, "A"},
{ -1, 0, "" }
};
@@ -154,8 +154,8 @@ void register_node_type_cmp_sepycca(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_SEPYCCA, "Separate YCbCrA", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- cmp_node_sepycca_in, cmp_node_sepycca_out);
+ node_type_base(&ntype, CMP_NODE_SEPYCCA, "Separate YCbCrA", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_sepycca_in, cmp_node_sepycca_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_composit_exec_sepycca);
@@ -165,15 +165,15 @@ void register_node_type_cmp_sepycca(ListBase *lb)
/* **************** COMBINE YCCA ******************** */
-static bNodeSocketType cmp_node_combycca_in[]= {
- { SOCK_VALUE, 1, "Y", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Cb", 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Cr", 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_combycca_in[]= {
+ { SOCK_FLOAT, 1, "Y", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Cb", 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Cr", 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_combycca_out[]= {
- { SOCK_RGBA, 0, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_combycca_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -301,8 +301,8 @@ void register_node_type_cmp_combycca(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_COMBYCCA, "Combine YCbCrA", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- cmp_node_combycca_in, cmp_node_combycca_out);
+ node_type_base(&ntype, CMP_NODE_COMBYCCA, "Combine YCbCrA", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_combycca_in, cmp_node_combycca_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_composit_exec_combycca);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c
index 8687e307df3..70bc36a020d 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c
+++ b/source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c
@@ -27,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c
+/** \file blender/nodes/composite/nodes/node_composite_sepcombYUVA.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** SEPARATE YUVA ******************** */
-static bNodeSocketType cmp_node_sepyuva_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_sepyuva_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_sepyuva_out[]= {
- { SOCK_VALUE, 0, "Y", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "U", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "V", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "A", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_sepyuva_out[]= {
+ { SOCK_FLOAT, 0, "Y"},
+ { SOCK_FLOAT, 0, "U"},
+ { SOCK_FLOAT, 0, "V"},
+ { SOCK_FLOAT, 0, "A"},
{ -1, 0, "" }
};
@@ -105,8 +105,8 @@ void register_node_type_cmp_sepyuva(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_SEPYUVA, "Separate YUVA", NODE_CLASS_CONVERTOR, 0,
- cmp_node_sepyuva_in, cmp_node_sepyuva_out);
+ node_type_base(&ntype, CMP_NODE_SEPYUVA, "Separate YUVA", NODE_CLASS_CONVERTOR, 0);
+ node_type_socket_templates(&ntype, cmp_node_sepyuva_in, cmp_node_sepyuva_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_composit_exec_sepyuva);
@@ -116,15 +116,15 @@ void register_node_type_cmp_sepyuva(ListBase *lb)
/* **************** COMBINE YUVA ******************** */
-static bNodeSocketType cmp_node_combyuva_in[]= {
- { SOCK_VALUE, 1, "Y", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "U", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "V", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_combyuva_in[]= {
+ { SOCK_FLOAT, 1, "Y", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "U", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "V", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_combyuva_out[]= {
- { SOCK_RGBA, 0, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_combyuva_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -176,8 +176,8 @@ void register_node_type_cmp_combyuva(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_COMBYUVA, "Combine YUVA", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- cmp_node_combyuva_in, cmp_node_combyuva_out);
+ node_type_base(&ntype, CMP_NODE_COMBYUVA, "Combine YUVA", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_combyuva_in, cmp_node_combyuva_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_composit_exec_combyuva);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c b/source/blender/nodes/composite/nodes/node_composite_setalpha.c
index bb8533a79f6..8264d4d4dea 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c
+++ b/source/blender/nodes/composite/nodes/node_composite_setalpha.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_setalpha.c
+/** \file blender/nodes/composite/nodes/node_composite_setalpha.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** SET ALPHA ******************** */
-static bNodeSocketType cmp_node_setalpha_in[]= {
- { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_setalpha_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_setalpha_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_setalpha_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -79,8 +79,8 @@ void register_node_type_cmp_setalpha(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_SETALPHA, "Set Alpha", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- cmp_node_setalpha_in, cmp_node_setalpha_out);
+ node_type_base(&ntype, CMP_NODE_SETALPHA, "Set Alpha", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_setalpha_in, cmp_node_setalpha_out);
node_type_size(&ntype, 120, 40, 140);
node_type_exec(&ntype, node_composit_exec_setalpha);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c b/source/blender/nodes/composite/nodes/node_composite_splitViewer.c
index 13cb3bcfed5..e73caa542b7 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c
+++ b/source/blender/nodes/composite/nodes/node_composite_splitViewer.c
@@ -27,17 +27,17 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_splitViewer.c
+/** \file blender/nodes/composite/nodes/node_composite_splitViewer.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** SPLIT VIEWER ******************** */
-static bNodeSocketType cmp_node_splitviewer_in[]= {
- { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_splitviewer_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
@@ -141,7 +141,7 @@ static void node_composit_exec_splitviewer(void *data, bNode *node, bNodeStack *
}
}
-static void node_composit_init_splitviewer(bNode* node)
+static void node_composit_init_splitviewer(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user");
node->storage= iuser;
@@ -155,8 +155,8 @@ void register_node_type_cmp_splitviewer(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_SPLITVIEWER, "SplitViewer", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS,
- cmp_node_splitviewer_in, NULL);
+ node_type_base(&ntype, CMP_NODE_SPLITVIEWER, "SplitViewer", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_splitviewer_in, NULL);
node_type_size(&ntype, 140, 100, 320);
node_type_init(&ntype, node_composit_init_splitviewer);
node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_texture.c b/source/blender/nodes/composite/nodes/node_composite_texture.c
index 46e71b8b8e5..1dbbd56d2f1 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_texture.c
+++ b/source/blender/nodes/composite/nodes/node_composite_texture.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_texture.c
+/** \file blender/nodes/composite/nodes/node_composite_texture.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** TEXTURE ******************** */
-static bNodeSocketType cmp_node_texture_in[]= {
- { SOCK_VECTOR, 1, "Offset", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f},
- { SOCK_VECTOR, 1, "Scale", 1.0f, 1.0f, 1.0f, 1.0f, -10.0f, 10.0f},
+static bNodeSocketTemplate cmp_node_texture_in[]= {
+ { SOCK_VECTOR, 1, "Offset", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f, PROP_TRANSLATION},
+ { SOCK_VECTOR, 1, "Scale", 1.0f, 1.0f, 1.0f, 1.0f, -10.0f, 10.0f, PROP_XYZ},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_texture_out[]= {
- { SOCK_VALUE, 0, "Value", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA , 0, "Color", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_texture_out[]= {
+ { SOCK_FLOAT, 0, "Value"},
+ { SOCK_RGBA , 0, "Color"},
{ -1, 0, "" }
};
@@ -148,8 +148,8 @@ void register_node_type_cmp_texture(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
- cmp_node_texture_in, cmp_node_texture_out);
+ node_type_base(&ntype, CMP_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW);
+ node_type_socket_templates(&ntype, cmp_node_texture_in, cmp_node_texture_out);
node_type_size(&ntype, 120, 80, 240);
node_type_exec(&ntype, node_composit_exec_texture);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c b/source/blender/nodes/composite/nodes/node_composite_tonemap.c
index f15811ec790..ba2dc9c5c79 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c
+++ b/source/blender/nodes/composite/nodes/node_composite_tonemap.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,19 +27,19 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_tonemap.c
+/** \file blender/nodes/composite/nodes/node_composite_tonemap.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
-static bNodeSocketType cmp_node_tonemap_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_tonemap_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_tonemap_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_tonemap_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -147,7 +148,7 @@ static void node_composit_exec_tonemap(void *UNUSED(data), bNode *node, bNodeSta
free_compbuf(img);
}
-static void node_composit_init_tonemap(bNode* node)
+static void node_composit_init_tonemap(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeTonemap *ntm = MEM_callocN(sizeof(NodeTonemap), "node tonemap data");
ntm->type = 1;
@@ -167,8 +168,8 @@ void register_node_type_cmp_tonemap(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_TONEMAP, "Tonemap", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- cmp_node_tonemap_in, cmp_node_tonemap_out);
+ node_type_base(&ntype, CMP_NODE_TONEMAP, "Tonemap", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_tonemap_in, cmp_node_tonemap_out);
node_type_size(&ntype, 150, 120, 200);
node_type_init(&ntype, node_composit_init_tonemap);
node_type_storage(&ntype, "NodeTonemap", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_translate.c b/source/blender/nodes/composite/nodes/node_composite_translate.c
index eb69523e7a9..872667a4e17 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_translate.c
+++ b/source/blender/nodes/composite/nodes/node_composite_translate.c
@@ -27,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_translate.c
+/** \file blender/nodes/composite/nodes/node_composite_translate.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Translate ******************** */
-static bNodeSocketType cmp_node_translate_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "X", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f},
- { SOCK_VALUE, 1, "Y", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f},
+static bNodeSocketTemplate cmp_node_translate_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "X", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Y", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_translate_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_translate_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -65,8 +65,8 @@ void register_node_type_cmp_translate(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_TRANSLATE, "Translate", NODE_CLASS_DISTORT, NODE_OPTIONS,
- cmp_node_translate_in, cmp_node_translate_out);
+ node_type_base(&ntype, CMP_NODE_TRANSLATE, "Translate", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_translate_in, cmp_node_translate_out);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, node_composit_exec_translate);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c b/source/blender/nodes/composite/nodes/node_composite_valToRgb.c
index 1e1c8c61b46..edd315e5a92 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c
+++ b/source/blender/nodes/composite/nodes/node_composite_valToRgb.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_valToRgb.c
+/** \file blender/nodes/composite/nodes/node_composite_valToRgb.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** VALTORGB ******************** */
-static bNodeSocketType cmp_node_valtorgb_in[]= {
- { SOCK_VALUE, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_valtorgb_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_valtorgb_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_valtorgb_out[]= {
+ { SOCK_RGBA, 0, "Image"},
+ { SOCK_FLOAT, 0, "Alpha"},
{ -1, 0, "" }
};
@@ -80,7 +80,7 @@ static void node_composit_exec_valtorgb(void *UNUSED(data), bNode *node, bNodeSt
}
}
-static void node_composit_init_valtorgb(bNode* node)
+static void node_composit_init_valtorgb(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= add_colorband(1);
}
@@ -89,8 +89,8 @@ void register_node_type_cmp_valtorgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- cmp_node_valtorgb_in, cmp_node_valtorgb_out);
+ node_type_base(&ntype, CMP_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_valtorgb_in, cmp_node_valtorgb_out);
node_type_size(&ntype, 240, 200, 300);
node_type_init(&ntype, node_composit_init_valtorgb);
node_type_storage(&ntype, "ColorBand", node_free_standard_storage, node_copy_standard_storage);
@@ -102,12 +102,12 @@ void register_node_type_cmp_valtorgb(ListBase *lb)
/* **************** RGBTOBW ******************** */
-static bNodeSocketType cmp_node_rgbtobw_in[]= {
+static bNodeSocketTemplate cmp_node_rgbtobw_in[]= {
{ SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_rgbtobw_out[]= {
- { SOCK_VALUE, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_rgbtobw_out[]= {
+ { SOCK_FLOAT, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
@@ -143,8 +143,8 @@ void register_node_type_cmp_rgbtobw(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0,
- cmp_node_rgbtobw_in, cmp_node_rgbtobw_out);
+ node_type_base(&ntype, CMP_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0);
+ node_type_socket_templates(&ntype, cmp_node_rgbtobw_in, cmp_node_rgbtobw_out);
node_type_size(&ntype, 80, 40, 120);
node_type_exec(&ntype, node_composit_exec_rgbtobw);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_value.c b/source/blender/nodes/composite/nodes/node_composite_value.c
index 46762065bb4..ed650477f50 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_value.c
+++ b/source/blender/nodes/composite/nodes/node_composite_value.c
@@ -27,32 +27,45 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_value.c
+/** \file blender/nodes/composite/nodes/node_composite_value.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** VALUE ******************** */
-static bNodeSocketType cmp_node_value_out[]= {
- { SOCK_VALUE, 0, "Value", 0.5f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f},
+static bNodeSocketTemplate cmp_node_value_out[]= {
+ /* XXX value nodes use the output sockets for buttons, so we need explicit limits here! */
+ { SOCK_FLOAT, 0, "Value", 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX},
{ -1, 0, "" }
};
+static void node_composit_init_value(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp))
+{
+ bNodeSocket *sock= node->outputs.first;
+ bNodeSocketValueFloat *dval= (bNodeSocketValueFloat*)sock->default_value;
+ /* uses the default value of the output socket, must be initialized here */
+ dval->value = 0.5f;
+ dval->min = -FLT_MAX;
+ dval->max = FLT_MAX;
+}
+
static void node_composit_exec_value(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
+ float val= ((bNodeSocketValueFloat*)sock->default_value)->value;
- out[0]->vec[0]= sock->ns.vec[0];
+ out[0]->vec[0]= val;
}
void register_node_type_cmp_value(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_VALUE, "Value", NODE_CLASS_INPUT, NODE_OPTIONS,
- NULL, cmp_node_value_out);
+ node_type_base(&ntype, CMP_NODE_VALUE, "Value", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, cmp_node_value_out);
+ node_type_init(&ntype, node_composit_init_value);
node_type_size(&ntype, 80, 40, 120);
node_type_exec(&ntype, node_composit_exec_value);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c b/source/blender/nodes/composite/nodes/node_composite_vecBlur.c
index c43bfa2435a..26fcffa93ac 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c
+++ b/source/blender/nodes/composite/nodes/node_composite_vecBlur.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_vecBlur.c
+/** \file blender/nodes/composite/nodes/node_composite_vecBlur.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** VECTOR BLUR ******************** */
-static bNodeSocketType cmp_node_vecblur_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Z", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 1, "Speed", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_vecblur_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "Z", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_VECTOR, 1, "Speed", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_VELOCITY},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_vecblur_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_vecblur_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -87,7 +87,7 @@ static void node_composit_exec_vecblur(void *UNUSED(data), bNode *node, bNodeSta
free_compbuf(img);
}
-static void node_composit_init_vecblur(bNode* node)
+static void node_composit_init_vecblur(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
NodeBlurData *nbd= MEM_callocN(sizeof(NodeBlurData), "node blur data");
node->storage= nbd;
@@ -100,8 +100,8 @@ void register_node_type_cmp_vecblur(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_VECBLUR, "Vector Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- cmp_node_vecblur_in, cmp_node_vecblur_out);
+ node_type_base(&ntype, CMP_NODE_VECBLUR, "Vector Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_vecblur_in, cmp_node_vecblur_out);
node_type_size(&ntype, 120, 80, 200);
node_type_init(&ntype, node_composit_init_vecblur);
node_type_storage(&ntype, "NodeBlurData", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c b/source/blender/nodes/composite/nodes/node_composite_viewer.c
index c4e719efbf9..8b052c5db35 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c
+++ b/source/blender/nodes/composite/nodes/node_composite_viewer.c
@@ -27,19 +27,19 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_viewer.c
+/** \file blender/nodes/composite/nodes/node_composite_viewer.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** VIEWER ******************** */
-static bNodeSocketType cmp_node_viewer_in[]= {
- { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Z", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate cmp_node_viewer_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Z", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
@@ -124,7 +124,7 @@ static void node_composit_exec_viewer(void *data, bNode *node, bNodeStack **in,
}
}
-static void node_composit_init_viewer(bNode* node)
+static void node_composit_init_viewer(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user");
node->storage= iuser;
@@ -137,8 +137,8 @@ void register_node_type_cmp_viewer(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_VIEWER, "Viewer", NODE_CLASS_OUTPUT, NODE_PREVIEW,
- cmp_node_viewer_in, NULL);
+ node_type_base(&ntype, CMP_NODE_VIEWER, "Viewer", NODE_CLASS_OUTPUT, NODE_PREVIEW);
+ node_type_socket_templates(&ntype, cmp_node_viewer_in, NULL);
node_type_size(&ntype, 80, 60, 200);
node_type_init(&ntype, node_composit_init_viewer);
node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage);
@@ -146,5 +146,3 @@ void register_node_type_cmp_viewer(ListBase *lb)
nodeRegisterType(lb, &ntype);
}
-
-
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c b/source/blender/nodes/composite/nodes/node_composite_zcombine.c
index 0fae0fcd4d5..220b770198a 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c
+++ b/source/blender/nodes/composite/nodes/node_composite_zcombine.c
@@ -27,26 +27,26 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/CMP_nodes/CMP_zcombine.c
+/** \file blender/nodes/composite/nodes/node_composite_zcombine.c
* \ingroup cmpnodes
*/
-#include "../CMP_util.h"
+#include "node_composite_util.h"
/* **************** Z COMBINE ******************** */
/* lazy coder note: node->custom2 is abused to send signal */
-static bNodeSocketType cmp_node_zcombine_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 10000.0f},
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 10000.0f},
+static bNodeSocketTemplate cmp_node_zcombine_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 10000.0f, PROP_NONE},
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 10000.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType cmp_node_zcombine_out[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 10000.0f},
+static bNodeSocketTemplate cmp_node_zcombine_out[]= {
+ { SOCK_RGBA, 0, "Image"},
+ { SOCK_FLOAT, 0, "Z"},
{ -1, 0, "" }
};
@@ -228,8 +228,8 @@ void register_node_type_cmp_zcombine(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, CMP_NODE_ZCOMBINE, "Z Combine", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- cmp_node_zcombine_in, cmp_node_zcombine_out);
+ node_type_base(&ntype, CMP_NODE_ZCOMBINE, "Z Combine", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, cmp_node_zcombine_in, cmp_node_zcombine_out);
node_type_size(&ntype, 80, 40, 120);
node_type_exec(&ntype, node_composit_exec_zcombine);
diff --git a/source/blender/nodes/intern/SHD_util.c b/source/blender/nodes/intern/SHD_util.c
deleted file mode 100644
index 190f68ce19a..00000000000
--- a/source/blender/nodes/intern/SHD_util.c
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 LICENSE BLOCK *****
- */
-
-/** \file blender/nodes/intern/SHD_util.c
- * \ingroup nodes
- */
-
-
-#include "SHD_util.h"
-
-
-
-
-
-/* ****** */
-
-void nodestack_get_vec(float *in, short type_in, bNodeStack *ns)
-{
- float *from= ns->vec;
-
- if(type_in==SOCK_VALUE) {
- if(ns->sockettype==SOCK_VALUE)
- *in= *from;
- else
- *in= 0.333333f*(from[0]+from[1]+from[2]);
- }
- else if(type_in==SOCK_VECTOR) {
- if(ns->sockettype==SOCK_VALUE) {
- in[0]= from[0];
- in[1]= from[0];
- in[2]= from[0];
- }
- else {
- VECCOPY(in, from);
- }
- }
- else { /* type_in==SOCK_RGBA */
- if(ns->sockettype==SOCK_RGBA) {
- QUATCOPY(in, from);
- }
- else if(ns->sockettype==SOCK_VALUE) {
- in[0]= from[0];
- in[1]= from[0];
- in[2]= from[0];
- in[3]= 1.0f;
- }
- else {
- VECCOPY(in, from);
- in[3]= 1.0f;
- }
- }
-}
-
-
-/* ******************* execute and parse ************ */
-
-void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr)
-{
- ShaderCallData scd;
- /*
- @note: preserve material from ShadeInput for material id, nodetree execs change it
- fix for bug "[#28012] Mat ID messy with shader nodes"
- */
- Material *mat = shi->mat;
- /* convert caller data to struct */
- scd.shi= shi;
- scd.shr= shr;
-
- /* each material node has own local shaderesult, with optional copying */
- memset(shr, 0, sizeof(ShadeResult));
-
- ntreeExecTree(ntree, &scd, shi->thread); /* threads */
- // @note: set material back to preserved material
- shi->mat = mat;
- /* better not allow negative for now */
- if(shr->combined[0]<0.0f) shr->combined[0]= 0.0f;
- if(shr->combined[1]<0.0f) shr->combined[1]= 0.0f;
- if(shr->combined[2]<0.0f) shr->combined[2]= 0.0f;
-
-}
-
-/* go over all used Geometry and Texture nodes, and return a texco flag */
-/* no group inside needed, this function is called for groups too */
-void ntreeShaderGetTexcoMode(bNodeTree *ntree, int r_mode, short *texco, int *mode)
-{
- bNode *node;
- bNodeSocket *sock;
- int a;
-
- ntreeSocketUseFlags(ntree);
-
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->type==SH_NODE_TEXTURE) {
- if((r_mode & R_OSA) && node->id) {
- Tex *tex= (Tex *)node->id;
- if ELEM3(tex->type, TEX_IMAGE, TEX_PLUGIN, TEX_ENVMAP)
- *texco |= TEXCO_OSA|NEED_UV;
- }
- /* usability exception... without input we still give the node orcos */
- sock= node->inputs.first;
- if(sock==NULL || sock->link==NULL)
- *texco |= TEXCO_ORCO|NEED_UV;
- }
- else if(node->type==SH_NODE_GEOMETRY) {
- /* note; sockets always exist for the given type! */
- for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) {
- if(sock->flag & SOCK_IN_USE) {
- switch(a) {
- case GEOM_OUT_GLOB:
- *texco |= TEXCO_GLOB|NEED_UV; break;
- case GEOM_OUT_VIEW:
- *texco |= TEXCO_VIEW|NEED_UV; break;
- case GEOM_OUT_ORCO:
- *texco |= TEXCO_ORCO|NEED_UV; break;
- case GEOM_OUT_UV:
- *texco |= TEXCO_UV|NEED_UV; break;
- case GEOM_OUT_NORMAL:
- *texco |= TEXCO_NORM|NEED_UV; break;
- case GEOM_OUT_VCOL:
- *texco |= NEED_UV; *mode |= MA_VERTEXCOL; break;
- }
- }
- }
- }
- }
-}
-
-/* nodes that use ID data get synced with local data */
-void nodeShaderSynchronizeID(bNode *node, int copyto)
-{
- if(node->id==NULL) return;
-
- if(ELEM(node->type, SH_NODE_MATERIAL, SH_NODE_MATERIAL_EXT)) {
- bNodeSocket *sock;
- Material *ma= (Material *)node->id;
- int a;
-
- /* hrmf, case in loop isnt super fast, but we dont edit 100s of material at same time either! */
- for(a=0, sock= node->inputs.first; sock; sock= sock->next, a++) {
- if(!(sock->flag & SOCK_HIDDEN)) {
- if(copyto) {
- switch(a) {
- case MAT_IN_COLOR:
- VECCOPY(&ma->r, sock->ns.vec); break;
- case MAT_IN_SPEC:
- VECCOPY(&ma->specr, sock->ns.vec); break;
- case MAT_IN_REFL:
- ma->ref= sock->ns.vec[0]; break;
- case MAT_IN_MIR:
- VECCOPY(&ma->mirr, sock->ns.vec); break;
- case MAT_IN_AMB:
- ma->amb= sock->ns.vec[0]; break;
- case MAT_IN_EMIT:
- ma->emit= sock->ns.vec[0]; break;
- case MAT_IN_SPECTRA:
- ma->spectra= sock->ns.vec[0]; break;
- case MAT_IN_RAY_MIRROR:
- ma->ray_mirror= sock->ns.vec[0]; break;
- case MAT_IN_ALPHA:
- ma->alpha= sock->ns.vec[0]; break;
- case MAT_IN_TRANSLUCENCY:
- ma->translucency= sock->ns.vec[0]; break;
- }
- }
- else {
- switch(a) {
- case MAT_IN_COLOR:
- VECCOPY(sock->ns.vec, &ma->r); break;
- case MAT_IN_SPEC:
- VECCOPY(sock->ns.vec, &ma->specr); break;
- case MAT_IN_REFL:
- sock->ns.vec[0]= ma->ref; break;
- case MAT_IN_MIR:
- VECCOPY(sock->ns.vec, &ma->mirr); break;
- case MAT_IN_AMB:
- sock->ns.vec[0]= ma->amb; break;
- case MAT_IN_EMIT:
- sock->ns.vec[0]= ma->emit; break;
- case MAT_IN_SPECTRA:
- sock->ns.vec[0]= ma->spectra; break;
- case MAT_IN_RAY_MIRROR:
- sock->ns.vec[0]= ma->ray_mirror; break;
- case MAT_IN_ALPHA:
- sock->ns.vec[0]= ma->alpha; break;
- case MAT_IN_TRANSLUCENCY:
- sock->ns.vec[0]= ma->translucency; break;
- }
- }
- }
- }
- }
-
-}
diff --git a/source/blender/nodes/intern/node_common.c b/source/blender/nodes/intern/node_common.c
new file mode 100644
index 00000000000..d7830b6a260
--- /dev/null
+++ b/source/blender/nodes/intern/node_common.c
@@ -0,0 +1,983 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Lukas Toenne.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/intern/node_common.c
+ * \ingroup nodes
+ */
+
+
+#include <string.h>
+
+#include "DNA_action_types.h"
+#include "DNA_anim_types.h"
+#include "DNA_node_types.h"
+
+#include "BLI_listbase.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_action.h"
+#include "BKE_animsys.h"
+#include "BKE_global.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
+#include "BLI_math.h"
+#include "BKE_node.h"
+#include "BKE_utildefines.h"
+
+#include "RNA_access.h"
+#include "RNA_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "node_common.h"
+#include "node_exec.h"
+#include "NOD_socket.h"
+
+/**** Group ****/
+
+bNodeSocket *node_group_find_input(bNode *gnode, bNodeSocket *gsock)
+{
+ bNodeSocket *sock;
+ for (sock=gnode->inputs.first; sock; sock=sock->next)
+ if (sock->groupsock == gsock)
+ return sock;
+ return NULL;
+}
+
+bNodeSocket *node_group_find_output(bNode *gnode, bNodeSocket *gsock)
+{
+ bNodeSocket *sock;
+ for (sock=gnode->outputs.first; sock; sock=sock->next)
+ if (sock->groupsock == gsock)
+ return sock;
+ return NULL;
+}
+
+bNodeSocket *node_group_add_extern_socket(bNodeTree *UNUSED(ntree), ListBase *lb, int in_out, bNodeSocket *gsock)
+{
+ bNodeSocket *sock;
+
+ if (gsock->flag & SOCK_INTERNAL)
+ return NULL;
+
+ sock= MEM_callocN(sizeof(bNodeSocket), "sock");
+
+ /* make a copy of the group socket */
+ *sock = *gsock;
+ sock->link = NULL;
+ sock->next = sock->prev = NULL;
+ sock->new_sock = NULL;
+
+ /* group sockets are dynamically added */
+ sock->flag |= SOCK_DYNAMIC;
+
+ sock->own_index = gsock->own_index;
+ sock->groupsock = gsock;
+ sock->limit = (in_out==SOCK_IN ? 1 : 0xFFF);
+
+ if (gsock->default_value)
+ sock->default_value = MEM_dupallocN(gsock->default_value);
+
+ if(lb)
+ BLI_addtail(lb, sock);
+
+ return sock;
+}
+
+bNode *node_group_make_from_selected(bNodeTree *ntree)
+{
+ bNodeLink *link, *linkn;
+ bNode *node, *gnode, *nextn;
+ bNodeTree *ngroup;
+ bNodeSocket *gsock;
+ ListBase anim_basepaths = {NULL, NULL};
+ float min[2], max[2];
+ int totnode=0;
+ bNodeTemplate ntemp;
+
+ INIT_MINMAX2(min, max);
+
+ /* is there something to group? also do some clearing */
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->flag & NODE_SELECT) {
+ /* no groups in groups */
+ if(node->type==NODE_GROUP)
+ return NULL;
+ DO_MINMAX2( (&node->locx), min, max);
+ totnode++;
+ }
+ node->done= 0;
+ }
+ if(totnode==0) return NULL;
+
+ /* check if all connections are OK, no unselected node has both
+ inputs and outputs to a selection */
+ for(link= ntree->links.first; link; link= link->next) {
+ if(link->fromnode && link->tonode && link->fromnode->flag & NODE_SELECT)
+ link->tonode->done |= 1;
+ if(link->fromnode && link->tonode && link->tonode->flag & NODE_SELECT)
+ link->fromnode->done |= 2;
+ }
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if((node->flag & NODE_SELECT)==0)
+ if(node->done==3)
+ break;
+ }
+ if(node)
+ return NULL;
+
+ /* OK! new nodetree */
+ ngroup= ntreeAddTree("NodeGroup", ntree->type, NODE_GROUP);
+
+ /* move nodes over */
+ for(node= ntree->nodes.first; node; node= nextn) {
+ nextn= node->next;
+ if(node->flag & NODE_SELECT) {
+ /* keep track of this node's RNA "base" path (the part of the pat identifying the node)
+ * if the old nodetree has animation data which potentially covers this node
+ */
+ if (ntree->adt) {
+ PointerRNA ptr;
+ char *path;
+
+ RNA_pointer_create(&ntree->id, &RNA_Node, node, &ptr);
+ path = RNA_path_from_ID_to_struct(&ptr);
+
+ if (path)
+ BLI_addtail(&anim_basepaths, BLI_genericNodeN(path));
+ }
+
+ /* change node-collection membership */
+ BLI_remlink(&ntree->nodes, node);
+ BLI_addtail(&ngroup->nodes, node);
+
+ node->locx-= 0.5f*(min[0]+max[0]);
+ node->locy-= 0.5f*(min[1]+max[1]);
+ }
+ }
+
+ /* move animation data over */
+ if (ntree->adt) {
+ LinkData *ld, *ldn=NULL;
+
+ BKE_animdata_separate_by_basepath(&ntree->id, &ngroup->id, &anim_basepaths);
+
+ /* paths + their wrappers need to be freed */
+ for (ld = anim_basepaths.first; ld; ld = ldn) {
+ ldn = ld->next;
+
+ MEM_freeN(ld->data);
+ BLI_freelinkN(&anim_basepaths, ld);
+ }
+ }
+
+ /* make group node */
+ ntemp.type = NODE_GROUP;
+ ntemp.ngroup = ngroup;
+ gnode= nodeAddNode(ntree, &ntemp);
+ gnode->locx= 0.5f*(min[0]+max[0]);
+ gnode->locy= 0.5f*(min[1]+max[1]);
+
+ /* relink external sockets */
+ for(link= ntree->links.first; link; link= linkn) {
+ linkn= link->next;
+
+ if(link->fromnode && link->tonode && (link->fromnode->flag & link->tonode->flag & NODE_SELECT)) {
+ BLI_remlink(&ntree->links, link);
+ BLI_addtail(&ngroup->links, link);
+ }
+ else if(link->tonode && (link->tonode->flag & NODE_SELECT)) {
+ gsock = node_group_expose_socket(ngroup, link->tosock, SOCK_IN);
+ link->tosock->link = nodeAddLink(ngroup, NULL, gsock, link->tonode, link->tosock);
+ link->tosock = node_group_add_extern_socket(ntree, &gnode->inputs, SOCK_IN, gsock);
+ link->tonode = gnode;
+ }
+ else if(link->fromnode && (link->fromnode->flag & NODE_SELECT)) {
+ /* search for existing group node socket */
+ for (gsock=ngroup->outputs.first; gsock; gsock=gsock->next)
+ if (gsock->link && gsock->link->fromsock==link->fromsock)
+ break;
+ if (!gsock) {
+ gsock = node_group_expose_socket(ngroup, link->fromsock, SOCK_OUT);
+ gsock->link = nodeAddLink(ngroup, link->fromnode, link->fromsock, NULL, gsock);
+ link->fromsock = node_group_add_extern_socket(ntree, &gnode->outputs, SOCK_OUT, gsock);
+ }
+ else
+ link->fromsock = node_group_find_output(gnode, gsock);
+ link->fromnode = gnode;
+ }
+ }
+
+ ngroup->update |= NTREE_UPDATE;
+ ntreeUpdateTree(ngroup);
+ ntree->update |= NTREE_UPDATE_NODES|NTREE_UPDATE_LINKS;
+ ntreeUpdateTree(ntree);
+
+ return gnode;
+}
+
+/* XXX This is a makeshift function to have useful initial group socket values.
+ * In the end this should be implemented by a flexible socket data conversion system,
+ * which is yet to be implemented. The idea is that beside default standard conversions,
+ * such as int-to-float, it should be possible to quickly select a conversion method or
+ * a chain of conversions for each input, whenever there is more than one option.
+ * E.g. a vector-to-float conversion could use either of the x/y/z components or
+ * the vector length.
+ *
+ * In the interface this could be implemented by a pseudo-script textbox on linked inputs,
+ * with quick selection from a predefined list of conversion options. Some Examples:
+ * - vector component 'z' (vector->float): "z"
+ * - greyscale color (float->color): "grey"
+ * - color luminance (color->float): "lum"
+ * - matrix column 2 length (matrix->vector->float): "col[1].len"
+ * - mesh vertex coordinate 'y' (mesh->vertex->vector->float): "vertex.co.y"
+ *
+ * The actual conversion is then done by a series of conversion functions,
+ * which are defined in the socket type structs.
+ */
+static void convert_socket_value(bNodeSocket *from, bNodeSocket *to)
+{
+ /* XXX only one of these pointers is valid! just putting them here for convenience */
+ bNodeSocketValueFloat *fromfloat= (bNodeSocketValueFloat*)from->default_value;
+ bNodeSocketValueInt *fromint= (bNodeSocketValueInt*)from->default_value;
+ bNodeSocketValueBoolean *frombool= (bNodeSocketValueBoolean*)from->default_value;
+ bNodeSocketValueVector *fromvector= (bNodeSocketValueVector*)from->default_value;
+ bNodeSocketValueRGBA *fromrgba= (bNodeSocketValueRGBA*)from->default_value;
+
+ bNodeSocketValueFloat *tofloat= (bNodeSocketValueFloat*)to->default_value;
+ bNodeSocketValueInt *toint= (bNodeSocketValueInt*)to->default_value;
+ bNodeSocketValueBoolean *tobool= (bNodeSocketValueBoolean*)to->default_value;
+ bNodeSocketValueVector *tovector= (bNodeSocketValueVector*)to->default_value;
+ bNodeSocketValueRGBA *torgba= (bNodeSocketValueRGBA*)to->default_value;
+
+ switch (from->type) {
+ case SOCK_FLOAT:
+ switch (to->type) {
+ case SOCK_FLOAT:
+ tofloat->value = fromfloat->value;
+ break;
+ case SOCK_INT:
+ toint->value = (int)fromfloat->value;
+ break;
+ case SOCK_BOOLEAN:
+ tobool->value = (fromfloat->value > 0.0f);
+ break;
+ case SOCK_VECTOR:
+ tovector->value[0] = tovector->value[1] = tovector->value[2] = fromfloat->value;
+ break;
+ case SOCK_RGBA:
+ torgba->value[0] = torgba->value[1] = torgba->value[2] = torgba->value[3] = fromfloat->value;
+ break;
+ }
+ break;
+ case SOCK_INT:
+ switch (to->type) {
+ case SOCK_FLOAT:
+ tofloat->value = (float)fromint->value;
+ break;
+ case SOCK_INT:
+ toint->value = fromint->value;
+ break;
+ case SOCK_BOOLEAN:
+ tobool->value = (fromint->value > 0);
+ break;
+ case SOCK_VECTOR:
+ tovector->value[0] = tovector->value[1] = tovector->value[2] = (float)fromint->value;
+ break;
+ case SOCK_RGBA:
+ torgba->value[0] = torgba->value[1] = torgba->value[2] = torgba->value[3] = (float)fromint->value;
+ break;
+ }
+ break;
+ case SOCK_BOOLEAN:
+ switch (to->type) {
+ case SOCK_FLOAT:
+ tofloat->value = (float)frombool->value;
+ break;
+ case SOCK_INT:
+ toint->value = (int)frombool->value;
+ break;
+ case SOCK_BOOLEAN:
+ tobool->value = frombool->value;
+ break;
+ case SOCK_VECTOR:
+ tovector->value[0] = tovector->value[1] = tovector->value[2] = (float)frombool->value;
+ break;
+ case SOCK_RGBA:
+ torgba->value[0] = torgba->value[1] = torgba->value[2] = torgba->value[3] = (float)frombool->value;
+ break;
+ }
+ break;
+ case SOCK_VECTOR:
+ switch (to->type) {
+ case SOCK_FLOAT:
+ tofloat->value = fromvector->value[0];
+ break;
+ case SOCK_INT:
+ toint->value = (int)fromvector->value[0];
+ break;
+ case SOCK_BOOLEAN:
+ tobool->value = (fromvector->value[0] > 0.0f);
+ break;
+ case SOCK_VECTOR:
+ copy_v3_v3(tovector->value, fromvector->value);
+ break;
+ case SOCK_RGBA:
+ copy_v3_v3(torgba->value, fromvector->value);
+ torgba->value[3] = 1.0f;
+ break;
+ }
+ break;
+ case SOCK_RGBA:
+ switch (to->type) {
+ case SOCK_FLOAT:
+ tofloat->value = fromrgba->value[0];
+ break;
+ case SOCK_INT:
+ toint->value = (int)fromrgba->value[0];
+ break;
+ case SOCK_BOOLEAN:
+ tobool->value = (fromrgba->value[0] > 0.0f);
+ break;
+ case SOCK_VECTOR:
+ copy_v3_v3(tovector->value, fromrgba->value);
+ break;
+ case SOCK_RGBA:
+ copy_v4_v4(torgba->value, fromrgba->value);
+ break;
+ }
+ break;
+ }
+}
+
+static void copy_socket_value(bNodeSocket *from, bNodeSocket *to)
+{
+ /* XXX only one of these pointers is valid! just putting them here for convenience */
+ bNodeSocketValueFloat *fromfloat= (bNodeSocketValueFloat*)from->default_value;
+ bNodeSocketValueInt *fromint= (bNodeSocketValueInt*)from->default_value;
+ bNodeSocketValueBoolean *frombool= (bNodeSocketValueBoolean*)from->default_value;
+ bNodeSocketValueVector *fromvector= (bNodeSocketValueVector*)from->default_value;
+ bNodeSocketValueRGBA *fromrgba= (bNodeSocketValueRGBA*)from->default_value;
+
+ bNodeSocketValueFloat *tofloat= (bNodeSocketValueFloat*)to->default_value;
+ bNodeSocketValueInt *toint= (bNodeSocketValueInt*)to->default_value;
+ bNodeSocketValueBoolean *tobool= (bNodeSocketValueBoolean*)to->default_value;
+ bNodeSocketValueVector *tovector= (bNodeSocketValueVector*)to->default_value;
+ bNodeSocketValueRGBA *torgba= (bNodeSocketValueRGBA*)to->default_value;
+
+ if (from->type != to->type)
+ return;
+
+ switch (from->type) {
+ case SOCK_FLOAT:
+ *tofloat = *fromfloat;
+ break;
+ case SOCK_INT:
+ *toint = *fromint;
+ break;
+ case SOCK_BOOLEAN:
+ *tobool = *frombool;
+ break;
+ case SOCK_VECTOR:
+ *tovector = *fromvector;
+ break;
+ case SOCK_RGBA:
+ *torgba = *fromrgba;
+ break;
+ }
+}
+
+/* returns 1 if its OK */
+int node_group_ungroup(bNodeTree *ntree, bNode *gnode)
+{
+ bNodeLink *link, *linkn;
+ bNode *node, *nextn;
+ bNodeTree *ngroup, *wgroup;
+ ListBase anim_basepaths = {NULL, NULL};
+
+ ngroup= (bNodeTree *)gnode->id;
+ if(ngroup==NULL) return 0;
+
+ /* clear new pointers, set in copytree */
+ for(node= ntree->nodes.first; node; node= node->next)
+ node->new_node= NULL;
+
+ /* wgroup is a temporary copy of the NodeTree we're merging in
+ * - all of wgroup's nodes are transferred across to their new home
+ * - ngroup (i.e. the source NodeTree) is left unscathed
+ */
+ wgroup= ntreeCopyTree(ngroup);
+
+ /* add the nodes into the ntree */
+ for(node= wgroup->nodes.first; node; node= nextn) {
+ nextn= node->next;
+
+ /* keep track of this node's RNA "base" path (the part of the pat identifying the node)
+ * if the old nodetree has animation data which potentially covers this node
+ */
+ if (wgroup->adt) {
+ PointerRNA ptr;
+ char *path;
+
+ RNA_pointer_create(&wgroup->id, &RNA_Node, node, &ptr);
+ path = RNA_path_from_ID_to_struct(&ptr);
+
+ if (path)
+ BLI_addtail(&anim_basepaths, BLI_genericNodeN(path));
+ }
+
+ /* migrate node */
+ BLI_remlink(&wgroup->nodes, node);
+ BLI_addtail(&ntree->nodes, node);
+
+ node->locx+= gnode->locx;
+ node->locy+= gnode->locy;
+
+ node->flag |= NODE_SELECT;
+ }
+
+ /* restore external links to and from the gnode */
+ for(link= ntree->links.first; link; link= link->next) {
+ if (link->fromnode==gnode) {
+ if (link->fromsock->groupsock) {
+ bNodeSocket *gsock= link->fromsock->groupsock;
+ if (gsock->link) {
+ if (gsock->link->fromnode) {
+ /* NB: using the new internal copies here! the groupsock pointer still maps to the old tree */
+ link->fromnode = (gsock->link->fromnode ? gsock->link->fromnode->new_node : NULL);
+ link->fromsock = gsock->link->fromsock->new_sock;
+ }
+ else {
+ /* group output directly maps to group input */
+ bNodeSocket *insock= node_group_find_input(gnode, gsock->link->fromsock);
+ if (insock->link) {
+ link->fromnode = insock->link->fromnode;
+ link->fromsock = insock->link->fromsock;
+ }
+ }
+ }
+ else {
+ /* copy the default input value from the group socket default to the external socket */
+ convert_socket_value(gsock, link->tosock);
+ }
+ }
+ }
+ }
+ /* remove internal output links, these are not used anymore */
+ for(link=wgroup->links.first; link; link= linkn) {
+ linkn = link->next;
+ if (!link->tonode)
+ nodeRemLink(wgroup, link);
+ }
+ /* restore links from internal nodes */
+ for(link= wgroup->links.first; link; link= link->next) {
+ /* indicates link to group input */
+ if (!link->fromnode) {
+ /* NB: can't use find_group_node_input here,
+ * because gnode sockets still point to the old tree!
+ */
+ bNodeSocket *insock;
+ for (insock= gnode->inputs.first; insock; insock= insock->next)
+ if (insock->groupsock->new_sock == link->fromsock)
+ break;
+ if (insock->link) {
+ link->fromnode = insock->link->fromnode;
+ link->fromsock = insock->link->fromsock;
+ }
+ else {
+ /* copy the default input value from the group node socket default to the internal socket */
+ convert_socket_value(insock, link->tosock);
+ nodeRemLink(wgroup, link);
+ }
+ }
+ }
+
+ /* add internal links to the ntree */
+ for(link= wgroup->links.first; link; link= linkn) {
+ linkn= link->next;
+ BLI_remlink(&wgroup->links, link);
+ BLI_addtail(&ntree->links, link);
+ }
+
+ /* and copy across the animation */
+ if (wgroup->adt) {
+ LinkData *ld, *ldn=NULL;
+ bAction *waction;
+
+ /* firstly, wgroup needs to temporary dummy action that can be destroyed, as it shares copies */
+ waction = wgroup->adt->action = copy_action(wgroup->adt->action);
+
+ /* now perform the moving */
+ BKE_animdata_separate_by_basepath(&wgroup->id, &ntree->id, &anim_basepaths);
+
+ /* paths + their wrappers need to be freed */
+ for (ld = anim_basepaths.first; ld; ld = ldn) {
+ ldn = ld->next;
+
+ MEM_freeN(ld->data);
+ BLI_freelinkN(&anim_basepaths, ld);
+ }
+
+ /* free temp action too */
+ free_libblock(&G.main->action, waction);
+ }
+
+ /* delete the group instance. this also removes old input links! */
+ nodeFreeNode(ntree, gnode);
+
+ /* free the group tree (takes care of user count) */
+ free_libblock(&G.main->nodetree, wgroup);
+
+ ntree->update |= NTREE_UPDATE_NODES|NTREE_UPDATE_LINKS;
+ ntreeUpdateTree(ntree);
+
+ return 1;
+}
+
+bNodeSocket *node_group_add_socket(bNodeTree *ngroup, const char *name, int type, int in_out)
+{
+ bNodeSocketType *stype = ntreeGetSocketType(type);
+ bNodeSocket *gsock = MEM_callocN(sizeof(bNodeSocket), "bNodeSocket");
+
+ strncpy(gsock->name, name, sizeof(gsock->name));
+ gsock->type = type;
+ /* group sockets are dynamically added */
+ gsock->flag |= SOCK_DYNAMIC;
+
+ gsock->next = gsock->prev = NULL;
+ gsock->new_sock = NULL;
+ gsock->link = NULL;
+ /* assign new unique index */
+ gsock->own_index = ngroup->cur_index++;
+ gsock->limit = (in_out==SOCK_IN ? 0xFFF : 1);
+
+ if (stype->value_structsize > 0)
+ gsock->default_value = MEM_callocN(stype->value_structsize, "default socket value");
+
+ BLI_addtail(in_out==SOCK_IN ? &ngroup->inputs : &ngroup->outputs, gsock);
+
+ ngroup->update |= (in_out==SOCK_IN ? NTREE_UPDATE_GROUP_IN : NTREE_UPDATE_GROUP_OUT);
+
+ return gsock;
+}
+
+bNodeSocket *node_group_expose_socket(bNodeTree *ngroup, bNodeSocket *sock, int in_out)
+{
+ bNodeSocket *gsock= node_group_add_socket(ngroup, sock->name, sock->type, in_out);
+
+ /* initialize the default value. */
+ copy_socket_value(sock, gsock);
+
+ return gsock;
+}
+
+void node_group_expose_all_sockets(bNodeTree *ngroup)
+{
+ bNode *node;
+ bNodeSocket *sock, *gsock;
+
+ for (node=ngroup->nodes.first; node; node=node->next) {
+ for (sock=node->inputs.first; sock; sock=sock->next) {
+ if (!sock->link && !(sock->flag & SOCK_HIDDEN)) {
+ gsock = node_group_add_socket(ngroup, sock->name, sock->type, SOCK_IN);
+
+ /* initialize the default value. */
+ copy_socket_value(sock, gsock);
+
+ sock->link = nodeAddLink(ngroup, NULL, gsock, node, sock);
+ }
+ }
+ for (sock=node->outputs.first; sock; sock=sock->next) {
+ if (nodeCountSocketLinks(ngroup, sock)==0 && !(sock->flag & SOCK_HIDDEN)) {
+ gsock = node_group_add_socket(ngroup, sock->name, sock->type, SOCK_OUT);
+
+ /* initialize the default value. */
+ copy_socket_value(sock, gsock);
+
+ gsock->link = nodeAddLink(ngroup, node, sock, NULL, gsock);
+ }
+ }
+ }
+}
+
+void node_group_remove_socket(bNodeTree *ngroup, bNodeSocket *gsock, int in_out)
+{
+ nodeRemSocketLinks(ngroup, gsock);
+
+ switch (in_out) {
+ case SOCK_IN:
+ BLI_remlink(&ngroup->inputs, gsock);
+ ngroup->update |= NTREE_UPDATE_GROUP_IN;
+ break;
+ case SOCK_OUT:
+ BLI_remlink(&ngroup->outputs, gsock);
+ ngroup->update |= NTREE_UPDATE_GROUP_OUT;
+ break;
+ }
+
+ if (gsock->default_value)
+ MEM_freeN(gsock->default_value);
+
+ MEM_freeN(gsock);
+}
+
+/* groups display their internal tree name as label */
+const char *node_group_label(bNode *node)
+{
+ return (node->id)? node->id->name+2: "Missing Datablock";
+}
+
+int node_group_valid(bNodeTree *ntree, bNodeTemplate *ntemp)
+{
+ bNodeTemplate childtemp;
+ bNode *node;
+
+ /* regular groups cannot be recursive */
+ if (ntree == ntemp->ngroup)
+ return 0;
+
+ /* make sure all children are valid */
+ for (node=ntemp->ngroup->nodes.first; node; node=node->next) {
+ childtemp = nodeMakeTemplate(node);
+ if (!nodeValid(ntree, &childtemp))
+ return 0;
+ }
+
+ return 1;
+}
+
+bNodeTemplate node_group_template(bNode *node)
+{
+ bNodeTemplate ntemp;
+ ntemp.type = NODE_GROUP;
+ ntemp.ngroup = (bNodeTree*)node->id;
+ return ntemp;
+}
+
+void node_group_init(bNodeTree *ntree, bNode *node, bNodeTemplate *ntemp)
+{
+ node->id = (ID*)ntemp->ngroup;
+
+ /* NB: group socket input/output roles are inverted internally!
+ * Group "inputs" work as outputs in links and vice versa.
+ */
+ if (ntemp->ngroup) {
+ bNodeSocket *gsock;
+ for (gsock=ntemp->ngroup->inputs.first; gsock; gsock=gsock->next)
+ node_group_add_extern_socket(ntree, &node->inputs, SOCK_IN, gsock);
+ for (gsock=ntemp->ngroup->outputs.first; gsock; gsock=gsock->next)
+ node_group_add_extern_socket(ntree, &node->outputs, SOCK_OUT, gsock);
+ }
+}
+
+static bNodeSocket *group_verify_socket(bNodeTree *ntree, ListBase *lb, int in_out, bNodeSocket *gsock)
+{
+ bNodeSocket *sock;
+
+ /* group sockets tagged as internal are not exposed ever */
+ if (gsock->flag & SOCK_INTERNAL)
+ return NULL;
+
+ for(sock= lb->first; sock; sock= sock->next) {
+ if(sock->own_index==gsock->own_index)
+ break;
+ }
+ if(sock) {
+ sock->groupsock = gsock;
+
+ strcpy(sock->name, gsock->name);
+ sock->type= gsock->type;
+
+ /* XXX hack: group socket input/output roles are inverted internally,
+ * need to change the limit value when making actual node sockets from them.
+ */
+ sock->limit = (in_out==SOCK_IN ? 1 : 0xFFF);
+
+ BLI_remlink(lb, sock);
+
+ return sock;
+ }
+ else {
+ return node_group_add_extern_socket(ntree, NULL, in_out, gsock);
+ }
+}
+
+static void group_verify_socket_list(bNodeTree *ntree, bNode *node, ListBase *lb, int in_out, ListBase *glb)
+{
+ bNodeSocket *sock, *nextsock, *gsock;
+
+ /* step by step compare */
+ for (gsock= glb->first; gsock; gsock=gsock->next) {
+ /* abusing new_sock pointer for verification here! only used inside this function */
+ gsock->new_sock= group_verify_socket(ntree, lb, in_out, gsock);
+ }
+ /* leftovers are removed */
+ for (sock=lb->first; sock; sock=nextsock) {
+ nextsock=sock->next;
+ if (sock->flag & SOCK_DYNAMIC)
+ nodeRemoveSocket(ntree, node, sock);
+ }
+ /* and we put back the verified sockets */
+ for (gsock= glb->first; gsock; gsock=gsock->next) {
+ if (gsock->new_sock) {
+ BLI_addtail(lb, gsock->new_sock);
+ gsock->new_sock = NULL;
+ }
+ }
+}
+
+/* make sure all group node in ntree, which use ngroup, are sync'd */
+void node_group_verify(struct bNodeTree *ntree, struct bNode *node, struct ID *id)
+{
+ /* check inputs and outputs, and remove or insert them */
+ if (node->id==id) {
+ bNodeTree *ngroup= (bNodeTree*)node->id;
+ group_verify_socket_list(ntree, node, &node->inputs, SOCK_IN, &ngroup->inputs);
+ group_verify_socket_list(ntree, node, &node->outputs, SOCK_OUT, &ngroup->outputs);
+ }
+}
+
+struct bNodeTree *node_group_edit_get(bNode *node)
+{
+ if (node->flag & NODE_GROUP_EDIT)
+ return (bNodeTree*)node->id;
+ else
+ return NULL;
+}
+
+struct bNodeTree *node_group_edit_set(bNode *node, int edit)
+{
+ if (edit) {
+ bNodeTree *ngroup= (bNodeTree*)node->id;
+ if (ngroup) {
+ if(ngroup->id.lib)
+ ntreeMakeLocal(ngroup);
+
+ node->flag |= NODE_GROUP_EDIT;
+ }
+ return ngroup;
+ }
+ else {
+ node->flag &= ~NODE_GROUP_EDIT;
+ return NULL;
+ }
+}
+
+void node_group_edit_clear(bNode *node)
+{
+ bNodeTree *ngroup= (bNodeTree*)node->id;
+ bNode *inode;
+
+ node->flag &= ~NODE_GROUP_EDIT;
+
+ if (ngroup)
+ for (inode=ngroup->nodes.first; inode; inode=inode->next)
+ nodeGroupEditClear(inode);
+}
+
+void node_group_link(bNodeTree *ntree, bNodeSocket *sock, int in_out)
+{
+ node_group_expose_socket(ntree, sock, in_out);
+}
+
+/**** For Loop ****/
+
+/* Essentially a group node with slightly different behavior.
+ * The internal tree is executed several times, with each output being re-used
+ * as an input in the next iteration. For this purpose, input and output socket
+ * lists are kept identical!
+ */
+
+bNodeTemplate node_forloop_template(bNode *node)
+{
+ bNodeTemplate ntemp;
+ ntemp.type = NODE_FORLOOP;
+ ntemp.ngroup = (bNodeTree*)node->id;
+ return ntemp;
+}
+
+void node_forloop_init(bNodeTree *ntree, bNode *node, bNodeTemplate *ntemp)
+{
+ bNodeSocket *sock;
+
+ node->id = (ID*)ntemp->ngroup;
+
+ sock = nodeAddInputFloat(ntree, node, "Iterations", PROP_UNSIGNED, 1, 0, 10000);
+
+ /* NB: group socket input/output roles are inverted internally!
+ * Group "inputs" work as outputs in links and vice versa.
+ */
+ if (ntemp->ngroup) {
+ bNodeSocket *gsock;
+ for (gsock=ntemp->ngroup->inputs.first; gsock; gsock=gsock->next)
+ node_group_add_extern_socket(ntree, &node->inputs, SOCK_IN, gsock);
+ for (gsock=ntemp->ngroup->outputs.first; gsock; gsock=gsock->next)
+ node_group_add_extern_socket(ntree, &node->outputs, SOCK_OUT, gsock);
+ }
+}
+
+void node_forloop_init_tree(bNodeTree *ntree)
+{
+ bNodeSocket *sock;
+ sock = node_group_add_socket(ntree, "Iteration", SOCK_FLOAT, SOCK_IN);
+ sock->flag |= SOCK_INTERNAL;
+}
+
+static void loop_sync(bNodeTree *ntree, int sync_in_out)
+{
+ bNodeSocket *sock, *sync, *nsync, *mirror;
+ ListBase *sync_lb;
+
+ if (sync_in_out==SOCK_IN) {
+ sock = ntree->outputs.first;
+
+ sync = ntree->inputs.first;
+ sync_lb = &ntree->inputs;
+ }
+ else {
+ sock = ntree->inputs.first;
+
+ sync = ntree->outputs.first;
+ sync_lb = &ntree->outputs;
+ }
+
+ /* NB: the sock->storage pointer is used here directly to store the own_index int
+ * out the mirrored socket counterpart!
+ */
+
+ while (sock) {
+ /* skip static and internal sockets on the sync side (preserves socket order!) */
+ while (sync && ((sync->flag & SOCK_INTERNAL) || !(sync->flag & SOCK_DYNAMIC)))
+ sync = sync->next;
+
+ if (sync && !(sync->flag & SOCK_INTERNAL) && (sync->flag & SOCK_DYNAMIC)) {
+ if (sock->storage==NULL) {
+ /* if mirror index is 0, the sockets is newly added and a new mirror must be created. */
+ mirror = node_group_expose_socket(ntree, sock, sync_in_out);
+ /* store the mirror index */
+ sock->storage = SET_INT_IN_POINTER(mirror->own_index);
+ mirror->storage = SET_INT_IN_POINTER(sock->own_index);
+ /* move mirror to the right place */
+ BLI_remlink(sync_lb, mirror);
+ if (sync)
+ BLI_insertlinkbefore(sync_lb, sync, mirror);
+ else
+ BLI_addtail(sync_lb, mirror);
+ }
+ else {
+ /* look up the mirror socket */
+ for (mirror=sync; mirror; mirror=mirror->next)
+ if (mirror->own_index == GET_INT_FROM_POINTER(sock->storage))
+ break;
+ /* make sure the name is the same (only for identification by user, no deeper meaning) */
+ strcpy(mirror->name, sock->name);
+ /* fix the socket order if necessary */
+ if (mirror != sync) {
+ BLI_remlink(sync_lb, mirror);
+ BLI_insertlinkbefore(sync_lb, sync, mirror);
+ }
+ else
+ sync = sync->next;
+ }
+ }
+
+ sock = sock->next;
+ }
+
+ /* remaining sockets in sync_lb are leftovers from deleted sockets, remove them */
+ while (sync) {
+ nsync = sync->next;
+ if (!(sync->flag & SOCK_INTERNAL) && (sync->flag & SOCK_DYNAMIC))
+ node_group_remove_socket(ntree, sync, sync_in_out);
+ sync = nsync;
+ }
+}
+
+void node_loop_update_tree(bNodeTree *ngroup)
+{
+ /* make sure inputs & outputs are identical */
+ if (ngroup->update & NTREE_UPDATE_GROUP_IN)
+ loop_sync(ngroup, SOCK_OUT);
+ if (ngroup->update & NTREE_UPDATE_GROUP_OUT)
+ loop_sync(ngroup, SOCK_IN);
+}
+
+void node_whileloop_init(bNodeTree *ntree, bNode *node, bNodeTemplate *ntemp)
+{
+ bNodeSocket *sock;
+
+ node->id = (ID*)ntemp->ngroup;
+
+ sock = nodeAddInputFloat(ntree, node, "Condition", PROP_NONE, 1, 0, 1);
+
+ /* max iterations */
+ node->custom1 = 10000;
+
+ /* NB: group socket input/output roles are inverted internally!
+ * Group "inputs" work as outputs in links and vice versa.
+ */
+ if (ntemp->ngroup) {
+ bNodeSocket *gsock;
+ for (gsock=ntemp->ngroup->inputs.first; gsock; gsock=gsock->next)
+ node_group_add_extern_socket(ntree, &node->inputs, SOCK_IN, gsock);
+ for (gsock=ntemp->ngroup->outputs.first; gsock; gsock=gsock->next)
+ node_group_add_extern_socket(ntree, &node->outputs, SOCK_OUT, gsock);
+ }
+}
+
+void node_whileloop_init_tree(bNodeTree *ntree)
+{
+ bNodeSocket *sock;
+ sock = node_group_add_socket(ntree, "Condition", SOCK_FLOAT, SOCK_OUT);
+ sock->flag |= SOCK_INTERNAL;
+}
+
+bNodeTemplate node_whileloop_template(bNode *node)
+{
+ bNodeTemplate ntemp;
+ ntemp.type = NODE_WHILELOOP;
+ ntemp.ngroup = (bNodeTree*)node->id;
+ return ntemp;
+}
+
+/**** FRAME ****/
+
+void register_node_type_frame(ListBase *lb)
+{
+ /* frame type is used for all tree types, needs dynamic allocation */
+ bNodeType *ntype= MEM_callocN(sizeof(bNodeType), "frame node type");
+
+ node_type_base(ntype, NODE_FRAME, "Frame", NODE_CLASS_LAYOUT, NODE_BACKGROUND);
+ node_type_size(ntype, 150, 100, 0);
+
+ ntype->needs_free = 1;
+ nodeRegisterType(lb, ntype);
+}
diff --git a/source/blender/nodes/intern/node_common.h b/source/blender/nodes/intern/node_common.h
new file mode 100644
index 00000000000..2723c595380
--- /dev/null
+++ b/source/blender/nodes/intern/node_common.h
@@ -0,0 +1,66 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Lukas Toenne.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/intern/node_common.h
+ * \ingroup nodes
+ */
+
+
+#ifndef NODE_COMMON_H_
+#define NODE_COMMON_H_
+
+#include "DNA_listBase.h"
+
+struct bNodeTree;
+
+struct bNodeSocket *node_group_add_extern_socket(struct bNodeTree *ntree, ListBase *lb, int in_out, struct bNodeSocket *gsock);
+
+void node_group_init(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp);
+void node_forloop_init(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp);
+void node_whileloop_init(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp);
+
+void node_forloop_init_tree(struct bNodeTree *ntree);
+void node_whileloop_init_tree(struct bNodeTree *ntree);
+
+const char *node_group_label(struct bNode *node);
+
+struct bNodeTemplate node_group_template(struct bNode *node);
+struct bNodeTemplate node_forloop_template(struct bNode *node);
+struct bNodeTemplate node_whileloop_template(struct bNode *node);
+
+int node_group_valid(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
+void node_group_verify(struct bNodeTree *ntree, struct bNode *node, struct ID *id);
+
+struct bNodeTree *node_group_edit_get(struct bNode *node);
+struct bNodeTree *node_group_edit_set(struct bNode *node, int edit);
+void node_group_edit_clear(bNode *node);
+
+void node_loop_update_tree(struct bNodeTree *ngroup);
+
+#endif
diff --git a/source/blender/nodes/intern/node_exec.c b/source/blender/nodes/intern/node_exec.c
new file mode 100644
index 00000000000..608347bc258
--- /dev/null
+++ b/source/blender/nodes/intern/node_exec.c
@@ -0,0 +1,309 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/intern/node_exec.c
+ * \ingroup nodes
+ */
+
+
+#include "DNA_node_types.h"
+
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_node.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "node_exec.h"
+
+
+/* for a given socket, find the actual stack entry */
+bNodeStack *node_get_socket_stack(bNodeStack *stack, bNodeSocket *sock)
+{
+ return stack + sock->stack_index;
+}
+
+void node_get_stack(bNode *node, bNodeStack *stack, bNodeStack **in, bNodeStack **out)
+{
+ bNodeSocket *sock;
+
+ /* build pointer stack */
+ if (in) {
+ for(sock= node->inputs.first; sock; sock= sock->next) {
+ *(in++) = node_get_socket_stack(stack, sock);
+ }
+ }
+
+ if (out) {
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ *(out++) = node_get_socket_stack(stack, sock);
+ }
+ }
+}
+
+void node_init_input_index(bNodeSocket *sock, int *index)
+{
+ if (sock->link && sock->link->fromsock) {
+ sock->stack_index = sock->link->fromsock->stack_index;
+ }
+ else {
+ sock->stack_index = (*index)++;
+ }
+}
+
+void node_init_output_index(bNodeSocket *sock, int *index)
+{
+ sock->stack_index = (*index)++;
+}
+
+/* basic preparation of socket stacks */
+static struct bNodeStack *setup_stack(bNodeStack *stack, bNodeSocket *sock)
+{
+ bNodeStack *ns = node_get_socket_stack(stack, sock);
+ float null_value[4]= {0.0f, 0.0f, 0.0f, 0.0f};
+
+ /* don't mess with remote socket stacks, these are initialized by other nodes! */
+ if (sock->link)
+ return ns;
+
+ ns->sockettype = sock->type;
+
+ if (sock->default_value) {
+ switch (sock->type) {
+ case SOCK_FLOAT:
+ ns->vec[0] = ((bNodeSocketValueFloat*)sock->default_value)->value;
+ break;
+ case SOCK_VECTOR:
+ copy_v3_v3(ns->vec, ((bNodeSocketValueVector*)sock->default_value)->value);
+ break;
+ case SOCK_RGBA:
+ copy_v4_v4(ns->vec, ((bNodeSocketValueRGBA*)sock->default_value)->value);
+ break;
+ }
+ }
+ else {
+ switch (sock->type) {
+ case SOCK_FLOAT:
+ ns->vec[0] = 0.0f;
+ break;
+ case SOCK_VECTOR:
+ copy_v3_v3(ns->vec, null_value);
+ break;
+ case SOCK_RGBA:
+ copy_v4_v4(ns->vec, null_value);
+ break;
+ }
+ }
+
+ return ns;
+}
+
+bNodeTreeExec *ntree_exec_begin(bNodeTree *ntree)
+{
+ bNodeTreeExec *exec;
+ bNode *node;
+ bNodeExec *nodeexec;
+ bNodeSocket *sock, *gsock;
+ bNodeStack *ns;
+ int index= 0;
+ bNode **nodelist;
+ int totnodes, n;
+
+ if((ntree->init & NTREE_TYPE_INIT)==0)
+ ntreeInitTypes(ntree);
+
+ /* get a dependency-sorted list of nodes */
+ ntreeGetDependencyList(ntree, &nodelist, &totnodes);
+
+ /* XXX could let callbacks do this for specialized data */
+ exec = MEM_callocN(sizeof(bNodeTreeExec), "node tree execution data");
+ /* backpointer to node tree */
+ exec->nodetree = ntree;
+
+ /* group inputs essentially work as outputs */
+ for(gsock=ntree->inputs.first; gsock; gsock = gsock->next)
+ node_init_output_index(gsock, &index);
+ /* set stack indexes */
+ for(n=0; n < totnodes; ++n) {
+ node = nodelist[n];
+
+ node->stack_index = index;
+
+ /* init node socket stack indexes */
+ for (sock=node->inputs.first; sock; sock=sock->next)
+ node_init_input_index(sock, &index);
+ for (sock=node->outputs.first; sock; sock=sock->next)
+ node_init_output_index(sock, &index);
+ }
+ /* group outputs essentially work as inputs */
+ for(gsock=ntree->outputs.first; gsock; gsock = gsock->next)
+ node_init_input_index(gsock, &index);
+
+ /* allocated exec data pointers for nodes */
+ exec->totnodes = totnodes;
+ exec->nodeexec = MEM_callocN(exec->totnodes * sizeof(bNodeExec), "node execution data");
+ /* allocate data pointer for node stack */
+ exec->stacksize = index;
+ exec->stack = MEM_callocN(exec->stacksize * sizeof(bNodeStack), "bNodeStack");
+
+ /* prepare group tree inputs */
+ for (sock=ntree->inputs.first; sock; sock=sock->next) {
+ ns = setup_stack(exec->stack, sock);
+ if (ns->hasoutput)
+ ns->hasinput = 1;
+ }
+ /* prepare all internal nodes for execution */
+ for(n=0, nodeexec= exec->nodeexec; n < totnodes; ++n, ++nodeexec) {
+ node = nodeexec->node = nodelist[n];
+
+ /* tag inputs */
+ for (sock=node->inputs.first; sock; sock=sock->next) {
+ /* disable the node if an input link is invalid */
+ if(sock->link && !(sock->link->flag & NODE_LINK_VALID))
+ node->need_exec= 0;
+
+ ns = setup_stack(exec->stack, sock);
+ if (ns->hasoutput)
+ ns->hasinput = 1;
+ }
+
+ /* tag all outputs */
+ for (sock=node->outputs.first; sock; sock=sock->next) {
+ ns = setup_stack(exec->stack, sock);
+ ns->hasoutput = 1;
+ }
+
+ if(node->typeinfo->initexecfunc)
+ nodeexec->data = node->typeinfo->initexecfunc(node);
+ }
+ /* prepare group tree outputs */
+ for (sock=ntree->outputs.first; sock; sock=sock->next) {
+ ns = setup_stack(exec->stack, sock);
+ ns->hasoutput = 1;
+ }
+
+ if (nodelist)
+ MEM_freeN(nodelist);
+
+ return exec;
+}
+
+void ntree_exec_end(bNodeTreeExec *exec)
+{
+ bNodeExec *nodeexec;
+ int n;
+
+ if (exec->stack)
+ MEM_freeN(exec->stack);
+
+ for(n=0, nodeexec= exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
+ if (nodeexec->node->typeinfo->freeexecfunc)
+ nodeexec->node->typeinfo->freeexecfunc(nodeexec->node, nodeexec->data);
+ }
+
+ if (exec->nodeexec)
+ MEM_freeN(exec->nodeexec);
+
+ MEM_freeN(exec);
+}
+
+/**** Compositor/Material/Texture trees ****/
+
+bNodeThreadStack *ntreeGetThreadStack(bNodeTreeExec *exec, int thread)
+{
+ ListBase *lb= &exec->threadstack[thread];
+ bNodeThreadStack *nts;
+
+ for(nts=lb->first; nts; nts=nts->next) {
+ if(!nts->used) {
+ nts->used= 1;
+ break;
+ }
+ }
+
+ if (!nts) {
+ nts= MEM_callocN(sizeof(bNodeThreadStack), "bNodeThreadStack");
+ nts->stack= MEM_dupallocN(exec->stack);
+ nts->used= 1;
+ BLI_addtail(lb, nts);
+ }
+
+ return nts;
+}
+
+void ntreeReleaseThreadStack(bNodeThreadStack *nts)
+{
+ nts->used = 0;
+}
+
+void ntreeExecNodes(bNodeTreeExec *exec, void *callerdata, int thread)
+{
+ bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
+ bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
+ bNodeExec *nodeexec;
+ bNode *node;
+ int n;
+
+ /* nodes are presorted, so exec is in order of list */
+
+ for(n=0, nodeexec= exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
+ node = nodeexec->node;
+ if(node->need_exec) {
+ node_get_stack(node, exec->stack, nsin, nsout);
+ if(node->typeinfo->execfunc)
+ node->typeinfo->execfunc(callerdata, node, nsin, nsout);
+ else if (node->typeinfo->newexecfunc)
+ node->typeinfo->newexecfunc(callerdata, thread, node, nodeexec->data, nsin, nsout);
+ }
+ }
+}
+
+void ntreeExecThreadNodes(bNodeTreeExec *exec, bNodeThreadStack *nts, void *callerdata, int thread)
+{
+ bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
+ bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
+ bNodeExec *nodeexec;
+ bNode *node;
+ int n;
+
+ /* nodes are presorted, so exec is in order of list */
+
+ for(n=0, nodeexec= exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
+ node = nodeexec->node;
+ if(node->need_exec) {
+ node_get_stack(node, nts->stack, nsin, nsout);
+ if(node->typeinfo->execfunc)
+ node->typeinfo->execfunc(callerdata, node, nsin, nsout);
+ else if (node->typeinfo->newexecfunc)
+ node->typeinfo->newexecfunc(callerdata, thread, node, nodeexec->data, nsin, nsout);
+ }
+ }
+}
diff --git a/source/blender/nodes/intern/node_exec.h b/source/blender/nodes/intern/node_exec.h
new file mode 100644
index 00000000000..567c6ae56cf
--- /dev/null
+++ b/source/blender/nodes/intern/node_exec.h
@@ -0,0 +1,90 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/intern/node_exec.h
+ * \ingroup nodes
+ */
+
+
+#ifndef NODE_EXEC_H_
+#define NODE_EXEC_H_
+
+#include "DNA_listBase.h"
+
+#include "BLI_utildefines.h"
+
+#include "BKE_node.h"
+
+#include "RNA_types.h"
+
+struct bNodeTree;
+struct bNode;
+struct bNodeStack;
+
+/* Node execution data */
+typedef struct bNodeExec {
+ struct bNode *node; /* backpointer to node */
+ void *data; /* custom data storage */
+} bNodeExec;
+
+/* Execution Data for each instance of node tree execution */
+typedef struct bNodeTreeExec {
+ struct bNodeTree *nodetree; /* backpointer to node tree */
+
+ int totnodes; /* total node count */
+ struct bNodeExec *nodeexec; /* per-node execution data */
+
+ int stacksize;
+ struct bNodeStack *stack; /* socket data stack */
+ /* only used by material and texture trees to keep one stack for each thread */
+ ListBase *threadstack; /* one instance of the stack for each thread */
+} bNodeTreeExec;
+
+/* stores one stack copy for each thread (material and texture trees) */
+typedef struct bNodeThreadStack {
+ struct bNodeThreadStack *next, *prev;
+ struct bNodeStack *stack;
+ int used;
+} bNodeThreadStack;
+
+struct bNodeStack *node_get_socket_stack(struct bNodeStack *stack, struct bNodeSocket *sock);
+void node_get_stack(struct bNode *node, struct bNodeStack *stack, struct bNodeStack **in, struct bNodeStack **out);
+void node_init_input_index(struct bNodeSocket *sock, int *index);
+void node_init_output_index(struct bNodeSocket *sock, int *index);
+
+struct bNodeTreeExec *ntree_exec_begin(struct bNodeTree *ntree);
+void ntree_exec_end(struct bNodeTreeExec *exec);
+
+void ntreeExecNodes(struct bNodeTreeExec *exec, void *callerdata, int thread);
+
+struct bNodeThreadStack *ntreeGetThreadStack(struct bNodeTreeExec *exec, int thread);
+void ntreeReleaseThreadStack(struct bNodeThreadStack *nts);
+void ntreeExecThreadNodes(struct bNodeTreeExec *exec, struct bNodeThreadStack *nts, void *callerdata, int thread);
+
+#endif
diff --git a/source/blender/nodes/intern/node_socket.c b/source/blender/nodes/intern/node_socket.c
new file mode 100644
index 00000000000..aabaf5b86de
--- /dev/null
+++ b/source/blender/nodes/intern/node_socket.c
@@ -0,0 +1,433 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Lukas Toennne
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/intern/node_socket.c
+ * \ingroup nodes
+ */
+
+
+#include "DNA_node_types.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_DerivedMesh.h"
+#include "BKE_node.h"
+
+#include "RNA_access.h"
+#include "RNA_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "NOD_socket.h"
+
+/****************** FLOAT ******************/
+
+static bNodeSocketType node_socket_type_float = {
+ /* type */ SOCK_FLOAT,
+ /* ui_name */ "Float",
+ /* ui_description */ "Floating Point",
+ /* ui_icon */ 0,
+ /* ui_color */ {160,160,160,255},
+
+ /* value_structname */ "bNodeSocketValueFloat",
+ /* value_structsize */ sizeof(bNodeSocketValueFloat),
+
+ /* buttonfunc */ NULL,
+};
+
+/****************** VECTOR ******************/
+
+static bNodeSocketType node_socket_type_vector = {
+ /* type */ SOCK_VECTOR,
+ /* ui_name */ "Vector",
+ /* ui_description */ "3-dimensional floating point vector",
+ /* ui_icon */ 0,
+ /* ui_color */ {100,100,200,255},
+
+ /* value_structname */ "bNodeSocketValueVector",
+ /* value_structsize */ sizeof(bNodeSocketValueVector),
+
+ /* buttonfunc */ NULL,
+};
+
+/****************** RGBA ******************/
+
+static bNodeSocketType node_socket_type_rgba = {
+ /* type */ SOCK_RGBA,
+ /* ui_name */ "RGBA",
+ /* ui_description */ "RGBA color",
+ /* ui_icon */ 0,
+ /* ui_color */ {200,200,40,255},
+
+ /* value_structname */ "bNodeSocketValueRGBA",
+ /* value_structsize */ sizeof(bNodeSocketValueRGBA),
+
+ /* buttonfunc */ NULL,
+};
+
+/****************** INT ******************/
+
+static bNodeSocketType node_socket_type_int = {
+ /* type */ SOCK_INT,
+ /* ui_name */ "Int",
+ /* ui_description */ "Integer",
+ /* ui_icon */ 0,
+ /* ui_color */ {17,133,37,255},
+
+ /* value_structname */ "bNodeSocketValueInt",
+ /* value_structsize */ sizeof(bNodeSocketValueInt),
+
+ /* buttonfunc */ NULL,
+};
+
+/****************** BOOLEAN ******************/
+
+static bNodeSocketType node_socket_type_boolean = {
+ /* type */ SOCK_BOOLEAN,
+ /* ui_name */ "Boolean",
+ /* ui_description */ "Boolean",
+ /* ui_icon */ 0,
+ /* ui_color */ {158,139,63,255},
+
+ /* value_structname */ "bNodeSocketValueBoolean",
+ /* value_structsize */ sizeof(bNodeSocketValueBoolean),
+
+ /* buttonfunc */ NULL,
+};
+
+/****************** MESH ******************/
+
+static bNodeSocketType node_socket_type_mesh = {
+ /* type */ SOCK_MESH,
+ /* ui_name */ "Mesh",
+ /* ui_description */ "Mesh geometry data",
+ /* ui_icon */ 0,
+ /* ui_color */ {255,133,7,255},
+
+ /* value_structname */ NULL,
+ /* value_structsize */ 0,
+
+ /* buttonfunc */ NULL,
+};
+
+
+void node_socket_type_init(bNodeSocketType *types[])
+{
+ #define INIT_TYPE(name) types[node_socket_type_##name.type] = &node_socket_type_##name;
+
+ INIT_TYPE(float);
+ INIT_TYPE(vector);
+ INIT_TYPE(rgba);
+ INIT_TYPE(int);
+ INIT_TYPE(boolean);
+ INIT_TYPE(mesh);
+
+ #undef INIT_TYPE
+}
+
+struct bNodeSocket *nodeAddInputInt(struct bNodeTree *ntree, struct bNode *node, const char *name, PropertySubType subtype,
+ int value, int min, int max)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_IN, name, SOCK_INT);
+ bNodeSocketValueInt *dval= (bNodeSocketValueInt*)sock->default_value;
+ dval->subtype = subtype;
+ dval->value = value;
+ dval->min = min;
+ dval->max = max;
+ return sock;
+}
+struct bNodeSocket *nodeAddOutputInt(struct bNodeTree *ntree, struct bNode *node, const char *name)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_OUT, name, SOCK_INT);
+ return sock;
+}
+
+struct bNodeSocket *nodeAddInputFloat(struct bNodeTree *ntree, struct bNode *node, const char *name, PropertySubType subtype,
+ float value, float min, float max)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_IN, name, SOCK_FLOAT);
+ bNodeSocketValueFloat *dval= (bNodeSocketValueFloat*)sock->default_value;
+ dval->subtype = subtype;
+ dval->value = value;
+ dval->min = min;
+ dval->max = max;
+ return sock;
+}
+struct bNodeSocket *nodeAddOutputFloat(struct bNodeTree *ntree, struct bNode *node, const char *name)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_OUT, name, SOCK_FLOAT);
+ return sock;
+}
+
+struct bNodeSocket *nodeAddInputBoolean(struct bNodeTree *ntree, struct bNode *node, const char *name, char value)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_IN, name, SOCK_BOOLEAN);
+ bNodeSocketValueBoolean *dval= (bNodeSocketValueBoolean*)sock->default_value;
+ dval->value = value;
+ return sock;
+}
+struct bNodeSocket *nodeAddOutputBoolean(struct bNodeTree *ntree, struct bNode *node, const char *name)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_OUT, name, SOCK_BOOLEAN);
+ return sock;
+}
+
+struct bNodeSocket *nodeAddInputVector(struct bNodeTree *ntree, struct bNode *node, const char *name, PropertySubType subtype,
+ float x, float y, float z, float min, float max)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_IN, name, SOCK_VECTOR);
+ bNodeSocketValueVector *dval= (bNodeSocketValueVector*)sock->default_value;
+ dval->subtype = subtype;
+ dval->value[0] = x;
+ dval->value[1] = y;
+ dval->value[2] = z;
+ dval->min = min;
+ dval->max = max;
+ return sock;
+}
+struct bNodeSocket *nodeAddOutputVector(struct bNodeTree *ntree, struct bNode *node, const char *name)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_OUT, name, SOCK_VECTOR);
+ return sock;
+}
+
+struct bNodeSocket *nodeAddInputRGBA(struct bNodeTree *ntree, struct bNode *node, const char *name,
+ float r, float g, float b, float a)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_IN, name, SOCK_RGBA);
+ bNodeSocketValueRGBA *dval= (bNodeSocketValueRGBA*)sock->default_value;
+ dval->value[0] = r;
+ dval->value[1] = g;
+ dval->value[2] = b;
+ dval->value[3] = a;
+ return sock;
+}
+struct bNodeSocket *nodeAddOutputRGBA(struct bNodeTree *ntree, struct bNode *node, const char *name)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_OUT, name, SOCK_RGBA);
+ return sock;
+}
+
+struct bNodeSocket *nodeAddInputMesh(struct bNodeTree *ntree, struct bNode *node, const char *name)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_IN, name, SOCK_MESH);
+ return sock;
+}
+struct bNodeSocket *nodeAddOutputMesh(struct bNodeTree *ntree, struct bNode *node, const char *name)
+{
+ bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_OUT, name, SOCK_MESH);
+ return sock;
+}
+
+struct bNodeSocket *node_add_input_from_template(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocketTemplate *stemp)
+{
+ bNodeSocket *sock;
+ switch (stemp->type) {
+ case SOCK_INT:
+ sock = nodeAddInputInt(ntree, node, stemp->name, stemp->subtype, (int)stemp->val1, (int)stemp->min, (int)stemp->max);
+ break;
+ case SOCK_FLOAT:
+ sock = nodeAddInputFloat(ntree, node, stemp->name, stemp->subtype, stemp->val1, stemp->min, stemp->max);
+ break;
+ case SOCK_BOOLEAN:
+ sock = nodeAddInputBoolean(ntree, node, stemp->name, (char)stemp->val1);
+ break;
+ case SOCK_VECTOR:
+ sock = nodeAddInputVector(ntree, node, stemp->name, stemp->subtype, stemp->val1, stemp->val2, stemp->val3, stemp->min, stemp->max);
+ break;
+ case SOCK_RGBA:
+ sock = nodeAddInputRGBA(ntree, node, stemp->name, stemp->val1, stemp->val2, stemp->val3, stemp->val4);
+ break;
+ case SOCK_MESH:
+ sock = nodeAddInputMesh(ntree, node, stemp->name);
+ break;
+ default:
+ sock = nodeAddSocket(ntree, node, SOCK_IN, stemp->name, stemp->type);
+ }
+ return sock;
+}
+
+struct bNodeSocket *node_add_output_from_template(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocketTemplate *stemp)
+{
+ bNodeSocket *sock;
+ switch (stemp->type) {
+ case SOCK_INT:
+ sock = nodeAddOutputInt(ntree, node, stemp->name);
+ break;
+ case SOCK_FLOAT:
+ sock = nodeAddOutputFloat(ntree, node, stemp->name);
+ break;
+ case SOCK_BOOLEAN:
+ sock = nodeAddOutputBoolean(ntree, node, stemp->name);
+ break;
+ case SOCK_VECTOR:
+ sock = nodeAddOutputVector(ntree, node, stemp->name);
+ break;
+ case SOCK_RGBA:
+ sock = nodeAddOutputRGBA(ntree, node, stemp->name);
+ break;
+ case SOCK_MESH:
+ sock = nodeAddOutputMesh(ntree, node, stemp->name);
+ break;
+ default:
+ sock = nodeAddSocket(ntree, node, SOCK_OUT, stemp->name, stemp->type);
+ }
+ return sock;
+}
+
+static bNodeSocket *verify_socket_template(bNodeTree *ntree, bNode *node, int in_out, ListBase *socklist, bNodeSocketTemplate *stemp)
+{
+ bNodeSocket *sock;
+
+ for(sock= socklist->first; sock; sock= sock->next) {
+ if(!(sock->flag & SOCK_DYNAMIC) && strncmp(sock->name, stemp->name, NODE_MAXSTR)==0)
+ break;
+ }
+ if(sock) {
+ sock->type= stemp->type; /* in future, read this from tydefs! */
+ if(stemp->limit==0) sock->limit= 0xFFF;
+ else sock->limit= stemp->limit;
+
+ /* Copy the property range and subtype parameters in case the template changed.
+ * NOT copying the actual value here, only button behavior changes!
+ */
+ switch (sock->type) {
+ case SOCK_FLOAT:
+ {
+ bNodeSocketValueFloat *dval= sock->default_value;
+ dval->min = stemp->min;
+ dval->max = stemp->max;
+ dval->subtype = stemp->subtype;
+ }
+ break;
+ case SOCK_INT:
+ {
+ bNodeSocketValueInt *dval= sock->default_value;
+ dval->min = stemp->min;
+ dval->max = stemp->max;
+ dval->subtype = stemp->subtype;
+ }
+ break;
+ case SOCK_VECTOR:
+ {
+ bNodeSocketValueVector *dval= sock->default_value;
+ dval->min = stemp->min;
+ dval->max = stemp->max;
+ dval->subtype = stemp->subtype;
+ }
+ break;
+ }
+
+ BLI_remlink(socklist, sock);
+
+ return sock;
+ }
+ else {
+ /* no socket for this template found, make a new one */
+ if (in_out==SOCK_IN)
+ sock = node_add_input_from_template(ntree, node, stemp);
+ else
+ sock = node_add_output_from_template(ntree, node, stemp);
+ /* remove the new socket from the node socket list first,
+ * will be added back after verification.
+ */
+ BLI_remlink(socklist, sock);
+ }
+
+ return sock;
+}
+
+static void verify_socket_template_list(bNodeTree *ntree, bNode *node, int in_out, ListBase *socklist, bNodeSocketTemplate *stemp_first)
+{
+ bNodeSocket *sock;
+ bNodeSocketTemplate *stemp;
+
+ /* no inputs anymore? */
+ if(stemp_first==NULL) {
+ while(socklist->first) {
+ sock = (bNodeSocket*)socklist->first;
+ if (!(sock->flag & SOCK_DYNAMIC))
+ nodeRemoveSocket(ntree, node, socklist->first);
+ }
+ }
+ else {
+ /* step by step compare */
+ stemp= stemp_first;
+ while(stemp->type != -1) {
+ stemp->sock= verify_socket_template(ntree, node, in_out, socklist, stemp);
+ stemp++;
+ }
+ /* leftovers are removed */
+ while(socklist->first) {
+ sock = (bNodeSocket*)socklist->first;
+ if (!(sock->flag & SOCK_DYNAMIC))
+ nodeRemoveSocket(ntree, node, socklist->first);
+ }
+
+ /* and we put back the verified sockets */
+ stemp= stemp_first;
+ if (socklist->first) {
+ /* some dynamic sockets left, store the list start
+ * so we can add static sockets infront of it.
+ */
+ sock = socklist->first;
+ while(stemp->type != -1) {
+ /* put static sockets infront of dynamic */
+ BLI_insertlinkbefore(socklist, sock, stemp->sock);
+ stemp++;
+ }
+ }
+ else {
+ while(stemp->type != -1) {
+ BLI_addtail(socklist, stemp->sock);
+ stemp++;
+ }
+ }
+ }
+}
+
+void node_verify_socket_templates(bNodeTree *ntree, bNode *node)
+{
+ bNodeType *ntype= node->typeinfo;
+ /* XXX Small trick: don't try to match socket lists when there are no templates.
+ * This also prevents group node sockets from being removed, without the need to explicitly
+ * check the node type here.
+ */
+ if(ntype && ((ntype->inputs && ntype->inputs[0].type>=0) || (ntype->outputs && ntype->outputs[0].type>=0))) {
+ verify_socket_template_list(ntree, node, SOCK_IN, &node->inputs, ntype->inputs);
+ verify_socket_template_list(ntree, node, SOCK_OUT, &node->outputs, ntype->outputs);
+ }
+}
diff --git a/source/blender/nodes/intern/node_util.c b/source/blender/nodes/intern/node_util.c
index 1cc8c282179..bdf53df06af 100644
--- a/source/blender/nodes/intern/node_util.c
+++ b/source/blender/nodes/intern/node_util.c
@@ -32,12 +32,24 @@
*/
-#include "CMP_util.h"
-#include "SHD_util.h"
+#include "DNA_action_types.h"
+#include "DNA_node_types.h"
+
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_colortools.h"
+#include "BKE_node.h"
#include "RNA_access.h"
#include "RNA_enum_types.h"
+#include "MEM_guardedalloc.h"
+
+#include "node_util.h"
+
+/**** Storage Data ****/
+
void node_free_curves(bNode *node)
{
curvemapping_free(node->storage);
@@ -58,6 +70,8 @@ void node_copy_standard_storage(bNode *orig_node, bNode *new_node)
new_node->storage= MEM_dupallocN(orig_node->storage);
}
+/**** Labels ****/
+
const char *node_blend_label(bNode *node)
{
const char *name;
diff --git a/source/blender/nodes/intern/node_util.h b/source/blender/nodes/intern/node_util.h
index 5a78fc07883..8d38d57f577 100644
--- a/source/blender/nodes/intern/node_util.h
+++ b/source/blender/nodes/intern/node_util.h
@@ -35,14 +35,27 @@
#ifndef NODE_UTIL_H_
#define NODE_UTIL_H_
+#include "DNA_listBase.h"
+
+#include "BKE_node.h"
+
#include "MEM_guardedalloc.h"
+#include "NOD_socket.h"
+
+struct bNodeTree;
+struct bNode;
+
+/**** Storage Data ****/
+
extern void node_free_curves(struct bNode *node);
extern void node_free_standard_storage(struct bNode *node);
extern void node_copy_curves(struct bNode *orig_node, struct bNode *new_node);
extern void node_copy_standard_storage(struct bNode *orig_node, struct bNode *new_node);
+/**** Labels ****/
+
const char *node_blend_label(struct bNode *node);
const char *node_math_label(struct bNode *node);
const char *node_vect_math_label(struct bNode *node);
diff --git a/source/blender/nodes/shader/node_shader_tree.c b/source/blender/nodes/shader/node_shader_tree.c
new file mode 100644
index 00000000000..28f0f983454
--- /dev/null
+++ b/source/blender/nodes/shader/node_shader_tree.c
@@ -0,0 +1,225 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s):
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/shader/node_shader_tree.c
+ * \ingroup nodes
+ */
+
+
+#include <string.h>
+
+#include "DNA_material_types.h"
+#include "DNA_node_types.h"
+
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+#include "BLI_threads.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_global.h"
+#include "BKE_main.h"
+#include "BKE_node.h"
+#include "BKE_utildefines.h"
+
+#include "GPU_material.h"
+
+#include "RE_shader_ext.h"
+
+#include "node_exec.h"
+#include "node_util.h"
+#include "node_shader_util.h"
+
+static void foreach_nodetree(Main *main, void *calldata, bNodeTreeCallback func)
+{
+ Material *ma;
+ for(ma= main->mat.first; ma; ma= ma->id.next) {
+ if(ma->nodetree) {
+ func(calldata, &ma->id, ma->nodetree);
+ }
+ }
+}
+
+static void local_sync(bNodeTree *localtree, bNodeTree *ntree)
+{
+ bNode *lnode;
+
+ /* copy over contents of previews */
+ for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
+ if(ntreeNodeExists(ntree, lnode->new_node)) {
+ bNode *node= lnode->new_node;
+
+ if(node->preview && node->preview->rect) {
+ if(lnode->preview && lnode->preview->rect) {
+ int xsize= node->preview->xsize;
+ int ysize= node->preview->ysize;
+ memcpy(node->preview->rect, lnode->preview->rect, 4*xsize + xsize*ysize*sizeof(char)*4);
+ }
+ }
+ }
+ }
+}
+
+bNodeTreeType ntreeType_Shader = {
+ /* type */ NTREE_SHADER,
+ /* id_name */ "NTShader Nodetree",
+
+ /* node_types */ { NULL, NULL },
+
+ /* free_cache */ NULL,
+ /* free_node_cache */ NULL,
+ /* foreach_nodetree */ foreach_nodetree,
+ /* localize */ NULL,
+ /* local_sync */ local_sync,
+ /* local_merge */ NULL,
+ /* update */ NULL,
+ /* update_node */ NULL
+};
+
+/* GPU material from shader nodes */
+
+void ntreeGPUMaterialNodes(bNodeTree *ntree, GPUMaterial *mat)
+{
+ bNodeTreeExec *exec;
+
+ exec = ntreeShaderBeginExecTree(ntree, 1);
+
+ ntreeExecGPUNodes(exec, mat, 1);
+
+ ntreeShaderEndExecTree(exec, 1);
+}
+
+/* **************** call to switch lamploop for material node ************ */
+
+void (*node_shader_lamp_loop)(struct ShadeInput *, struct ShadeResult *);
+
+void set_node_shader_lamp_loop(void (*lamp_loop_func)(ShadeInput *, ShadeResult *))
+{
+ node_shader_lamp_loop= lamp_loop_func;
+}
+
+
+/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes.
+ * If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees.
+ */
+bNodeTreeExec *ntreeShaderBeginExecTree(bNodeTree *ntree, int use_tree_data)
+{
+ bNodeTreeExec *exec;
+ bNode *node;
+
+ if (use_tree_data) {
+ /* XXX hack: prevent exec data from being generated twice.
+ * this should be handled by the renderer!
+ */
+ if (ntree->execdata)
+ return ntree->execdata;
+ }
+
+ /* ensures only a single output node is enabled */
+ ntreeSetOutput(ntree);
+
+ /* common base initialization */
+ exec = ntree_exec_begin(ntree);
+
+ /* allocate the thread stack listbase array */
+ exec->threadstack= MEM_callocN(BLENDER_MAX_THREADS*sizeof(ListBase), "thread stack array");
+
+ for(node= exec->nodetree->nodes.first; node; node= node->next)
+ node->need_exec= 1;
+
+ if (use_tree_data) {
+ /* XXX this should not be necessary, but is still used for cmp/sha/tex nodes,
+ * which only store the ntree pointer. Should be fixed at some point!
+ */
+ ntree->execdata = exec;
+ }
+
+ return exec;
+}
+
+/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes.
+ * If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees.
+ */
+void ntreeShaderEndExecTree(bNodeTreeExec *exec, int use_tree_data)
+{
+ if(exec) {
+ bNodeTree *ntree= exec->nodetree;
+ bNodeThreadStack *nts;
+ int a;
+
+ if(exec->threadstack) {
+ for(a=0; a<BLENDER_MAX_THREADS; a++) {
+ for(nts=exec->threadstack[a].first; nts; nts=nts->next)
+ if (nts->stack) MEM_freeN(nts->stack);
+ BLI_freelistN(&exec->threadstack[a]);
+ }
+
+ MEM_freeN(exec->threadstack);
+ exec->threadstack= NULL;
+ }
+
+ ntree_exec_end(exec);
+
+ if (use_tree_data) {
+ /* XXX clear nodetree backpointer to exec data, same problem as noted in ntreeBeginExecTree */
+ ntree->execdata = NULL;
+ }
+ }
+}
+
+void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr)
+{
+ ShaderCallData scd;
+ /*
+ @note: preserve material from ShadeInput for material id, nodetree execs change it
+ fix for bug "[#28012] Mat ID messy with shader nodes"
+ */
+ Material *mat = shi->mat; bNodeThreadStack *nts = NULL;
+ bNodeTreeExec *exec = ntree->execdata;
+
+ /* convert caller data to struct */
+ scd.shi= shi;
+ scd.shr= shr;
+
+ /* each material node has own local shaderesult, with optional copying */
+ memset(shr, 0, sizeof(ShadeResult));
+
+ if (!exec)
+ exec = ntree->execdata = ntreeShaderBeginExecTree(ntree, 1);
+
+ nts= ntreeGetThreadStack(exec, shi->thread);
+ ntreeExecThreadNodes(exec, nts, &scd, shi->thread);
+ ntreeReleaseThreadStack(nts);
+
+ // @note: set material back to preserved material
+ shi->mat = mat;
+ /* better not allow negative for now */
+ if(shr->combined[0]<0.0f) shr->combined[0]= 0.0f;
+ if(shr->combined[1]<0.0f) shr->combined[1]= 0.0f;
+ if(shr->combined[2]<0.0f) shr->combined[2]= 0.0f;
+}
diff --git a/source/blender/nodes/shader/node_shader_util.c b/source/blender/nodes/shader/node_shader_util.c
new file mode 100644
index 00000000000..01dd0f7d5a1
--- /dev/null
+++ b/source/blender/nodes/shader/node_shader_util.c
@@ -0,0 +1,287 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * 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 LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/shader/node_shader_util.c
+ * \ingroup nodes
+ */
+
+
+#include "DNA_node_types.h"
+
+#include "node_shader_util.h"
+
+#include "node_exec.h"
+
+/* ****** */
+
+void nodestack_get_vec(float *in, short type_in, bNodeStack *ns)
+{
+ float *from= ns->vec;
+
+ if(type_in==SOCK_FLOAT) {
+ if(ns->sockettype==SOCK_FLOAT)
+ *in= *from;
+ else
+ *in= 0.333333f*(from[0]+from[1]+from[2]);
+ }
+ else if(type_in==SOCK_VECTOR) {
+ if(ns->sockettype==SOCK_FLOAT) {
+ in[0]= from[0];
+ in[1]= from[0];
+ in[2]= from[0];
+ }
+ else {
+ VECCOPY(in, from);
+ }
+ }
+ else { /* type_in==SOCK_RGBA */
+ if(ns->sockettype==SOCK_RGBA) {
+ QUATCOPY(in, from);
+ }
+ else if(ns->sockettype==SOCK_FLOAT) {
+ in[0]= from[0];
+ in[1]= from[0];
+ in[2]= from[0];
+ in[3]= 1.0f;
+ }
+ else {
+ VECCOPY(in, from);
+ in[3]= 1.0f;
+ }
+ }
+}
+
+
+/* ******************* execute and parse ************ */
+
+/* go over all used Geometry and Texture nodes, and return a texco flag */
+/* no group inside needed, this function is called for groups too */
+void ntreeShaderGetTexcoMode(bNodeTree *ntree, int r_mode, short *texco, int *mode)
+{
+ bNode *node;
+ bNodeSocket *sock;
+ int a;
+
+ ntreeSocketUseFlags(ntree);
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->type==SH_NODE_TEXTURE) {
+ if((r_mode & R_OSA) && node->id) {
+ Tex *tex= (Tex *)node->id;
+ if ELEM3(tex->type, TEX_IMAGE, TEX_PLUGIN, TEX_ENVMAP)
+ *texco |= TEXCO_OSA|NEED_UV;
+ }
+ /* usability exception... without input we still give the node orcos */
+ sock= node->inputs.first;
+ if(sock==NULL || sock->link==NULL)
+ *texco |= TEXCO_ORCO|NEED_UV;
+ }
+ else if(node->type==SH_NODE_GEOMETRY) {
+ /* note; sockets always exist for the given type! */
+ for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) {
+ if(sock->flag & SOCK_IN_USE) {
+ switch(a) {
+ case GEOM_OUT_GLOB:
+ *texco |= TEXCO_GLOB|NEED_UV; break;
+ case GEOM_OUT_VIEW:
+ *texco |= TEXCO_VIEW|NEED_UV; break;
+ case GEOM_OUT_ORCO:
+ *texco |= TEXCO_ORCO|NEED_UV; break;
+ case GEOM_OUT_UV:
+ *texco |= TEXCO_UV|NEED_UV; break;
+ case GEOM_OUT_NORMAL:
+ *texco |= TEXCO_NORM|NEED_UV; break;
+ case GEOM_OUT_VCOL:
+ *texco |= NEED_UV; *mode |= MA_VERTEXCOL; break;
+ }
+ }
+ }
+ }
+ }
+}
+
+/* nodes that use ID data get synced with local data */
+void nodeShaderSynchronizeID(bNode *node, int copyto)
+{
+ if(node->id==NULL) return;
+
+ if(ELEM(node->type, SH_NODE_MATERIAL, SH_NODE_MATERIAL_EXT)) {
+ bNodeSocket *sock;
+ Material *ma= (Material *)node->id;
+ int a;
+
+ /* hrmf, case in loop isnt super fast, but we dont edit 100s of material at same time either! */
+ for(a=0, sock= node->inputs.first; sock; sock= sock->next, a++) {
+ if(!(sock->flag & SOCK_HIDDEN)) {
+ if(copyto) {
+ switch(a) {
+ case MAT_IN_COLOR:
+ VECCOPY(&ma->r, ((bNodeSocketValueRGBA*)sock->default_value)->value); break;
+ case MAT_IN_SPEC:
+ VECCOPY(&ma->specr, ((bNodeSocketValueRGBA*)sock->default_value)->value); break;
+ case MAT_IN_REFL:
+ ma->ref= ((bNodeSocketValueFloat*)sock->default_value)->value; break;
+ case MAT_IN_MIR:
+ VECCOPY(&ma->mirr, ((bNodeSocketValueRGBA*)sock->default_value)->value); break;
+ case MAT_IN_AMB:
+ ma->amb= ((bNodeSocketValueFloat*)sock->default_value)->value; break;
+ case MAT_IN_EMIT:
+ ma->emit= ((bNodeSocketValueFloat*)sock->default_value)->value; break;
+ case MAT_IN_SPECTRA:
+ ma->spectra= ((bNodeSocketValueFloat*)sock->default_value)->value; break;
+ case MAT_IN_RAY_MIRROR:
+ ma->ray_mirror= ((bNodeSocketValueFloat*)sock->default_value)->value; break;
+ case MAT_IN_ALPHA:
+ ma->alpha= ((bNodeSocketValueFloat*)sock->default_value)->value; break;
+ case MAT_IN_TRANSLUCENCY:
+ ma->translucency= ((bNodeSocketValueFloat*)sock->default_value)->value; break;
+ }
+ }
+ else {
+ switch(a) {
+ case MAT_IN_COLOR:
+ VECCOPY(((bNodeSocketValueRGBA*)sock->default_value)->value, &ma->r); break;
+ case MAT_IN_SPEC:
+ VECCOPY(((bNodeSocketValueRGBA*)sock->default_value)->value, &ma->specr); break;
+ case MAT_IN_REFL:
+ ((bNodeSocketValueFloat*)sock->default_value)->value= ma->ref; break;
+ case MAT_IN_MIR:
+ VECCOPY(((bNodeSocketValueRGBA*)sock->default_value)->value, &ma->mirr); break;
+ case MAT_IN_AMB:
+ ((bNodeSocketValueFloat*)sock->default_value)->value= ma->amb; break;
+ case MAT_IN_EMIT:
+ ((bNodeSocketValueFloat*)sock->default_value)->value= ma->emit; break;
+ case MAT_IN_SPECTRA:
+ ((bNodeSocketValueFloat*)sock->default_value)->value= ma->spectra; break;
+ case MAT_IN_RAY_MIRROR:
+ ((bNodeSocketValueFloat*)sock->default_value)->value= ma->ray_mirror; break;
+ case MAT_IN_ALPHA:
+ ((bNodeSocketValueFloat*)sock->default_value)->value= ma->alpha; break;
+ case MAT_IN_TRANSLUCENCY:
+ ((bNodeSocketValueFloat*)sock->default_value)->value= ma->translucency; break;
+ }
+ }
+ }
+ }
+ }
+
+}
+
+
+void node_gpu_stack_from_data(struct GPUNodeStack *gs, int type, bNodeStack *ns)
+{
+ memset(gs, 0, sizeof(*gs));
+
+ QUATCOPY(gs->vec, ns->vec);
+ gs->link= ns->data;
+
+ if (type == SOCK_FLOAT)
+ gs->type= GPU_FLOAT;
+ else if (type == SOCK_VECTOR)
+ gs->type= GPU_VEC3;
+ else if (type == SOCK_RGBA)
+ gs->type= GPU_VEC4;
+ else
+ gs->type= GPU_NONE;
+
+ gs->name = "";
+ gs->hasinput= ns->hasinput && ns->data;
+ gs->hasoutput= ns->hasoutput && ns->data;
+ gs->sockettype= ns->sockettype;
+}
+
+void node_data_from_gpu_stack(bNodeStack *ns, GPUNodeStack *gs)
+{
+ ns->data= gs->link;
+ ns->sockettype= gs->sockettype;
+}
+
+static void gpu_stack_from_data_list(GPUNodeStack *gs, ListBase *sockets, bNodeStack **ns)
+{
+ bNodeSocket *sock;
+ int i;
+
+ for (sock=sockets->first, i=0; sock; sock=sock->next, i++)
+ node_gpu_stack_from_data(&gs[i], sock->type, ns[i]);
+
+ gs[i].type= GPU_NONE;
+}
+
+static void data_from_gpu_stack_list(ListBase *sockets, bNodeStack **ns, GPUNodeStack *gs)
+{
+ bNodeSocket *sock;
+ int i;
+
+ for (sock=sockets->first, i=0; sock; sock=sock->next, i++)
+ node_data_from_gpu_stack(ns[i], &gs[i]);
+}
+
+void ntreeExecGPUNodes(bNodeTreeExec *exec, GPUMaterial *mat, int do_outputs)
+{
+ bNodeExec *nodeexec;
+ bNode *node;
+ int n;
+ bNodeStack *stack;
+ bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
+ bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */
+ GPUNodeStack gpuin[MAX_SOCKET+1], gpuout[MAX_SOCKET+1];
+ int doit;
+
+ stack= exec->stack;
+
+ for(n=0, nodeexec= exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
+ node = nodeexec->node;
+
+ doit = 0;
+ /* for groups, only execute outputs for edited group */
+ if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
+ if(do_outputs && (node->flag & NODE_DO_OUTPUT))
+ doit = 1;
+ }
+ else
+ doit = 1;
+
+ if (doit) {
+ if(node->typeinfo->gpufunc) {
+ node_get_stack(node, stack, nsin, nsout);
+ gpu_stack_from_data_list(gpuin, &node->inputs, nsin);
+ gpu_stack_from_data_list(gpuout, &node->outputs, nsout);
+ if(node->typeinfo->gpufunc(mat, node, gpuin, gpuout))
+ data_from_gpu_stack_list(&node->outputs, nsout, gpuout);
+ }
+ else if(node->typeinfo->gpuextfunc) {
+ node_get_stack(node, stack, nsin, nsout);
+ gpu_stack_from_data_list(gpuin, &node->inputs, nsin);
+ gpu_stack_from_data_list(gpuout, &node->outputs, nsout);
+ if(node->typeinfo->gpuextfunc(mat, node, nodeexec->data, gpuin, gpuout))
+ data_from_gpu_stack_list(&node->outputs, nsout, gpuout);
+ }
+ }
+ }
+}
diff --git a/source/blender/nodes/intern/SHD_util.h b/source/blender/nodes/shader/node_shader_util.h
index e6b1377067d..4c929c93517 100644
--- a/source/blender/nodes/intern/SHD_util.h
+++ b/source/blender/nodes/shader/node_shader_util.h
@@ -27,13 +27,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_util.h
+/** \file blender/nodes/shader/node_shader_util.h
* \ingroup nodes
*/
-#ifndef SHD_NODE_UTIL_H_
-#define SHD_NODE_UTIL_H_
+#ifndef NODE_SHADER_UTIL_H_
+#define NODE_SHADER_UTIL_H_
#include <math.h>
#include <float.h>
@@ -61,7 +61,7 @@
#include "BKE_library.h"
-#include "../SHD_node.h"
+#include "NOD_shader.h"
#include "node_util.h"
#include "BLI_math.h"
@@ -122,4 +122,9 @@ typedef struct ShaderCallData {
extern void node_ID_title_cb(void *node_v, void *unused_v);
void nodestack_get_vec(float *in, short type_in, bNodeStack *ns);
+void node_gpu_stack_from_data(struct GPUNodeStack *gs, int type, struct bNodeStack *ns);
+void node_data_from_gpu_stack(struct bNodeStack *ns, struct GPUNodeStack *gs);
+
+void ntreeExecGPUNodes(struct bNodeTreeExec *exec, struct GPUMaterial *mat, int do_outputs);
+
#endif
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_camera.c b/source/blender/nodes/shader/nodes/node_shader_camera.c
index eea572bf271..c1e737fcb53 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_camera.c
+++ b/source/blender/nodes/shader/nodes/node_shader_camera.c
@@ -27,18 +27,18 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_camera.c
+/** \file blender/nodes/shader/nodes/node_shader_camera.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** CAMERA INFO ******************** */
-static bNodeSocketType sh_node_camera_out[]= {
- { SOCK_VECTOR, 0, "View Vector", 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f}, /* None of these actually */
- { SOCK_VALUE, 0, "View Z Depth", 0.f, 0.0f, 0.0f, 0.0f, 0.0f, 99999999999.0f}, /* have any limits on their */
- { SOCK_VALUE, 0, "View Distance", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 99999999999.0f}, /* values. */
+static bNodeSocketTemplate sh_node_camera_out[]= {
+ { SOCK_VECTOR, 0, "View Vector"},
+ { SOCK_FLOAT, 0, "View Z Depth"},
+ { SOCK_FLOAT, 0, "View Distance"},
{ -1, 0, "" }
};
@@ -63,8 +63,8 @@ void register_node_type_sh_camera(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_CAMERA, "Camera Data", NODE_CLASS_INPUT, 0,
- NULL, sh_node_camera_out);
+ node_type_base(&ntype, SH_NODE_CAMERA, "Camera Data", NODE_CLASS_INPUT, 0);
+ node_type_socket_templates(&ntype, NULL, sh_node_camera_out);
node_type_size(&ntype, 95, 95, 120);
node_type_storage(&ntype, "node_camera", NULL, NULL);
node_type_exec(&ntype, node_shader_exec_camera);
diff --git a/source/blender/nodes/shader/nodes/node_shader_common.c b/source/blender/nodes/shader/nodes/node_shader_common.c
new file mode 100644
index 00000000000..2dd15ab1e99
--- /dev/null
+++ b/source/blender/nodes/shader/nodes/node_shader_common.c
@@ -0,0 +1,327 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2006 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Campbell Barton, Alfredo de Greef, David Millan Escriva,
+ * Juho Vepsäläinen
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/shader/nodes/node_shader_common.c
+ * \ingroup shdnodes
+ */
+
+
+#include "DNA_node_types.h"
+
+#include "BKE_node.h"
+
+#include "node_shader_util.h"
+#include "node_common.h"
+#include "node_exec.h"
+
+static void copy_stack(bNodeStack *to, bNodeStack *from)
+{
+ if (to != from) {
+ copy_v4_v4(to->vec, from->vec);
+ to->data = from->data;
+ to->datatype = from->datatype;
+
+ /* tag as copy to prevent freeing */
+ to->is_copy = 1;
+ }
+}
+
+static void move_stack(bNodeStack *to, bNodeStack *from)
+{
+ if (to != from) {
+ copy_v4_v4(to->vec, from->vec);
+ to->data = from->data;
+ to->datatype = from->datatype;
+ to->is_copy = from->is_copy;
+
+ zero_v4(from->vec);
+ from->data = NULL;
+ from->datatype = 0;
+ from->is_copy = 0;
+ }
+}
+
+/**** GROUP ****/
+
+static void *group_initexec(bNode *node)
+{
+ bNodeTree *ngroup= (bNodeTree*)node->id;
+ bNodeTreeExec *exec;
+
+ /* initialize the internal node tree execution */
+ exec = ntreeShaderBeginExecTree(ngroup, 0);
+
+ return exec;
+}
+
+static void group_freeexec(bNode *UNUSED(node), void *nodedata)
+{
+ bNodeTreeExec*gexec= (bNodeTreeExec*)nodedata;
+
+ ntreeShaderEndExecTree(gexec, 0);
+}
+
+/* Copy inputs to the internal stack.
+ */
+static void group_copy_inputs(bNode *node, bNodeStack **in, bNodeStack *gstack)
+{
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int a;
+ for (sock=node->inputs.first, a=0; sock; sock=sock->next, ++a) {
+ if (sock->groupsock) {
+ ns = node_get_socket_stack(gstack, sock->groupsock);
+ copy_stack(ns, in[a]);
+ }
+ }
+}
+
+/* Copy internal results to the external outputs.
+ */
+static void group_move_outputs(bNode *node, bNodeStack **out, bNodeStack *gstack)
+{
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int a;
+ for (sock=node->outputs.first, a=0; sock; sock=sock->next, ++a) {
+ if (sock->groupsock) {
+ ns = node_get_socket_stack(gstack, sock->groupsock);
+ move_stack(out[a], ns);
+ }
+ }
+}
+
+static void group_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out)
+{
+ bNodeTreeExec *exec= (bNodeTreeExec*)nodedata;
+ bNodeThreadStack *nts;
+
+ /* XXX same behavior as trunk: all nodes inside group are executed.
+ * it's stupid, but just makes it work. compo redesign will do this better.
+ */
+ {
+ bNode *inode;
+ for (inode=exec->nodetree->nodes.first; inode; inode=inode->next)
+ inode->need_exec = 1;
+ }
+
+ nts = ntreeGetThreadStack(exec, thread);
+
+ group_copy_inputs(node, in, nts->stack);
+ ntreeExecThreadNodes(exec, nts, data, thread);
+ group_move_outputs(node, out, nts->stack);
+
+ ntreeReleaseThreadStack(nts);
+}
+
+static void group_gpu_copy_inputs(bNode *node, GPUNodeStack *in, bNodeStack *gstack)
+{
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int a;
+ for (sock=node->inputs.first, a=0; sock; sock=sock->next, ++a) {
+ if (sock->groupsock) {
+ ns = node_get_socket_stack(gstack, sock->groupsock);
+ /* convert the external gpu stack back to internal node stack data */
+ node_data_from_gpu_stack(ns, &in[a]);
+ }
+ }
+}
+
+/* Copy internal results to the external outputs.
+ */
+static void group_gpu_move_outputs(bNode *node, GPUNodeStack *out, bNodeStack *gstack)
+{
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int a;
+ for (sock=node->outputs.first, a=0; sock; sock=sock->next, ++a) {
+ if (sock->groupsock) {
+ ns = node_get_socket_stack(gstack, sock->groupsock);
+ /* convert the node stack data result back to gpu stack */
+ node_gpu_stack_from_data(&out[a], sock->type, ns);
+ }
+ }
+}
+
+static int gpu_group_execute(GPUMaterial *mat, bNode *node, void *nodedata, GPUNodeStack *in, GPUNodeStack *out)
+{
+ bNodeTreeExec *exec= (bNodeTreeExec*)nodedata;
+
+ group_gpu_copy_inputs(node, in, exec->stack);
+ ntreeExecGPUNodes(exec, mat, (node->flag & NODE_GROUP_EDIT));
+ group_gpu_move_outputs(node, out, exec->stack);
+
+ return 1;
+}
+
+void register_node_type_sh_group(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, NODE_GROUP, "Group", NODE_CLASS_GROUP, NODE_OPTIONS|NODE_CONST_OUTPUT);
+ node_type_socket_templates(&ntype, NULL, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_label(&ntype, node_group_label);
+ node_type_init(&ntype, node_group_init);
+ node_type_valid(&ntype, node_group_valid);
+ node_type_template(&ntype, node_group_template);
+ node_type_update(&ntype, NULL, node_group_verify);
+ node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear);
+ node_type_exec_new(&ntype, group_initexec, group_freeexec, group_execute);
+ node_type_gpu_ext(&ntype, gpu_group_execute);
+
+ nodeRegisterType(lb, &ntype);
+}
+
+
+/**** FOR LOOP ****/
+
+#if 0 /* XXX loop nodes don't work nicely with current trees */
+static void forloop_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out)
+{
+ bNodeTreeExec *exec= (bNodeTreeExec*)nodedata;
+ bNodeThreadStack *nts;
+ int iterations= (int)in[0]->vec[0];
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int iteration;
+
+ /* XXX same behavior as trunk: all nodes inside group are executed.
+ * it's stupid, but just makes it work. compo redesign will do this better.
+ */
+ {
+ bNode *inode;
+ for (inode=exec->nodetree->nodes.first; inode; inode=inode->next)
+ inode->need_exec = 1;
+ }
+
+ nts = ntreeGetThreadStack(exec, thread);
+
+ /* "Iteration" socket */
+ sock = exec->nodetree->inputs.first;
+ ns = node_get_socket_stack(nts->stack, sock);
+
+// group_copy_inputs(node, in, nts->stack);
+ for (iteration=0; iteration < iterations; ++iteration) {
+ /* first input contains current iteration counter */
+ ns->vec[0] = (float)iteration;
+ ns->vec[1]=ns->vec[2]=ns->vec[3] = 0.0f;
+
+// if (iteration > 0)
+// loop_init_iteration(exec->nodetree, nts->stack);
+// ntreeExecThreadNodes(exec, nts, data, thread);
+ }
+// loop_copy_outputs(node, in, out, exec->stack);
+
+ ntreeReleaseThreadStack(nts);
+}
+
+void register_node_type_sh_forloop(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, NODE_FORLOOP, "For", NODE_CLASS_GROUP, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_label(&ntype, node_group_label);
+ node_type_init(&ntype, node_forloop_init);
+ node_type_valid(&ntype, node_group_valid);
+ node_type_template(&ntype, node_forloop_template);
+ node_type_update(&ntype, NULL, node_group_verify);
+ node_type_tree(&ntype, node_forloop_init_tree, node_loop_update_tree);
+ node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear);
+ node_type_exec_new(&ntype, group_initexec, group_freeexec, forloop_execute);
+
+ nodeRegisterType(lb, &ntype);
+}
+#endif
+
+/**** WHILE LOOP ****/
+
+#if 0 /* XXX loop nodes don't work nicely with current trees */
+static void whileloop_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out)
+{
+ bNodeTreeExec *exec= (bNodeTreeExec*)nodedata;
+ bNodeThreadStack *nts;
+ int condition= (in[0]->vec[0] > 0.0f);
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int iteration;
+
+ /* XXX same behavior as trunk: all nodes inside group are executed.
+ * it's stupid, but just makes it work. compo redesign will do this better.
+ */
+ {
+ bNode *inode;
+ for (inode=exec->nodetree->nodes.first; inode; inode=inode->next)
+ inode->need_exec = 1;
+ }
+
+ nts = ntreeGetThreadStack(exec, thread);
+
+ /* "Condition" socket */
+ sock = exec->nodetree->outputs.first;
+ ns = node_get_socket_stack(nts->stack, sock);
+
+ iteration = 0;
+// group_copy_inputs(node, in, nts->stack);
+ while (condition && iteration < node->custom1) {
+// if (iteration > 0)
+// loop_init_iteration(exec->nodetree, nts->stack);
+// ntreeExecThreadNodes(exec, nts, data, thread);
+
+ condition = (ns->vec[0] > 0.0f);
+ ++iteration;
+ }
+// loop_copy_outputs(node, in, out, exec->stack);
+
+ ntreeReleaseThreadStack(nts);
+}
+
+void register_node_type_sh_whileloop(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, NODE_WHILELOOP, "While", NODE_CLASS_GROUP, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_label(&ntype, node_group_label);
+ node_type_init(&ntype, node_whileloop_init);
+ node_type_valid(&ntype, node_group_valid);
+ node_type_template(&ntype, node_whileloop_template);
+ node_type_update(&ntype, NULL, node_group_verify);
+ node_type_tree(&ntype, node_whileloop_init_tree, node_loop_update_tree);
+ node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear);
+ node_type_exec_new(&ntype, group_initexec, group_freeexec, whileloop_execute);
+
+ nodeRegisterType(lb, &ntype);
+}
+#endif
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_curves.c b/source/blender/nodes/shader/nodes/node_shader_curves.c
index a39a639897e..9dedeba6d39 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_curves.c
+++ b/source/blender/nodes/shader/nodes/node_shader_curves.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_curves.c
+/** \file blender/nodes/shader/nodes/node_shader_curves.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** CURVE VEC ******************** */
-static bNodeSocketType sh_node_curve_vec_in[]= {
- { SOCK_VALUE, 0, "Fac", 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_curve_vec_in[]= {
+ { SOCK_FLOAT, 0, "Fac", 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_curve_vec_out[]= {
- { SOCK_VECTOR, 0, "Vector", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_curve_vec_out[]= {
+ { SOCK_VECTOR, 0, "Vector"},
{ -1, 0, "" }
};
@@ -57,7 +57,7 @@ static void node_shader_exec_curve_vec(void *UNUSED(data), bNode *node, bNodeSta
curvemapping_evaluate3F(node->storage, out[0]->vec, vec);
}
-static void node_shader_init_curve_vec(bNode* node)
+static void node_shader_init_curve_vec(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= curvemapping_add(3, -1.0f, -1.0f, 1.0f, 1.0f);
}
@@ -75,8 +75,8 @@ void register_node_type_sh_curve_vec(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_CURVE_VEC, "Vector Curves", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- sh_node_curve_vec_in, sh_node_curve_vec_out);
+ node_type_base(&ntype, SH_NODE_CURVE_VEC, "Vector Curves", NODE_CLASS_OP_VECTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_curve_vec_in, sh_node_curve_vec_out);
node_type_size(&ntype, 200, 140, 320);
node_type_init(&ntype, node_shader_init_curve_vec);
node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
@@ -88,14 +88,14 @@ void register_node_type_sh_curve_vec(ListBase *lb)
/* **************** CURVE RGB ******************** */
-static bNodeSocketType sh_node_curve_rgb_in[]= {
- { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_curve_rgb_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_curve_rgb_out[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_curve_rgb_out[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -112,7 +112,7 @@ static void node_shader_exec_curve_rgb(void *UNUSED(data), bNode *node, bNodeSta
}
}
-static void node_shader_init_curve_rgb(bNode *node)
+static void node_shader_init_curve_rgb(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f);
}
@@ -129,8 +129,8 @@ void register_node_type_sh_curve_rgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- sh_node_curve_rgb_in, sh_node_curve_rgb_out);
+ node_type_base(&ntype, SH_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_curve_rgb_in, sh_node_curve_rgb_out);
node_type_size(&ntype, 200, 140, 320);
node_type_init(&ntype, node_shader_init_curve_rgb);
node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c b/source/blender/nodes/shader/nodes/node_shader_dynamic.c
index d5e5d5eeb93..5aae54d858b 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c
+++ b/source/blender/nodes/shader/nodes/node_shader_dynamic.c
@@ -27,7 +27,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_dynamic.c
+/** \file blender/nodes/shader/nodes/node_shader_dynamic.c
* \ingroup shdnodes
*/
@@ -54,7 +54,7 @@
#endif
#endif
-#include "../SHD_util.h"
+#include "node_shader_util.h"
// XXX
#if 0
@@ -95,7 +95,7 @@ static bNodeType *node_dynamic_find_typeinfo(ListBase *list, ID *id)
static void node_dynamic_free_typeinfo_sockets(bNodeType *tinfo)
{
- bNodeSocketType *sock;
+ bNodeSocketTemplate *sock;
if (!tinfo) return;
@@ -782,7 +782,7 @@ void register_node_type_sh_dynamic(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, NODE_DYNAMIC, "Dynamic", NODE_CLASS_OP_DYNAMIC, 0, NULL, NULL);
+ node_type_base(&ntype, NODE_DYNAMIC, "Dynamic", NODE_CLASS_OP_DYNAMIC, 0);
nodeRegisterType(lb, &ntype);
}
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_geom.c b/source/blender/nodes/shader/nodes/node_shader_geom.c
index 379f54bec57..ddb8c42a730 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_geom.c
+++ b/source/blender/nodes/shader/nodes/node_shader_geom.c
@@ -27,27 +27,27 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_geom.c
+/** \file blender/nodes/shader/nodes/node_shader_geom.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
#include "DNA_customdata_types.h"
/* **************** GEOMETRY ******************** */
/* output socket type definition */
-static bNodeSocketType sh_node_geom_out[]= {
- { SOCK_VECTOR, 0, "Global", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, /* btw; uses no limit */
- { SOCK_VECTOR, 0, "Local", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_VECTOR, 0, "View", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_VECTOR, 0, "Orco", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_VECTOR, 0, "UV", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_RGBA, 0, "Vertex Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Front/Back", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_geom_out[]= {
+ { SOCK_VECTOR, 0, "Global"},
+ { SOCK_VECTOR, 0, "Local"},
+ { SOCK_VECTOR, 0, "View"},
+ { SOCK_VECTOR, 0, "Orco"},
+ { SOCK_VECTOR, 0, "UV"},
+ { SOCK_VECTOR, 0, "Normal"},
+ { SOCK_RGBA, 0, "Vertex Color"},
+ { SOCK_FLOAT, 0, "Front/Back"},
{ -1, 0, "" }
};
@@ -72,12 +72,12 @@ static void node_shader_exec_geom(void *data, bNode *node, bNodeStack **UNUSED(i
}
/* out: global, local, view, orco, uv, normal, vertex color */
- VECCOPY(out[GEOM_OUT_GLOB]->vec, shi->gl);
- VECCOPY(out[GEOM_OUT_LOCAL]->vec, shi->co);
- VECCOPY(out[GEOM_OUT_VIEW]->vec, shi->view);
- VECCOPY(out[GEOM_OUT_ORCO]->vec, shi->lo);
- VECCOPY(out[GEOM_OUT_UV]->vec, suv->uv);
- VECCOPY(out[GEOM_OUT_NORMAL]->vec, shi->vno);
+ copy_v3_v3(out[GEOM_OUT_GLOB]->vec, shi->gl);
+ copy_v3_v3(out[GEOM_OUT_LOCAL]->vec, shi->co);
+ copy_v3_v3(out[GEOM_OUT_VIEW]->vec, shi->view);
+ copy_v3_v3(out[GEOM_OUT_ORCO]->vec, shi->lo);
+ copy_v3_v3(out[GEOM_OUT_UV]->vec, suv->uv);
+ copy_v3_v3(out[GEOM_OUT_NORMAL]->vec, shi->vno);
if (shi->totcol) {
/* find vertex color layer by name */
@@ -118,7 +118,7 @@ static void node_shader_exec_geom(void *data, bNode *node, bNodeStack **UNUSED(i
}
}
-static void node_shader_init_geometry(bNode *node)
+static void node_shader_init_geometry(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= MEM_callocN(sizeof(NodeGeometry), "NodeGeometry");
}
@@ -140,8 +140,8 @@ void register_node_type_sh_geom(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_GEOMETRY, "Geometry", NODE_CLASS_INPUT, NODE_OPTIONS,
- NULL, sh_node_geom_out);
+ node_type_base(&ntype, SH_NODE_GEOMETRY, "Geometry", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, sh_node_geom_out);
node_type_size(&ntype, 120, 80, 160);
node_type_init(&ntype, node_shader_init_geometry);
node_type_storage(&ntype, "NodeGeometry", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c b/source/blender/nodes/shader/nodes/node_shader_hueSatVal.c
index 91fd995dbbe..f4f69cf56fe 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c
+++ b/source/blender/nodes/shader/nodes/node_shader_hueSatVal.c
@@ -1,5 +1,5 @@
/*
- *
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -27,25 +27,25 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c
+/** \file blender/nodes/shader/nodes/node_shader_hueSatVal.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** Hue Saturation ******************** */
-static bNodeSocketType sh_node_hue_sat_in[]= {
- { SOCK_VALUE, 1, "Hue", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Saturation", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f},
- { SOCK_VALUE, 1, "Value", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f},
- { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_hue_sat_in[]= {
+ { SOCK_FLOAT, 1, "Hue", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Saturation", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f, PROP_FACTOR},
+ { SOCK_FLOAT, 1, "Value", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f, PROP_FACTOR},
+ { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_hue_sat_out[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_hue_sat_out[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -86,8 +86,8 @@ void register_node_type_sh_hue_sat(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- sh_node_hue_sat_in, sh_node_hue_sat_out);
+ node_type_base(&ntype, SH_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_hue_sat_in, sh_node_hue_sat_out);
node_type_size(&ntype, 150, 80, 250);
node_type_exec(&ntype, node_shader_exec_hue_sat);
node_type_gpu(&ntype, gpu_shader_hue_sat);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_invert.c b/source/blender/nodes/shader/nodes/node_shader_invert.c
index f8d6e54859e..5347d98b42e 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_invert.c
+++ b/source/blender/nodes/shader/nodes/node_shader_invert.c
@@ -27,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_invert.c
+/** \file blender/nodes/shader/nodes/node_shader_invert.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** INVERT ******************** */
-static bNodeSocketType sh_node_invert_in[]= {
- { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_invert_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_invert_out[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_invert_out[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -78,8 +78,8 @@ void register_node_type_sh_invert(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- sh_node_invert_in, sh_node_invert_out);
+ node_type_base(&ntype, SH_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_invert_in, sh_node_invert_out);
node_type_size(&ntype, 90, 80, 100);
node_type_exec(&ntype, node_shader_exec_invert);
node_type_gpu(&ntype, gpu_shader_invert);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c b/source/blender/nodes/shader/nodes/node_shader_mapping.c
index eb300301ce2..05432708b29 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c
+++ b/source/blender/nodes/shader/nodes/node_shader_mapping.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_mapping.c
+/** \file blender/nodes/shader/nodes/node_shader_mapping.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** MAPPING ******************** */
-static bNodeSocketType sh_node_mapping_in[]= {
- { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_mapping_in[]= {
+ { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_mapping_out[]= {
- { SOCK_VECTOR, 0, "Vector", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_mapping_out[]= {
+ { SOCK_VECTOR, 0, "Vector"},
{ -1, 0, "" }
};
@@ -69,7 +69,7 @@ static void node_shader_exec_mapping(void *UNUSED(data), bNode *node, bNodeStack
}
-static void node_shader_init_mapping(bNode *node)
+static void node_shader_init_mapping(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= add_mapping();
}
@@ -92,8 +92,8 @@ void register_node_type_sh_mapping(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_MAPPING, "Mapping", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- sh_node_mapping_in, sh_node_mapping_out);
+ node_type_base(&ntype, SH_NODE_MAPPING, "Mapping", NODE_CLASS_OP_VECTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_mapping_in, sh_node_mapping_out);
node_type_size(&ntype, 240, 160, 320);
node_type_init(&ntype, node_shader_init_mapping);
node_type_storage(&ntype, "TexMapping", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_material.c b/source/blender/nodes/shader/nodes/node_shader_material.c
index f78dd9ec727..21fb4db115b 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_material.c
+++ b/source/blender/nodes/shader/nodes/node_shader_material.c
@@ -27,54 +27,54 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_material.c
+/** \file blender/nodes/shader/nodes/node_shader_material.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** MATERIAL ******************** */
-static bNodeSocketType sh_node_material_in[]= {
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Spec", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Refl", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_material_in[]= {
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_RGBA, 1, "Spec", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Refl", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_DIRECTION},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_material_out[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_material_out[]= {
+ { SOCK_RGBA, 0, "Color"},
+ { SOCK_FLOAT, 0, "Alpha"},
+ { SOCK_VECTOR, 0, "Normal"},
{ -1, 0, "" }
};
/* **************** EXTENDED MATERIAL ******************** */
-static bNodeSocketType sh_node_material_ext_in[]= {
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Spec", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Refl", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_RGBA, 1, "Mirror", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Ambient", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Emit", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "SpecTra", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Ray Mirror", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Alpha", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Translucency", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_material_ext_in[]= {
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_RGBA, 1, "Spec", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Refl", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_DIRECTION},
+ { SOCK_RGBA, 1, "Mirror", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Ambient", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_FLOAT, 1, "Emit", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_UNSIGNED},
+ { SOCK_FLOAT, 1, "SpecTra", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_FLOAT, 1, "Ray Mirror", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_FLOAT, 1, "Alpha", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_UNSIGNED},
+ { SOCK_FLOAT, 1, "Translucency", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_material_ext_out[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_RGBA, 0, "Diffuse", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, "Spec", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, "AO", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_material_ext_out[]= {
+ { SOCK_RGBA, 0, "Color"},
+ { SOCK_FLOAT, 0, "Alpha"},
+ { SOCK_VECTOR, 0, "Normal"},
+ { SOCK_RGBA, 0, "Diffuse"},
+ { SOCK_RGBA, 0, "Spec"},
+ { SOCK_RGBA, 0, "AO"},
{ -1, 0, "" }
};
@@ -112,7 +112,7 @@ static void node_shader_exec_material(void *data, bNode *node, bNodeStack **in,
nodestack_get_vec(&shi->specr, SOCK_VECTOR, in[MAT_IN_SPEC]);
if(hasinput[MAT_IN_REFL])
- nodestack_get_vec(&shi->refl, SOCK_VALUE, in[MAT_IN_REFL]);
+ nodestack_get_vec(&shi->refl, SOCK_FLOAT, in[MAT_IN_REFL]);
/* retrieve normal */
if(hasinput[MAT_IN_NORMAL]) {
@@ -120,30 +120,28 @@ static void node_shader_exec_material(void *data, bNode *node, bNodeStack **in,
normalize_v3(shi->vn);
}
else
- VECCOPY(shi->vn, shi->vno);
+ copy_v3_v3(shi->vn, shi->vno);
/* custom option to flip normal */
if(node->custom1 & SH_NODE_MAT_NEG) {
- shi->vn[0]= -shi->vn[0];
- shi->vn[1]= -shi->vn[1];
- shi->vn[2]= -shi->vn[2];
+ negate_v3(shi->vn);
}
if (node->type == SH_NODE_MATERIAL_EXT) {
if(hasinput[MAT_IN_MIR])
nodestack_get_vec(&shi->mirr, SOCK_VECTOR, in[MAT_IN_MIR]);
if(hasinput[MAT_IN_AMB])
- nodestack_get_vec(&shi->amb, SOCK_VALUE, in[MAT_IN_AMB]);
+ nodestack_get_vec(&shi->amb, SOCK_FLOAT, in[MAT_IN_AMB]);
if(hasinput[MAT_IN_EMIT])
- nodestack_get_vec(&shi->emit, SOCK_VALUE, in[MAT_IN_EMIT]);
+ nodestack_get_vec(&shi->emit, SOCK_FLOAT, in[MAT_IN_EMIT]);
if(hasinput[MAT_IN_SPECTRA])
- nodestack_get_vec(&shi->spectra, SOCK_VALUE, in[MAT_IN_SPECTRA]);
+ nodestack_get_vec(&shi->spectra, SOCK_FLOAT, in[MAT_IN_SPECTRA]);
if(hasinput[MAT_IN_RAY_MIRROR])
- nodestack_get_vec(&shi->ray_mirror, SOCK_VALUE, in[MAT_IN_RAY_MIRROR]);
+ nodestack_get_vec(&shi->ray_mirror, SOCK_FLOAT, in[MAT_IN_RAY_MIRROR]);
if(hasinput[MAT_IN_ALPHA])
- nodestack_get_vec(&shi->alpha, SOCK_VALUE, in[MAT_IN_ALPHA]);
+ nodestack_get_vec(&shi->alpha, SOCK_FLOAT, in[MAT_IN_ALPHA]);
if(hasinput[MAT_IN_TRANSLUCENCY])
- nodestack_get_vec(&shi->translucency, SOCK_VALUE, in[MAT_IN_TRANSLUCENCY]);
+ nodestack_get_vec(&shi->translucency, SOCK_FLOAT, in[MAT_IN_TRANSLUCENCY]);
}
shi->nodes= 1; /* temp hack to prevent trashadow recursion */
@@ -204,7 +202,7 @@ static void node_shader_exec_material(void *data, bNode *node, bNodeStack **in,
}
-static void node_shader_init_material(bNode* node)
+static void node_shader_init_material(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->custom1= SH_NODE_MAT_DIFF|SH_NODE_MAT_SPEC;
}
@@ -308,8 +306,8 @@ void register_node_type_sh_material(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_MATERIAL, "Material", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
- sh_node_material_in, sh_node_material_out);
+ node_type_base(&ntype, SH_NODE_MATERIAL, "Material", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW);
+ node_type_socket_templates(&ntype, sh_node_material_in, sh_node_material_out);
node_type_size(&ntype, 120, 80, 240);
node_type_init(&ntype, node_shader_init_material);
node_type_exec(&ntype, node_shader_exec_material);
@@ -323,8 +321,8 @@ void register_node_type_sh_material_ext(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_MATERIAL_EXT, "Extended Material", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
- sh_node_material_ext_in, sh_node_material_ext_out);
+ node_type_base(&ntype, SH_NODE_MATERIAL_EXT, "Extended Material", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW);
+ node_type_socket_templates(&ntype, sh_node_material_ext_in, sh_node_material_ext_out);
node_type_size(&ntype, 120, 80, 240);
node_type_init(&ntype, node_shader_init_material);
node_type_exec(&ntype, node_shader_exec_material);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_math.c b/source/blender/nodes/shader/nodes/node_shader_math.c
index dd0a564dc4b..592779d6803 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_math.c
+++ b/source/blender/nodes/shader/nodes/node_shader_math.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_math.c
+/** \file blender/nodes/shader/nodes/node_shader_math.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** SCALAR MATH ******************** */
-static bNodeSocketType sh_node_math_in[]= {
- { SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f},
- { SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f},
+static bNodeSocketTemplate sh_node_math_in[]= {
+ { SOCK_FLOAT, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_math_out[]= {
- { SOCK_VALUE, 0, "Value", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_math_out[]= {
+ { SOCK_FLOAT, 0, "Value"},
{ -1, 0, "" }
};
@@ -242,8 +242,8 @@ void register_node_type_sh_math(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- sh_node_math_in, sh_node_math_out);
+ node_type_base(&ntype, SH_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_math_in, sh_node_math_out);
node_type_size(&ntype, 120, 110, 160);
node_type_label(&ntype, node_math_label);
node_type_storage(&ntype, "node_math", NULL, NULL);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c b/source/blender/nodes/shader/nodes/node_shader_mixRgb.c
index 8b3033a98ca..a9e4f2129be 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c
+++ b/source/blender/nodes/shader/nodes/node_shader_mixRgb.c
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_mixRgb.c
+/** \file blender/nodes/shader/nodes/node_shader_mixRgb.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** MIX RGB ******************** */
-static bNodeSocketType sh_node_mix_rgb_in[]= {
- { SOCK_VALUE, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Color1", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 1, "Color2", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_mix_rgb_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Color1", 0.5f, 0.5f, 0.5f, 1.0f},
+ { SOCK_RGBA, 1, "Color2", 0.5f, 0.5f, 0.5f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_mix_rgb_out[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_mix_rgb_out[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -54,7 +54,7 @@ static void node_shader_exec_mix_rgb(void *UNUSED(data), bNode *node, bNodeStack
float fac;
float vec[3];
- nodestack_get_vec(&fac, SOCK_VALUE, in[0]);
+ nodestack_get_vec(&fac, SOCK_FLOAT, in[0]);
CLAMP(fac, 0.0f, 1.0f);
nodestack_get_vec(col, SOCK_VECTOR, in[1]);
@@ -79,8 +79,8 @@ void register_node_type_sh_mix_rgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- sh_node_mix_rgb_in, sh_node_mix_rgb_out);
+ node_type_base(&ntype, SH_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_mix_rgb_in, sh_node_mix_rgb_out);
node_type_size(&ntype, 100, 60, 150);
node_type_label(&ntype, node_blend_label);
node_type_exec(&ntype, node_shader_exec_mix_rgb);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_normal.c b/source/blender/nodes/shader/nodes/node_shader_normal.c
index a4e39935cea..1ce7c61c593 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_normal.c
+++ b/source/blender/nodes/shader/nodes/node_shader_normal.c
@@ -27,25 +27,36 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_normal.c
+/** \file blender/nodes/shader/nodes/node_shader_normal.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** NORMAL ******************** */
-static bNodeSocketType sh_node_normal_in[]= {
- { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_normal_in[]= {
+ { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_normal_out[]= {
- { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
- { SOCK_VALUE, 0, "Dot", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_normal_out[]= {
+ { SOCK_VECTOR, 0, "Normal"},
+ { SOCK_FLOAT, 0, "Dot"},
{ -1, 0, "" }
};
+static void node_shader_init_normal(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp))
+{
+ bNodeSocket *sock= node->outputs.first;
+ bNodeSocketValueVector *dval= (bNodeSocketValueVector*)sock->default_value;
+
+ /* output value is used for normal vector */
+ dval->value[0] = 0.0f;
+ dval->value[1] = 0.0f;
+ dval->value[2] = 1.0f;
+}
+
/* generates normal, does dot product */
static void node_shader_exec_normal(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
@@ -57,7 +68,7 @@ static void node_shader_exec_normal(void *UNUSED(data), bNode *node, bNodeStack
nodestack_get_vec(vec, SOCK_VECTOR, in[0]);
- VECCOPY(out[0]->vec, sock->ns.vec);
+ VECCOPY(out[0]->vec, ((bNodeSocketValueVector*)sock->default_value)->value);
/* render normals point inside... the widget points outside */
out[1]->vec[0]= -INPR(out[0]->vec, vec);
}
@@ -65,7 +76,7 @@ static void node_shader_exec_normal(void *UNUSED(data), bNode *node, bNodeStack
static int gpu_shader_normal(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
{
bNodeSocket *sock= node->outputs.first;
- GPUNodeLink *vec = GPU_uniform(sock->ns.vec);
+ GPUNodeLink *vec = GPU_uniform(((bNodeSocketValueVector*)sock->default_value)->value);
return GPU_stack_link(mat, "normal", in, out, vec);
}
@@ -74,8 +85,9 @@ void register_node_type_sh_normal(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- sh_node_normal_in, sh_node_normal_out);
+ node_type_base(&ntype, SH_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_normal_in, sh_node_normal_out);
+ node_type_init(&ntype, node_shader_init_normal);
node_type_exec(&ntype, node_shader_exec_normal);
node_type_gpu(&ntype, gpu_shader_normal);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_output.c b/source/blender/nodes/shader/nodes/node_shader_output.c
index e42caabff34..94990bd9cf1 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_output.c
+++ b/source/blender/nodes/shader/nodes/node_shader_output.c
@@ -27,17 +27,17 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_output.c
+/** \file blender/nodes/shader/nodes/node_shader_output.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** OUTPUT ******************** */
-static bNodeSocketType sh_node_output_in[]= {
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_output_in[]= {
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ -1, 0, "" }
};
@@ -49,7 +49,7 @@ static void node_shader_exec_output(void *data, bNode *node, bNodeStack **in, bN
/* stack order input sockets: col, alpha, normal */
nodestack_get_vec(col, SOCK_VECTOR, in[0]);
- nodestack_get_vec(col+3, SOCK_VALUE, in[1]);
+ nodestack_get_vec(col+3, SOCK_FLOAT, in[1]);
if(shi->do_preview) {
nodeAddToPreview(node, col, shi->xs, shi->ys, shi->do_manage);
@@ -84,8 +84,8 @@ void register_node_type_sh_output(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_OUTPUT, "Output", NODE_CLASS_OUTPUT, NODE_PREVIEW,
- sh_node_output_in, NULL);
+ node_type_base(&ntype, SH_NODE_OUTPUT, "Output", NODE_CLASS_OUTPUT, NODE_PREVIEW);
+ node_type_socket_templates(&ntype, sh_node_output_in, NULL);
node_type_size(&ntype, 80, 60, 200);
node_type_exec(&ntype, node_shader_exec_output);
node_type_gpu(&ntype, gpu_shader_output);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c b/source/blender/nodes/shader/nodes/node_shader_rgb.c
index 3d7f401b055..d612e5c228f 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c
+++ b/source/blender/nodes/shader/nodes/node_shader_rgb.c
@@ -27,30 +27,43 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_rgb.c
+/** \file blender/nodes/shader/nodes/node_shader_rgb.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** RGB ******************** */
-static bNodeSocketType sh_node_rgb_out[]= {
- { SOCK_RGBA, 0, "Color", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_rgb_out[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
+static void node_shader_init_rgb(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp))
+{
+ bNodeSocket *sock= node->outputs.first;
+ bNodeSocketValueRGBA *dval= (bNodeSocketValueRGBA*)sock->default_value;
+ /* uses the default value of the output socket, must be initialized here */
+ dval->value[0] = 0.5f;
+ dval->value[1] = 0.5f;
+ dval->value[2] = 0.5f;
+ dval->value[3] = 1.0f;
+}
+
static void node_shader_exec_rgb(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
+ float *col= ((bNodeSocketValueRGBA*)sock->default_value)->value;
- VECCOPY(out[0]->vec, sock->ns.vec);
+ VECCOPY(out[0]->vec, col);
}
static int gpu_shader_rgb(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
{
bNodeSocket *sock= node->outputs.first;
- GPUNodeLink *vec = GPU_uniform(sock->ns.vec);
+ float *col= ((bNodeSocketValueRGBA*)sock->default_value)->value;
+ GPUNodeLink *vec = GPU_uniform(col);
return GPU_stack_link(mat, "set_rgba", in, out, vec);
}
@@ -59,8 +72,9 @@ void register_node_type_sh_rgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_RGB, "RGB", NODE_CLASS_INPUT, NODE_OPTIONS,
- NULL, sh_node_rgb_out);
+ node_type_base(&ntype, SH_NODE_RGB, "RGB", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, sh_node_rgb_out);
+ node_type_init(&ntype, node_shader_init_rgb);
node_type_size(&ntype, 140, 80, 140);
node_type_exec(&ntype, node_shader_exec_rgb);
node_type_gpu(&ntype, gpu_shader_rgb);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c b/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c
index e4fa0b02521..15a8a4952fb 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c
+++ b/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c
@@ -1,5 +1,5 @@
/*
- *
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c
+/** \file blender/nodes/shader/nodes/node_shader_sepcombRGB.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** SEPARATE RGBA ******************** */
-static bNodeSocketType sh_node_seprgb_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_seprgb_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_seprgb_out[]= {
- { SOCK_VALUE, 0, "R", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "G", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "B", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_seprgb_out[]= {
+ { SOCK_FLOAT, 0, "R"},
+ { SOCK_FLOAT, 0, "G"},
+ { SOCK_FLOAT, 0, "B"},
{ -1, 0, "" }
};
@@ -62,8 +62,8 @@ void register_node_type_sh_seprgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_SEPRGB, "Separate RGB", NODE_CLASS_CONVERTOR, 0,
- sh_node_seprgb_in, sh_node_seprgb_out);
+ node_type_base(&ntype, SH_NODE_SEPRGB, "Separate RGB", NODE_CLASS_CONVERTOR, 0);
+ node_type_socket_templates(&ntype, sh_node_seprgb_in, sh_node_seprgb_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_shader_exec_seprgb);
node_type_gpu(&ntype, gpu_shader_seprgb);
@@ -74,14 +74,14 @@ void register_node_type_sh_seprgb(ListBase *lb)
/* **************** COMBINE RGB ******************** */
-static bNodeSocketType sh_node_combrgb_in[]= {
- { SOCK_VALUE, 1, "R", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "G", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "B", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_combrgb_in[]= {
+ { SOCK_FLOAT, 1, "R", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_UNSIGNED},
+ { SOCK_FLOAT, 1, "G", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_UNSIGNED},
+ { SOCK_FLOAT, 1, "B", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_UNSIGNED},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_combrgb_out[]= {
- { SOCK_RGBA, 0, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_combrgb_out[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -101,8 +101,8 @@ void register_node_type_sh_combrgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_COMBRGB, "Combine RGB", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- sh_node_combrgb_in, sh_node_combrgb_out);
+ node_type_base(&ntype, SH_NODE_COMBRGB, "Combine RGB", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_combrgb_in, sh_node_combrgb_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_shader_exec_combrgb);
node_type_gpu(&ntype, gpu_shader_combrgb);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c b/source/blender/nodes/shader/nodes/node_shader_squeeze.c
index 80693ff08f0..b9eb116b866 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c
+++ b/source/blender/nodes/shader/nodes/node_shader_squeeze.c
@@ -27,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_squeeze.c
+/** \file blender/nodes/shader/nodes/node_shader_squeeze.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** VALUE SQUEEZE ******************** */
-static bNodeSocketType sh_node_squeeze_in[]= {
- { SOCK_VALUE, 1, "Value", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f},
- { SOCK_VALUE, 1, "Width", 1.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f},
- { SOCK_VALUE, 1, "Center", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f},
+static bNodeSocketTemplate sh_node_squeeze_in[]= {
+ { SOCK_FLOAT, 1, "Value", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Width", 1.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Center", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_squeeze_out[]= {
- { SOCK_VALUE, 0, "Value", 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_squeeze_out[]= {
+ { SOCK_FLOAT, 0, "Value"},
{ -1, 0, "" }
};
@@ -52,9 +52,9 @@ bNodeStack **out)
{
float vec[3];
- nodestack_get_vec(vec, SOCK_VALUE, in[0]);
- nodestack_get_vec(vec+1, SOCK_VALUE, in[1]);
- nodestack_get_vec(vec+2, SOCK_VALUE, in[2]);
+ nodestack_get_vec(vec, SOCK_FLOAT, in[0]);
+ nodestack_get_vec(vec+1, SOCK_FLOAT, in[1]);
+ nodestack_get_vec(vec+2, SOCK_FLOAT, in[2]);
out[0]->vec[0] = 1.0f / (1.0f + pow(2.71828183,-((vec[0]-vec[2])*vec[1]))) ;
}
@@ -68,8 +68,8 @@ void register_node_type_sh_squeeze(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_SQUEEZE, "Squeeze Value", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- sh_node_squeeze_in, sh_node_squeeze_out);
+ node_type_base(&ntype, SH_NODE_SQUEEZE, "Squeeze Value", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_squeeze_in, sh_node_squeeze_out);
node_type_size(&ntype, 120, 110, 160);
node_type_storage(&ntype, "node_squeeze", NULL, NULL);
node_type_exec(&ntype, node_shader_exec_squeeze);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_texture.c b/source/blender/nodes/shader/nodes/node_shader_texture.c
index 249e4eeca5d..09716820800 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_texture.c
+++ b/source/blender/nodes/shader/nodes/node_shader_texture.c
@@ -27,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_texture.c
+/** \file blender/nodes/shader/nodes/node_shader_texture.c
* \ingroup shdnodes
*/
#include "DNA_texture_types.h"
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** TEXTURE ******************** */
-static bNodeSocketType sh_node_texture_in[]= {
- { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, /* no limit */
+static bNodeSocketTemplate sh_node_texture_in[]= {
+ { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE}, /* no limit */
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_texture_out[]= {
- { SOCK_VALUE, 0, "Value", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_RGBA , 0, "Color", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate sh_node_texture_out[]= {
+ { SOCK_FLOAT, 0, "Value"},
+ { SOCK_RGBA , 0, "Color"},
+ { SOCK_VECTOR, 0, "Normal"},
{ -1, 0, "" }
};
@@ -137,8 +137,8 @@ void register_node_type_sh_texture(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
- sh_node_texture_in, sh_node_texture_out);
+ node_type_base(&ntype, SH_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW);
+ node_type_socket_templates(&ntype, sh_node_texture_in, sh_node_texture_out);
node_type_size(&ntype, 120, 80, 240);
node_type_exec(&ntype, node_shader_exec_texture);
node_type_gpu(&ntype, gpu_shader_texture);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c b/source/blender/nodes/shader/nodes/node_shader_valToRgb.c
index 86f832c12ee..5c1d3096a6e 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c
+++ b/source/blender/nodes/shader/nodes/node_shader_valToRgb.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_valToRgb.c
+/** \file blender/nodes/shader/nodes/node_shader_valToRgb.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** VALTORGB ******************** */
-static bNodeSocketType sh_node_valtorgb_in[]= {
- { SOCK_VALUE, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_valtorgb_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_valtorgb_out[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_valtorgb_out[]= {
+ { SOCK_RGBA, 0, "Color"},
+ { SOCK_FLOAT, 0, "Alpha"},
{ -1, 0, "" }
};
@@ -52,14 +52,14 @@ static void node_shader_exec_valtorgb(void *UNUSED(data), bNode *node, bNodeStac
if(node->storage) {
float fac;
- nodestack_get_vec(&fac, SOCK_VALUE, in[0]);
+ nodestack_get_vec(&fac, SOCK_FLOAT, in[0]);
do_colorband(node->storage, fac, out[0]->vec);
out[1]->vec[0]= out[0]->vec[3];
}
}
-static void node_shader_init_valtorgb(bNode *node)
+static void node_shader_init_valtorgb(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= add_colorband(1);
}
@@ -77,8 +77,8 @@ void register_node_type_sh_valtorgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- sh_node_valtorgb_in, sh_node_valtorgb_out);
+ node_type_base(&ntype, SH_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_valtorgb_in, sh_node_valtorgb_out);
node_type_size(&ntype, 240, 200, 300);
node_type_init(&ntype, node_shader_init_valtorgb);
node_type_storage(&ntype, "ColorBand", node_free_standard_storage, node_copy_standard_storage);
@@ -90,12 +90,12 @@ void register_node_type_sh_valtorgb(ListBase *lb)
/* **************** RGBTOBW ******************** */
-static bNodeSocketType sh_node_rgbtobw_in[]= {
+static bNodeSocketTemplate sh_node_rgbtobw_in[]= {
{ SOCK_RGBA, 1, "Color", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_rgbtobw_out[]= {
- { SOCK_VALUE, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_rgbtobw_out[]= {
+ { SOCK_FLOAT, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
@@ -117,8 +117,8 @@ void register_node_type_sh_rgbtobw(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0,
- sh_node_rgbtobw_in, sh_node_rgbtobw_out);
+ node_type_base(&ntype, SH_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0);
+ node_type_socket_templates(&ntype, sh_node_rgbtobw_in, sh_node_rgbtobw_out);
node_type_size(&ntype, 80, 40, 120);
node_type_exec(&ntype, node_shader_exec_rgbtobw);
node_type_gpu(&ntype, gpu_shader_rgbtobw);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_value.c b/source/blender/nodes/shader/nodes/node_shader_value.c
index 29a75bbf36d..119a3664308 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_value.c
+++ b/source/blender/nodes/shader/nodes/node_shader_value.c
@@ -27,30 +27,43 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_value.c
+/** \file blender/nodes/shader/nodes/node_shader_value.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** VALUE ******************** */
-static bNodeSocketType sh_node_value_out[]= {
- { SOCK_VALUE, 0, "Value", 0.5f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f},
+static bNodeSocketTemplate sh_node_value_out[]= {
+ /* XXX value nodes use the output sockets for buttons, so we need explicit limits here! */
+ { SOCK_FLOAT, 0, "Value", 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX},
{ -1, 0, "" }
};
+static void node_shader_init_value(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp))
+{
+ bNodeSocket *sock= node->outputs.first;
+ bNodeSocketValueFloat *dval= (bNodeSocketValueFloat*)sock->default_value;
+ /* uses the default value of the output socket, must be initialized here */
+ dval->value = 0.5f;
+ dval->min = -FLT_MAX;
+ dval->max = FLT_MAX;
+}
+
static void node_shader_exec_value(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
+ float val= ((bNodeSocketValueFloat*)sock->default_value)->value;
- out[0]->vec[0]= sock->ns.vec[0];
+ out[0]->vec[0]= val;
}
static int gpu_shader_value(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
{
bNodeSocket *sock= node->outputs.first;
- GPUNodeLink *vec = GPU_uniform(sock->ns.vec);
+ float *val= &((bNodeSocketValueFloat*)sock->default_value)->value;
+ GPUNodeLink *vec = GPU_uniform(val);
return GPU_stack_link(mat, "set_value", in, out, vec);
}
@@ -59,8 +72,9 @@ void register_node_type_sh_value(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_VALUE, "Value", NODE_CLASS_INPUT, NODE_OPTIONS,
- NULL, sh_node_value_out);
+ node_type_base(&ntype, SH_NODE_VALUE, "Value", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, sh_node_value_out);
+ node_type_init(&ntype, node_shader_init_value);
node_type_size(&ntype, 80, 50, 120);
node_type_exec(&ntype, node_shader_exec_value);
node_type_gpu(&ntype, gpu_shader_value);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c b/source/blender/nodes/shader/nodes/node_shader_vectMath.c
index 9979e488a71..ca31d879e3e 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c
+++ b/source/blender/nodes/shader/nodes/node_shader_vectMath.c
@@ -27,25 +27,25 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/SHD_nodes/SHD_vectMath.c
+/** \file blender/nodes/shader/nodes/node_shader_vectMath.c
* \ingroup shdnodes
*/
-#include "../SHD_util.h"
+#include "node_shader_util.h"
/* **************** VECTOR MATH ******************** */
-static bNodeSocketType sh_node_vect_math_in[]= {
- { SOCK_VECTOR, 1, "Vector", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 1, "Vector", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_vect_math_in[]= {
+ { SOCK_VECTOR, 1, "Vector", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_VECTOR, 1, "Vector", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType sh_node_vect_math_out[]= {
- { SOCK_VECTOR, 0, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 0, "Value", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate sh_node_vect_math_out[]= {
+ { SOCK_VECTOR, 0, "Vector"},
+ { SOCK_FLOAT, 0, "Value"},
{ -1, 0, "" }
};
@@ -136,8 +136,8 @@ void register_node_type_sh_vect_math(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, SH_NODE_VECT_MATH, "Vector Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- sh_node_vect_math_in, sh_node_vect_math_out);
+ node_type_base(&ntype, SH_NODE_VECT_MATH, "Vector Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, sh_node_vect_math_in, sh_node_vect_math_out);
node_type_size(&ntype, 80, 75, 140);
node_type_label(&ntype, node_vect_math_label);
node_type_storage(&ntype, "node_vect_math", NULL, NULL);
diff --git a/source/blender/nodes/texture/node_texture_tree.c b/source/blender/nodes/texture/node_texture_tree.c
new file mode 100644
index 00000000000..603aa7ceb77
--- /dev/null
+++ b/source/blender/nodes/texture/node_texture_tree.c
@@ -0,0 +1,251 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s):
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/texture/node_texture_tree.c
+ * \ingroup nodes
+ */
+
+
+#include <string.h>
+
+#include "DNA_texture_types.h"
+#include "DNA_node_types.h"
+
+#include "BLI_listbase.h"
+#include "BLI_threads.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_global.h"
+#include "BKE_main.h"
+#include "BKE_node.h"
+
+#include "node_exec.h"
+#include "node_util.h"
+#include "NOD_texture.h"
+#include "node_texture_util.h"
+
+#include "RE_pipeline.h"
+#include "RE_shader_ext.h"
+
+
+static void foreach_nodetree(Main *main, void *calldata, bNodeTreeCallback func)
+{
+ Tex *tx;
+ for(tx= main->tex.first; tx; tx= tx->id.next) {
+ if(tx->nodetree) {
+ func(calldata, &tx->id, tx->nodetree);
+ }
+ }
+}
+
+static void local_sync(bNodeTree *localtree, bNodeTree *ntree)
+{
+ bNode *lnode;
+
+ /* copy over contents of previews */
+ for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
+ if(ntreeNodeExists(ntree, lnode->new_node)) {
+ bNode *node= lnode->new_node;
+
+ if(node->preview && node->preview->rect) {
+ if(lnode->preview && lnode->preview->rect) {
+ int xsize= node->preview->xsize;
+ int ysize= node->preview->ysize;
+ memcpy(node->preview->rect, lnode->preview->rect, 4*xsize + xsize*ysize*sizeof(char)*4);
+ }
+ }
+ }
+ }
+}
+
+bNodeTreeType ntreeType_Texture = {
+ /* type */ NTREE_TEXTURE,
+ /* id_name */ "NTTexture Nodetree",
+
+ /* node_types */ { NULL, NULL },
+
+ /* free_cache */ NULL,
+ /* free_node_cache */ NULL,
+ /* foreach_nodetree */ foreach_nodetree,
+ /* localize */ NULL,
+ /* local_sync */ local_sync,
+ /* local_merge */ NULL,
+ /* update */ NULL,
+ /* update_node */ NULL
+};
+
+int ntreeTexTagAnimated(bNodeTree *ntree)
+{
+ bNode *node;
+
+ if(ntree==NULL) return 0;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->type==TEX_NODE_CURVE_TIME) {
+ NodeTagChanged(ntree, node);
+ return 1;
+ }
+ else if(node->type==NODE_GROUP) {
+ if( ntreeTexTagAnimated((bNodeTree *)node->id) ) {
+ return 1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes.
+ * If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees.
+ */
+bNodeTreeExec *ntreeTexBeginExecTree(bNodeTree *ntree, int use_tree_data)
+{
+ bNodeTreeExec *exec;
+ bNode *node;
+
+ if (use_tree_data) {
+ /* XXX hack: prevent exec data from being generated twice.
+ * this should be handled by the renderer!
+ */
+ if (ntree->execdata)
+ return ntree->execdata;
+ }
+
+ /* common base initialization */
+ exec = ntree_exec_begin(ntree);
+
+ /* allocate the thread stack listbase array */
+ exec->threadstack= MEM_callocN(BLENDER_MAX_THREADS*sizeof(ListBase), "thread stack array");
+
+ for(node= exec->nodetree->nodes.first; node; node= node->next)
+ node->need_exec= 1;
+
+ if (use_tree_data) {
+ /* XXX this should not be necessary, but is still used for cmp/sha/tex nodes,
+ * which only store the ntree pointer. Should be fixed at some point!
+ */
+ ntree->execdata = exec;
+ }
+
+ return exec;
+}
+
+/* free texture delegates */
+static void tex_free_delegates(bNodeTreeExec *exec)
+{
+ bNodeThreadStack *nts;
+ bNodeStack *ns;
+ int th, a;
+
+ for(th=0; th<BLENDER_MAX_THREADS; th++)
+ for(nts=exec->threadstack[th].first; nts; nts=nts->next)
+ for(ns= nts->stack, a=0; a<exec->stacksize; a++, ns++)
+ if(ns->data && !ns->is_copy)
+ MEM_freeN(ns->data);
+}
+
+/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes.
+ * If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees.
+ */
+void ntreeTexEndExecTree(bNodeTreeExec *exec, int use_tree_data)
+{
+ if(exec) {
+ bNodeTree *ntree= exec->nodetree;
+ bNodeThreadStack *nts;
+ int a;
+
+ if(exec->threadstack) {
+ tex_free_delegates(exec);
+
+ for(a=0; a<BLENDER_MAX_THREADS; a++) {
+ for(nts=exec->threadstack[a].first; nts; nts=nts->next)
+ if (nts->stack) MEM_freeN(nts->stack);
+ BLI_freelistN(&exec->threadstack[a]);
+ }
+
+ MEM_freeN(exec->threadstack);
+ exec->threadstack= NULL;
+ }
+
+ ntree_exec_end(exec);
+
+ if (use_tree_data) {
+ /* XXX clear nodetree backpointer to exec data, same problem as noted in ntreeBeginExecTree */
+ ntree->execdata = NULL;
+ }
+ }
+}
+
+int ntreeTexExecTree(
+ bNodeTree *nodes,
+ TexResult *texres,
+ float *co,
+ float *dxt, float *dyt,
+ int osatex,
+ short thread,
+ Tex *UNUSED(tex),
+ short which_output,
+ int cfra,
+ int preview,
+ ShadeInput *shi,
+ MTex *mtex
+){
+ TexCallData data;
+ float *nor= texres->nor;
+ int retval = TEX_INT;
+ bNodeThreadStack *nts = NULL;
+ bNodeTreeExec *exec= nodes->execdata;
+
+ data.co = co;
+ data.dxt = dxt;
+ data.dyt = dyt;
+ data.osatex = osatex;
+ data.target = texres;
+ data.do_preview = preview;
+ data.thread = thread;
+ data.which_output = which_output;
+ data.cfra= cfra;
+ data.mtex= mtex;
+ data.shi= shi;
+
+ if (!exec)
+ exec = ntreeTexBeginExecTree(nodes, 1);
+
+ nts= ntreeGetThreadStack(exec, thread);
+ ntreeExecThreadNodes(exec, nts, &data, thread);
+ ntreeReleaseThreadStack(nts);
+
+ if(texres->nor) retval |= TEX_NOR;
+ retval |= TEX_RGB;
+ /* confusing stuff; the texture output node sets this to NULL to indicate no normal socket was set
+ however, the texture code checks this for other reasons (namely, a normal is required for material) */
+ texres->nor= nor;
+
+ return retval;
+}
diff --git a/source/blender/nodes/intern/TEX_util.c b/source/blender/nodes/texture/node_texture_util.c
index b5e27ca2ccb..7b8f42aa925 100644
--- a/source/blender/nodes/intern/TEX_util.c
+++ b/source/blender/nodes/texture/node_texture_util.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,7 +27,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_util.c
+/** \file blender/nodes/texture/node_texture_util.c
* \ingroup nodes
*/
@@ -48,11 +49,11 @@
*/
#include <assert.h>
-#include "TEX_util.h"
+#include "node_texture_util.h"
#define PREV_RES 128 /* default preview resolution */
-void tex_call_delegate(TexDelegate *dg, float *out, TexParams *params, short thread)
+static void tex_call_delegate(TexDelegate *dg, float *out, TexParams *params, short thread)
{
if(dg->node->need_exec) {
dg->fn(out, params, dg->node, dg->in, thread);
@@ -68,7 +69,7 @@ static void tex_input(float *out, int sz, bNodeStack *in, TexParams *params, sho
if(dg) {
tex_call_delegate(dg, in->vec, params, thread);
- if(in->hasoutput && in->sockettype == SOCK_VALUE)
+ if(in->hasoutput && in->sockettype == SOCK_FLOAT)
in->vec[1] = in->vec[2] = in->vec[0];
}
memcpy(out, in->vec, sz * sizeof(float));
@@ -83,7 +84,7 @@ void tex_input_rgba(float *out, bNodeStack *in, TexParams *params, short thread)
{
tex_input(out, 4, in, params, thread);
- if(in->hasoutput && in->sockettype == SOCK_VALUE)
+ if(in->hasoutput && in->sockettype == SOCK_FLOAT)
{
out[1] = out[2] = out[0];
out[3] = 1;
@@ -170,45 +171,3 @@ void ntreeTexCheckCyclics(struct bNodeTree *ntree)
}
}
-
-int ntreeTexExecTree(
- bNodeTree *nodes,
- TexResult *texres,
- float *co,
- float *dxt, float *dyt,
- int osatex,
- short thread,
- Tex *UNUSED(tex),
- short which_output,
- int cfra,
- int preview,
- ShadeInput *shi,
- MTex *mtex
-){
- TexCallData data;
- float *nor= texres->nor;
- int retval = TEX_INT;
-
- data.co = co;
- data.dxt = dxt;
- data.dyt = dyt;
- data.osatex = osatex;
- data.target = texres;
- data.do_preview = preview;
- data.thread = thread;
- data.which_output = which_output;
- data.cfra= cfra;
- data.mtex= mtex;
- data.shi= shi;
-
- ntreeExecTree(nodes, &data, thread);
-
- if(texres->nor) retval |= TEX_NOR;
- retval |= TEX_RGB;
- /* confusing stuff; the texture output node sets this to NULL to indicate no normal socket was set
- however, the texture code checks this for other reasons (namely, a normal is required for material) */
- texres->nor= nor;
-
- return retval;
-}
-
diff --git a/source/blender/nodes/intern/TEX_util.h b/source/blender/nodes/texture/node_texture_util.h
index 0875bcd52bf..ccaf5df9897 100644
--- a/source/blender/nodes/intern/TEX_util.h
+++ b/source/blender/nodes/texture/node_texture_util.h
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,13 +27,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_util.h
+/** \file blender/nodes/texture/node_texture_util.h
* \ingroup nodes
*/
-#ifndef TEX_NODE_UTIL_H_
-#define TEX_NODE_UTIL_H_
+#ifndef NODE_TEXTURE_UTIL_H_
+#define NODE_TEXTURE_UTIL_H_
#include <math.h>
#include <string.h>
@@ -60,7 +61,6 @@
#include "BKE_library.h"
-#include "../SHD_node.h"
#include "node_util.h"
#include "BLI_math.h"
@@ -112,8 +112,6 @@ typedef struct TexDelegate {
int type;
} TexDelegate;
-void tex_call_delegate(TexDelegate*, float *out, TexParams *params, short thread);
-
void tex_input_rgba(float *out, bNodeStack *in, TexParams *params, short thread);
void tex_input_vec(float *out, bNodeStack *in, TexParams *params, short thread);
float tex_input_value(bNodeStack *in, TexParams *params, short thread);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_at.c b/source/blender/nodes/texture/nodes/node_texture_at.c
index d5980b786b0..34993a93092 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_at.c
+++ b/source/blender/nodes/texture/nodes/node_texture_at.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_at.c
+/** \file blender/nodes/texture/nodes/node_texture_at.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Texture", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
- { SOCK_VECTOR, 1, "Coordinates", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Texture", 0.0f, 0.0f, 0.0f, 1.0f },
+ { SOCK_VECTOR, 1, "Coordinates", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, PROP_NONE },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Texture", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Texture" },
{ -1, 0, "" }
};
@@ -63,8 +64,8 @@ void register_node_type_tex_at(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_AT, "At", NODE_CLASS_DISTORT, 0,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_AT, "At", NODE_CLASS_DISTORT, 0);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c b/source/blender/nodes/texture/nodes/node_texture_bricks.c
index 0eb982496a9..a9a82fe4d65 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c
+++ b/source/blender/nodes/texture/nodes/node_texture_bricks.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,32 +27,33 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_bricks.c
+/** \file blender/nodes/texture/nodes/node_texture_bricks.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
#include <math.h>
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Bricks 1", 0.596f, 0.282f, 0.0f, 1.0f, 0.0f, 1.0f },
- { SOCK_RGBA, 1, "Bricks 2", 0.632f, 0.504f, 0.05f, 1.0f, 0.0f, 1.0f },
- { SOCK_RGBA, 1, "Mortar", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
- { SOCK_VALUE, 1, "Thickness", 0.02f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_VALUE, 1, "Bias", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
- { SOCK_VALUE, 1, "Brick Width", 0.5f, 0.0f, 0.0f, 0.0f, 0.001f, 99.0f },
- { SOCK_VALUE, 1, "Row Height", 0.25f, 0.0f, 0.0f, 0.0f, 0.001f, 99.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Bricks 1", 0.596f, 0.282f, 0.0f, 1.0f },
+ { SOCK_RGBA, 1, "Bricks 2", 0.632f, 0.504f, 0.05f, 1.0f },
+ { SOCK_RGBA, 1, "Mortar", 0.0f, 0.0f, 0.0f, 1.0f },
+ { SOCK_FLOAT, 1, "Thickness", 0.02f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Bias", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, PROP_NONE },
+ { SOCK_FLOAT, 1, "Brick Width", 0.5f, 0.0f, 0.0f, 0.0f, 0.001f, 99.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Row Height", 0.25f, 0.0f, 0.0f, 0.0f, 0.001f, 99.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
-static void init(bNode *node) {
+static void init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
+{
node->custom3 = 0.5; /* offset */
node->custom4 = 1.0; /* squash */
}
@@ -123,8 +125,8 @@ void register_node_type_tex_bricks(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_BRICKS, "Bricks", NODE_CLASS_PATTERN, NODE_PREVIEW|NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_BRICKS, "Bricks", NODE_CLASS_PATTERN, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 150, 60, 150);
node_type_init(&ntype, init);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_checker.c b/source/blender/nodes/texture/nodes/node_texture_checker.c
index c6c25ba1a8a..7762c9ef992 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_checker.c
+++ b/source/blender/nodes/texture/nodes/node_texture_checker.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_checker.c
+/** \file blender/nodes/texture/nodes/node_texture_checker.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
#include <math.h>
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Color1", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
- { SOCK_RGBA, 1, "Color2", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f },
- { SOCK_VALUE, 1, "Size", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 100.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Color1", 1.0f, 0.0f, 0.0f, 1.0f },
+ { SOCK_RGBA, 1, "Color2", 1.0f, 1.0f, 1.0f, 1.0f },
+ { SOCK_FLOAT, 1, "Size", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 100.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Color" },
{ -1, 0, "" }
};
@@ -74,8 +75,8 @@ void register_node_type_tex_checker(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_CHECKER, "Checker", NODE_CLASS_PATTERN, NODE_PREVIEW|NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_CHECKER, "Checker", NODE_CLASS_PATTERN, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 100, 60, 150);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/texture/nodes/node_texture_common.c b/source/blender/nodes/texture/nodes/node_texture_common.c
new file mode 100644
index 00000000000..1b46b830909
--- /dev/null
+++ b/source/blender/nodes/texture/nodes/node_texture_common.c
@@ -0,0 +1,271 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2006 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Campbell Barton, Alfredo de Greef, David Millan Escriva,
+ * Juho Vepsäläinen
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/nodes/texture/nodes/node_texture_common.c
+ * \ingroup texnodes
+ */
+
+
+#include "DNA_node_types.h"
+
+#include "BKE_node.h"
+
+#include "node_texture_util.h"
+#include "node_common.h"
+#include "node_exec.h"
+
+static void copy_stack(bNodeStack *to, bNodeStack *from)
+{
+ if (to != from) {
+ copy_v4_v4(to->vec, from->vec);
+ to->data = from->data;
+ to->datatype = from->datatype;
+
+ /* tag as copy to prevent freeing */
+ to->is_copy = 1;
+ }
+}
+
+/**** GROUP ****/
+
+static void *group_initexec(bNode *node)
+{
+ bNodeTree *ngroup= (bNodeTree*)node->id;
+ void *exec;
+
+ /* initialize the internal node tree execution */
+ exec = ntreeTexBeginExecTree(ngroup, 0);
+
+ return exec;
+}
+
+static void group_freeexec(bNode *UNUSED(node), void *nodedata)
+{
+ bNodeTreeExec*gexec= (bNodeTreeExec*)nodedata;
+
+ ntreeTexEndExecTree(gexec, 0);
+}
+
+/* Copy inputs to the internal stack.
+ * This is a shallow copy, no buffers are duplicated here!
+ */
+static void group_copy_inputs(bNode *node, bNodeStack **in, bNodeStack *gstack)
+{
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int a;
+ for (sock=node->inputs.first, a=0; sock; sock=sock->next, ++a) {
+ if (sock->groupsock) {
+ ns = node_get_socket_stack(gstack, sock->groupsock);
+ copy_stack(ns, in[a]);
+ }
+ }
+}
+
+/* Copy internal results to the external outputs.
+ */
+static void group_copy_outputs(bNode *node, bNodeStack **out, bNodeStack *gstack)
+{
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int a;
+ for (sock=node->outputs.first, a=0; sock; sock=sock->next, ++a) {
+ if (sock->groupsock) {
+ ns = node_get_socket_stack(gstack, sock->groupsock);
+ copy_stack(out[a], ns);
+ }
+ }
+}
+
+static void group_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out)
+{
+ bNodeTreeExec *exec= (bNodeTreeExec*)nodedata;
+ bNodeThreadStack *nts;
+
+ /* XXX same behavior as trunk: all nodes inside group are executed.
+ * it's stupid, but just makes it work. compo redesign will do this better.
+ */
+ {
+ bNode *inode;
+ for (inode=exec->nodetree->nodes.first; inode; inode=inode->next)
+ inode->need_exec = 1;
+ }
+
+ nts = ntreeGetThreadStack(exec, thread);
+
+ group_copy_inputs(node, in, nts->stack);
+ ntreeExecThreadNodes(exec, nts, data, thread);
+ group_copy_outputs(node, out, nts->stack);
+
+ ntreeReleaseThreadStack(nts);
+}
+
+void register_node_type_tex_group(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, NODE_GROUP, "Group", NODE_CLASS_GROUP, NODE_OPTIONS|NODE_CONST_OUTPUT);
+ node_type_socket_templates(&ntype, NULL, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_label(&ntype, node_group_label);
+ node_type_init(&ntype, node_group_init);
+ node_type_valid(&ntype, node_group_valid);
+ node_type_template(&ntype, node_group_template);
+ node_type_update(&ntype, NULL, node_group_verify);
+ node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear);
+ node_type_exec_new(&ntype, group_initexec, group_freeexec, group_execute);
+
+ nodeRegisterType(lb, &ntype);
+}
+
+
+/**** FOR LOOP ****/
+
+#if 0 /* XXX loop nodes don't work nicely with current trees */
+static void forloop_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out)
+{
+ bNodeTreeExec *exec= (bNodeTreeExec*)nodedata;
+ bNodeThreadStack *nts;
+ int iterations= (int)in[0]->vec[0];
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int iteration;
+
+ /* XXX same behavior as trunk: all nodes inside group are executed.
+ * it's stupid, but just makes it work. compo redesign will do this better.
+ */
+ {
+ bNode *inode;
+ for (inode=exec->nodetree->nodes.first; inode; inode=inode->next)
+ inode->need_exec = 1;
+ }
+
+ nts = ntreeGetThreadStack(exec, thread);
+
+ /* "Iteration" socket */
+ sock = exec->nodetree->inputs.first;
+ ns = node_get_socket_stack(nts->stack, sock);
+
+// group_copy_inputs(node, in, nts->stack);
+ for (iteration=0; iteration < iterations; ++iteration) {
+ /* first input contains current iteration counter */
+ ns->vec[0] = (float)iteration;
+ ns->vec[1]=ns->vec[2]=ns->vec[3] = 0.0f;
+
+// if (iteration > 0)
+// loop_init_iteration(exec->nodetree, nts->stack);
+// ntreeExecThreadNodes(exec, nts, data, thread);
+ }
+// loop_copy_outputs(node, in, out, exec->stack);
+
+ ntreeReleaseThreadStack(nts);
+}
+
+void register_node_type_tex_forloop(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, NODE_FORLOOP, "For", NODE_CLASS_GROUP, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_label(&ntype, node_group_label);
+ node_type_init(&ntype, node_forloop_init);
+ node_type_valid(&ntype, node_group_valid);
+ node_type_template(&ntype, node_forloop_template);
+ node_type_update(&ntype, NULL, node_group_verify);
+ node_type_tree(&ntype, node_forloop_init_tree, node_loop_update_tree);
+ node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear);
+ node_type_exec_new(&ntype, group_initexec, group_freeexec, forloop_execute);
+
+ nodeRegisterType(lb, &ntype);
+}
+#endif
+
+/**** WHILE LOOP ****/
+
+#if 0 /* XXX loop nodes don't work nicely with current trees */
+static void whileloop_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out)
+{
+ bNodeTreeExec *exec= (bNodeTreeExec*)nodedata;
+ bNodeThreadStack *nts;
+ int condition= (in[0]->vec[0] > 0.0f);
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ int iteration;
+
+ /* XXX same behavior as trunk: all nodes inside group are executed.
+ * it's stupid, but just makes it work. compo redesign will do this better.
+ */
+ {
+ bNode *inode;
+ for (inode=exec->nodetree->nodes.first; inode; inode=inode->next)
+ inode->need_exec = 1;
+ }
+
+ nts = ntreeGetThreadStack(exec, thread);
+
+ /* "Condition" socket */
+ sock = exec->nodetree->outputs.first;
+ ns = node_get_socket_stack(nts->stack, sock);
+
+ iteration = 0;
+// group_copy_inputs(node, in, nts->stack);
+ while (condition && iteration < node->custom1) {
+// if (iteration > 0)
+// loop_init_iteration(exec->nodetree, nts->stack);
+// ntreeExecThreadNodes(exec, nts, data, thread);
+
+ condition = (ns->vec[0] > 0.0f);
+ ++iteration;
+ }
+// loop_copy_outputs(node, in, out, exec->stack);
+
+ ntreeReleaseThreadStack(nts);
+}
+
+void register_node_type_tex_whileloop(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, NODE_WHILELOOP, "While", NODE_CLASS_GROUP, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, NULL);
+ node_type_size(&ntype, 120, 60, 200);
+ node_type_label(&ntype, node_group_label);
+ node_type_init(&ntype, node_whileloop_init);
+ node_type_valid(&ntype, node_group_valid);
+ node_type_template(&ntype, node_whileloop_template);
+ node_type_update(&ntype, NULL, node_group_verify);
+ node_type_tree(&ntype, node_whileloop_init_tree, node_loop_update_tree);
+ node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear);
+ node_type_exec_new(&ntype, group_initexec, group_freeexec, whileloop_execute);
+
+ nodeRegisterType(lb, &ntype);
+}
+#endif
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_compose.c b/source/blender/nodes/texture/nodes/node_texture_compose.c
index 6eae78ec3de..d224ae793e2 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_compose.c
+++ b/source/blender/nodes/texture/nodes/node_texture_compose.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_compose.c
+/** \file blender/nodes/texture/nodes/node_texture_compose.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
-static bNodeSocketType inputs[]= {
- { SOCK_VALUE, 1, "Red", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_VALUE, 1, "Green", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_VALUE, 1, "Blue", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_VALUE, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_FLOAT, 1, "Red", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Green", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Blue", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Color" },
{ -1, 0, "" }
};
@@ -62,8 +63,8 @@ void register_node_type_tex_compose(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_COMPOSE, "Compose RGBA", NODE_CLASS_OP_COLOR, 0,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_COMPOSE, "Compose RGBA", NODE_CLASS_OP_COLOR, 0);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 100, 60, 150);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_coord.c b/source/blender/nodes/texture/nodes/node_texture_coord.c
index 3c46971f0d4..2bfa2ff2314 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_coord.c
+++ b/source/blender/nodes/texture/nodes/node_texture_coord.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,16 +27,16 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_coord.c
+/** \file blender/nodes/texture/nodes/node_texture_coord.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
-static bNodeSocketType outputs[]= {
- { SOCK_VECTOR, 0, "Coordinates", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_VECTOR, 0, "Coordinates" },
{ -1, 0, "" }
};
@@ -55,8 +56,8 @@ void register_node_type_tex_coord(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_COORD, "Coordinates", NODE_CLASS_INPUT, NODE_OPTIONS,
- NULL, outputs);
+ node_type_base(&ntype, TEX_NODE_COORD, "Coordinates", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, outputs);
node_type_size(&ntype, 120, 110, 160);
node_type_storage(&ntype, "node_coord", NULL, NULL);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_curves.c b/source/blender/nodes/texture/nodes/node_texture_curves.c
index b7af6c748ff..dd65f979bbe 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_curves.c
+++ b/source/blender/nodes/texture/nodes/node_texture_curves.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,19 +27,19 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_curves.c
+/** \file blender/nodes/texture/nodes/node_texture_curves.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
/* **************** CURVE Time ******************** */
/* custom1 = sfra, custom2 = efra */
-static bNodeSocketType time_outputs[]= {
- { SOCK_VALUE, 0, "Value", 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate time_outputs[]= {
+ { SOCK_FLOAT, 0, "Value" },
{ -1, 0, "" }
};
@@ -60,7 +61,7 @@ static void time_exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out
}
-static void time_init(bNode* node)
+static void time_init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->custom1= 1;
node->custom2= 250;
@@ -71,8 +72,8 @@ void register_node_type_tex_curve_time(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_CURVE_TIME, "Time", NODE_CLASS_INPUT, NODE_OPTIONS,
- NULL, time_outputs);
+ node_type_base(&ntype, TEX_NODE_CURVE_TIME, "Time", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, time_outputs);
node_type_size(&ntype, 140, 100, 320);
node_type_init(&ntype, time_init);
node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
@@ -82,13 +83,13 @@ void register_node_type_tex_curve_time(ListBase *lb)
}
/* **************** CURVE RGB ******************** */
-static bNodeSocketType rgb_inputs[]= {
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate rgb_inputs[]= {
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType rgb_outputs[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
+static bNodeSocketTemplate rgb_outputs[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -106,7 +107,7 @@ static void rgb_exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &rgb_colorfn, data);
}
-static void rgb_init(bNode *node)
+static void rgb_init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f);
}
@@ -115,8 +116,8 @@ void register_node_type_tex_curve_rgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- rgb_inputs, rgb_outputs);
+ node_type_base(&ntype, TEX_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, rgb_inputs, rgb_outputs);
node_type_size(&ntype, 200, 140, 320);
node_type_init(&ntype, rgb_init);
node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c b/source/blender/nodes/texture/nodes/node_texture_decompose.c
index f27d8c98716..016ee5498d8 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c
+++ b/source/blender/nodes/texture/nodes/node_texture_decompose.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_decompose.c
+/** \file blender/nodes/texture/nodes/node_texture_decompose.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
#include <math.h>
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_VALUE, 0, "Red", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_VALUE, 0, "Green", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_VALUE, 0, "Blue", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_FLOAT, 0, "Red" },
+ { SOCK_FLOAT, 0, "Green" },
+ { SOCK_FLOAT, 0, "Blue" },
+ { SOCK_FLOAT, 0, "Alpha" },
{ -1, 0, "" }
};
@@ -83,8 +84,8 @@ void register_node_type_tex_decompose(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_DECOMPOSE, "Decompose RGBA", NODE_CLASS_OP_COLOR, 0,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_DECOMPOSE, "Decompose RGBA", NODE_CLASS_OP_COLOR, 0);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 100, 60, 150);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_distance.c b/source/blender/nodes/texture/nodes/node_texture_distance.c
index b460844ba4a..ef3f701d8f3 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_distance.c
+++ b/source/blender/nodes/texture/nodes/node_texture_distance.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_distance.c
+/** \file blender/nodes/texture/nodes/node_texture_distance.c
* \ingroup texnodes
*/
#include <math.h>
#include "BLI_math.h"
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
-static bNodeSocketType inputs[]= {
- { SOCK_VECTOR, 1, "Coordinate 1", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
- { SOCK_VECTOR, 1, "Coordinate 2", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_VECTOR, 1, "Coordinate 1", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, PROP_NONE },
+ { SOCK_VECTOR, 1, "Coordinate 2", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, PROP_NONE },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_VALUE, 0, "Value", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_FLOAT, 0, "Value" },
{ -1, 0, "" }
};
@@ -66,8 +67,8 @@ void register_node_type_tex_distance(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_DISTANCE, "Distance", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_DISTANCE, "Distance", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 120, 110, 160);
node_type_storage(&ntype, "node_distance", NULL, NULL);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c b/source/blender/nodes/texture/nodes/node_texture_hueSatVal.c
index 471d8db2c03..cd7ebb18018 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c
+++ b/source/blender/nodes/texture/nodes/node_texture_hueSatVal.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,25 +27,25 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c
+/** \file blender/nodes/texture/nodes/node_texture_hueSatVal.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
-static bNodeSocketType inputs[]= {
- { SOCK_VALUE, 1, "Hue", 0.0f, 0.0f, 0.0f, 0.0f, -0.5f, 0.5f },
- { SOCK_VALUE, 1, "Saturation", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f },
- { SOCK_VALUE, 1, "Value", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f },
- { SOCK_VALUE, 1, "Factor", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_FLOAT, 1, "Hue", 0.0f, 0.0f, 0.0f, 0.0f, -0.5f, 0.5f, PROP_NONE },
+ { SOCK_FLOAT, 1, "Saturation", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f, PROP_FACTOR },
+ { SOCK_FLOAT, 1, "Value", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f, PROP_FACTOR },
+ { SOCK_FLOAT, 1, "Factor", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR },
+ { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Color" },
{ -1, 0, "" }
};
@@ -97,8 +98,8 @@ void register_node_type_tex_hue_sat(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 150, 80, 250);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_image.c b/source/blender/nodes/texture/nodes/node_texture_image.c
index a54ca4bb119..6e749a80d99 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_image.c
+++ b/source/blender/nodes/texture/nodes/node_texture_image.c
@@ -27,16 +27,16 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_image.c
+/** \file blender/nodes/texture/nodes/node_texture_image.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Image"},
{ -1, 0, "" }
};
@@ -88,7 +88,7 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-static void init(bNode* node)
+static void init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user");
node->storage= iuser;
@@ -101,8 +101,8 @@ void register_node_type_tex_image(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_IMAGE, "Image", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
- NULL, outputs);
+ node_type_base(&ntype, TEX_NODE_IMAGE, "Image", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, NULL, outputs);
node_type_size(&ntype, 120, 80, 300);
node_type_init(&ntype, init);
node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_invert.c b/source/blender/nodes/texture/nodes/node_texture_invert.c
index e908bdcff07..d18bb86d5fa 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_invert.c
+++ b/source/blender/nodes/texture/nodes/node_texture_invert.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_invert.c
+/** \file blender/nodes/texture/nodes/node_texture_invert.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
/* **************** INVERT ******************** */
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -68,8 +69,8 @@ void register_node_type_tex_invert(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 90, 80, 100);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_math.c b/source/blender/nodes/texture/nodes/node_texture_math.c
index 18468bdd55c..04f399069c1 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_math.c
+++ b/source/blender/nodes/texture/nodes/node_texture_math.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_math.c
+/** \file blender/nodes/texture/nodes/node_texture_math.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
/* **************** SCALAR MATH ******************** */
-static bNodeSocketType inputs[]= {
- { SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f},
- { SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f},
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_FLOAT, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f, PROP_NONE},
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_VALUE, 0, "Value", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_FLOAT, 0, "Value"},
{ -1, 0, "" }
};
@@ -189,8 +190,8 @@ void register_node_type_tex_math(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 120, 110, 160);
node_type_label(&ntype, node_math_label);
node_type_storage(&ntype, "node_math", NULL, NULL);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c b/source/blender/nodes/texture/nodes/node_texture_mixRgb.c
index c7668c27b99..933a0302df8 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c
+++ b/source/blender/nodes/texture/nodes/node_texture_mixRgb.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_mixRgb.c
+/** \file blender/nodes/texture/nodes/node_texture_mixRgb.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
/* **************** MIX RGB ******************** */
-static bNodeSocketType inputs[]= {
- { SOCK_VALUE, 1, "Factor", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_RGBA, 1, "Color1", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f },
- { SOCK_RGBA , 1, "Color2", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_FLOAT, 1, "Factor", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR },
+ { SOCK_RGBA, 1, "Color1", 0.5f, 0.5f, 0.5f, 1.0f },
+ { SOCK_RGBA , 1, "Color2", 0.5f, 0.5f, 0.5f, 1.0f },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Color" },
{ -1, 0, "" }
};
@@ -69,8 +70,8 @@ void register_node_type_tex_mix_rgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 100, 60, 150);
node_type_label(&ntype, node_blend_label);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_output.c b/source/blender/nodes/texture/nodes/node_texture_output.c
index 046ad724507..3095e224446 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_output.c
+++ b/source/blender/nodes/texture/nodes/node_texture_output.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,18 +27,18 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_output.c
+/** \file blender/nodes/texture/nodes/node_texture_output.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
/* **************** COMPOSITE ******************** */
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, PROP_DIRECTION},
{ -1, 0, "" }
};
@@ -141,7 +142,7 @@ static void assign_index(struct bNode *node)
node->custom1 = index;
}
-static void init(bNode *node)
+static void init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
TexNodeOutput *tno = MEM_callocN(sizeof(TexNodeOutput), "TEX_output");
node->storage= tno;
@@ -162,8 +163,8 @@ void register_node_type_tex_output(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_OUTPUT, "Output", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS,
- inputs, NULL);
+ node_type_base(&ntype, TEX_NODE_OUTPUT, "Output", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, NULL);
node_type_size(&ntype, 150, 60, 200);
node_type_init(&ntype, init);
node_type_storage(&ntype, "TexNodeOutput", node_free_standard_storage, copy);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_proc.c b/source/blender/nodes/texture/nodes/node_texture_proc.c
index 294c1f7322f..237e4d6923d 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_proc.c
+++ b/source/blender/nodes/texture/nodes/node_texture_proc.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,13 +27,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_proc.c
+/** \file blender/nodes/texture/nodes/node_texture_proc.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
#include "RE_shader_ext.h"
@@ -41,21 +42,21 @@
*/
-static bNodeSocketType outputs_both[]= {
- { SOCK_RGBA, 0, "Color", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
- { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs_both[]= {
+ { SOCK_RGBA, 0, "Color", 1.0f, 0.0f, 0.0f, 1.0f },
+ { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, PROP_DIRECTION },
{ -1, 0, "" }
};
-static bNodeSocketType outputs_color_only[]= {
- { SOCK_RGBA, 0, "Color", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs_color_only[]= {
+ { SOCK_RGBA, 0, "Color" },
{ -1, 0, "" }
};
/* Inputs common to all, #defined because nodes will need their own inputs too */
#define I 2 /* count */
#define COMMON_INPUTS \
- { SOCK_RGBA, 1, "Color 1", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, \
- { SOCK_RGBA, 1, "Color 2", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f }
+ { SOCK_RGBA, 1, "Color 1", 0.0f, 0.0f, 0.0f, 1.0f }, \
+ { SOCK_RGBA, 1, "Color 2", 1.0f, 1.0f, 1.0f, 1.0f }
/* Calls multitex and copies the result to the outputs. Called by xxx_exec, which handles inputs. */
static void do_proc(float *result, TexParams *p, float *col1, float *col2, char is_normal, Tex *tex, short thread)
@@ -139,15 +140,15 @@ static int count_outputs(bNode *node)
/* --- VORONOI -- */
-static bNodeSocketType voronoi_inputs[]= {
+static bNodeSocketTemplate voronoi_inputs[]= {
COMMON_INPUTS,
- { SOCK_VALUE, 1, "W1", 1.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f },
- { SOCK_VALUE, 1, "W2", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f },
- { SOCK_VALUE, 1, "W3", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f },
- { SOCK_VALUE, 1, "W4", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f },
+ { SOCK_FLOAT, 1, "W1", 1.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f, PROP_NONE },
+ { SOCK_FLOAT, 1, "W2", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f, PROP_NONE },
+ { SOCK_FLOAT, 1, "W3", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f, PROP_NONE },
+ { SOCK_FLOAT, 1, "W4", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f, PROP_NONE },
- { SOCK_VALUE, 1, "iScale", 1.0f, 0.0f, 0.0f, 0.0f, 0.01f, 10.0f },
- { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 4.0f },
+ { SOCK_FLOAT, 1, "iScale", 1.0f, 0.0f, 0.0f, 0.0f, 0.01f, 10.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 4.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
@@ -164,7 +165,7 @@ static void voronoi_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short th
ProcDef(voronoi)
/* --- BLEND -- */
-static bNodeSocketType blend_inputs[]= {
+static bNodeSocketTemplate blend_inputs[]= {
COMMON_INPUTS,
{ -1, 0, "" }
};
@@ -172,9 +173,9 @@ ProcNoInputs(blend)
ProcDef(blend)
/* -- MAGIC -- */
-static bNodeSocketType magic_inputs[]= {
+static bNodeSocketTemplate magic_inputs[]= {
COMMON_INPUTS,
- { SOCK_VALUE, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f },
+ { SOCK_FLOAT, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
static void magic_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
@@ -184,10 +185,10 @@ static void magic_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thre
ProcDef(magic)
/* --- MARBLE --- */
-static bNodeSocketType marble_inputs[]= {
+static bNodeSocketTemplate marble_inputs[]= {
COMMON_INPUTS,
- { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f },
- { SOCK_VALUE, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f },
+ { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
static void marble_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
@@ -198,9 +199,9 @@ static void marble_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thr
ProcDef(marble)
/* --- CLOUDS --- */
-static bNodeSocketType clouds_inputs[]= {
+static bNodeSocketTemplate clouds_inputs[]= {
COMMON_INPUTS,
- { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f },
+ { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
static void clouds_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
@@ -210,10 +211,10 @@ static void clouds_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thr
ProcDef(clouds)
/* --- DISTORTED NOISE --- */
-static bNodeSocketType distnoise_inputs[]= {
+static bNodeSocketTemplate distnoise_inputs[]= {
COMMON_INPUTS,
- { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f },
- { SOCK_VALUE, 1, "Distortion", 1.00f, 0.0f, 0.0f, 0.0f, 0.0000f, 10.0f },
+ { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Distortion", 1.00f, 0.0f, 0.0f, 0.0f, 0.0000f, 10.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
static void distnoise_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
@@ -224,10 +225,10 @@ static void distnoise_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short
ProcDef(distnoise)
/* --- WOOD --- */
-static bNodeSocketType wood_inputs[]= {
+static bNodeSocketTemplate wood_inputs[]= {
COMMON_INPUTS,
- { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f },
- { SOCK_VALUE, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f },
+ { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
static void wood_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
@@ -238,14 +239,14 @@ static void wood_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short threa
ProcDef(wood)
/* --- MUSGRAVE --- */
-static bNodeSocketType musgrave_inputs[]= {
+static bNodeSocketTemplate musgrave_inputs[]= {
COMMON_INPUTS,
- { SOCK_VALUE, 1, "H", 1.0f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f },
- { SOCK_VALUE, 1, "Lacunarity", 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 6.0f },
- { SOCK_VALUE, 1, "Octaves", 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 8.0f },
+ { SOCK_FLOAT, 1, "H", 1.0f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Lacunarity", 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 6.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Octaves", 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 8.0f, PROP_UNSIGNED },
- { SOCK_VALUE, 1, "iScale", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 10.0f },
- { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f },
+ { SOCK_FLOAT, 1, "iScale", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 10.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
static void musgrave_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
@@ -259,7 +260,7 @@ static void musgrave_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short t
ProcDef(musgrave)
/* --- NOISE --- */
-static bNodeSocketType noise_inputs[]= {
+static bNodeSocketTemplate noise_inputs[]= {
COMMON_INPUTS,
{ -1, 0, "" }
};
@@ -267,10 +268,10 @@ ProcNoInputs(noise)
ProcDef(noise)
/* --- STUCCI --- */
-static bNodeSocketType stucci_inputs[]= {
+static bNodeSocketTemplate stucci_inputs[]= {
COMMON_INPUTS,
- { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f },
- { SOCK_VALUE, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f },
+ { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED },
+ { SOCK_FLOAT, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f, PROP_UNSIGNED },
{ -1, 0, "" }
};
static void stucci_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
@@ -282,7 +283,7 @@ ProcDef(stucci)
/* --- */
-static void init(bNode *node)
+static void init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
Tex *tex = MEM_callocN(sizeof(Tex), "Tex");
node->storage= tex;
@@ -301,7 +302,8 @@ void register_node_type_tex_proc_##name(ListBase *lb) \
{ \
static bNodeType ntype; \
\
- node_type_base(&ntype, TEX_NODE_PROC+TEXTYPE, Name, NODE_CLASS_TEXTURE, NODE_PREVIEW|NODE_OPTIONS, name##_inputs, outputs); \
+ node_type_base(&ntype, TEX_NODE_PROC+TEXTYPE, Name, NODE_CLASS_TEXTURE, NODE_PREVIEW|NODE_OPTIONS); \
+ node_type_socket_templates(&ntype, name##_inputs, outputs); \
node_type_size(&ntype, 140, 80, 140); \
node_type_init(&ntype, init); \
node_type_storage(&ntype, "Tex", node_free_standard_storage, node_copy_standard_storage); \
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c b/source/blender/nodes/texture/nodes/node_texture_rotate.c
index 1be6152a2b3..afba9f199f9 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c
+++ b/source/blender/nodes/texture/nodes/node_texture_rotate.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,25 +27,25 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_rotate.c
+/** \file blender/nodes/texture/nodes/node_texture_rotate.c
* \ingroup texnodes
*/
#include <math.h>
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Turns", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
- { SOCK_VECTOR, 1, "Axis", 0.0f, 0.0f, 1.0f, 0.0f, -1.0f, 1.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Turns", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, PROP_NONE },
+ { SOCK_VECTOR, 1, "Axis", 0.0f, 0.0f, 1.0f, 0.0f, -1.0f, 1.0f, PROP_DIRECTION },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -100,8 +101,8 @@ void register_node_type_tex_rotate(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_ROTATE, "Rotate", NODE_CLASS_DISTORT, NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_ROTATE, "Rotate", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 140, 100, 320);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_scale.c b/source/blender/nodes/texture/nodes/node_texture_scale.c
index cfffcfda2e5..e3aee35977a 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_scale.c
+++ b/source/blender/nodes/texture/nodes/node_texture_scale.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_scale.c
+/** \file blender/nodes/texture/nodes/node_texture_scale.c
* \ingroup texnodes
*/
#include <math.h>
-#include "../TEX_util.h"
+#include "node_texture_util.h"
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
- { SOCK_VECTOR, 1, "Scale", 1.0f, 1.0f, 1.0f, 0.0f, -10.0f, 10.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f },
+ { SOCK_VECTOR, 1, "Scale", 1.0f, 1.0f, 1.0f, 0.0f, -10.0f, 10.0f, PROP_FACTOR },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -73,8 +74,8 @@ void register_node_type_tex_scale(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_SCALE, "Scale", NODE_CLASS_DISTORT, NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_SCALE, "Scale", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 90, 80, 100);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c b/source/blender/nodes/texture/nodes/node_texture_texture.c
index c58595866af..96d6325671a 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c
+++ b/source/blender/nodes/texture/nodes/node_texture_texture.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,24 +27,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_texture.c
+/** \file blender/nodes/texture/nodes/node_texture_texture.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
#include "RE_shader_ext.h"
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Color1", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f },
- { SOCK_RGBA, 1, "Color2", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Color1", 1.0f, 1.0f, 1.0f, 1.0f },
+ { SOCK_RGBA, 1, "Color2", 0.0f, 0.0f, 0.0f, 1.0f },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Color", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Color" },
{ -1, 0, "" }
};
@@ -53,7 +54,7 @@ static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor
static float red[] = {1,0,0,1};
static float white[] = {1,1,1,1};
float co[3], dxt[3], dyt[3];
-
+
copy_v3_v3(co, p->co);
copy_v3_v3(dxt, p->dxt);
copy_v3_v3(dyt, p->dyt);
@@ -70,7 +71,7 @@ static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor
tex_input_rgba(col1, in[0], p, thread);
tex_input_rgba(col2, in[1], p, thread);
-
+
texres.nor = nor;
textype = multitex_nodes(nodetex, co, dxt, dyt, p->osatex,
&texres, thread, 0, p->shi, p->mtex);
@@ -94,8 +95,8 @@ void register_node_type_tex_texture(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 120, 80, 240);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_translate.c b/source/blender/nodes/texture/nodes/node_texture_translate.c
index 8f7d6d837d7..b970bfbff76 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_translate.c
+++ b/source/blender/nodes/texture/nodes/node_texture_translate.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,23 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_translate.c
+/** \file blender/nodes/texture/nodes/node_texture_translate.c
* \ingroup texnodes
*/
#include <math.h>
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 1, "Offset", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_VECTOR, 1, "Offset", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f, PROP_TRANSLATION },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -69,8 +70,8 @@ void register_node_type_tex_translate(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_TRANSLATE, "Translate", NODE_CLASS_DISTORT, NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_TRANSLATE, "Translate", NODE_CLASS_DISTORT, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 90, 80, 100);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c b/source/blender/nodes/texture/nodes/node_texture_valToNor.c
index e430c0c9a95..523f416568c 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c
+++ b/source/blender/nodes/texture/nodes/node_texture_valToNor.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_valToNor.c
+/** \file blender/nodes/texture/nodes/node_texture_valToNor.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
-static bNodeSocketType inputs[]= {
- { SOCK_VALUE, 1, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
- { SOCK_VALUE, 1, "Nabla", 0.025f, 0.0f, 0.0f, 0.0f, 0.001f, 0.1f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_FLOAT, 1, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE },
+ { SOCK_FLOAT, 1, "Nabla", 0.025f, 0.0f, 0.0f, 0.0f, 0.001f, 0.1f, PROP_UNSIGNED },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
- { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate outputs[]= {
+ { SOCK_VECTOR, 0, "Normal" },
{ -1, 0, "" }
};
@@ -85,8 +86,8 @@ void register_node_type_tex_valtonor(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_VALTONOR, "Value to Normal", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_VALTONOR, "Value to Normal", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 90, 80, 100);
node_type_exec(&ntype, exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c b/source/blender/nodes/texture/nodes/node_texture_valToRgb.c
index 8f59828081c..6398a398b32 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c
+++ b/source/blender/nodes/texture/nodes/node_texture_valToRgb.c
@@ -27,21 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_valToRgb.c
+/** \file blender/nodes/texture/nodes/node_texture_valToRgb.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
/* **************** VALTORGB ******************** */
-static bNodeSocketType valtorgb_in[]= {
- { SOCK_VALUE, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate valtorgb_in[]= {
+ { SOCK_FLOAT, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ -1, 0, "" }
};
-static bNodeSocketType valtorgb_out[]= {
- { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate valtorgb_out[]= {
+ { SOCK_RGBA, 0, "Color"},
{ -1, 0, "" }
};
@@ -59,7 +59,7 @@ static void valtorgb_exec(void *data, bNode *node, bNodeStack **in, bNodeStack *
tex_output(node, in, out[0], &valtorgb_colorfn, data);
}
-static void valtorgb_init(bNode *node)
+static void valtorgb_init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
{
node->storage = add_colorband(1);
}
@@ -68,8 +68,8 @@ void register_node_type_tex_valtorgb(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- valtorgb_in, valtorgb_out);
+ node_type_base(&ntype, TEX_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_socket_templates(&ntype, valtorgb_in, valtorgb_out);
node_type_size(&ntype, 240, 200, 300);
node_type_init(&ntype, valtorgb_init);
node_type_storage(&ntype, "ColorBand", node_free_standard_storage, node_copy_standard_storage);
@@ -79,12 +79,12 @@ void register_node_type_tex_valtorgb(ListBase *lb)
}
/* **************** RGBTOBW ******************** */
-static bNodeSocketType rgbtobw_in[]= {
+static bNodeSocketTemplate rgbtobw_in[]= {
{ SOCK_RGBA, 1, "Color", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
-static bNodeSocketType rgbtobw_out[]= {
- { SOCK_VALUE, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+static bNodeSocketTemplate rgbtobw_out[]= {
+ { SOCK_FLOAT, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
@@ -106,8 +106,8 @@ void register_node_type_tex_rgbtobw(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0,
- rgbtobw_in, rgbtobw_out);
+ node_type_base(&ntype, TEX_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0);
+ node_type_socket_templates(&ntype, rgbtobw_in, rgbtobw_out);
node_type_size(&ntype, 80, 40, 120);
node_type_exec(&ntype, rgbtobw_exec);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c b/source/blender/nodes/texture/nodes/node_texture_viewer.c
index e917e525e17..b0aa74a83b2 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c
+++ b/source/blender/nodes/texture/nodes/node_texture_viewer.c
@@ -1,4 +1,5 @@
/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,20 +27,20 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/nodes/intern/TEX_nodes/TEX_viewer.c
+/** \file blender/nodes/texture/nodes/node_texture_viewer.c
* \ingroup texnodes
*/
-#include "../TEX_util.h"
-#include "TEX_node.h"
+#include "node_texture_util.h"
+#include "NOD_texture.h"
#include <math.h>
-static bNodeSocketType inputs[]= {
- { SOCK_RGBA, 1, "Color", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
+static bNodeSocketTemplate inputs[]= {
+ { SOCK_RGBA, 1, "Color", 1.0f, 0.0f, 0.0f, 1.0f },
{ -1, 0, "" }
};
-static bNodeSocketType outputs[]= {
+static bNodeSocketTemplate outputs[]= {
{ -1, 0, "" }
};
@@ -61,8 +62,8 @@ void register_node_type_tex_viewer(ListBase *lb)
{
static bNodeType ntype;
- node_type_base(&ntype, TEX_NODE_VIEWER, "Viewer", NODE_CLASS_OUTPUT, NODE_PREVIEW,
- inputs, outputs);
+ node_type_base(&ntype, TEX_NODE_VIEWER, "Viewer", NODE_CLASS_OUTPUT, NODE_PREVIEW);
+ node_type_socket_templates(&ntype, inputs, outputs);
node_type_size(&ntype, 100, 60, 150);
node_type_exec(&ntype, exec);
diff --git a/source/blender/python/SConscript b/source/blender/python/SConscript
index dec0de4a6ab..9d7928c4432 100644
--- a/source/blender/python/SConscript
+++ b/source/blender/python/SConscript
@@ -5,7 +5,7 @@
Import ('env')
incs = '. ../editors/include ../makesdna ../makesrna ../blenlib ../blenkernel ../nodes'
-incs += ' ../imbuf ../blenloader ../render/extern/include ../windowmanager'
+incs += ' ../imbuf ../blenloader ../gpu ../render/extern/include ../windowmanager'
incs += ' #intern/guardedalloc #intern/memutil #extern/glew/include'
incs += ' #intern/audaspace/intern ' + env['BF_PYTHON_INC']
diff --git a/source/blender/python/generic/bpy_internal_import.c b/source/blender/python/generic/bpy_internal_import.c
index f0158fe72c3..67ed90c79eb 100644
--- a/source/blender/python/generic/bpy_internal_import.c
+++ b/source/blender/python/generic/bpy_internal_import.c
@@ -344,7 +344,7 @@ void bpy_text_clear_modules(int clear_all)
/* looping over the dict */
PyObject *key, *value;
- int pos= 0;
+ Py_ssize_t pos= 0;
/* new list */
PyObject *list;
@@ -374,7 +374,7 @@ void bpy_text_clear_modules(int clear_all)
}
/* remove all our modules */
- for(pos=0; pos < PyList_Size(list); pos++) {
+ for(pos=0; pos < PyList_GET_SIZE(list); pos++) {
/* PyObject_Print(key, stderr, 0); */
key= PyList_GET_ITEM(list, pos);
PyDict_DelItem(modules, key);
diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c
index 81aea8571f8..d5bd44fc288 100644
--- a/source/blender/python/generic/py_capi_utils.c
+++ b/source/blender/python/generic/py_capi_utils.c
@@ -208,7 +208,77 @@ PyObject *PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...)
return item;
}
-/* returns the exception string as a new PyUnicode object, depends on external StringIO module */
+/* similar to PyErr_Format(),
+ *
+ * implimentation - we cant actually preprend the existing exception,
+ * because it could have _any_ argiments given to it, so instead we get its
+ * __str__ output and raise our own exception including it.
+ */
+PyObject *PyC_Err_Format_Prefix(PyObject *exception_type_prefix, const char *format, ...)
+{
+ PyObject *error_value_prefix;
+ va_list args;
+
+ va_start(args, format);
+ error_value_prefix= PyUnicode_FromFormatV(format, args); /* can fail and be NULL */
+ va_end(args);
+
+ if(PyErr_Occurred()) {
+ PyObject *error_type, *error_value, *error_traceback;
+ PyErr_Fetch(&error_type, &error_value, &error_traceback);
+ PyErr_Format(exception_type_prefix,
+ "%S, %.200s(%S)",
+ error_value_prefix,
+ Py_TYPE(error_value)->tp_name,
+ error_value
+ );
+ }
+ else {
+ PyErr_SetObject(exception_type_prefix,
+ error_value_prefix
+ );
+ }
+
+ Py_XDECREF(error_value_prefix);
+
+ /* dumb to always return NULL but matches PyErr_Format */
+ return NULL;
+}
+
+
+/* returns the exception string as a new PyUnicode object, depends on external traceback module */
+#if 0
+
+/* this version uses traceback module but somehow fails on UI errors */
+
+PyObject *PyC_ExceptionBuffer(void)
+{
+ PyObject *traceback_mod= NULL;
+ PyObject *format_tb_func= NULL;
+ PyObject *ret= NULL;
+
+ if(! (traceback_mod= PyImport_ImportModule("traceback")) ) {
+ goto error_cleanup;
+ }
+ else if (! (format_tb_func= PyObject_GetAttrString(traceback_mod, "format_exc"))) {
+ goto error_cleanup;
+ }
+
+ ret= PyObject_CallObject(format_tb_func, NULL);
+
+ if(ret == Py_None) {
+ Py_DECREF(ret);
+ ret= NULL;
+ }
+
+error_cleanup:
+ /* could not import the module so print the error and close */
+ Py_XDECREF(traceback_mod);
+ Py_XDECREF(format_tb_func);
+
+ return ret;
+}
+#else /* verbose, non-threadsafe version */
PyObject *PyC_ExceptionBuffer(void)
{
PyObject *stdout_backup = PySys_GetObject("stdout"); /* borrowed */
@@ -217,20 +287,20 @@ PyObject *PyC_ExceptionBuffer(void)
PyObject *string_io_buf = NULL;
PyObject *string_io_mod= NULL;
PyObject *string_io_getvalue= NULL;
-
+
PyObject *error_type, *error_value, *error_traceback;
-
+
if (!PyErr_Occurred())
return NULL;
-
+
PyErr_Fetch(&error_type, &error_value, &error_traceback);
-
+
PyErr_Clear();
-
+
/* import io
* string_io = io.StringIO()
*/
-
+
if(! (string_io_mod= PyImport_ImportModule("io")) ) {
goto error_cleanup;
}
@@ -240,44 +310,45 @@ PyObject *PyC_ExceptionBuffer(void)
else if (! (string_io_getvalue= PyObject_GetAttrString(string_io, "getvalue"))) {
goto error_cleanup;
}
-
+
Py_INCREF(stdout_backup); // since these were borrowed we dont want them freed when replaced.
Py_INCREF(stderr_backup);
-
+
PySys_SetObject("stdout", string_io); // both of these are free'd when restoring
PySys_SetObject("stderr", string_io);
-
+
PyErr_Restore(error_type, error_value, error_traceback);
PyErr_Print(); /* print the error */
PyErr_Clear();
-
+
string_io_buf = PyObject_CallObject(string_io_getvalue, NULL);
-
+
PySys_SetObject("stdout", stdout_backup);
PySys_SetObject("stderr", stderr_backup);
-
+
Py_DECREF(stdout_backup); /* now sys owns the ref again */
Py_DECREF(stderr_backup);
-
+
Py_DECREF(string_io_mod);
Py_DECREF(string_io_getvalue);
Py_DECREF(string_io); /* free the original reference */
-
+
PyErr_Clear();
return string_io_buf;
-
-
+
+
error_cleanup:
/* could not import the module so print the error and close */
Py_XDECREF(string_io_mod);
Py_XDECREF(string_io);
-
+
PyErr_Restore(error_type, error_value, error_traceback);
PyErr_Print(); /* print the error */
PyErr_Clear();
-
+
return NULL;
}
+#endif
/* string conversion, escape non-unicode chars, coerce must be set to NULL */
diff --git a/source/blender/python/generic/py_capi_utils.h b/source/blender/python/generic/py_capi_utils.h
index 96c93ab71f8..03a8637710e 100644
--- a/source/blender/python/generic/py_capi_utils.h
+++ b/source/blender/python/generic/py_capi_utils.h
@@ -34,6 +34,7 @@ void PyC_ObSpit(const char *name, PyObject *var);
void PyC_LineSpit(void);
PyObject * PyC_ExceptionBuffer(void);
PyObject * PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...);
+PyObject * PyC_Err_Format_Prefix(PyObject *exception_type_prefix, const char *format, ...);
void PyC_FileAndNum(const char **filename, int *lineno);
int PyC_AsArray(void *array, PyObject *value, const int length, const PyTypeObject *type, const short is_double, const char *error_prefix);
diff --git a/source/blender/python/intern/CMakeLists.txt b/source/blender/python/intern/CMakeLists.txt
index 93a4b3ec269..9ed08591eea 100644
--- a/source/blender/python/intern/CMakeLists.txt
+++ b/source/blender/python/intern/CMakeLists.txt
@@ -32,6 +32,7 @@ set(INC
../../makesdna
../../makesrna
../../windowmanager
+ ../../gpu
../../../../intern/guardedalloc
)
@@ -40,6 +41,7 @@ set(INC_SYS
)
set(SRC
+ gpu.c
bpy.c
bpy_app.c
bpy_app_handlers.c
@@ -58,6 +60,7 @@ set(SRC
bpy_util.c
stubs.c
+ gpu.h
bpy.h
bpy_app.h
bpy_app_handlers.h
diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c
index d68fd9a9111..f3ef55d29c4 100644
--- a/source/blender/python/intern/bpy_driver.c
+++ b/source/blender/python/intern/bpy_driver.c
@@ -76,6 +76,13 @@ int bpy_pydriver_create_dict(void)
Py_DECREF(mod);
}
+ /* add noise to global namespace */
+ mod= PyImport_ImportModuleLevel((char *)"noise", NULL, NULL, NULL, 0);
+ if (mod) {
+ PyDict_SetItemString(bpy_pydriver_Dict, "noise", mod);
+ Py_DECREF(mod);
+ }
+
return 0;
}
diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c
index e5e90380d61..e5bfc1d633f 100644
--- a/source/blender/python/intern/bpy_interface.c
+++ b/source/blender/python/intern/bpy_interface.c
@@ -40,6 +40,7 @@
#include "RNA_types.h"
#include "bpy.h"
+#include "gpu.h"
#include "bpy_rna.h"
#include "bpy_util.h"
#include "bpy_traceback.h"
@@ -181,6 +182,7 @@ static struct _inittab bpy_internal_modules[]= {
#ifdef WITH_AUDASPACE
{(char *)"aud", AUD_initPython},
#endif
+ {(char *)"gpu", GPU_initPython},
{NULL, NULL}
};
diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c
index e1c38a82142..a63cee4e505 100644
--- a/source/blender/python/intern/bpy_rna.c
+++ b/source/blender/python/intern/bpy_rna.c
@@ -1298,7 +1298,9 @@ PyObject *pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
{
int subtype= RNA_property_subtype(prop);
const char *buf;
- buf= RNA_property_string_get_alloc(ptr, prop, NULL, -1);
+ char buf_fixed[32];
+
+ buf= RNA_property_string_get_alloc(ptr, prop, buf_fixed, sizeof(buf_fixed));
#ifdef USE_STRING_COERCE
/* only file paths get special treatment, they may contain non utf-8 chars */
if(ELEM3(subtype, PROP_FILEPATH, PROP_DIRPATH, PROP_FILENAME)) {
@@ -1310,7 +1312,9 @@ PyObject *pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
#else // USE_STRING_COERCE
ret= PyUnicode_FromString(buf);
#endif // USE_STRING_COERCE
- MEM_freeN((void *)buf);
+ if(buf_fixed != buf) {
+ MEM_freeN((void *)buf);
+ }
break;
}
case PROP_ENUM:
@@ -1521,10 +1525,22 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
#endif // USE_STRING_COERCE
if (param==NULL) {
- PyErr_Format(PyExc_TypeError,
- "%.200s %.200s.%.200s expected a string type, not %.200s",
- error_prefix, RNA_struct_identifier(ptr->type),
- RNA_property_identifier(prop), Py_TYPE(value)->tp_name);
+ if(PyUnicode_Check(value)) {
+ /* there was an error assigning a string type,
+ * rather than setting a new error, prefix the existing one
+ */
+ PyC_Err_Format_Prefix(PyExc_TypeError,
+ "%.200s %.200s.%.200s error assigning string",
+ error_prefix, RNA_struct_identifier(ptr->type),
+ RNA_property_identifier(prop));
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "%.200s %.200s.%.200s expected a string type, not %.200s",
+ error_prefix, RNA_struct_identifier(ptr->type),
+ RNA_property_identifier(prop), Py_TYPE(value)->tp_name);
+ }
+
return -1;
}
else {
@@ -4604,7 +4620,7 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject
#ifdef DEBUG_STRING_FREE
- // if(PyList_Size(string_free_ls)) printf("%.200s.%.200s(): has %d strings\n", RNA_struct_identifier(self_ptr->type), RNA_function_identifier(self_func), (int)PyList_Size(string_free_ls));
+ // if(PyList_GET_SIZE(string_free_ls)) printf("%.200s.%.200s(): has %d strings\n", RNA_struct_identifier(self_ptr->type), RNA_function_identifier(self_func), (int)PyList_GET_SIZE(string_free_ls));
Py_DECREF(string_free_ls);
#undef DEBUG_STRING_FREE
#endif
@@ -4627,28 +4643,28 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject
/* note: tp_base member is set to &PyType_Type on init */
PyTypeObject pyrna_struct_meta_idprop_Type= {
PyVarObject_HEAD_INIT(NULL, 0)
- "bpy_struct_meta_idprop", /* tp_name */
- sizeof(PyHeapTypeObject), /* tp_basicsize */ // XXX, would be PyTypeObject, but subtypes of Type must be PyHeapTypeObject's
- 0, /* tp_itemsize */
+ "bpy_struct_meta_idprop", /* tp_name */
+ sizeof(PyHeapTypeObject), /* tp_basicsize */ // XXX, would be PyTypeObject, but subtypes of Type must be PyHeapTypeObject's
+ 0, /* tp_itemsize */
/* methods */
- NULL, /* tp_dealloc */
+ NULL, /* tp_dealloc */
NULL, /* printfunc tp_print; */
- NULL, /* getattrfunc tp_getattr; */
- NULL, /* setattrfunc tp_setattr; */
- NULL, /* tp_compare */ /* deprecated in python 3.0! */
- NULL, /* tp_repr */
+ NULL, /* getattrfunc tp_getattr; */
+ NULL, /* setattrfunc tp_setattr; */
+ NULL, /* tp_compare */ /* deprecated in python 3.0! */
+ NULL, /* tp_repr */
/* Method suites for standard classes */
NULL, /* PyNumberMethods *tp_as_number; */
- NULL, /* PySequenceMethods *tp_as_sequence; */
- NULL, /* PyMappingMethods *tp_as_mapping; */
+ 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) pyrna_struct_meta_idprop_getattro*/, /* getattrofunc tp_getattro; */
- (setattrofunc) pyrna_struct_meta_idprop_setattro, /* setattrofunc tp_setattro; */
+ NULL, /* hashfunc tp_hash; */
+ NULL, /* ternaryfunc tp_call; */
+ NULL, /* reprfunc tp_str; */
+ NULL /*(getattrofunc) pyrna_struct_meta_idprop_getattro*/, /* getattrofunc tp_getattro; */
+ (setattrofunc) pyrna_struct_meta_idprop_setattro, /* setattrofunc tp_setattro; */
/* Functions to access object as input/output buffer */
NULL, /* PyBufferProcs *tp_as_buffer; */
@@ -4656,7 +4672,7 @@ PyTypeObject pyrna_struct_meta_idprop_Type= {
/*** Flags to define presence of optional/expanded features ***/
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* long tp_flags; */
- NULL, /* char *tp_doc; Documentation string */
+ NULL, /* char *tp_doc; Documentation string */
/*** Assigned meaning in release 2.0 ***/
/* call function for all accessible objects */
NULL, /* traverseproc tp_traverse; */
@@ -4666,7 +4682,7 @@ PyTypeObject pyrna_struct_meta_idprop_Type= {
/*** Assigned meaning in release 2.1 ***/
/*** rich comparisons ***/
- NULL, /* richcmpfunc tp_richcompare; */
+ NULL, /* richcmpfunc tp_richcompare; */
/*** weak reference enabler ***/
0, /* long tp_weaklistoffset; */
@@ -4677,9 +4693,9 @@ PyTypeObject pyrna_struct_meta_idprop_Type= {
NULL, /* iternextfunc tp_iternext; */
/*** Attribute descriptor and subclassing stuff ***/
- NULL, /* struct PyMethodDef *tp_methods; */
+ NULL, /* struct PyMethodDef *tp_methods; */
NULL, /* struct PyMemberDef *tp_members; */
- NULL, /* struct PyGetSetDef *tp_getset; */
+ NULL, /* struct PyGetSetDef *tp_getset; */
NULL, /* struct _typeobject *tp_base; */
NULL, /* PyObject *tp_dict; */
NULL, /* descrgetfunc tp_descr_get; */
@@ -4687,7 +4703,7 @@ PyTypeObject pyrna_struct_meta_idprop_Type= {
0, /* long tp_dictoffset; */
NULL, /* initproc tp_init; */
NULL, /* allocfunc tp_alloc; */
- NULL, /* newfunc tp_new; */
+ NULL, /* newfunc tp_new; */
/* Low-level free-memory routine */
NULL, /* freefunc tp_free; */
/* For PyObject_IS_GC */
@@ -4705,45 +4721,45 @@ PyTypeObject pyrna_struct_meta_idprop_Type= {
/*-----------------------BPy_StructRNA method def------------------------------*/
PyTypeObject pyrna_struct_Type= {
PyVarObject_HEAD_INIT(NULL, 0)
- "bpy_struct", /* tp_name */
- sizeof(BPy_StructRNA), /* tp_basicsize */
- 0, /* tp_itemsize */
+ "bpy_struct", /* tp_name */
+ sizeof(BPy_StructRNA), /* tp_basicsize */
+ 0, /* tp_itemsize */
/* methods */
(destructor) pyrna_struct_dealloc,/* tp_dealloc */
NULL, /* printfunc tp_print; */
- NULL, /* getattrfunc tp_getattr; */
- NULL, /* setattrfunc tp_setattr; */
- NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
- (reprfunc) pyrna_struct_repr, /* tp_repr */
+ NULL, /* getattrfunc tp_getattr; */
+ NULL, /* setattrfunc tp_setattr; */
+ NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
+ (reprfunc) pyrna_struct_repr, /* tp_repr */
/* Method suites for standard classes */
NULL, /* PyNumberMethods *tp_as_number; */
- &pyrna_struct_as_sequence, /* PySequenceMethods *tp_as_sequence; */
- &pyrna_struct_as_mapping, /* PyMappingMethods *tp_as_mapping; */
+ &pyrna_struct_as_sequence, /* PySequenceMethods *tp_as_sequence; */
+ &pyrna_struct_as_mapping, /* PyMappingMethods *tp_as_mapping; */
/* More standard operations (here for binary compatibility) */
- (hashfunc) pyrna_struct_hash, /* hashfunc tp_hash; */
- NULL, /* ternaryfunc tp_call; */
+ (hashfunc) pyrna_struct_hash, /* hashfunc tp_hash; */
+ NULL, /* ternaryfunc tp_call; */
(reprfunc) pyrna_struct_str, /* reprfunc tp_str; */
- (getattrofunc) pyrna_struct_getattro, /* getattrofunc tp_getattro; */
- (setattrofunc) pyrna_struct_setattro, /* setattrofunc tp_setattro; */
+ (getattrofunc) pyrna_struct_getattro, /* getattrofunc tp_getattro; */
+ (setattrofunc) pyrna_struct_setattro, /* setattrofunc tp_setattro; */
/* Functions to access object as input/output buffer */
NULL, /* PyBufferProcs *tp_as_buffer; */
/*** Flags to define presence of optional/expanded features ***/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* long tp_flags; */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* long tp_flags; */
- NULL, /* char *tp_doc; Documentation string */
+ NULL, /* char *tp_doc; Documentation string */
/*** Assigned meaning in release 2.0 ***/
/* call function for all accessible objects */
#ifdef USE_PYRNA_STRUCT_REFERENCE
- (traverseproc) pyrna_struct_traverse, /* traverseproc tp_traverse; */
+ (traverseproc) pyrna_struct_traverse, /* traverseproc tp_traverse; */
/* delete references to contained objects */
- (inquiry)pyrna_struct_clear, /* inquiry tp_clear; */
+ (inquiry)pyrna_struct_clear, /* inquiry tp_clear; */
#else
NULL, /* traverseproc tp_traverse; */
@@ -4753,11 +4769,11 @@ PyTypeObject pyrna_struct_Type= {
/*** Assigned meaning in release 2.1 ***/
/*** rich comparisons ***/
- (richcmpfunc)pyrna_struct_richcmp, /* richcmpfunc tp_richcompare; */
+ (richcmpfunc)pyrna_struct_richcmp, /* richcmpfunc tp_richcompare; */
/*** weak reference enabler ***/
#ifdef USE_WEAKREFS
- offsetof(BPy_StructRNA, in_weakreflist), /* long tp_weaklistoffset; */
+ offsetof(BPy_StructRNA, in_weakreflist), /* long tp_weaklistoffset; */
#else
0,
#endif
@@ -4767,9 +4783,9 @@ PyTypeObject pyrna_struct_Type= {
NULL, /* iternextfunc tp_iternext; */
/*** Attribute descriptor and subclassing stuff ***/
- pyrna_struct_methods, /* struct PyMethodDef *tp_methods; */
+ pyrna_struct_methods, /* struct PyMethodDef *tp_methods; */
NULL, /* struct PyMemberDef *tp_members; */
- pyrna_struct_getseters, /* struct PyGetSetDef *tp_getset; */
+ pyrna_struct_getseters, /* struct PyGetSetDef *tp_getset; */
NULL, /* struct _typeobject *tp_base; */
NULL, /* PyObject *tp_dict; */
NULL, /* descrgetfunc tp_descr_get; */
@@ -4777,7 +4793,7 @@ PyTypeObject pyrna_struct_Type= {
0, /* long tp_dictoffset; */
NULL, /* initproc tp_init; */
NULL, /* allocfunc tp_alloc; */
- pyrna_struct_new, /* newfunc tp_new; */
+ pyrna_struct_new, /* newfunc tp_new; */
/* Low-level free-memory routine */
NULL, /* freefunc tp_free; */
/* For PyObject_IS_GC */
@@ -4794,32 +4810,32 @@ PyTypeObject pyrna_struct_Type= {
/*-----------------------BPy_PropertyRNA method def------------------------------*/
PyTypeObject pyrna_prop_Type= {
PyVarObject_HEAD_INIT(NULL, 0)
- "bpy_prop", /* tp_name */
- sizeof(BPy_PropertyRNA), /* tp_basicsize */
- 0, /* tp_itemsize */
+ "bpy_prop", /* tp_name */
+ sizeof(BPy_PropertyRNA), /* tp_basicsize */
+ 0, /* tp_itemsize */
/* methods */
(destructor) pyrna_prop_dealloc, /* tp_dealloc */
- NULL, /* printfunc tp_print; */
- NULL, /* getattrfunc tp_getattr; */
+ NULL, /* printfunc tp_print; */
+ NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
- NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
- (reprfunc) pyrna_prop_repr, /* tp_repr */
+ NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
+ (reprfunc) pyrna_prop_repr, /* tp_repr */
/* Method suites for standard classes */
NULL, /* PyNumberMethods *tp_as_number; */
- NULL, /* PySequenceMethods *tp_as_sequence; */
- NULL, /* PyMappingMethods *tp_as_mapping; */
+ NULL, /* PySequenceMethods *tp_as_sequence; */
+ NULL, /* PyMappingMethods *tp_as_mapping; */
/* More standard operations (here for binary compatibility) */
- (hashfunc) pyrna_prop_hash, /* hashfunc tp_hash; */
+ (hashfunc) pyrna_prop_hash, /* hashfunc tp_hash; */
NULL, /* ternaryfunc tp_call; */
(reprfunc) pyrna_prop_str, /* reprfunc tp_str; */
/* will only use these if this is a subtype of a py class */
- NULL, /* getattrofunc tp_getattro; */
- NULL, /* setattrofunc tp_setattro; */
+ NULL, /* getattrofunc tp_getattro; */
+ NULL, /* setattrofunc tp_setattro; */
/* Functions to access object as input/output buffer */
NULL, /* PyBufferProcs *tp_as_buffer; */
@@ -4827,7 +4843,7 @@ PyTypeObject pyrna_prop_Type= {
/*** Flags to define presence of optional/expanded features ***/
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* long tp_flags; */
- NULL, /* char *tp_doc; Documentation string */
+ NULL, /* char *tp_doc; Documentation string */
/*** Assigned meaning in release 2.0 ***/
/* call function for all accessible objects */
NULL, /* traverseproc tp_traverse; */
@@ -4848,11 +4864,11 @@ PyTypeObject pyrna_prop_Type= {
/*** Added in release 2.2 ***/
/* Iterators */
- NULL, /* getiterfunc tp_iter; */
+ NULL, /* getiterfunc tp_iter; */
NULL, /* iternextfunc tp_iternext; */
/*** Attribute descriptor and subclassing stuff ***/
- pyrna_prop_methods, /* struct PyMethodDef *tp_methods; */
+ pyrna_prop_methods, /* struct PyMethodDef *tp_methods; */
NULL, /* struct PyMemberDef *tp_members; */
pyrna_prop_getseters, /* struct PyGetSetDef *tp_getset; */
NULL, /* struct _typeobject *tp_base; */
@@ -4862,7 +4878,7 @@ PyTypeObject pyrna_prop_Type= {
0, /* long tp_dictoffset; */
NULL, /* initproc tp_init; */
NULL, /* allocfunc tp_alloc; */
- pyrna_prop_new, /* newfunc tp_new; */
+ pyrna_prop_new, /* newfunc tp_new; */
/* Low-level free-memory routine */
NULL, /* freefunc tp_free; */
/* For PyObject_IS_GC */
@@ -4884,34 +4900,34 @@ PyTypeObject pyrna_prop_array_Type= {
/* methods */
(destructor)pyrna_prop_array_dealloc, /* tp_dealloc */
NULL, /* printfunc tp_print; */
- NULL, /* getattrfunc tp_getattr; */
+ NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
- NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
+ NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
NULL,/* subclassed */ /* tp_repr */
/* Method suites for standard classes */
- &pyrna_prop_array_as_number, /* PyNumberMethods *tp_as_number; */
- &pyrna_prop_array_as_sequence, /* PySequenceMethods *tp_as_sequence; */
- &pyrna_prop_array_as_mapping, /* PyMappingMethods *tp_as_mapping; */
+ &pyrna_prop_array_as_number, /* PyNumberMethods *tp_as_number; */
+ &pyrna_prop_array_as_sequence, /* PySequenceMethods *tp_as_sequence; */
+ &pyrna_prop_array_as_mapping, /* PyMappingMethods *tp_as_mapping; */
/* More standard operations (here for binary compatibility) */
- NULL, /* hashfunc tp_hash; */
+ NULL, /* hashfunc tp_hash; */
NULL, /* ternaryfunc tp_call; */
NULL, /* reprfunc tp_str; */
/* will only use these if this is a subtype of a py class */
- (getattrofunc) pyrna_prop_array_getattro, /* getattrofunc tp_getattro; */
- NULL, /* setattrofunc tp_setattro; */
+ (getattrofunc) pyrna_prop_array_getattro, /* 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; */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* long tp_flags; */
- NULL, /* char *tp_doc; Documentation string */
+ NULL, /* char *tp_doc; Documentation string */
/*** Assigned meaning in release 2.0 ***/
/* call function for all accessible objects */
NULL, /* traverseproc tp_traverse; */
@@ -4921,7 +4937,7 @@ PyTypeObject pyrna_prop_array_Type= {
/*** Assigned meaning in release 2.1 ***/
/*** rich comparisons ***/
- NULL, /* subclassed */ /* richcmpfunc tp_richcompare; */
+ NULL, /* subclassed */ /* richcmpfunc tp_richcompare; */
/*** weak reference enabler ***/
#ifdef USE_WEAKREFS
@@ -4935,22 +4951,22 @@ PyTypeObject pyrna_prop_array_Type= {
NULL, /* iternextfunc tp_iternext; */
/*** Attribute descriptor and subclassing stuff ***/
- pyrna_prop_array_methods, /* struct PyMethodDef *tp_methods; */
+ pyrna_prop_array_methods, /* struct PyMethodDef *tp_methods; */
NULL, /* struct PyMemberDef *tp_members; */
- NULL /*pyrna_prop_getseters*/, /* struct PyGetSetDef *tp_getset; */
- &pyrna_prop_Type, /* struct _typeobject *tp_base; */
+ NULL /*pyrna_prop_getseters*/, /* struct PyGetSetDef *tp_getset; */
+ &pyrna_prop_Type, /* 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; */
+ 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; */
+ NULL, /* PyObject *tp_bases; */
/* method resolution order */
NULL, /* PyObject *tp_mro; */
NULL, /* PyObject *tp_cache; */
@@ -4961,32 +4977,32 @@ PyTypeObject pyrna_prop_array_Type= {
PyTypeObject pyrna_prop_collection_Type= {
PyVarObject_HEAD_INIT(NULL, 0)
- "bpy_prop_collection", /* tp_name */
- sizeof(BPy_PropertyRNA), /* tp_basicsize */
- 0, /* tp_itemsize */
+ "bpy_prop_collection", /* tp_name */
+ sizeof(BPy_PropertyRNA), /* tp_basicsize */
+ 0, /* tp_itemsize */
/* methods */
(destructor)pyrna_prop_dealloc, /* tp_dealloc */
NULL, /* printfunc tp_print; */
- NULL, /* getattrfunc tp_getattr; */
+ NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
- NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
+ NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
NULL, /* subclassed */ /* tp_repr */
/* Method suites for standard classes */
&pyrna_prop_collection_as_number, /* PyNumberMethods *tp_as_number; */
- &pyrna_prop_collection_as_sequence, /* PySequenceMethods *tp_as_sequence; */
- &pyrna_prop_collection_as_mapping, /* PyMappingMethods *tp_as_mapping; */
+ &pyrna_prop_collection_as_sequence, /* PySequenceMethods *tp_as_sequence; */
+ &pyrna_prop_collection_as_mapping, /* PyMappingMethods *tp_as_mapping; */
/* More standard operations (here for binary compatibility) */
- NULL, /* hashfunc tp_hash; */
+ NULL, /* hashfunc tp_hash; */
NULL, /* ternaryfunc tp_call; */
NULL, /* reprfunc tp_str; */
/* will only use these if this is a subtype of a py class */
- (getattrofunc) pyrna_prop_collection_getattro, /* getattrofunc tp_getattro; */
- (setattrofunc) pyrna_prop_collection_setattro, /* setattrofunc tp_setattro; */
+ (getattrofunc) pyrna_prop_collection_getattro, /* getattrofunc tp_getattro; */
+ (setattrofunc) pyrna_prop_collection_setattro, /* setattrofunc tp_setattro; */
/* Functions to access object as input/output buffer */
NULL, /* PyBufferProcs *tp_as_buffer; */
@@ -4994,7 +5010,7 @@ PyTypeObject pyrna_prop_collection_Type= {
/*** Flags to define presence of optional/expanded features ***/
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* long tp_flags; */
- NULL, /* char *tp_doc; Documentation string */
+ NULL, /* char *tp_doc; Documentation string */
/*** Assigned meaning in release 2.0 ***/
/* call function for all accessible objects */
NULL, /* traverseproc tp_traverse; */
@@ -5008,33 +5024,33 @@ PyTypeObject pyrna_prop_collection_Type= {
/*** weak reference enabler ***/
#ifdef USE_WEAKREFS
- offsetof(BPy_PropertyRNA, in_weakreflist), /* long tp_weaklistoffset; */
+ offsetof(BPy_PropertyRNA, in_weakreflist), /* long tp_weaklistoffset; */
#else
0,
#endif
/*** Added in release 2.2 ***/
/* Iterators */
- (getiterfunc)pyrna_prop_collection_iter, /* getiterfunc tp_iter; */
+ (getiterfunc)pyrna_prop_collection_iter, /* getiterfunc tp_iter; */
NULL, /* iternextfunc tp_iternext; */
/*** Attribute descriptor and subclassing stuff ***/
- pyrna_prop_collection_methods, /* struct PyMethodDef *tp_methods; */
+ pyrna_prop_collection_methods, /* struct PyMethodDef *tp_methods; */
NULL, /* struct PyMemberDef *tp_members; */
- NULL /*pyrna_prop_getseters*/, /* struct PyGetSetDef *tp_getset; */
- &pyrna_prop_Type, /* struct _typeobject *tp_base; */
+ NULL /*pyrna_prop_getseters*/, /* struct PyGetSetDef *tp_getset; */
+ &pyrna_prop_Type, /* 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; */
+ 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; */
+ NULL, /* PyObject *tp_bases; */
/* method resolution order */
NULL, /* PyObject *tp_mro; */
NULL, /* PyObject *tp_cache; */
@@ -5046,32 +5062,32 @@ PyTypeObject pyrna_prop_collection_Type= {
/* only for add/remove/move methods */
static PyTypeObject pyrna_prop_collection_idprop_Type= {
PyVarObject_HEAD_INIT(NULL, 0)
- "bpy_prop_collection_idprop", /* tp_name */
- sizeof(BPy_PropertyRNA), /* tp_basicsize */
- 0, /* tp_itemsize */
+ "bpy_prop_collection_idprop", /* tp_name */
+ sizeof(BPy_PropertyRNA), /* tp_basicsize */
+ 0, /* tp_itemsize */
/* methods */
(destructor)pyrna_prop_dealloc, /* tp_dealloc */
NULL, /* printfunc tp_print; */
- NULL, /* getattrfunc tp_getattr; */
+ NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
- NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
- NULL, /* subclassed */ /* tp_repr */
+ NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
+ NULL, /* subclassed */ /* tp_repr */
/* Method suites for standard classes */
- NULL, /* PyNumberMethods *tp_as_number; */
- NULL, /* PySequenceMethods *tp_as_sequence; */
- NULL, /* PyMappingMethods *tp_as_mapping; */
+ 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, /* hashfunc tp_hash; */
NULL, /* ternaryfunc tp_call; */
NULL, /* reprfunc tp_str; */
/* will only use these if this is a subtype of a py class */
- NULL, /* getattrofunc tp_getattro; */
- NULL, /* setattrofunc tp_setattro; */
+ NULL, /* getattrofunc tp_getattro; */
+ NULL, /* setattrofunc tp_setattro; */
/* Functions to access object as input/output buffer */
NULL, /* PyBufferProcs *tp_as_buffer; */
@@ -5079,7 +5095,7 @@ static PyTypeObject pyrna_prop_collection_idprop_Type= {
/*** Flags to define presence of optional/expanded features ***/
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* long tp_flags; */
- NULL, /* char *tp_doc; Documentation string */
+ NULL, /* char *tp_doc; Documentation string */
/*** Assigned meaning in release 2.0 ***/
/* call function for all accessible objects */
NULL, /* traverseproc tp_traverse; */
@@ -5093,33 +5109,33 @@ static PyTypeObject pyrna_prop_collection_idprop_Type= {
/*** weak reference enabler ***/
#ifdef USE_WEAKREFS
- offsetof(BPy_PropertyRNA, in_weakreflist), /* long tp_weaklistoffset; */
+ offsetof(BPy_PropertyRNA, in_weakreflist), /* long tp_weaklistoffset; */
#else
0,
#endif
/*** Added in release 2.2 ***/
/* Iterators */
- NULL, /* getiterfunc tp_iter; */
+ NULL, /* getiterfunc tp_iter; */
NULL, /* iternextfunc tp_iternext; */
/*** Attribute descriptor and subclassing stuff ***/
pyrna_prop_collection_idprop_methods, /* struct PyMethodDef *tp_methods; */
NULL, /* struct PyMemberDef *tp_members; */
- NULL /*pyrna_prop_getseters*/, /* struct PyGetSetDef *tp_getset; */
- &pyrna_prop_collection_Type, /* struct _typeobject *tp_base; */
+ NULL /*pyrna_prop_getseters*/, /* struct PyGetSetDef *tp_getset; */
+ &pyrna_prop_collection_Type,/* 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; */
+ 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; */
+ NULL, /* PyObject *tp_bases; */
/* method resolution order */
NULL, /* PyObject *tp_mro; */
NULL, /* PyObject *tp_cache; */
@@ -5131,32 +5147,32 @@ static PyTypeObject pyrna_prop_collection_idprop_Type= {
/*-----------------------BPy_PropertyRNA method def------------------------------*/
PyTypeObject pyrna_func_Type= {
PyVarObject_HEAD_INIT(NULL, 0)
- "bpy_func", /* tp_name */
- sizeof(BPy_FunctionRNA), /* tp_basicsize */
- 0, /* tp_itemsize */
+ "bpy_func", /* tp_name */
+ sizeof(BPy_FunctionRNA), /* tp_basicsize */
+ 0, /* tp_itemsize */
/* methods */
- NULL, /* tp_dealloc */
- NULL, /* printfunc tp_print; */
- NULL, /* getattrfunc tp_getattr; */
+ NULL, /* tp_dealloc */
+ NULL, /* printfunc tp_print; */
+ NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
- NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
- (reprfunc) pyrna_func_repr, /* tp_repr */
+ NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
+ (reprfunc) pyrna_func_repr, /* tp_repr */
/* Method suites for standard classes */
NULL, /* PyNumberMethods *tp_as_number; */
- NULL, /* PySequenceMethods *tp_as_sequence; */
- NULL, /* PyMappingMethods *tp_as_mapping; */
+ NULL, /* PySequenceMethods *tp_as_sequence; */
+ NULL, /* PyMappingMethods *tp_as_mapping; */
/* More standard operations (here for binary compatibility) */
- NULL, /* hashfunc tp_hash; */
- (ternaryfunc)pyrna_func_call, /* ternaryfunc tp_call; */
- NULL, /* reprfunc tp_str; */
+ NULL, /* hashfunc tp_hash; */
+ (ternaryfunc)pyrna_func_call, /* ternaryfunc tp_call; */
+ NULL, /* reprfunc tp_str; */
/* will only use these if this is a subtype of a py class */
- NULL, /* getattrofunc tp_getattro; */
- NULL, /* setattrofunc tp_setattro; */
+ NULL, /* getattrofunc tp_getattro; */
+ NULL, /* setattrofunc tp_setattro; */
/* Functions to access object as input/output buffer */
NULL, /* PyBufferProcs *tp_as_buffer; */
@@ -5164,7 +5180,7 @@ PyTypeObject pyrna_func_Type= {
/*** Flags to define presence of optional/expanded features ***/
Py_TPFLAGS_DEFAULT, /* long tp_flags; */
- NULL, /* char *tp_doc; Documentation string */
+ NULL, /* char *tp_doc; Documentation string */
/*** Assigned meaning in release 2.0 ***/
/* call function for all accessible objects */
NULL, /* traverseproc tp_traverse; */
@@ -5174,7 +5190,7 @@ PyTypeObject pyrna_func_Type= {
/*** Assigned meaning in release 2.1 ***/
/*** rich comparisons ***/
- NULL, /* richcmpfunc tp_richcompare; */
+ NULL, /* richcmpfunc tp_richcompare; */
/*** weak reference enabler ***/
#ifdef USE_WEAKREFS
@@ -5185,13 +5201,13 @@ PyTypeObject pyrna_func_Type= {
/*** Added in release 2.2 ***/
/* Iterators */
- NULL, /* getiterfunc tp_iter; */
+ NULL, /* getiterfunc tp_iter; */
NULL, /* iternextfunc tp_iternext; */
/*** Attribute descriptor and subclassing stuff ***/
- NULL, /* struct PyMethodDef *tp_methods; */
+ NULL, /* struct PyMethodDef *tp_methods; */
NULL, /* struct PyMemberDef *tp_members; */
- NULL, /* struct PyGetSetDef *tp_getset; */
+ NULL, /* struct PyGetSetDef *tp_getset; */
NULL, /* struct _typeobject *tp_base; */
NULL, /* PyObject *tp_dict; */
NULL, /* descrgetfunc tp_descr_get; */
@@ -5199,7 +5215,7 @@ PyTypeObject pyrna_func_Type= {
0, /* long tp_dictoffset; */
NULL, /* initproc tp_init; */
NULL, /* allocfunc tp_alloc; */
- NULL, /* newfunc tp_new; */
+ NULL, /* newfunc tp_new; */
/* Low-level free-memory routine */
NULL, /* freefunc tp_free; */
/* For PyObject_IS_GC */
@@ -5227,32 +5243,32 @@ static PyObject *pyrna_prop_collection_iter_next(BPy_PropertyCollectionIterRNA *
PyTypeObject pyrna_prop_collection_iter_Type= {
PyVarObject_HEAD_INIT(NULL, 0)
- "bpy_prop_collection_iter", /* tp_name */
- sizeof(BPy_PropertyCollectionIterRNA), /* tp_basicsize */
- 0, /* tp_itemsize */
+ "bpy_prop_collection_iter", /* tp_name */
+ sizeof(BPy_PropertyCollectionIterRNA), /* tp_basicsize */
+ 0, /* tp_itemsize */
/* methods */
(destructor)pyrna_prop_collection_iter_dealloc, /* tp_dealloc */
NULL, /* printfunc tp_print; */
- NULL, /* getattrfunc tp_getattr; */
+ NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
- NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
+ NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
NULL,/* subclassed */ /* tp_repr */
/* Method suites for standard classes */
NULL, /* PyNumberMethods *tp_as_number; */
- NULL, /* PySequenceMethods *tp_as_sequence; */
- NULL, /* PyMappingMethods *tp_as_mapping; */
+ NULL, /* PySequenceMethods *tp_as_sequence; */
+ NULL, /* PyMappingMethods *tp_as_mapping; */
/* More standard operations (here for binary compatibility) */
- NULL, /* hashfunc tp_hash; */
+ NULL, /* hashfunc tp_hash; */
NULL, /* ternaryfunc tp_call; */
NULL, /* reprfunc tp_str; */
/* will only use these if this is a subtype of a py class */
- PyObject_GenericGetAttr, /* getattrofunc tp_getattro; */
- NULL, /* setattrofunc tp_setattro; */
+ PyObject_GenericGetAttr, /* getattrofunc tp_getattro; */
+ NULL, /* setattrofunc tp_setattro; */
/* Functions to access object as input/output buffer */
NULL, /* PyBufferProcs *tp_as_buffer; */
@@ -5260,7 +5276,7 @@ PyTypeObject pyrna_prop_collection_iter_Type= {
/*** Flags to define presence of optional/expanded features ***/
Py_TPFLAGS_DEFAULT, /* long tp_flags; */
- NULL, /* char *tp_doc; Documentation string */
+ NULL, /* char *tp_doc; Documentation string */
/*** Assigned meaning in release 2.0 ***/
/* call function for all accessible objects */
NULL, /* traverseproc tp_traverse; */
@@ -5274,19 +5290,19 @@ PyTypeObject pyrna_prop_collection_iter_Type= {
/*** weak reference enabler ***/
#ifdef USE_WEAKREFS
- offsetof(BPy_PropertyCollectionIterRNA, in_weakreflist), /* long tp_weaklistoffset; */
+ offsetof(BPy_PropertyCollectionIterRNA, in_weakreflist), /* long tp_weaklistoffset; */
#else
0,
#endif
/*** Added in release 2.2 ***/
/* Iterators */
- PyObject_SelfIter, /* getiterfunc tp_iter; */
- (iternextfunc) pyrna_prop_collection_iter_next, /* iternextfunc tp_iternext; */
+ PyObject_SelfIter, /* getiterfunc tp_iter; */
+ (iternextfunc) pyrna_prop_collection_iter_next, /* iternextfunc tp_iternext; */
/*** Attribute descriptor and subclassing stuff ***/
- NULL, /* struct PyMethodDef *tp_methods; */
+ NULL, /* struct PyMethodDef *tp_methods; */
NULL, /* struct PyMemberDef *tp_members; */
- NULL, /* struct PyGetSetDef *tp_getset; */
+ NULL, /* struct PyGetSetDef *tp_getset; */
NULL, /* struct _typeobject *tp_base; */
NULL, /* PyObject *tp_dict; */
NULL, /* descrgetfunc tp_descr_get; */
@@ -5294,12 +5310,12 @@ PyTypeObject pyrna_prop_collection_iter_Type= {
0, /* long tp_dictoffset; */
NULL, /* initproc tp_init; */
NULL, /* allocfunc tp_alloc; */
- NULL, /* newfunc tp_new; */
+ 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; */
+ NULL, /* PyObject *tp_bases; */
/* method resolution order */
NULL, /* PyObject *tp_mro; */
NULL, /* PyObject *tp_cache; */
@@ -5439,7 +5455,7 @@ static PyObject* pyrna_srna_ExternalType(StructRNA *srna)
if(bpy_types==NULL) {
PyErr_Print();
PyErr_Clear();
- fprintf(stderr, "pyrna_srna_ExternalType: failed to find 'bpy_types' module\n");
+ fprintf(stderr, "%s: failed to find 'bpy_types' module\n", __func__);
return NULL;
}
bpy_types_dict= PyModule_GetDict(bpy_types); // borrow
@@ -5453,18 +5469,18 @@ static PyObject* pyrna_srna_ExternalType(StructRNA *srna)
PyObject *base_compare= pyrna_srna_PyBase(srna);
//PyObject *slots= PyObject_GetAttrString(newclass, "__slots__"); // cant do this because it gets superclasses values!
//PyObject *bases= PyObject_GetAttrString(newclass, "__bases__"); // can do this but faster not to.
- PyObject *bases= ((PyTypeObject *)newclass)->tp_bases;
- PyObject *slots= PyDict_GetItem(((PyTypeObject *)newclass)->tp_dict, bpy_intern_str___slots__);
+ PyObject *tp_bases= ((PyTypeObject *)newclass)->tp_bases;
+ PyObject *tp_slots= PyDict_GetItem(((PyTypeObject *)newclass)->tp_dict, bpy_intern_str___slots__);
- if(slots==NULL) {
- fprintf(stderr, "pyrna_srna_ExternalType: expected class '%s' to have __slots__ defined\n\nSee bpy_types.py\n", idname);
+ if(tp_slots==NULL) {
+ fprintf(stderr, "%s: expected class '%s' to have __slots__ defined\n\nSee bpy_types.py\n", __func__, idname);
newclass= NULL;
}
- else if(PyTuple_GET_SIZE(bases)) {
- PyObject *base= PyTuple_GET_ITEM(bases, 0);
+ else if(PyTuple_GET_SIZE(tp_bases)) {
+ PyObject *base= PyTuple_GET_ITEM(tp_bases, 0);
if(base_compare != base) {
- fprintf(stderr, "pyrna_srna_ExternalType: incorrect subclassing of SRNA '%s'\nSee bpy_types.py\n", idname);
+ fprintf(stderr, "%s: incorrect subclassing of SRNA '%s'\nSee bpy_types.py\n", __func__, idname);
PyC_ObSpit("Expected! ", base_compare);
newclass= NULL;
}
@@ -5534,7 +5550,7 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna)
}
else {
/* this should not happen */
- printf("Error registering '%s'\n", idname);
+ printf("%s: error registering '%s'\n", __func__, idname);
PyErr_Print();
PyErr_Clear();
}
@@ -5577,7 +5593,7 @@ PyObject *pyrna_struct_CreatePyObject(PointerRNA *ptr)
Py_DECREF(tp); /* srna owns, cant hold a ref */
}
else {
- fprintf(stderr, "Could not make type\n");
+ fprintf(stderr, "%s: could not make type\n", __func__);
pyrna= (BPy_StructRNA *) PyObject_GC_New(BPy_StructRNA, &pyrna_struct_Type);
#ifdef USE_WEAKREFS
pyrna->in_weakreflist= NULL;
@@ -6227,10 +6243,10 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
#endif
py_class= RNA_struct_py_type_get(ptr->type);
-
/* rare case. can happen when registering subclasses */
if(py_class==NULL) {
- fprintf(stderr, "bpy_class_call(): unable to get python class for rna struct '%.200s'\n", RNA_struct_identifier(ptr->type));
+ fprintf(stderr, "%s: unable to get python class for rna struct '%.200s'\n",
+ __func__, RNA_struct_identifier(ptr->type));
return -1;
}
@@ -6423,14 +6439,11 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
* no line number since the func has finished calling on error,
* re-raise the exception with more info since it would be slow to
* create prefix on every call (when there are no errors) */
- if(err == -1 && PyErr_Occurred()) {
- PyObject *error_type, *error_value, *error_traceback;
- PyErr_Fetch(&error_type, &error_value, &error_traceback);
-
- PyErr_Format(error_type,
- "class %.200s, function %.200s: incompatible return value%S",
- RNA_struct_identifier(ptr->type), RNA_function_identifier(func),
- error_value);
+ if(err == -1) {
+ PyC_Err_Format_Prefix(PyExc_RuntimeError,
+ "class %.200s, function %.200s: incompatible return value ",
+ RNA_struct_identifier(ptr->type), RNA_function_identifier(func)
+ );
}
}
else if (ret_len > 1) {
diff --git a/source/blender/python/intern/gpu.c b/source/blender/python/intern/gpu.c
new file mode 100644
index 00000000000..334bb1f725a
--- /dev/null
+++ b/source/blender/python/intern/gpu.c
@@ -0,0 +1,289 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2006 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Benoit Bolsee.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/intern/gpu.c
+ * \ingroup pythonintern
+ */
+
+/* python redefines */
+#ifdef _POSIX_C_SOURCE
+#undef _POSIX_C_SOURCE
+#endif
+
+#include <Python.h>
+
+#include "GPU_material.h"
+
+#include "DNA_scene_types.h"
+#include "DNA_image_types.h"
+#include "DNA_material_types.h"
+#include "DNA_lamp_types.h"
+#include "DNA_object_types.h"
+#include "DNA_ID.h"
+#include "DNA_customdata_types.h"
+
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
+
+#include "RNA_access.h"
+
+#include "bpy_rna.h"
+
+#define PY_MODULE_ADD_CONSTANT(module, name) PyModule_AddIntConstant(module, #name, name)
+
+PyDoc_STRVAR(M_gpu_doc,
+ "This module provides access to the GLSL shader.");
+
+static struct PyModuleDef gpumodule = {
+ PyModuleDef_HEAD_INIT,
+ "gpu", /* name of module */
+ M_gpu_doc, /* module documentation */
+ -1, /* size of per-interpreter state of the module,
+ or -1 if the module keeps state in global variables. */
+ NULL, NULL, NULL, NULL, NULL
+};
+
+PyMODINIT_FUNC
+PyInit_gpu(void)
+{
+ PyObject* m;
+
+ m = PyModule_Create(&gpumodule);
+ if(m == NULL)
+ return NULL;
+
+ // device constants
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_VIEWMAT);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_MAT);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_VIEWIMAT);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_IMAT);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_COLOR);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNVEC);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNCO);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNIMAT);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNPERSMAT);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNENERGY);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNCOL);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_SAMPLER_2DBUFFER);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_SAMPLER_2DIMAGE);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_SAMPLER_2DSHADOW);
+
+ PY_MODULE_ADD_CONSTANT(m, GPU_DATA_1I);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DATA_1F);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DATA_2F);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DATA_3F);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DATA_4F);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DATA_9F);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DATA_16F);
+ PY_MODULE_ADD_CONSTANT(m, GPU_DATA_4UB);
+
+ PY_MODULE_ADD_CONSTANT(m, CD_MTFACE);
+ PY_MODULE_ADD_CONSTANT(m, CD_ORCO);
+ PY_MODULE_ADD_CONSTANT(m, CD_TANGENT);
+ PY_MODULE_ADD_CONSTANT(m, CD_MCOL);
+ return m;
+}
+
+#define PY_DICT_ADD_STRING(d,s,f) \
+ val = PyUnicode_FromString(s->f); \
+ PyDict_SetItemString(d, #f, val); \
+ Py_DECREF(val)
+
+#define PY_DICT_ADD_LONG(d,s,f) \
+ val = PyLong_FromLong(s->f); \
+ PyDict_SetItemString(d, #f, val); \
+ Py_DECREF(val)
+
+#define PY_DICT_ADD_ID(d,s,f) \
+ RNA_id_pointer_create((struct ID*)s->f, &tptr); \
+ val = pyrna_struct_CreatePyObject(&tptr); \
+ PyDict_SetItemString(d, #f, val); \
+ Py_DECREF(val)
+
+#define PY_OBJ_ADD_ID(d,s,f) \
+ val = PyUnicode_FromString(&s->f->id.name[2]); \
+ PyObject_SetAttrString(d, #f, val); \
+ Py_DECREF(val)
+
+#define PY_OBJ_ADD_LONG(d,s,f) \
+ val = PyLong_FromLong(s->f); \
+ PyObject_SetAttrString(d, #f, val); \
+ Py_DECREF(val)
+
+#define PY_OBJ_ADD_STRING(d,s,f) \
+ val = PyUnicode_FromString(s->f); \
+ PyObject_SetAttrString(d, #f, val); \
+ Py_DECREF(val)
+
+static PyObject* GPU_export_shader(PyObject* UNUSED(self), PyObject *args, PyObject *kwds)
+{
+ PyObject* pyscene;
+ PyObject* pymat;
+ PyObject* as_pointer;
+ PyObject* pointer;
+ PyObject* result;
+ PyObject* dict;
+ PyObject* val;
+ PyObject* seq;
+
+ int i;
+ Scene *scene;
+ PointerRNA tptr;
+ Material *material;
+ GPUShaderExport *shader;
+ GPUInputUniform *uniform;
+ GPUInputAttribute *attribute;
+
+ static const char *kwlist[] = {"scene", "material", NULL};
+
+ if(!PyArg_ParseTupleAndKeywords(args, kwds, "OO:export_shader", (char**)(kwlist), &pyscene, &pymat))
+ return NULL;
+
+ if (!strcmp(Py_TYPE(pyscene)->tp_name, "Scene") &&
+ (as_pointer = PyObject_GetAttrString(pyscene, "as_pointer")) != NULL &&
+ PyCallable_Check(as_pointer)) {
+ // must be a scene object
+ pointer = PyObject_CallObject(as_pointer, NULL);
+ if (!pointer) {
+ PyErr_SetString(PyExc_SystemError, "scene.as_pointer() failed");
+ return NULL;
+ }
+ scene = (Scene*)PyLong_AsVoidPtr(pointer);
+ Py_DECREF(pointer);
+ if (!scene) {
+ PyErr_SetString(PyExc_SystemError, "scene.as_pointer() failed");
+ return NULL;
+ }
+ } else {
+ PyErr_SetString(PyExc_TypeError, "gpu.export_shader() first argument should be of Scene type");
+ return NULL;
+ }
+
+ if (!strcmp(Py_TYPE(pymat)->tp_name, "Material") &&
+ (as_pointer = PyObject_GetAttrString(pymat, "as_pointer")) != NULL &&
+ PyCallable_Check(as_pointer)) {
+ // must be a material object
+ pointer = PyObject_CallObject(as_pointer, NULL);
+ if (!pointer) {
+ PyErr_SetString(PyExc_SystemError, "scene.as_pointer() failed");
+ return NULL;
+ }
+ material = (Material*)PyLong_AsVoidPtr(pointer);
+ Py_DECREF(pointer);
+ if (!material) {
+ PyErr_SetString(PyExc_SystemError, "scene.as_pointer() failed");
+ return NULL;
+ }
+ } else {
+ PyErr_SetString(PyExc_TypeError, "gpu.export_shader() second argument should be of Material type");
+ return NULL;
+ }
+ // we can call our internal function at last:
+ shader = GPU_shader_export(scene, material);
+ if (!shader) {
+ PyErr_SetString(PyExc_RuntimeError, "cannot export shader");
+ return NULL;
+ }
+ // build a dictionary
+ result = PyDict_New();
+ if (shader->fragment) {
+ PY_DICT_ADD_STRING(result,shader,fragment);
+ }
+ if (shader->vertex) {
+ PY_DICT_ADD_STRING(result,shader,vertex);
+ }
+ seq = PyList_New(BLI_countlist(&shader->uniforms));
+ for (i=0, uniform=shader->uniforms.first; uniform; uniform=uniform->next, i++) {
+ dict = PyDict_New();
+ PY_DICT_ADD_STRING(dict,uniform,varname);
+ PY_DICT_ADD_LONG(dict,uniform,datatype);
+ PY_DICT_ADD_LONG(dict,uniform,type);
+ if (uniform->lamp) {
+ PY_DICT_ADD_ID(dict,uniform,lamp);
+ }
+ if (uniform->image) {
+ PY_DICT_ADD_ID(dict,uniform,image);
+ }
+ if (uniform->type == GPU_DYNAMIC_SAMPLER_2DBUFFER ||
+ uniform->type == GPU_DYNAMIC_SAMPLER_2DIMAGE ||
+ uniform->type == GPU_DYNAMIC_SAMPLER_2DSHADOW) {
+ PY_DICT_ADD_LONG(dict,uniform,texnumber);
+ }
+ if (uniform->texpixels) {
+ val = PyByteArray_FromStringAndSize((const char *)uniform->texpixels, uniform->texsize);
+ PyDict_SetItemString(dict, "texpixels", val);
+ Py_DECREF(val);
+ PY_DICT_ADD_LONG(dict,uniform,texsize);
+ }
+ PyList_SET_ITEM(seq, i, dict);
+ }
+ PyDict_SetItemString(result, "uniforms", seq);
+ Py_DECREF(seq);
+
+ seq = PyList_New(BLI_countlist(&shader->attributes));
+ for (i=0, attribute=shader->attributes.first; attribute; attribute=attribute->next, i++) {
+ dict = PyDict_New();
+ PY_DICT_ADD_STRING(dict,attribute,varname);
+ PY_DICT_ADD_LONG(dict,attribute,datatype);
+ PY_DICT_ADD_LONG(dict,attribute,type);
+ PY_DICT_ADD_LONG(dict,attribute,number);
+ if (attribute->name) {
+ if (attribute->name[0] != 0) {
+ PY_DICT_ADD_STRING(dict,attribute,name);
+ } else {
+ val = PyLong_FromLong(0);
+ PyDict_SetItemString(dict, "name", val);
+ Py_DECREF(val);
+ }
+ }
+ PyList_SET_ITEM(seq, i, dict);
+ }
+ PyDict_SetItemString(result, "attributes", seq);
+ Py_DECREF(seq);
+
+ GPU_free_shader_export(shader);
+
+ return result;
+}
+
+static PyMethodDef meth_export_shader[] = {{ "export_shader", (PyCFunction)GPU_export_shader, METH_VARARGS | METH_KEYWORDS,
+ "export_shader(scene,material)\n\n"
+ "Returns the GLSL shader that produces the visual effect of material in scene.\n\n"
+ ":return: Dictionary defining the shader, uniforms and attributes.\n"
+ ":rtype: Dict"}};
+
+PyObject* GPU_initPython(void)
+{
+ PyObject* module = PyInit_gpu();
+ PyModule_AddObject(module, "export_shader", (PyObject *)PyCFunction_New(meth_export_shader, NULL));
+ PyDict_SetItemString(PyImport_GetModuleDict(), "gpu", module);
+
+ return module;
+}
+
diff --git a/source/blender/python/intern/gpu.h b/source/blender/python/intern/gpu.h
new file mode 100644
index 00000000000..d604c7c6201
--- /dev/null
+++ b/source/blender/python/intern/gpu.h
@@ -0,0 +1,41 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This shader is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This shader is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this shader; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2005 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Benoit Bolsee.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/intern/gpu.h
+ * \ingroup pythonintern
+ */
+
+/**
+ * Initalizes the gpu Python module.
+ */
+PyObject* GPU_initPython(void);
+
diff --git a/source/blender/python/mathutils/mathutils_geometry.c b/source/blender/python/mathutils/mathutils_geometry.c
index acfb8a91416..c39e1a3025e 100755..100644
--- a/source/blender/python/mathutils/mathutils_geometry.c
+++ b/source/blender/python/mathutils/mathutils_geometry.c
@@ -983,7 +983,7 @@ static PyObject *M_Geometry_tesselate_polygon(PyObject *UNUSED(self), PyObject *
static int boxPack_FromPyObject(PyObject *value, boxPack **boxarray)
{
- int len, i;
+ Py_ssize_t len, i;
PyObject *list_item, *item_1, *item_2;
boxPack *box;
@@ -995,14 +995,14 @@ static int boxPack_FromPyObject(PyObject *value, boxPack **boxarray)
return -1;
}
- len= PyList_Size(value);
+ len= PyList_GET_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) {
+ if(!PyList_Check(list_item) || PyList_GET_SIZE(list_item) < 4) {
MEM_freeN(*boxarray);
PyErr_SetString(PyExc_TypeError,
"can only pack a list of [x, y, w, h]");
@@ -1034,11 +1034,11 @@ static int boxPack_FromPyObject(PyObject *value, boxPack **boxarray)
static void boxPack_ToPyObject(PyObject *value, boxPack **boxarray)
{
- int len, i;
+ Py_ssize_t len, i;
PyObject *list_item;
boxPack *box;
- len= PyList_Size(value);
+ len= PyList_GET_SIZE(value);
for(i= 0; i < len; i++) {
box= (*boxarray)+i;
@@ -1062,7 +1062,7 @@ PyDoc_STRVAR(M_Geometry_box_pack_2d_doc,
static PyObject *M_Geometry_box_pack_2d(PyObject *UNUSED(self), PyObject *boxlist)
{
float tot_width= 0.0f, tot_height= 0.0f;
- int len;
+ Py_ssize_t len;
PyObject *ret;
diff --git a/source/blender/render/extern/include/RE_render_ext.h b/source/blender/render/extern/include/RE_render_ext.h
index 849640a5c16..e98f481b162 100644
--- a/source/blender/render/extern/include/RE_render_ext.h
+++ b/source/blender/render/extern/include/RE_render_ext.h
@@ -55,10 +55,10 @@ struct ImBuf;
//void RE_zbufferall_radio(struct RadView *vw, struct RNode **rg_elem, int rg_totelem, struct Render *re);
/* particle.c, effect.c, editmesh_modes.c and brush.c, returns 1 if rgb, 0 otherwise */
-int externtex(struct MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *tb, float *ta, const int thread);
+int externtex(struct MTex *mtex, const float vec[3], float *tin, float *tr, float *tg, float *tb, float *ta, const int thread);
/* particle.c */
-void texture_rgb_blend(float *in, float *tex, float *out, float fact, float facg, int blendtype);
+void texture_rgb_blend(float in[3], const float tex[3], const float out[3], float fact, float facg, int blendtype);
float texture_value_blend(float tex, float out, float fact, float facg, int blendtype);
/* node_composite.c */
diff --git a/source/blender/render/intern/include/pixelshading.h b/source/blender/render/intern/include/pixelshading.h
index 0298f90c0d0..feabfea9319 100644
--- a/source/blender/render/intern/include/pixelshading.h
+++ b/source/blender/render/intern/include/pixelshading.h
@@ -58,10 +58,10 @@ int shadeHaloFloat(HaloRen *har,
/**
* Render the sky at pixel (x, y).
*/
-void shadeSkyPixel(float *collector, float fx, float fy, short thread);
-void shadeSkyView(float *colf, float *rco, float *view, float *dxyview, short thread);
+void shadeSkyPixel(float collector[4], float fx, float fy, short thread);
+void shadeSkyView(float col_r[3], const float rco[3], const float view[3], const float dxyview[2], short thread);
void shadeAtmPixel(struct SunSky *sunsky, float *collector, float fx, float fy, float distance);
-void shadeSunView(float *colf, float *view);
+void shadeSunView(float col_r[3], const float view[3]);
/* ------------------------------------------------------------------------- */
#endif
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index 13ca40bfd20..0b339d285ce 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -338,7 +338,7 @@ typedef struct ObjectInstanceRen {
struct VolumePrecache *volume_precache;
- float *vectors;
+ float *vectors; /* (RE_WINSPEED_ELEMS * VertRen.index) */
int totvector;
/* used on makeraytree */
@@ -354,8 +354,8 @@ typedef struct VertRen
float co[3];
float n[3];
float *orco;
- short clip;
- unsigned short flag; /* in use for clipping zbuffer parts, temp setting stuff in convertblender.c */
+ unsigned int flag; /* in use for clipping zbuffer parts, temp setting stuff in convertblender.c
+ * only an 'int' because of alignment, could be a char too */
float accum; /* accum for radio weighting, and for strand texco static particles */
int index; /* index allows extending vertren with any property */
} VertRen;
diff --git a/source/blender/render/intern/include/rendercore.h b/source/blender/render/intern/include/rendercore.h
index 67c3cbcebe2..f9486b5d5c0 100644
--- a/source/blender/render/intern/include/rendercore.h
+++ b/source/blender/render/intern/include/rendercore.h
@@ -81,8 +81,8 @@ float mistfactor(float zcor, float *co); /* dist and height, return alpha */
void renderspothalo(struct ShadeInput *shi, float *col, float alpha);
void add_halo_flare(Render *re);
-void calc_renderco_zbuf(float *co, float *view, int z);
-void calc_renderco_ortho(float *co, float x, float y, int z);
+void calc_renderco_zbuf(float co[3], float *view, int z);
+void calc_renderco_ortho(float co[3], float x, float y, int z);
int count_mask(unsigned short mask);
diff --git a/source/blender/render/intern/include/renderdatabase.h b/source/blender/render/intern/include/renderdatabase.h
index e1fa208d0b6..06185d0ae74 100644
--- a/source/blender/render/intern/include/renderdatabase.h
+++ b/source/blender/render/intern/include/renderdatabase.h
@@ -91,7 +91,7 @@ void free_renderdata_vertnodes(struct VertTableNode *vertnodes);
void free_renderdata_vlaknodes(struct VlakTableNode *vlaknodes);
void set_normalflags(struct Render *re, struct ObjectRen *obr);
-void project_renderdata(struct Render *re, void (*projectfunc)(float *, float mat[][4], float *), int do_pano, float xoffs, int do_buckets);
+void project_renderdata(struct Render *re, void (*projectfunc)(const float *, float mat[][4], float *), int do_pano, float xoffs, int do_buckets);
int clip_render_object(float boundbox[][3], float *bounds, float mat[][4]);
/* functions are not exported... so wrong names */
diff --git a/source/blender/render/intern/include/shadbuf.h b/source/blender/render/intern/include/shadbuf.h
index 2dca9963e4f..5bed39db3e9 100644
--- a/source/blender/render/intern/include/shadbuf.h
+++ b/source/blender/render/intern/include/shadbuf.h
@@ -59,13 +59,13 @@ void threaded_makeshadowbufs(struct Render *re);
* @param inp The inproduct between viewvector and ?
*
*/
-float testshadowbuf(struct Render *re, struct ShadBuf *shb, float *rco, float *dxco, float *dyco, float inp, float mat_bias);
+float testshadowbuf(struct Render *re, struct ShadBuf *shb, const float rco[3], const float dxco[3], const float dyco[3], float inp, float mat_bias);
/**
* Determines the shadow factor for lamp <lar>, between <p1>
* and <p2>. (Which CS?)
*/
-float shadow_halo(LampRen *lar, float *p1, float *p2);
+float shadow_halo(LampRen *lar, const float p1[3], const float p2[3]);
/**
* Irregular shadowbuffer
diff --git a/source/blender/render/intern/include/shading.h b/source/blender/render/intern/include/shading.h
index 07d24ea6d66..91507ef3f98 100644
--- a/source/blender/render/intern/include/shading.h
+++ b/source/blender/render/intern/include/shading.h
@@ -63,7 +63,7 @@ void shade_volume_loop(struct ShadeInput *shi, struct ShadeResult *shr);
void shade_input_set_triangle_i(struct ShadeInput *shi, struct ObjectInstanceRen *obi, struct VlakRen *vlr, short i1, short i2, short i3);
void shade_input_set_triangle(struct ShadeInput *shi, volatile int obi, volatile int facenr, int normal_flip);
void shade_input_copy_triangle(struct ShadeInput *shi, struct ShadeInput *from);
-void shade_input_calc_viewco(struct ShadeInput *shi, float x, float y, float z, float *view, float *dxyview, float *co, float *dxco, float *dyco);
+void shade_input_calc_viewco(struct ShadeInput *shi, float x, float y, float z, float view[3], float *dxyview, float *co, float *dxco, float *dyco);
void shade_input_set_viewco(struct ShadeInput *shi, float x, float y, float sx, float sy, float z);
void shade_input_set_uv(struct ShadeInput *shi);
void shade_input_set_normals(struct ShadeInput *shi);
@@ -96,7 +96,7 @@ void ambient_occlusion(struct ShadeInput *shi);
void environment_lighting_apply(struct ShadeInput *shi, struct ShadeResult *shr);
ListBase *get_lights(struct ShadeInput *shi);
-float lamp_get_visibility(struct LampRen *lar, float *co, float *lv, float *dist);
+float lamp_get_visibility(struct LampRen *lar, const float co[3], float *lv, float *dist);
void lamp_get_shadow(struct LampRen *lar, ShadeInput *shi, float inp, float *shadfac, int do_real);
float fresnel_fac(float *view, float *vn, float fresnel, float fac);
diff --git a/source/blender/render/intern/include/texture.h b/source/blender/render/intern/include/texture.h
index a63c4f7f253..73f9d7a1627 100644
--- a/source/blender/render/intern/include/texture.h
+++ b/source/blender/render/intern/include/texture.h
@@ -64,11 +64,11 @@ struct ImBuf;
/* texture.h */
-void do_halo_tex(struct HaloRen *har, float xn, float yn, float *colf);
-void do_sky_tex(float *rco, float *lo, float *dxyview, float *hor, float *zen, float *blend, int skyflag, short thread);
+void do_halo_tex(struct HaloRen *har, float xn, float yn, float col_r[4]);
+void do_sky_tex(const float rco[3], float lo[3], const float dxyview[2], float hor[3], float zen[3], float *blend, int skyflag, short thread);
void do_material_tex(struct ShadeInput *shi);
-void do_lamp_tex(LampRen *la, float *lavec, struct ShadeInput *shi, float *colf, int effect);
-void do_volume_tex(struct ShadeInput *shi, float *xyz, int mapto_flag, float *col, float *val);
+void do_lamp_tex(LampRen *la, const float lavec[3], struct ShadeInput *shi, float col_r[3], int effect);
+void do_volume_tex(struct ShadeInput *shi, const float xyz[3], int mapto_flag, float col[3], float *val);
void init_render_textures(Render *re);
void end_render_textures(Render *re);
@@ -77,8 +77,8 @@ void render_realtime_texture(struct ShadeInput *shi, struct Image *ima);
/* imagetexture.h */
-int imagewraposa(struct Tex *tex, struct Image *ima, struct ImBuf *ibuf, float *texvec, float *dxt, float *dyt, struct TexResult *texres);
-int imagewrap(struct Tex *tex, struct Image *ima, struct ImBuf *ibuf, float *texvec, struct TexResult *texres);
+int imagewraposa(struct Tex *tex, struct Image *ima, struct ImBuf *ibuf, const float texvec[3], const float dxt[3], const float dyt[3], struct TexResult *texres);
+int imagewrap(struct Tex *tex, struct Image *ima, struct ImBuf *ibuf, const float texvec[3], struct TexResult *texres);
void image_sample(struct Image *ima, float fx, float fy, float dx, float dy, float *result);
#endif /* TEXTURE_EXT_H */
diff --git a/source/blender/render/intern/include/volumetric.h b/source/blender/render/intern/include/volumetric.h
index 6d8d4cbe0f2..87d74de9134 100644
--- a/source/blender/render/intern/include/volumetric.h
+++ b/source/blender/render/intern/include/volumetric.h
@@ -35,8 +35,8 @@ struct Isect;
struct ShadeInput;
struct ShadeResult;
-float vol_get_density(struct ShadeInput *shi, float *co);
-void vol_get_scattering(ShadeInput *shi, float *scatter_col, float *co_);
+float vol_get_density(struct ShadeInput *shi, const float co[3]);
+void vol_get_scattering(ShadeInput *shi, float scatter_col[3], const float co[3], const float view[3]);
void shade_volume_outside(ShadeInput *shi, ShadeResult *shr);
void shade_volume_inside(ShadeInput *shi, ShadeResult *shr);
diff --git a/source/blender/render/intern/include/zbuf.h b/source/blender/render/intern/include/zbuf.h
index 4c87520d4d1..0d129081d62 100644
--- a/source/blender/render/intern/include/zbuf.h
+++ b/source/blender/render/intern/include/zbuf.h
@@ -51,9 +51,9 @@ void fillrect(int *rect, int x, int y, int val);
* Converts a world coordinate into a homogenous coordinate in view
* coordinates.
*/
-void projectvert(float *v1, float winmat[][4], float *adr);
-void projectverto(float *v1, float winmat[][4], float *adr);
-int testclip(float *v);
+void projectvert(const float v1[3], float winmat[][4], float adr[4]);
+void projectverto(const float v1[3], float winmat[][4], float adr[4]);
+int testclip(const float v[3]);
void zbuffer_shadow(struct Render *re, float winmat[][4], struct LampRen *lar, int *rectz, int size, float jitx, float jity);
void zbuffer_abuf_shadow(struct Render *re, struct LampRen *lar, float winmat[][4], struct APixstr *APixbuf, struct APixstrand *apixbuf, struct ListBase *apsmbase, int size, int samples, float (*jit)[2]);
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 2f79560efd6..c323760296b 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -142,7 +142,7 @@ static HaloRen *initstar(Render *re, ObjectRen *obr, float *vec, float hasize)
har= RE_findOrAddHalo(obr, obr->tothalo++);
/* projectvert is done in function zbufvlaggen again, because of parts */
- VECCOPY(har->co, vec);
+ copy_v3_v3(har->co, vec);
har->hasize= hasize;
har->zd= 0.0;
@@ -547,7 +547,7 @@ static void GetPosition(const SMikkTSpaceContext * pContext, float fPos[], const
SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData;
VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num);
const float *co= (&vlr->v1)[vert_index]->co;
- VECCOPY(fPos, co);
+ copy_v3_v3(fPos, co);
}
static void GetTextureCoordinate(const SMikkTSpaceContext * pContext, float fUV[], const int face_num, const int vert_index)
@@ -576,7 +576,7 @@ static void GetNormal(const SMikkTSpaceContext * pContext, float fNorm[], const
SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData;
VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num);
const float *n= (&vlr->v1)[vert_index]->n;
- VECCOPY(fNorm, n);
+ copy_v3_v3(fNorm, n);
}
static void SetTSpace(const SMikkTSpaceContext * pContext, const float fvTangent[], const float fSign, const int face_num, const int iVert)
{
@@ -585,7 +585,7 @@ static void SetTSpace(const SMikkTSpaceContext * pContext, const float fvTangent
VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num);
float * ftang= RE_vlakren_get_nmap_tangent(pMesh->obr, vlr, 1);
if(ftang!=NULL) {
- VECCOPY(&ftang[iVert*4+0], fvTangent);
+ copy_v3_v3(&ftang[iVert*4+0], fvTangent);
ftang[iVert*4+3]=fSign;
}
}
@@ -632,10 +632,10 @@ static void calc_vertexnormals(Render *UNUSED(re), ObjectRen *obr, int do_tangen
VlakRen *vlr= RE_findOrAddVlak(obr, a);
if((vlr->flag & ME_SMOOTH)==0) {
- if(is_zero_v3(vlr->v1->n)) VECCOPY(vlr->v1->n, vlr->n);
- if(is_zero_v3(vlr->v2->n)) VECCOPY(vlr->v2->n, vlr->n);
- if(is_zero_v3(vlr->v3->n)) VECCOPY(vlr->v3->n, vlr->n);
- if(vlr->v4 && is_zero_v3(vlr->v4->n)) VECCOPY(vlr->v4->n, vlr->n);
+ if(is_zero_v3(vlr->v1->n)) copy_v3_v3(vlr->v1->n, vlr->n);
+ if(is_zero_v3(vlr->v2->n)) copy_v3_v3(vlr->v2->n, vlr->n);
+ if(is_zero_v3(vlr->v3->n)) copy_v3_v3(vlr->v3->n, vlr->n);
+ if(vlr->v4 && is_zero_v3(vlr->v4->n)) copy_v3_v3(vlr->v4->n, vlr->n);
}
if(do_nmap_tangent) {
@@ -647,17 +647,17 @@ static void calc_vertexnormals(Render *UNUSED(re), ObjectRen *obr, int do_tangen
float *vtang, *ftang= RE_vlakren_get_nmap_tangent(obr, vlr, 1);
vtang= find_vertex_tangent(vtangents[v1->index], tface->uv[0]);
- VECCOPY(ftang, vtang);
+ copy_v3_v3(ftang, vtang);
normalize_v3(ftang);
vtang= find_vertex_tangent(vtangents[v2->index], tface->uv[1]);
- VECCOPY(ftang+4, vtang);
+ copy_v3_v3(ftang+4, vtang);
normalize_v3(ftang+4);
vtang= find_vertex_tangent(vtangents[v3->index], tface->uv[2]);
- VECCOPY(ftang+8, vtang);
+ copy_v3_v3(ftang+8, vtang);
normalize_v3(ftang+8);
if(v4) {
vtang= find_vertex_tangent(vtangents[v4->index], tface->uv[3]);
- VECCOPY(ftang+12, vtang);
+ copy_v3_v3(ftang+12, vtang);
normalize_v3(ftang+12);
}
for(k=0; k<4; k++) ftang[4*k+3]=1;
@@ -1023,7 +1023,7 @@ typedef struct ParticleStrandData
}
ParticleStrandData;
/* future thread problem... */
-static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, ParticleStrandData *sd, float *vec, float *vec1)
+static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, ParticleStrandData *sd, const float vec[3], const float vec1[3])
{
static VertRen *v1= NULL, *v2= NULL;
VlakRen *vlr= NULL;
@@ -1090,27 +1090,27 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par
vlr->v3= RE_findOrAddVert(obr, obr->totvert++);
vlr->v4= RE_findOrAddVert(obr, obr->totvert++);
- VECCOPY(vlr->v1->co, vec);
+ copy_v3_v3(vlr->v1->co, vec);
add_v3_v3(vlr->v1->co, cross);
- VECCOPY(vlr->v1->n, nor);
+ copy_v3_v3(vlr->v1->n, nor);
vlr->v1->orco= sd->orco;
vlr->v1->accum= -1.0f; // accum abuse for strand texco
- VECCOPY(vlr->v2->co, vec);
+ copy_v3_v3(vlr->v2->co, vec);
sub_v3_v3v3(vlr->v2->co, vlr->v2->co, cross);
- VECCOPY(vlr->v2->n, nor);
+ copy_v3_v3(vlr->v2->n, nor);
vlr->v2->orco= sd->orco;
vlr->v2->accum= vlr->v1->accum;
- VECCOPY(vlr->v4->co, vec1);
+ copy_v3_v3(vlr->v4->co, vec1);
add_v3_v3(vlr->v4->co, cross);
- VECCOPY(vlr->v4->n, nor);
+ copy_v3_v3(vlr->v4->n, nor);
vlr->v4->orco= sd->orco;
vlr->v4->accum= 1.0f; // accum abuse for strand texco
- VECCOPY(vlr->v3->co, vec1);
+ copy_v3_v3(vlr->v3->co, vec1);
sub_v3_v3v3(vlr->v3->co, vlr->v3->co, cross);
- VECCOPY(vlr->v3->n, nor);
+ copy_v3_v3(vlr->v3->n, nor);
vlr->v3->orco= sd->orco;
vlr->v3->accum= vlr->v4->accum;
@@ -1121,7 +1121,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par
if(sd->surfnor) {
float *snor= RE_vlakren_get_surfnor(obr, vlr, 1);
- VECCOPY(snor, sd->surfnor);
+ copy_v3_v3(snor, sd->surfnor);
}
if(sd->uvco){
@@ -1156,23 +1156,23 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par
/* first two vertices of a strand */
else if(sd->first) {
if(sd->adapt){
- VECCOPY(anor, nor);
- VECCOPY(avec, vec);
+ copy_v3_v3(anor, nor);
+ copy_v3_v3(avec, vec);
second=1;
}
v1= RE_findOrAddVert(obr, obr->totvert++);
v2= RE_findOrAddVert(obr, obr->totvert++);
- VECCOPY(v1->co, vec);
+ copy_v3_v3(v1->co, vec);
add_v3_v3(v1->co, cross);
- VECCOPY(v1->n, nor);
+ copy_v3_v3(v1->n, nor);
v1->orco= sd->orco;
v1->accum= -1.0f; // accum abuse for strand texco
- VECCOPY(v2->co, vec);
+ copy_v3_v3(v2->co, vec);
sub_v3_v3v3(v2->co, v2->co, cross);
- VECCOPY(v2->n, nor);
+ copy_v3_v3(v2->n, nor);
v2->orco= sd->orco;
v2->accum= v1->accum;
}
@@ -1192,8 +1192,8 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par
if(sd->adapt){
second=0;
- VECCOPY(anor,nor);
- VECCOPY(avec,vec);
+ copy_v3_v3(anor,nor);
+ copy_v3_v3(avec,vec);
}
}
@@ -1218,23 +1218,23 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par
v1= vlr->v4; // cycle
v2= vlr->v3; // cycle
- VECCOPY(anor,nor);
- VECCOPY(avec,vec);
+ copy_v3_v3(anor,nor);
+ copy_v3_v3(avec,vec);
}
else{
vlr= RE_findOrAddVlak(obr, obr->totvlak-1);
}
}
- VECCOPY(vlr->v4->co, vec);
+ copy_v3_v3(vlr->v4->co, vec);
add_v3_v3(vlr->v4->co, cross);
- VECCOPY(vlr->v4->n, nor);
+ copy_v3_v3(vlr->v4->n, nor);
vlr->v4->orco= sd->orco;
vlr->v4->accum= -1.0f + 2.0f*sd->time; // accum abuse for strand texco
- VECCOPY(vlr->v3->co, vec);
+ copy_v3_v3(vlr->v3->co, vec);
sub_v3_v3v3(vlr->v3->co, vlr->v3->co, cross);
- VECCOPY(vlr->v3->n, nor);
+ copy_v3_v3(vlr->v3->n, nor);
vlr->v3->orco= sd->orco;
vlr->v3->accum= vlr->v4->accum;
@@ -1245,7 +1245,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par
if(sd->surfnor) {
float *snor= RE_vlakren_get_surfnor(obr, vlr, 1);
- VECCOPY(snor, sd->surfnor);
+ copy_v3_v3(snor, sd->surfnor);
}
if(sd->uvco){
@@ -1279,7 +1279,7 @@ static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, Par
}
}
-static void static_particle_wire(ObjectRen *obr, Material *ma, float *vec, float *vec1, int first, int line)
+static void static_particle_wire(ObjectRen *obr, Material *ma, const float vec[3], const float vec1[3], int first, int line)
{
VlakRen *vlr;
static VertRen *v1;
@@ -1291,13 +1291,13 @@ static void static_particle_wire(ObjectRen *obr, Material *ma, float *vec, float
vlr->v3= vlr->v2;
vlr->v4= NULL;
- VECCOPY(vlr->v1->co, vec);
- VECCOPY(vlr->v2->co, vec1);
+ copy_v3_v3(vlr->v1->co, vec);
+ copy_v3_v3(vlr->v2->co, vec1);
sub_v3_v3v3(vlr->n, vec, vec1);
normalize_v3(vlr->n);
- VECCOPY(vlr->v1->n, vlr->n);
- VECCOPY(vlr->v2->n, vlr->n);
+ copy_v3_v3(vlr->v1->n, vlr->n);
+ copy_v3_v3(vlr->v2->n, vlr->n);
vlr->mat= ma;
vlr->ec= ME_V1V2;
@@ -1305,7 +1305,7 @@ static void static_particle_wire(ObjectRen *obr, Material *ma, float *vec, float
}
else if(first) {
v1= RE_findOrAddVert(obr, obr->totvert++);
- VECCOPY(v1->co, vec);
+ copy_v3_v3(v1->co, vec);
}
else {
vlr= RE_findOrAddVlak(obr, obr->totvlak++);
@@ -1315,11 +1315,11 @@ static void static_particle_wire(ObjectRen *obr, Material *ma, float *vec, float
vlr->v4= NULL;
v1= vlr->v2; // cycle
- VECCOPY(v1->co, vec);
+ copy_v3_v3(v1->co, vec);
sub_v3_v3v3(vlr->n, vec, vec1);
normalize_v3(vlr->n);
- VECCOPY(v1->n, vlr->n);
+ copy_v3_v3(v1->n, vlr->n);
vlr->mat= ma;
vlr->ec= ME_V1V2;
@@ -1376,10 +1376,10 @@ static void particle_billboard(Render *re, ObjectRen *obr, Material *ma, Particl
mul_m4_v3(re->viewmat, vlr->v4->co);
normal_quad_v3( vlr->n,vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co);
- VECCOPY(vlr->v1->n,vlr->n);
- VECCOPY(vlr->v2->n,vlr->n);
- VECCOPY(vlr->v3->n,vlr->n);
- VECCOPY(vlr->v4->n,vlr->n);
+ copy_v3_v3(vlr->v1->n,vlr->n);
+ copy_v3_v3(vlr->v2->n,vlr->n);
+ copy_v3_v3(vlr->v3->n,vlr->n);
+ copy_v3_v3(vlr->v4->n,vlr->n);
vlr->mat= ma;
vlr->ec= ME_V2V3;
@@ -1470,7 +1470,7 @@ static void particle_normal_ren(short ren_as, ParticleSettings *part, Render *re
{
float loc[3], loc0[3], loc1[3], vel[3];
- VECCOPY(loc, state->co);
+ copy_v3_v3(loc, state->co);
if(ren_as != PART_DRAW_BB)
mul_m4_v3(re->viewmat, loc);
@@ -1481,7 +1481,7 @@ static void particle_normal_ren(short ren_as, ParticleSettings *part, Render *re
sd->time = 0.0f;
sd->size = hasize;
- VECCOPY(vel, state->vel);
+ copy_v3_v3(vel, state->vel);
mul_mat3_m4_v3(re->viewmat, vel);
normalize_v3(vel);
@@ -1497,8 +1497,8 @@ static void particle_normal_ren(short ren_as, ParticleSettings *part, Render *re
case PART_DRAW_BB:
- VECCOPY(bb->vec, loc);
- VECCOPY(bb->vel, state->vel);
+ copy_v3_v3(bb->vec, loc);
+ copy_v3_v3(bb->vel, state->vel);
particle_billboard(re, obr, ma, bb);
@@ -1892,7 +1892,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
strand= RE_findOrAddStrand(obr, obr->totstrand++);
strand->buffer= strandbuf;
strand->vert= svert;
- VECCOPY(strand->orco, sd.orco);
+ copy_v3_v3(strand->orco, sd.orco);
if(dosimplify) {
float *ssimplify= RE_strandren_get_simplify(obr, strand, 1);
@@ -1902,7 +1902,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
if(sd.surfnor) {
float *snor= RE_strandren_get_surfnor(obr, strand, 1);
- VECCOPY(snor, sd.surfnor);
+ copy_v3_v3(snor, sd.surfnor);
}
if(dosurfacecache && num >= 0) {
@@ -1945,8 +1945,8 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
float time;
if(k<=max_k){
- VECCOPY(state.co,(cache+k)->co);
- VECCOPY(state.vel,(cache+k)->vel);
+ copy_v3_v3(state.co,(cache+k)->co);
+ copy_v3_v3(state.vel,(cache+k)->vel);
}
else
continue;
@@ -1955,11 +1955,11 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
curlen += len_v3v3((cache+k-1)->co, (cache+k)->co);
time= curlen/strandlen;
- VECCOPY(loc,state.co);
+ copy_v3_v3(loc,state.co);
mul_m4_v3(re->viewmat,loc);
if(strandbuf) {
- VECCOPY(svert->co, loc);
+ copy_v3_v3(svert->co, loc);
svert->strandco= -1.0f + 2.0f*time;
svert++;
strand->totvert++;
@@ -1982,7 +1982,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
if(k)
particle_curve(re, obr, psmd->dm, ma, &sd, loc, loc1, seed, pa_co);
- VECCOPY(loc1,loc);
+ copy_v3_v3(loc1,loc);
}
}
@@ -2147,7 +2147,7 @@ static void make_render_halos(Render *re, ObjectRen *obr, Mesh *UNUSED(me), int
if(ok) {
hasize= ma->hasize;
- VECCOPY(vec, mvert->co);
+ copy_v3_v3(vec, mvert->co);
mul_m4_v3(mat, vec);
if(ma->mode & MA_HALOPUNO) {
@@ -2161,7 +2161,7 @@ static void make_render_halos(Render *re, ObjectRen *obr, Mesh *UNUSED(me), int
nor[2]= imat[2][0]*xn+imat[2][1]*yn+imat[2][2]*zn;
normalize_v3(nor);
- VECCOPY(view, vec);
+ copy_v3_v3(view, vec);
normalize_v3(view);
zn= nor[0]*view[0]+nor[1]*view[1]+nor[2]*view[2];
@@ -2238,9 +2238,9 @@ static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi, Ve
int i;
/* shi->co is current render coord, just make sure at least some vector is here */
- VECCOPY(shi->co, vr->co);
+ copy_v3_v3(shi->co, vr->co);
/* vertex normal is used for textures type 'col' and 'var' */
- VECCOPY(shi->vn, vr->n);
+ copy_v3_v3(shi->vn, vr->n);
if(mat)
mul_m4_v3(mat, shi->co);
@@ -2269,7 +2269,7 @@ static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi, Ve
/* set all rendercoords, 'texco' is an ORed value for all textures needed */
if ((texco & TEXCO_ORCO) && (vr->orco)) {
- VECCOPY(shi->lo, vr->orco);
+ copy_v3_v3(shi->lo, vr->orco);
}
if (texco & TEXCO_STICKY) {
float *sticky= RE_vertren_get_sticky(obr, vr, 0);
@@ -2280,11 +2280,11 @@ static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi, Ve
}
}
if (texco & TEXCO_GLOB) {
- VECCOPY(shi->gl, shi->co);
+ copy_v3_v3(shi->gl, shi->co);
mul_m4_v3(re->viewinv, shi->gl);
}
if (texco & TEXCO_NORM) {
- VECCOPY(shi->orn, shi->vn);
+ copy_v3_v3(shi->orn, shi->vn);
}
if(texco & TEXCO_REFL) {
/* not (yet?) */
@@ -2461,7 +2461,7 @@ static void init_render_mball(Render *re, ObjectRen *obr)
for(a=0; a<dl->nr; a++, data+=3, nors+=3) {
ver= RE_findOrAddVert(obr, obr->totvert++);
- VECCOPY(ver->co, data);
+ copy_v3_v3(ver->co, data);
mul_m4_v3(mat, ver->co);
/* render normals are inverted */
@@ -2540,7 +2540,7 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar,
data= dl->verts;
for (u = 0; u < sizeu; u++) {
v1 = RE_findOrAddVert(obr, obr->totvert++); /* save this for possible V wrapping */
- VECCOPY(v1->co, data); data += 3;
+ copy_v3_v3(v1->co, data); data += 3;
if(orco) {
v1->orco= orco; orco+= 3; orcoret++;
}
@@ -2548,7 +2548,7 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar,
for (v = 1; v < sizev; v++) {
ver= RE_findOrAddVert(obr, obr->totvert++);
- VECCOPY(ver->co, data); data += 3;
+ copy_v3_v3(ver->co, data); data += 3;
if(orco) {
ver->orco= orco; orco+= 3; orcoret++;
}
@@ -2557,7 +2557,7 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar,
/* if V-cyclic, add extra vertices at end of the row */
if (dl->flag & DL_CYCL_U) {
ver= RE_findOrAddVert(obr, obr->totvert++);
- VECCOPY(ver->co, v1->co);
+ copy_v3_v3(ver->co, v1->co);
if(orco) {
ver->orco= orco; orco+=3; orcoret++; //orcobase + 3*(u*sizev + 0);
}
@@ -2573,7 +2573,7 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar,
for (v = 0; v < nsizev; v++) {
v1= RE_findOrAddVert(obr, startvert + v);
ver= RE_findOrAddVert(obr, obr->totvert++);
- VECCOPY(ver->co, v1->co);
+ copy_v3_v3(ver->co, v1->co);
if(orco) {
ver->orco= orco; orco+=3; orcoret++; //ver->orco= orcobase + 3*(0*sizev + v);
}
@@ -2602,7 +2602,7 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar,
normal_quad_v3( n1,vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co);
- VECCOPY(vlr->n, n1);
+ copy_v3_v3(vlr->n, n1);
vlr->mat= matar[ dl->col];
vlr->ec= ME_V1V2+ME_V2V3;
@@ -2670,10 +2670,10 @@ static int dl_surf_to_renderdata(ObjectRen *obr, DispList *dl, Material **matar,
add_v3_v3(n1, vlr2->n);
vlr3= RE_findOrAddVlak(obr, UVTOINDEX(sizeu-1, 0)); /* (m,0) */
add_v3_v3(n1, vlr3->n);
- VECCOPY(vlr->v3->n, n1);
- VECCOPY(vlr1->v1->n, n1);
- VECCOPY(vlr2->v2->n, n1);
- VECCOPY(vlr3->v4->n, n1);
+ copy_v3_v3(vlr->v3->n, n1);
+ copy_v3_v3(vlr1->v1->n, n1);
+ copy_v3_v3(vlr2->v2->n, n1);
+ copy_v3_v3(vlr3->v4->n, n1);
}
for(a = startvert; a < obr->totvert; a++) {
ver= RE_findOrAddVert(obr, a);
@@ -2701,7 +2701,7 @@ static void init_render_dm(DerivedMesh *dm, Render *re, ObjectRen *obr,
for(a=0; a<totvert; a++, mvert++) {
ver= RE_findOrAddVert(obr, obr->totvert++);
- VECCOPY(ver->co, mvert->co);
+ copy_v3_v3(ver->co, mvert->co);
mul_m4_v3(mat, ver->co);
if(orco) {
@@ -2913,7 +2913,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
for(a=0; a<dl->nr; a++, data+=3) {
ver= RE_findOrAddVert(obr, obr->totvert++);
- VECCOPY(ver->co, data);
+ copy_v3_v3(ver->co, data);
mul_m4_v3(mat, ver->co);
@@ -2979,7 +2979,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
while(nr--) {
ver= RE_findOrAddVert(obr, obr->totvert++);
- VECCOPY(ver->co, fp);
+ copy_v3_v3(ver->co, fp);
mul_m4_v3(mat, ver->co);
fp+= 3;
@@ -3340,7 +3340,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
for(a=0; a<totvert; a++, mvert++) {
ver= RE_findOrAddVert(obr, obr->totvert++);
- VECCOPY(ver->co, mvert->co);
+ copy_v3_v3(ver->co, mvert->co);
if(do_autosmooth==0) { /* autosmooth on original unrotated data to prevent differences between frames */
normal_short_to_float_v3(ver->n, mvert->no);
mul_m4_v3(mat, ver->co);
@@ -3782,7 +3782,7 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
lar->sunsky = (struct SunSky*)MEM_callocN(sizeof(struct SunSky), "sunskyren");
lar->sunsky->effect_type = la->sun_effect_type;
- VECCOPY(vec,ob->obmat[2]);
+ copy_v3_v3(vec,ob->obmat[2]);
normalize_v3(vec);
InitSunSky(lar->sunsky, la->atm_turbidity, vec, la->horizon_brightness,
@@ -4001,7 +4001,7 @@ void init_render_world(Render *re)
cp[2]= 255.0f*re->wrld.horb;
cp[3]= 1;
- VECCOPY(re->grvec, re->viewmat[2]);
+ copy_v3_v3(re->grvec, re->viewmat[2]);
normalize_v3(re->grvec);
copy_m3_m4(re->imat, re->viewinv);
@@ -4051,25 +4051,25 @@ static void set_phong_threshold(ObjectRen *obr)
for(i=0; i<obr->totvlak; i++) {
vlr= RE_findOrAddVlak(obr, i);
if(vlr->flag & R_SMOOTH) {
- dot= INPR(vlr->n, vlr->v1->n);
+ dot= dot_v3v3(vlr->n, vlr->v1->n);
dot= ABS(dot);
if(dot>0.9f) {
thresh+= dot; tot++;
}
- dot= INPR(vlr->n, vlr->v2->n);
+ dot= dot_v3v3(vlr->n, vlr->v2->n);
dot= ABS(dot);
if(dot>0.9f) {
thresh+= dot; tot++;
}
- dot= INPR(vlr->n, vlr->v3->n);
+ dot= dot_v3v3(vlr->n, vlr->v3->n);
dot= ABS(dot);
if(dot>0.9f) {
thresh+= dot; tot++;
}
if(vlr->v4) {
- dot= INPR(vlr->n, vlr->v4->n);
+ dot= dot_v3v3(vlr->n, vlr->v4->n);
dot= ABS(dot);
if(dot>0.9f) {
thresh+= dot; tot++;
@@ -4340,16 +4340,16 @@ static void finalize_render_object(Render *re, ObjectRen *obr, int timeoffset)
strand_minmax(strand, smin, smax, width);
}
- VECCOPY(sbound->boundbox[0], smin);
- VECCOPY(sbound->boundbox[1], smax);
+ copy_v3_v3(sbound->boundbox[0], smin);
+ copy_v3_v3(sbound->boundbox[1], smax);
DO_MINMAX(smin, min, max);
DO_MINMAX(smax, min, max);
}
}
- VECCOPY(obr->boundbox[0], min);
- VECCOPY(obr->boundbox[1], max);
+ copy_v3_v3(obr->boundbox[0], min);
+ copy_v3_v3(obr->boundbox[1], max);
}
}
}
@@ -4932,7 +4932,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
/* fill in instance variables for texturing */
set_dupli_tex_mat(re, obi, dob);
if(dob->type != OB_DUPLIGROUP) {
- VECCOPY(obi->dupliorco, dob->orco);
+ copy_v3_v3(obi->dupliorco, dob->orco);
obi->dupliuv[0]= dob->uv[0];
obi->dupliuv[1]= dob->uv[1];
}
@@ -4958,7 +4958,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
set_dupli_tex_mat(re, obi, dob);
if(dob->type != OB_DUPLIGROUP) {
- VECCOPY(obi->dupliorco, dob->orco);
+ copy_v3_v3(obi->dupliorco, dob->orco);
obi->dupliuv[0]= dob->uv[0];
obi->dupliuv[1]= dob->uv[1];
}
@@ -5064,7 +5064,7 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l
/* still bad... doing all */
init_render_textures(re);
- VECCOPY(amb, &re->wrld.ambr);
+ copy_v3_v3(amb, &re->wrld.ambr);
init_render_materials(re->main, re->r.mode, amb);
set_node_shader_lamp_loop(shade_material_loop);
@@ -5216,7 +5216,7 @@ static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int la
}
/* choose to use static, to prevent giving too many args to this call */
-static void speedvector_project(Render *re, float *zco, float *co, float *ho)
+static void speedvector_project(Render *re, float zco[2], const float co[3], const float ho[4])
{
static float pixelphix=0.0f, pixelphiy=0.0f, zmulx=0.0f, zmuly=0.0f;
static int pano= 0;
@@ -5251,7 +5251,7 @@ static void speedvector_project(Render *re, float *zco, float *co, float *ho)
if(pano) {
float vec[3], ang;
/* angle between (0,0,-1) and (co) */
- VECCOPY(vec, co);
+ copy_v3_v3(vec, co);
ang= saacos(-vec[2]/sqrt(vec[0]*vec[0] + vec[2]*vec[2]));
if(vec[0]<0.0f) ang= -ang;
@@ -5267,7 +5267,7 @@ static void speedvector_project(Render *re, float *zco, float *co, float *ho)
}
}
-static void calculate_speedvector(float *vectors, int step, float winsq, float winroot, float *co, float *ho, float *speed)
+static void calculate_speedvector(const float vectors[2], int step, float winsq, float winroot, const float co[3], const float ho[4], float speed[4])
{
float zco[2], len;
@@ -5764,7 +5764,7 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay,
/* still bad... doing all */
init_render_textures(re);
- VECCOPY(amb, &re->wrld.ambr);
+ copy_v3_v3(amb, &re->wrld.ambr);
init_render_materials(re->main, re->r.mode, amb);
set_node_shader_lamp_loop(shade_material_loop);
@@ -5860,7 +5860,7 @@ void RE_make_sticky(Scene *scene, View3D *v3d)
ms= me->msticky;
for(a=0; a<me->totvert; a++, ms++, mvert++) {
- VECCOPY(ho, mvert->co);
+ copy_v3_v3(ho, mvert->co);
mul_m4_v3(mat, ho);
projectverto(ho, re->winmat, ho);
ms->co[0]= ho[0]/ho[3];
diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c
index 6d264951204..b290459a7c9 100644
--- a/source/blender/render/intern/source/imagetexture.c
+++ b/source/blender/render/intern/source/imagetexture.c
@@ -111,7 +111,7 @@ static void ibuf_get_color(float *col, struct ImBuf *ibuf, int x, int y)
}
}
-int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, TexResult *texres)
+int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], TexResult *texres)
{
float fx, fy, val1, val2, val3;
int x, y, retval;
@@ -1019,7 +1019,7 @@ static void image_mipmap_test(Tex *tex, ImBuf *ibuf)
}
-static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *dxt, float *dyt, TexResult *texres)
+static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], float dxt[3], float dyt[3], TexResult *texres)
{
TexResult texr;
float fx, fy, minx, maxx, miny, maxy;
@@ -1409,7 +1409,7 @@ static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec,
}
-int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, float *DYT, TexResult *texres)
+int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, const float texvec[3], const float DXT[3], const float DYT[3], TexResult *texres)
{
TexResult texr;
float fx, fy, minx, maxx, miny, maxy, dx, dy, dxt[3], dyt[3];
@@ -1418,8 +1418,8 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
// TXF: since dxt/dyt might be modified here and since they might be needed after imagewraposa() call,
// make a local copy here so that original vecs remain untouched
- VECCOPY(dxt, DXT);
- VECCOPY(dyt, DYT);
+ copy_v3_v3(dxt, DXT);
+ copy_v3_v3(dyt, DYT);
// anisotropic filtering
if (tex->texfilter != TXF_BOX)
diff --git a/source/blender/render/intern/source/occlusion.c b/source/blender/render/intern/source/occlusion.c
index 54137c62d22..36dd4eb9708 100644
--- a/source/blender/render/intern/source/occlusion.c
+++ b/source/blender/render/intern/source/occlusion.c
@@ -1777,11 +1777,11 @@ void sample_occ(Render *re, ShadeInput *shi)
if(cache->sample && cache->step) {
sample= &cache->sample[(shi->ys-cache->y)*cache->w + (shi->xs-cache->x)];
- VECCOPY(sample->co, shi->co);
- VECCOPY(sample->n, shi->vno);
- VECCOPY(sample->ao, shi->ao);
- VECCOPY(sample->env, shi->env);
- VECCOPY(sample->indirect, shi->indirect);
+ copy_v3_v3(sample->co, shi->co);
+ copy_v3_v3(sample->n, shi->vno);
+ copy_v3_v3(sample->ao, shi->ao);
+ copy_v3_v3(sample->env, shi->env);
+ copy_v3_v3(sample->indirect, shi->indirect);
sample->intensity= MAX3(sample->ao[0], sample->ao[1], sample->ao[2]);
sample->intensity= MAX2(sample->intensity, MAX3(sample->env[0], sample->env[1], sample->env[2]));
sample->intensity= MAX2(sample->intensity, MAX3(sample->indirect[0], sample->indirect[1], sample->indirect[2]));
@@ -1872,11 +1872,11 @@ void cache_occ_samples(Render *re, RenderPart *pa, ShadeSample *ssamp)
exclude.facenr= shi->vlr->index;
sample_occ_tree(re, tree, &exclude, shi->co, shi->vno, shi->thread, onlyshadow, shi->ao, shi->env, shi->indirect);
- VECCOPY(sample->co, shi->co);
- VECCOPY(sample->n, shi->vno);
- VECCOPY(sample->ao, shi->ao);
- VECCOPY(sample->env, shi->env);
- VECCOPY(sample->indirect, shi->indirect);
+ copy_v3_v3(sample->co, shi->co);
+ copy_v3_v3(sample->n, shi->vno);
+ copy_v3_v3(sample->ao, shi->ao);
+ copy_v3_v3(sample->env, shi->env);
+ copy_v3_v3(sample->indirect, shi->indirect);
sample->intensity= MAX3(sample->ao[0], sample->ao[1], sample->ao[2]);
sample->intensity= MAX2(sample->intensity, MAX3(sample->env[0], sample->env[1], sample->env[2]));
sample->intensity= MAX2(sample->intensity, MAX3(sample->indirect[0], sample->indirect[1], sample->indirect[2]));
diff --git a/source/blender/render/intern/source/pixelshading.c b/source/blender/render/intern/source/pixelshading.c
index febfea89f04..dd5deddece9 100644
--- a/source/blender/render/intern/source/pixelshading.c
+++ b/source/blender/render/intern/source/pixelshading.c
@@ -76,7 +76,7 @@ extern struct Render R;
extern float hashvectf[];
-static void render_lighting_halo(HaloRen *har, float *colf)
+static void render_lighting_halo(HaloRen *har, float col_r[3])
{
GroupObject *go;
LampRen *lar;
@@ -246,9 +246,9 @@ static void render_lighting_halo(HaloRen *har, float *colf)
if(ig<0.0f) ig= 0.0f;
if(ib<0.0f) ib= 0.0f;
- colf[0]*= ir;
- colf[1]*= ig;
- colf[2]*= ib;
+ col_r[0]*= ir;
+ col_r[1]*= ig;
+ col_r[2]*= ib;
}
@@ -502,8 +502,8 @@ int shadeHaloFloat(HaloRen *har, float *col, int zz,
/* ------------------------------------------------------------------------- */
-/* Only view vector is important here. Result goes to colf[3] */
-void shadeSkyView(float *colf, float *rco, float *view, float *dxyview, short thread)
+/* Only view vector is important here. Result goes to col_r[3] */
+void shadeSkyView(float col_r[3], const float rco[3], const float view[3], const float dxyview[2], short thread)
{
float lo[3], zen[3], hor[3], blend, blendm;
int skyflag;
@@ -528,13 +528,13 @@ void shadeSkyView(float *colf, float *rco, float *view, float *dxyview, short th
blend= fabs(0.5f + view[1]);
}
- VECCOPY(hor, &R.wrld.horr);
- VECCOPY(zen, &R.wrld.zenr);
+ copy_v3_v3(hor, &R.wrld.horr);
+ copy_v3_v3(zen, &R.wrld.zenr);
/* Careful: SKYTEX and SKYBLEND are NOT mutually exclusive! If */
/* SKYBLEND is active, the texture and color blend are added. */
if(R.wrld.skytype & WO_SKYTEX) {
- VECCOPY(lo, view);
+ copy_v3_v3(lo, view);
if(R.wrld.skytype & WO_SKYREAL) {
mul_m3_v3(R.imat, lo);
@@ -550,19 +550,19 @@ void shadeSkyView(float *colf, float *rco, float *view, float *dxyview, short th
/* No clipping, no conversion! */
if(R.wrld.skytype & WO_SKYBLEND) {
- colf[0] = (blendm*hor[0] + blend*zen[0]);
- colf[1] = (blendm*hor[1] + blend*zen[1]);
- colf[2] = (blendm*hor[2] + blend*zen[2]);
+ col_r[0] = (blendm*hor[0] + blend*zen[0]);
+ col_r[1] = (blendm*hor[1] + blend*zen[1]);
+ col_r[2] = (blendm*hor[2] + blend*zen[2]);
} else {
/* Done when a texture was grabbed. */
- colf[0]= hor[0];
- colf[1]= hor[1];
- colf[2]= hor[2];
+ col_r[0]= hor[0];
+ col_r[1]= hor[1];
+ col_r[2]= hor[2];
}
}
/* shade sky according to sun lamps, all parameters are like shadeSkyView except sunsky*/
-void shadeSunView(float *colf, float *view)
+void shadeSunView(float col_r[3], const float view[3])
{
GroupObject *go;
LampRen *lar;
@@ -576,9 +576,8 @@ void shadeSunView(float *colf, float *view)
float colorxyz[3];
if(do_init) {
-
- VECCOPY(sview, view);
- normalize_v3(sview);
+
+ normalize_v3_v3(sview, view);
mul_m3_v3(R.imat, sview);
if (sview[2] < 0.0f)
sview[2] = 0.0f;
@@ -590,7 +589,7 @@ void shadeSunView(float *colf, float *view)
xyz_to_rgb(colorxyz[0], colorxyz[1], colorxyz[2], &sun_collector[0], &sun_collector[1], &sun_collector[2],
lar->sunsky->sky_colorspace);
- ramp_blend(lar->sunsky->skyblendtype, colf, colf+1, colf+2, lar->sunsky->skyblendfac, sun_collector);
+ ramp_blend(lar->sunsky->skyblendtype, col_r, col_r+1, col_r+2, lar->sunsky->skyblendfac, sun_collector);
}
}
}
@@ -599,7 +598,7 @@ void shadeSunView(float *colf, float *view)
/*
Stuff the sky color into the collector.
*/
-void shadeSkyPixel(float *collector, float fx, float fy, short thread)
+void shadeSkyPixel(float collector[4], float fx, float fy, short thread)
{
float view[3], dxyview[2];
@@ -649,10 +648,10 @@ void shadeSkyPixel(float *collector, float fx, float fy, short thread)
}
/* aerial perspective */
-void shadeAtmPixel(struct SunSky *sunsky, float *collector, float fx, float fy, float distance)
+void shadeAtmPixel(struct SunSky *sunsky, float collector[3], float fx, float fy, float distance)
{
float view[3];
-
+
calc_view_vector(view, fx, fy);
normalize_v3(view);
/*mul_m3_v3(R.imat, view);*/
diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c
index fbbb33d0172..ad592609ce6 100644
--- a/source/blender/render/intern/source/render_texture.c
+++ b/source/blender/render/intern/source/render_texture.c
@@ -125,7 +125,7 @@ static void init_render_texture(Render *re, Tex *tex)
}
if(tex->nodetree && tex->use_nodes) {
- ntreeBeginExecTree(tex->nodetree); /* has internal flag to detect it only does it once */
+ ntreeTexBeginExecTree(tex->nodetree, 1); /* has internal flag to detect it only does it once */
}
}
@@ -144,8 +144,8 @@ void init_render_textures(Render *re)
static void end_render_texture(Tex *tex)
{
- if(tex && tex->use_nodes && tex->nodetree)
- ntreeEndExecTree(tex->nodetree);
+ if(tex && tex->use_nodes && tex->nodetree && tex->nodetree->execdata)
+ ntreeTexEndExecTree(tex->nodetree->execdata, 1);
}
void end_render_textures(Render *re)
@@ -505,7 +505,7 @@ static int stucci(Tex *tex, float *texvec, TexResult *texres)
if(texres->nor) {
- VECCOPY(texres->nor, nor);
+ copy_v3_v3(texres->nor, nor);
tex_normal_derivate(tex, texres);
if(tex->stype==TEX_WALLOUT) {
@@ -755,9 +755,9 @@ static int plugintex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex
if(pit && pit->doit) {
if(texres->nor) {
if (pit->version < 6) {
- VECCOPY(pit->result+5, texres->nor);
+ copy_v3_v3(pit->result+5, texres->nor);
} else {
- VECCOPY(result+5, texres->nor);
+ copy_v3_v3(result+5, texres->nor);
}
}
if (pit->version < 6) {
@@ -781,9 +781,9 @@ static int plugintex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex
if(rgbnor & TEX_NOR) {
if(texres->nor) {
if (pit->version < 6) {
- VECCOPY(texres->nor, pit->result+5);
+ copy_v3_v3(texres->nor, pit->result+5);
} else {
- VECCOPY(texres->nor, result+5);
+ copy_v3_v3(texres->nor, result+5);
}
}
}
@@ -820,7 +820,7 @@ static int cubemap_glob(float *n, float x, float y, float z, float *adr1, float
nor[0]= x; nor[1]= y; nor[2]= z; // use local render coord
}
else {
- VECCOPY(nor, n);
+ copy_v3_v3(nor, n);
}
mul_mat3_m4_v3(R.viewinv, nor);
@@ -914,7 +914,7 @@ static int cubemap_ob(Object *ob, float *n, float x, float y, float z, float *ad
if(n==NULL) return 0;
- VECCOPY(nor, n);
+ copy_v3_v3(nor, n);
if(ob) mul_mat3_m4_v3(ob->imat, nor);
x1= fabs(nor[0]);
@@ -1219,7 +1219,7 @@ static int multitex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex,
/* ton: added this, for Blender convention reason.
* artificer: added the use of tmpvec to avoid scaling texvec
*/
- VECCOPY(tmpvec, texvec);
+ copy_v3_v3(tmpvec, texvec);
mul_v3_fl(tmpvec, 1.0f/tex->noisesize);
switch(tex->stype) {
@@ -1241,7 +1241,7 @@ static int multitex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex,
/* ton: added this, for Blender convention reason.
* artificer: added the use of tmpvec to avoid scaling texvec
*/
- VECCOPY(tmpvec, texvec);
+ copy_v3_v3(tmpvec, texvec);
mul_v3_fl(tmpvec, 1.0f/tex->noisesize);
retval= voronoiTex(tex, tmpvec, texres);
@@ -1250,7 +1250,7 @@ static int multitex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex,
/* ton: added this, for Blender convention reason.
* artificer: added the use of tmpvec to avoid scaling texvec
*/
- VECCOPY(tmpvec, texvec);
+ copy_v3_v3(tmpvec, texvec);
mul_v3_fl(tmpvec, 1.0f/tex->noisesize);
retval= mg_distNoiseTex(tex, tmpvec, texres);
@@ -1374,7 +1374,7 @@ int multitex_ext_safe(Tex *tex, float *texvec, TexResult *texres)
/* in = destination, tex = texture, out = previous color */
/* fact = texture strength, facg = button strength value */
-void texture_rgb_blend(float *in, float *tex, float *out, float fact, float facg, int blendtype)
+void texture_rgb_blend(float in[3], const float tex[3], const float out[3], float fact, float facg, int blendtype)
{
float facm, col;
@@ -1477,32 +1477,32 @@ void texture_rgb_blend(float *in, float *tex, float *out, float fact, float facg
case MTEX_BLEND_HUE:
fact*= facg;
- VECCOPY(in, out);
+ copy_v3_v3(in, out);
ramp_blend(MA_RAMP_HUE, in, in+1, in+2, fact, tex);
break;
case MTEX_BLEND_SAT:
fact*= facg;
- VECCOPY(in, out);
+ copy_v3_v3(in, out);
ramp_blend(MA_RAMP_SAT, in, in+1, in+2, fact, tex);
break;
case MTEX_BLEND_VAL:
fact*= facg;
- VECCOPY(in, out);
+ copy_v3_v3(in, out);
ramp_blend(MA_RAMP_VAL, in, in+1, in+2, fact, tex);
break;
case MTEX_BLEND_COLOR:
fact*= facg;
- VECCOPY(in, out);
+ copy_v3_v3(in, out);
ramp_blend(MA_RAMP_COLOR, in, in+1, in+2, fact, tex);
break;
case MTEX_SOFT_LIGHT:
fact*= facg;
- VECCOPY(in, out);
+ copy_v3_v3(in, out);
ramp_blend(MA_RAMP_SOFT, in, in+1, in+2, fact, tex);
break;
case MTEX_LIN_LIGHT:
fact*= facg;
- VECCOPY(in, out);
+ copy_v3_v3(in, out);
ramp_blend(MA_RAMP_LINEAR, in, in+1, in+2, fact, tex);
break;
}
@@ -1924,8 +1924,8 @@ static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, T
Hscale *= 0.1f; // factor 0.1 proved to look like the previous bump code
if( !ntap_bump->init_done ) {
- VECCOPY(ntap_bump->vNacc, shi->vn);
- VECCOPY(ntap_bump->vNorg, shi->vn);
+ copy_v3_v3(ntap_bump->vNacc, shi->vn);
+ copy_v3_v3(ntap_bump->vNorg, shi->vn);
ntap_bump->fPrevMagnitude = 1.0f;
ntap_bump->iPrevBumpSpace = 0;
@@ -2056,9 +2056,9 @@ static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, T
float obj2view[3][3], view2obj[3][3], tmp[4][4];
// local copies of derivatives and normal
float dPdx[3], dPdy[3], vN[3];
- VECCOPY(dPdx, shi->dxco);
- VECCOPY(dPdy, shi->dyco);
- VECCOPY(vN, ntap_bump->vNorg);
+ copy_v3_v3(dPdx, shi->dxco);
+ copy_v3_v3(dPdy, shi->dyco);
+ copy_v3_v3(vN, ntap_bump->vNorg);
if( mtex->texflag & MTEX_BUMP_OBJECTSPACE ) {
// TODO: these calculations happen for every pixel!
@@ -2200,14 +2200,14 @@ void do_material_tex(ShadeInput *shi)
co= tempvec;
dx= dxt;
dy= dyt;
- VECCOPY(tempvec, shi->co);
+ copy_v3_v3(tempvec, shi->co);
if(mtex->texflag & MTEX_OB_DUPLI_ORIG)
if(shi->obi && shi->obi->duplitexmat)
mul_m4_v3(shi->obi->duplitexmat, tempvec);
mul_m4_v3(ob->imat_ren, tempvec);
if(shi->osatex) {
- VECCOPY(dxt, shi->dxco);
- VECCOPY(dyt, shi->dyco);
+ copy_v3_v3(dxt, shi->dxco);
+ copy_v3_v3(dyt, shi->dyco);
mul_mat3_m4_v3(ob->imat_ren, dxt);
mul_mat3_m4_v3(ob->imat_ren, dyt);
}
@@ -2369,7 +2369,7 @@ void do_material_tex(ShadeInput *shi)
float *warpnor= texres.nor, warpnor_[3];
if(use_ntap_bump) {
- VECCOPY(warpnor_, texres.nor);
+ copy_v3_v3(warpnor_, texres.nor);
warpnor= warpnor_;
normalize_v3(warpnor_);
}
@@ -2485,7 +2485,7 @@ void do_material_tex(ShadeInput *shi)
else {
float nor[3];
- VECCOPY(nor, texres.nor);
+ copy_v3_v3(nor, texres.nor);
if(mtex->normapspace == MTEX_NSPACE_CAMERA);
else if(mtex->normapspace == MTEX_NSPACE_WORLD) {
@@ -2526,7 +2526,7 @@ void do_material_tex(ShadeInput *shi)
nor[1]= Tnor*norfac*texres.nor[1];
nor[2]= Tnor*norfac*texres.nor[2];
- dot= 0.5f + 0.5f*INPR(nor, shi->vn);
+ dot= 0.5f + 0.5f * dot_v3v3(nor, shi->vn);
shi->vn[0]+= dot*nor[0];
shi->vn[1]+= dot*nor[1];
@@ -2658,7 +2658,7 @@ void do_material_tex(ShadeInput *shi)
}
-void do_volume_tex(ShadeInput *shi, float *xyz, int mapto_flag, float *col, float *val)
+void do_volume_tex(ShadeInput *shi, const float xyz[3], int mapto_flag, float col[3], float *val)
{
MTex *mtex;
Tex *tex;
@@ -2687,7 +2687,7 @@ void do_volume_tex(ShadeInput *shi, float *xyz, int mapto_flag, float *col, floa
if(mtex->texco==TEXCO_OBJECT) {
Object *ob= mtex->object;
if(ob) {
- VECCOPY(co, xyz);
+ copy_v3_v3(co, xyz);
if(mtex->texflag & MTEX_OB_DUPLI_ORIG) {
if(shi->obi && shi->obi->duplitexmat)
mul_m4_v3(shi->obi->duplitexmat, co);
@@ -2699,16 +2699,16 @@ void do_volume_tex(ShadeInput *shi, float *xyz, int mapto_flag, float *col, floa
else if(mtex->texco==TEXCO_ORCO) {
if(mtex->texflag & MTEX_DUPLI_MAPTO) {
- VECCOPY(co, shi->duplilo);
+ copy_v3_v3(co, shi->duplilo);
}
else {
Object *ob= shi->obi->ob;
- VECCOPY(co, xyz);
+ copy_v3_v3(co, xyz);
mul_m4_v3(ob->imat_ren, co);
}
}
else if(mtex->texco==TEXCO_GLOB) {
- VECCOPY(co, xyz);
+ copy_v3_v3(co, xyz);
mul_m4_v3(R.viewinv, co);
}
else continue; // can happen when texco defines disappear and it renders old files
@@ -2838,7 +2838,7 @@ void do_volume_tex(ShadeInput *shi, float *xyz, int mapto_flag, float *col, floa
/* ------------------------------------------------------------------------- */
-void do_halo_tex(HaloRen *har, float xn, float yn, float *colf)
+void do_halo_tex(HaloRen *har, float xn, float yn, float col_r[4])
{
MTex *mtex;
TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL};
@@ -2945,23 +2945,23 @@ void do_halo_tex(HaloRen *har, float xn, float yn, float *colf)
if(mtex->blendtype==MTEX_SUB) fact= -fact;
if(mtex->blendtype==MTEX_BLEND) {
- colf[0]= (fact*texres.tr + facm*har->r);
- colf[1]= (fact*texres.tg + facm*har->g);
- colf[2]= (fact*texres.tb + facm*har->b);
+ col_r[0]= (fact*texres.tr + facm*har->r);
+ col_r[1]= (fact*texres.tg + facm*har->g);
+ col_r[2]= (fact*texres.tb + facm*har->b);
}
else if(mtex->blendtype==MTEX_MUL) {
- colf[0]= (facm+fact*texres.tr)*har->r;
- colf[1]= (facm+fact*texres.tg)*har->g;
- colf[2]= (facm+fact*texres.tb)*har->b;
+ col_r[0]= (facm+fact*texres.tr)*har->r;
+ col_r[1]= (facm+fact*texres.tg)*har->g;
+ col_r[2]= (facm+fact*texres.tb)*har->b;
}
else {
- colf[0]= (fact*texres.tr + har->r);
- colf[1]= (fact*texres.tg + har->g);
- colf[2]= (fact*texres.tb + har->b);
+ col_r[0]= (fact*texres.tr + har->r);
+ col_r[1]= (fact*texres.tg + har->g);
+ col_r[2]= (fact*texres.tb + har->b);
- CLAMP(colf[0], 0.0f, 1.0f);
- CLAMP(colf[1], 0.0f, 1.0f);
- CLAMP(colf[2], 0.0f, 1.0f);
+ CLAMP(col_r[0], 0.0f, 1.0f);
+ CLAMP(col_r[1], 0.0f, 1.0f);
+ CLAMP(col_r[2], 0.0f, 1.0f);
}
}
if(mtex->mapto & MAP_ALPHA) {
@@ -2970,14 +2970,14 @@ void do_halo_tex(HaloRen *har, float xn, float yn, float *colf)
else texres.tin= (0.35f*texres.tr+0.45f*texres.tg+0.2f*texres.tb);
}
- colf[3]*= texres.tin;
+ col_r[3]*= texres.tin;
}
}
/* ------------------------------------------------------------------------- */
/* hor and zen are RGB vectors, blend is 1 float, should all be initialized */
-void do_sky_tex(float *rco, float *lo, float *dxyview, float *hor, float *zen, float *blend, int skyflag, short thread)
+void do_sky_tex(const float rco[3], float lo[3], const float dxyview[2], float hor[3], float zen[3], float *blend, int skyflag, short thread)
{
MTex *mtex;
Tex *tex;
@@ -3054,7 +3054,7 @@ void do_sky_tex(float *rco, float *lo, float *dxyview, float *hor, float *zen, f
break;
case TEXCO_OBJECT:
if(mtex->object) {
- VECCOPY(tempvec, lo);
+ copy_v3_v3(tempvec, lo);
mul_m4_v3(mtex->object->imat_ren, tempvec);
co= tempvec;
}
@@ -3062,16 +3062,16 @@ void do_sky_tex(float *rco, float *lo, float *dxyview, float *hor, float *zen, f
case TEXCO_GLOB:
if(rco) {
- VECCOPY(tempvec, rco);
+ copy_v3_v3(tempvec, rco);
mul_m4_v3(R.viewinv, tempvec);
co= tempvec;
}
else
co= lo;
-// VECCOPY(shi->dxgl, shi->dxco);
+// copy_v3_v3(shi->dxgl, shi->dxco);
// mul_m3_v3(R.imat, shi->dxco);
-// VECCOPY(shi->dygl, shi->dyco);
+// copy_v3_v3(shi->dygl, shi->dyco);
// mul_m3_v3(R.imat, shi->dyco);
break;
}
@@ -3172,9 +3172,9 @@ void do_sky_tex(float *rco, float *lo, float *dxyview, float *hor, float *zen, f
}
/* ------------------------------------------------------------------------- */
-/* colf supposed to be initialized with la->r,g,b */
+/* col_r supposed to be initialized with la->r,g,b */
-void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int effect)
+void do_lamp_tex(LampRen *la, const float lavec[3], ShadeInput *shi, float col_r[3], int effect)
{
Object *ob;
MTex *mtex;
@@ -3203,11 +3203,11 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef
co= tempvec;
dx= dxt;
dy= dyt;
- VECCOPY(tempvec, shi->co);
+ copy_v3_v3(tempvec, shi->co);
mul_m4_v3(ob->imat_ren, tempvec);
if(shi->osatex) {
- VECCOPY(dxt, shi->dxco);
- VECCOPY(dyt, shi->dyco);
+ copy_v3_v3(dxt, shi->dxco);
+ copy_v3_v3(dyt, shi->dyco);
mul_mat3_m4_v3(ob->imat_ren, dxt);
mul_mat3_m4_v3(ob->imat_ren, dyt);
}
@@ -3219,12 +3219,12 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef
}
else if(mtex->texco==TEXCO_GLOB) {
co= shi->gl; dx= shi->dxco; dy= shi->dyco;
- VECCOPY(shi->gl, shi->co);
+ copy_v3_v3(shi->gl, shi->co);
mul_m4_v3(R.viewinv, shi->gl);
}
else if(mtex->texco==TEXCO_VIEW) {
- VECCOPY(tempvec, lavec);
+ copy_v3_v3(tempvec, lavec);
mul_m3_v3(la->imat, tempvec);
if(la->type==LA_SPOT) {
@@ -3238,8 +3238,8 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef
dx= dxt; dy= dyt;
if(shi->osatex) {
- VECCOPY(dxt, shi->dxlv);
- VECCOPY(dyt, shi->dylv);
+ copy_v3_v3(dxt, shi->dxlv);
+ copy_v3_v3(dyt, shi->dylv);
/* need some matrix conversion here? la->imat is a [3][3] matrix!!! **/
mul_m3_v3(la->imat, dxt);
mul_m3_v3(la->imat, dyt);
@@ -3356,7 +3356,7 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef
col[1]= texres.tg*la->energy;
col[2]= texres.tb*la->energy;
- texture_rgb_blend(colf, col, colf, texres.tin, mtex->colfac, mtex->blendtype);
+ texture_rgb_blend(col_r, col, col_r, texres.tin, mtex->colfac, mtex->blendtype);
}
}
}
@@ -3364,7 +3364,7 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef
/* ------------------------------------------------------------------------- */
-int externtex(MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *tb, float *ta, const int thread)
+int externtex(MTex *mtex, const float vec[3], float *tin, float *tr, float *tg, float *tb, float *ta, const int thread)
{
Tex *tex;
TexResult texr;
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index b66740c87ba..16bbe1ca5c2 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -128,7 +128,7 @@ void calc_view_vector(float *view, float x, float y)
}
}
-void calc_renderco_ortho(float *co, float x, float y, int z)
+void calc_renderco_ortho(float co[3], float x, float y, int z)
{
/* x and y 3d coordinate can be derived from pixel coord and winmat */
float fx= 2.0f/(R.winx*R.winmat[0][0]);
@@ -142,7 +142,7 @@ void calc_renderco_ortho(float *co, float x, float y, int z)
co[2]= R.winmat[3][2]/( R.winmat[2][3]*zco - R.winmat[2][2] );
}
-void calc_renderco_zbuf(float *co, float *view, int z)
+void calc_renderco_zbuf(float co[3], float *view, int z)
{
float fac, zco;
diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c
index 0c5ad0475ab..7a39342ac8d 100644
--- a/source/blender/render/intern/source/renderdatabase.c
+++ b/source/blender/render/intern/source/renderdatabase.c
@@ -428,7 +428,7 @@ VlakRen *RE_vlakren_copy(ObjectRen *obr, VlakRen *vlr)
surfnor= RE_vlakren_get_surfnor(obr, vlr, 0);
if(surfnor) {
surfnor1= RE_vlakren_get_surfnor(obr, vlr1, 1);
- VECCOPY(surfnor1, surfnor);
+ copy_v3_v3(surfnor1, surfnor);
}
tangent= RE_vlakren_get_nmap_tangent(obr, vlr, 0);
@@ -451,13 +451,12 @@ void RE_vlakren_get_normal(Render *UNUSED(re), ObjectInstanceRen *obi, VlakRen *
float (*nmat)[3]= obi->nmat;
if(obi->flag & R_TRANSFORMED) {
- VECCOPY(nor, vlr->n);
-
- mul_m3_v3(nmat, nor);
+ mul_v3_m3v3(nor, nmat, vlr->n);
normalize_v3(nor);
}
- else
- VECCOPY(nor, vlr->n);
+ else {
+ copy_v3_v3(nor, vlr->n);
+ }
}
void RE_set_customdata_names(ObjectRen *obr, CustomData *data)
@@ -953,7 +952,7 @@ HaloRen *RE_inithalo(Render *re, ObjectRen *obr, Material *ma, float *vec, f
}
har= RE_findOrAddHalo(obr, obr->tothalo++);
- VECCOPY(har->co, vec);
+ copy_v3_v3(har->co, vec);
har->hasize= hasize;
/* actual projectvert is done in function project_renderdata() because of parts/border/pano */
@@ -1009,7 +1008,7 @@ HaloRen *RE_inithalo(Render *re, ObjectRen *obr, Material *ma, float *vec, f
else {
mtex= ma->mtex[0];
- VECCOPY(texvec, vec);
+ copy_v3_v3(texvec, vec);
if(mtex->texco & TEXCO_NORM) {
;
@@ -1022,7 +1021,7 @@ HaloRen *RE_inithalo(Render *re, ObjectRen *obr, Material *ma, float *vec, f
}
else {
if(orco) {
- VECCOPY(texvec, orco);
+ copy_v3_v3(texvec, orco);
}
}
@@ -1067,7 +1066,7 @@ HaloRen *RE_inithalo_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Mater
}
har= RE_findOrAddHalo(obr, obr->tothalo++);
- VECCOPY(har->co, vec);
+ copy_v3_v3(har->co, vec);
har->hasize= hasize;
/* actual projectvert is done in function project_renderdata() because of parts/border/pano */
@@ -1123,7 +1122,7 @@ HaloRen *RE_inithalo_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Mater
for(i=0; i<MAX_MTEX; i++)
if(ma->mtex[i] && (ma->septex & (1<<i))==0) {
mtex= ma->mtex[i];
- VECCOPY(texvec, vec);
+ copy_v3_v3(texvec, vec);
if(mtex->texco & TEXCO_NORM) {
;
@@ -1133,7 +1132,7 @@ HaloRen *RE_inithalo_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Mater
mul_m4_v3(mtex->object->imat_ren,texvec);
}
else if(mtex->texco & TEXCO_GLOB){
- VECCOPY(texvec,vec);
+ copy_v3_v3(texvec,vec);
}
else if(mtex->texco & TEXCO_UV && uvco){
int uv_index=CustomData_get_named_layer_index(&dm->faceData,CD_MTFACE,mtex->uvname);
@@ -1153,7 +1152,7 @@ HaloRen *RE_inithalo_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Mater
texvec[2] = pa_co[2];
}
else if(orco) {
- VECCOPY(texvec, orco);
+ copy_v3_v3(texvec, orco);
}
hasrgb = externtex(mtex, texvec, &tin, &tr, &tg, &tb, &ta, 0);
@@ -1238,7 +1237,7 @@ static int panotestclip(Render *re, int do_pano, float *v)
- shadow buffering (shadbuf.c)
*/
-void project_renderdata(Render *re, void (*projectfunc)(float *, float mat[][4], float *), int do_pano, float xoffs, int UNUSED(do_buckets))
+void project_renderdata(Render *re, void (*projectfunc)(const float *, float mat[][4], float *), int do_pano, float xoffs, int UNUSED(do_buckets))
{
ObjectRen *obr;
HaloRen *har = NULL;
@@ -1264,7 +1263,7 @@ void project_renderdata(Render *re, void (*projectfunc)(float *, float mat[][4],
vec[2]= -re->panosi*har->co[0] + re->panoco*har->co[2];
}
else {
- VECCOPY(vec, har->co);
+ copy_v3_v3(vec, har->co);
}
projectfunc(vec, re->winmat, hoco);
diff --git a/source/blender/render/intern/source/shadbuf.c b/source/blender/render/intern/source/shadbuf.c
index 5860c395b07..e4b2a0cf1d1 100644
--- a/source/blender/render/intern/source/shadbuf.c
+++ b/source/blender/render/intern/source/shadbuf.c
@@ -1099,7 +1099,7 @@ static float readshadowbuf(ShadBuf *shb, ShadSampleBuf *shsample, int bias, int
}
}
-static void shadowbuf_project_co(float *x, float *y, float *z, ShadBuf *shb, float co[3])
+static void shadowbuf_project_co(float *x, float *y, float *z, ShadBuf *shb, const float co[3])
{
float hco[4], size= 0.5f*(float)shb->size;
@@ -1115,7 +1115,7 @@ static void shadowbuf_project_co(float *x, float *y, float *z, ShadBuf *shb, flo
/* the externally called shadow testing (reading) function */
/* return 1.0: no shadow at all */
-float testshadowbuf(Render *re, ShadBuf *shb, float *co, float *dxco, float *dyco, float inp, float mat_bias)
+float testshadowbuf(Render *re, ShadBuf *shb, const float co[3], const float dxco[3], const float dyco[3], float inp, float mat_bias)
{
ShadSampleBuf *shsample;
float fac, dco[3], dx[3], dy[3], shadfac=0.0f;
@@ -1291,7 +1291,7 @@ static float readshadowbuf_halo(ShadBuf *shb, ShadSampleBuf *shsample, int xs, i
}
-float shadow_halo(LampRen *lar, float *p1, float *p2)
+float shadow_halo(LampRen *lar, const float p1[3], const float p2[3])
{
/* p1 p2 already are rotated in spot-space */
ShadBuf *shb= lar->shb;
@@ -1469,7 +1469,7 @@ static void init_box(Boxf *box)
}
/* use v1 to calculate boundbox */
-static void bound_boxf(Boxf *box, float *v1)
+static void bound_boxf(Boxf *box, const float v1[3])
{
if(v1[0] < box->xmin) box->xmin= v1[0];
if(v1[0] > box->xmax) box->xmax= v1[0];
@@ -1480,7 +1480,7 @@ static void bound_boxf(Boxf *box, float *v1)
}
/* use v1 to calculate boundbox */
-static void bound_rectf(rctf *box, float *v1)
+static void bound_rectf(rctf *box, const float v1[2])
{
if(v1[0] < box->xmin) box->xmin= v1[0];
if(v1[0] > box->xmax) box->xmax= v1[0];
@@ -1639,24 +1639,17 @@ static int isb_bsp_insert(ISBBranch *root, MemArena *memarena, ISBSample *sample
return 0;
}
-static float VecLen2f( float *v1, float *v2)
-{
- float x= v1[0]-v2[0];
- float y= v1[1]-v2[1];
- return (float)sqrt(x*x+y*y);
-}
-
/* initialize vars in face, for optimal point-in-face test */
static void bspface_init_strand(BSPFace *face)
{
- face->radline= 0.5f*VecLen2f(face->v1, face->v2);
+ face->radline= 0.5f* len_v2v2(face->v1, face->v2);
mid_v3_v3v3(face->vec1, face->v1, face->v2);
if(face->v4)
mid_v3_v3v3(face->vec2, face->v3, face->v4);
else
- VECCOPY(face->vec2, face->v3);
+ copy_v3_v3(face->vec2, face->v3);
face->rc[0]= face->vec2[0]-face->vec1[0];
face->rc[1]= face->vec2[1]-face->vec1[1];
@@ -1671,7 +1664,7 @@ static void bspface_init_strand(BSPFace *face)
}
/* brought back to a simple 2d case */
-static int point_behind_strand(float *p, BSPFace *face)
+static int point_behind_strand(const float p[3], BSPFace *face)
{
/* v1 - v2 is radius, v1 - v3 length */
float dist, rc[2], pt[2];
@@ -1712,7 +1705,7 @@ static int point_behind_strand(float *p, BSPFace *face)
/* return 1 if inside. code derived from src/parametrizer.c */
-static int point_behind_tria2d(float *p, float *v1, float *v2, float *v3)
+static int point_behind_tria2d(const float p[3], const float v1[3], const float v2[3], const float v3[3])
{
float a[2], c[2], h[2], div;
float u, v;
@@ -1751,7 +1744,7 @@ static int point_behind_tria2d(float *p, float *v1, float *v2, float *v3)
/* tested these calls, but it gives inaccuracy, 'side' cannot be found reliably using v3 */
/* check if line v1-v2 has all rect points on other side of point v3 */
-static int rect_outside_line(rctf *rect, float *v1, float *v2, float *v3)
+static int rect_outside_line(rctf *rect, const float v1[3], const float v2[3], const float v3[3])
{
float a, b, c;
int side;
@@ -1772,7 +1765,7 @@ static int rect_outside_line(rctf *rect, float *v1, float *v2, float *v3)
}
/* check if one of the triangle edges separates all rect points on 1 side */
-static int rect_isect_tria(rctf *rect, float *v1, float *v2, float *v3)
+static int rect_isect_tria(rctf *rect, const float v1[3], const float v2[3], const float v3[3])
{
if(rect_outside_line(rect, v1, v2, v3))
return 0;
@@ -1935,7 +1928,7 @@ static void isb_bsp_test_face(ZSpan *zspan, int obi, int zvlnr, float *v1, float
isb_bsp_face_inside((ISBBranch *)zspan->rectz, &face);
}
-static int testclip_minmax(float *ho, float *minmax)
+static int testclip_minmax(const float ho[4], const float minmax[4])
{
float wco= ho[3];
int flag= 0;
@@ -2064,7 +2057,7 @@ static void isb_bsp_fillfaces(Render *re, LampRen *lar, ISBBranch *root)
}
/* returns 1 when the viewpixel is visible in lampbuffer */
-static int viewpixel_to_lampbuf(ShadBuf *shb, ObjectInstanceRen *obi, VlakRen *vlr, float x, float y, float *co)
+static int viewpixel_to_lampbuf(ShadBuf *shb, ObjectInstanceRen *obi, VlakRen *vlr, float x, float y, float co_r[3])
{
float hoco[4], v1[3], nor[3];
float dface, fac, siz;
@@ -2123,12 +2116,12 @@ static int viewpixel_to_lampbuf(ShadBuf *shb, ObjectInstanceRen *obi, VlakRen *v
return 0;
siz= 0.5f*(float)shb->size;
- co[0]= siz*(1.0f+hoco[0]/hoco[3]) -0.5f;
- co[1]= siz*(1.0f+hoco[1]/hoco[3]) -0.5f;
- co[2]= ((float)0x7FFFFFFF)*(hoco[2]/hoco[3]);
+ co_r[0]= siz*(1.0f+hoco[0]/hoco[3]) -0.5f;
+ co_r[1]= siz*(1.0f+hoco[1]/hoco[3]) -0.5f;
+ co_r[2]= ((float)0x7FFFFFFF)*(hoco[2]/hoco[3]);
/* XXXX bias, much less than normal shadbuf, or do we need a constant? */
- co[2] -= 0.05f*shb->bias;
+ co_r[2] -= 0.05f*shb->bias;
return 1;
}
diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c
index eab66aaf2ec..128900d1fd2 100644
--- a/source/blender/render/intern/source/shadeinput.c
+++ b/source/blender/render/intern/source/shadeinput.c
@@ -114,10 +114,8 @@ void shade_material_loop(ShadeInput *shi, ShadeResult *shr)
float fac= shi->translucency;
shade_input_init_material(shi);
-
- VECCOPY(shi->vn, shi->vno);
- VECMUL(shi->vn, -1.0f);
- VECMUL(shi->facenor, -1.0f);
+ negate_v3_v3(shi->vn, shi->vno);
+ negate_v3(shi->facenor);
shi->depth++; /* hack to get real shadow now */
shade_lamp_loop(shi, &shr_t);
shi->depth--;
@@ -184,8 +182,8 @@ void shade_input_do_shade(ShadeInput *shi, ShadeResult *shr)
/* copy additional passes */
if(shi->passflag & (SCE_PASS_VECTOR|SCE_PASS_NORMAL)) {
- QUATCOPY(shr->winspeed, shi->winspeed);
- VECCOPY(shr->nor, shi->vn);
+ copy_v4_v4(shr->winspeed, shi->winspeed);
+ copy_v3_v3(shr->nor, shi->vn);
}
/* MIST */
@@ -286,9 +284,9 @@ void shade_input_set_triangle_i(ShadeInput *shi, ObjectInstanceRen *obi, VlakRen
/* calculate vertexnormals */
if(vlr->flag & R_SMOOTH) {
- VECCOPY(shi->n1, shi->v1->n);
- VECCOPY(shi->n2, shi->v2->n);
- VECCOPY(shi->n3, shi->v3->n);
+ copy_v3_v3(shi->n1, shi->v1->n);
+ copy_v3_v3(shi->n2, shi->v2->n);
+ copy_v3_v3(shi->n3, shi->v3->n);
if(obi->flag & R_TRANSFORMED) {
mul_m3_v3(obi->nmat, shi->n1); normalize_v3(shi->n1);
@@ -341,26 +339,26 @@ void shade_input_set_strand(ShadeInput *shi, StrandRen *strand, StrandPoint *spo
shi->mode= shi->mat->mode_l; /* or-ed result for all nodes */
/* shade_input_set_viewco equivalent */
- VECCOPY(shi->co, spoint->co);
- VECCOPY(shi->view, shi->co);
+ copy_v3_v3(shi->co, spoint->co);
+ copy_v3_v3(shi->view, shi->co);
normalize_v3(shi->view);
shi->xs= (int)spoint->x;
shi->ys= (int)spoint->y;
if(shi->osatex || (R.r.mode & R_SHADOW)) {
- VECCOPY(shi->dxco, spoint->dtco);
- VECCOPY(shi->dyco, spoint->dsco);
+ copy_v3_v3(shi->dxco, spoint->dtco);
+ copy_v3_v3(shi->dyco, spoint->dsco);
}
/* dxview, dyview, not supported */
/* facenormal, simply viewco flipped */
- VECCOPY(shi->facenor, spoint->nor);
+ copy_v3_v3(shi->facenor, spoint->nor);
/* shade_input_set_normals equivalent */
if(shi->mat->mode & MA_TANGENT_STR) {
- VECCOPY(shi->vn, spoint->tan)
+ copy_v3_v3(shi->vn, spoint->tan);
}
else {
float cross[3];
@@ -369,11 +367,11 @@ void shade_input_set_strand(ShadeInput *shi, StrandRen *strand, StrandPoint *spo
cross_v3_v3v3(shi->vn, cross, spoint->tan);
normalize_v3(shi->vn);
- if(INPR(shi->vn, shi->view) < 0.0f)
+ if(dot_v3v3(shi->vn, shi->view) < 0.0f)
negate_v3(shi->vn);
}
- VECCOPY(shi->vno, shi->vn);
+ copy_v3_v3(shi->vno, shi->vn);
}
void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert *svert, StrandPoint *spoint)
@@ -393,17 +391,17 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert
}
if(mode & (MA_TANGENT_V|MA_NORMAP_TANG)) {
- VECCOPY(shi->tang, spoint->tan);
- VECCOPY(shi->nmaptang, spoint->tan);
+ copy_v3_v3(shi->tang, spoint->tan);
+ copy_v3_v3(shi->nmaptang, spoint->tan);
}
if(mode & MA_STR_SURFDIFF) {
float *surfnor= RE_strandren_get_surfnor(obr, strand, 0);
if(surfnor)
- VECCOPY(shi->surfnor, surfnor)
+ copy_v3_v3(shi->surfnor, surfnor);
else
- VECCOPY(shi->surfnor, shi->vn)
+ copy_v3_v3(shi->surfnor, shi->vn);
if(shi->mat->strand_surfnor > 0.0f) {
shi->surfdist= 0.0f;
@@ -418,7 +416,7 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert
speed= RE_strandren_get_winspeed(shi->obi, strand, 0);
if(speed)
- QUATCOPY(shi->winspeed, speed)
+ copy_v4_v4(shi->winspeed, speed);
else
shi->winspeed[0]= shi->winspeed[1]= shi->winspeed[2]= shi->winspeed[3]= 0.0f;
}
@@ -426,18 +424,18 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert
/* shade_input_set_shade_texco equivalent */
if(texco & NEED_UV) {
if(texco & TEXCO_ORCO) {
- VECCOPY(shi->lo, strand->orco);
+ copy_v3_v3(shi->lo, strand->orco);
/* no shi->osatex, orco derivatives are zero */
}
if(texco & TEXCO_GLOB) {
- VECCOPY(shi->gl, shi->co);
+ copy_v3_v3(shi->gl, shi->co);
mul_m4_v3(R.viewinv, shi->gl);
if(shi->osatex) {
- VECCOPY(shi->dxgl, shi->dxco);
+ copy_v3_v3(shi->dxgl, shi->dxco);
mul_mat3_m4_v3(R.viewinv, shi->dxgl);
- VECCOPY(shi->dygl, shi->dyco);
+ copy_v3_v3(shi->dygl, shi->dyco);
mul_mat3_m4_v3(R.viewinv, shi->dygl);
}
}
@@ -586,7 +584,7 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert
}
/* from scanline pixel coordinates to 3d coordinates, requires set_triangle */
-void shade_input_calc_viewco(ShadeInput *shi, float x, float y, float z, float *view, float *dxyview, float *co, float *dxco, float *dyco)
+void shade_input_calc_viewco(ShadeInput *shi, float x, float y, float z, float view[3], float dxyview[2], float co[3], float dxco[3], float dyco[3])
{
/* returns not normalized, so is in viewplane coords */
calc_view_vector(view, x, y);
@@ -603,7 +601,7 @@ void shade_input_calc_viewco(ShadeInput *shi, float x, float y, float z, float *
/* for non-wire, intersect with the triangle to get the exact coord */
float fac, dface, v1[3];
- VECCOPY(v1, shi->v1->co);
+ copy_v3_v3(v1, shi->v1->co);
if(shi->obi->flag & R_TRANSFORMED)
mul_m4_v3(shi->obi->mat, v1);
@@ -721,9 +719,9 @@ void shade_input_set_uv(ShadeInput *shi)
if((vlr->flag & R_SMOOTH) || (shi->mat->texco & NEED_UV) || (shi->passflag & SCE_PASS_UV)) {
float v1[3], v2[3], v3[3];
- VECCOPY(v1, shi->v1->co);
- VECCOPY(v2, shi->v2->co);
- VECCOPY(v3, shi->v3->co);
+ copy_v3_v3(v1, shi->v1->co);
+ copy_v3_v3(v2, shi->v2->co);
+ copy_v3_v3(v3, shi->v3->co);
if(shi->obi->flag & R_TRANSFORMED) {
mul_m4_v3(shi->obi->mat, v1);
@@ -822,18 +820,18 @@ void shade_input_set_normals(ShadeInput *shi)
shi->vn[2]= l*n3[2]-u*n1[2]-v*n2[2];
// use unnormalized normal (closer to games)
- VECCOPY(shi->nmapnorm, shi->vn);
+ copy_v3_v3(shi->nmapnorm, shi->vn);
normalize_v3(shi->vn);
}
else
{
- VECCOPY(shi->vn, shi->facenor);
- VECCOPY(shi->nmapnorm, shi->vn);
+ copy_v3_v3(shi->vn, shi->facenor);
+ copy_v3_v3(shi->nmapnorm, shi->vn);
}
/* used in nodes */
- VECCOPY(shi->vno, shi->vn);
+ copy_v3_v3(shi->vno, shi->vn);
/* flip normals to viewing direction */
if(!(shi->vlr->flag & R_TANGENT))
@@ -856,18 +854,18 @@ void shade_input_set_vertex_normals(ShadeInput *shi)
shi->vn[2]= l*n3[2]-u*n1[2]-v*n2[2];
// use unnormalized normal (closer to games)
- VECCOPY(shi->nmapnorm, shi->vn);
+ copy_v3_v3(shi->nmapnorm, shi->vn);
normalize_v3(shi->vn);
}
else
{
- VECCOPY(shi->vn, shi->facenor);
- VECCOPY(shi->nmapnorm, shi->vn);
+ copy_v3_v3(shi->vn, shi->facenor);
+ copy_v3_v3(shi->nmapnorm, shi->vn);
}
/* used in nodes */
- VECCOPY(shi->vno, shi->vn);
+ copy_v3_v3(shi->vno, shi->vn);
}
@@ -956,7 +954,7 @@ void shade_input_set_shade_texco(ShadeInput *shi)
mul_m3_v3(obi->nmat, shi->tang);
normalize_v3(shi->tang);
- VECCOPY(shi->nmaptang, shi->tang);
+ copy_v3_v3(shi->nmaptang, shi->tang);
}
}
@@ -969,9 +967,9 @@ void shade_input_set_shade_texco(ShadeInput *shi)
vlr_set_uv_indices(shi->vlr, &j1, &j2, &j3);
- VECCOPY(c0, &tangent[j1*4]);
- VECCOPY(c1, &tangent[j2*4]);
- VECCOPY(c2, &tangent[j3*4]);
+ copy_v3_v3(c0, &tangent[j1*4]);
+ copy_v3_v3(c1, &tangent[j2*4]);
+ copy_v3_v3(c2, &tangent[j3*4]);
// keeping tangents normalized at vertex level
// corresponds better to how it's done in game engines
@@ -999,12 +997,12 @@ void shade_input_set_shade_texco(ShadeInput *shi)
float *surfnor= RE_vlakren_get_surfnor(obr, shi->vlr, 0);
if(surfnor) {
- VECCOPY(shi->surfnor, surfnor)
+ copy_v3_v3(shi->surfnor, surfnor);
if(obi->flag & R_TRANSFORMED)
mul_m3_v3(obi->nmat, shi->surfnor);
}
else
- VECCOPY(shi->surfnor, shi->vn)
+ copy_v3_v3(shi->surfnor, shi->vn);
shi->surfdist= 0.0f;
}
@@ -1057,16 +1055,16 @@ void shade_input_set_shade_texco(ShadeInput *shi)
}
}
- VECCOPY(shi->duplilo, obi->dupliorco);
+ copy_v3_v3(shi->duplilo, obi->dupliorco);
}
if(texco & TEXCO_GLOB) {
- VECCOPY(shi->gl, shi->co);
+ copy_v3_v3(shi->gl, shi->co);
mul_m4_v3(R.viewinv, shi->gl);
if(shi->osatex) {
- VECCOPY(shi->dxgl, shi->dxco);
+ copy_v3_v3(shi->dxgl, shi->dxco);
mul_mat3_m4_v3(R.viewinv, shi->dxgl);
- VECCOPY(shi->dygl, shi->dyco);
+ copy_v3_v3(shi->dygl, shi->dyco);
mul_mat3_m4_v3(R.viewinv, shi->dygl);
}
}
diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c
index 7f921d21041..431b2839c25 100644
--- a/source/blender/render/intern/source/shadeoutput.c
+++ b/source/blender/render/intern/source/shadeoutput.c
@@ -85,7 +85,7 @@ static void fogcolor(float *colf, float *rco, float *view)
hor[0]= R.wrld.horr; hor[1]= R.wrld.horg; hor[2]= R.wrld.horb;
zen[0]= R.wrld.zenr; zen[1]= R.wrld.zeng; zen[2]= R.wrld.zenb;
- VECCOPY(vec, rco);
+ copy_v3_v3(vec, rco);
/* we loop from cur coord to mist start in steps */
stepsize= 1.0f;
@@ -282,10 +282,10 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
else if(ok1==0 || ok2==0) return;
/* at least 1 visible interesction point */
- if(t1<0.0f && t2<0.0f) return;
+ if(t1<0.0 && t2<0.0) return;
- if(t1<0.0f) t1= 0.0f;
- if(t2<0.0f) t2= 0.0f;
+ if(t1<0.0) t1= 0.0;
+ if(t2<0.0) t2= 0.0;
if(t1==t2) return;
@@ -423,8 +423,8 @@ float fresnel_fac(float *view, float *vn, float grad, float fac)
static double saacos_d(double fac)
{
- if(fac<= -1.0f) return M_PI;
- else if(fac>=1.0f) return 0.0;
+ if(fac<= -1.0) return M_PI;
+ else if(fac>=1.0) return 0.0;
else return acos(fac);
}
@@ -486,8 +486,8 @@ static float area_lamp_energy_multisample(LampRen *lar, float *co, float *vn)
int a= lar->ray_totsamp;
/* test if co is behind lamp */
- VECSUB(vec, co, lar->co);
- if(INPR(vec, lar->vec) < 0.0f)
+ sub_v3_v3v3(vec, co, lar->co);
+ if(dot_v3v3(vec, lar->vec) < 0.0f)
return 0.0f;
while(a--) {
@@ -590,7 +590,7 @@ static float CookTorr_Spec(float *n, float *l, float *v, int hard, int tangent)
i= spec(nh, hard);
- i= i/(0.1+nv);
+ i= i/(0.1f+nv);
return i;
}
@@ -896,7 +896,7 @@ static void ramp_diffuse_result(float *diff, ShadeInput *shi)
if(ma->ramp_col) {
if(ma->rampin_col==MA_RAMP_IN_RESULT) {
- fac= 0.3*diff[0] + 0.58*diff[1] + 0.12*diff[2];
+ fac= 0.3f*diff[0] + 0.58f*diff[1] + 0.12f*diff[2];
do_colorband(ma->ramp_col, fac, col);
/* blending method */
@@ -926,7 +926,7 @@ static void add_to_diffuse(float *diff, ShadeInput *shi, float is, float r, floa
/* input */
switch(ma->rampin_col) {
case MA_RAMP_IN_ENERGY:
- fac= 0.3*r + 0.58*g + 0.12*b;
+ fac= 0.3f*r + 0.58f*g + 0.12f*b;
break;
case MA_RAMP_IN_SHADER:
fac= is;
@@ -966,7 +966,7 @@ static void ramp_spec_result(float *specr, float *specg, float *specb, ShadeInpu
float fac;
if(ma->ramp_spec && (ma->rampin_spec==MA_RAMP_IN_RESULT)) {
- fac= 0.3*(*specr) + 0.58*(*specg) + 0.12*(*specb);
+ fac= 0.3f*(*specr) + 0.58f*(*specg) + 0.12f*(*specb);
do_colorband(ma->ramp_spec, fac, col);
/* blending method */
@@ -1119,21 +1119,21 @@ float lamp_get_visibility(LampRen *lar, float *co, float *lv, float *dist)
{
if(lar->type==LA_SUN || lar->type==LA_HEMI) {
*dist= 1.0f;
- VECCOPY(lv, lar->vec);
+ copy_v3_v3(lv, lar->vec);
return 1.0f;
}
else {
float visifac= 1.0f, t;
- VECSUB(lv, co, lar->co);
- *dist= sqrt( INPR(lv, lv));
+ sub_v3_v3v3(lv, co, lar->co);
+ *dist= sqrtf(dot_v3v3(lv, lv));
t= 1.0f/dist[0];
- VECMUL(lv, t);
+ mul_v3_fl(lv, t);
/* area type has no quad or sphere option */
if(lar->type==LA_AREA) {
/* area is single sided */
- //if(INPR(lv, lar->vec) > 0.0f)
+ //if(dot_v3v3(lv, lar->vec) > 0.0f)
// visifac= 1.0f;
//else
// visifac= 0.0f;
@@ -1179,11 +1179,11 @@ float lamp_get_visibility(LampRen *lar, float *co, float *lv, float *dist)
float inpr;
if(lar->mode & LA_SQUARE) {
- if(lv[0]*lar->vec[0]+lv[1]*lar->vec[1]+lv[2]*lar->vec[2]>0.0f) {
+ if(dot_v3v3(lv, lar->vec) > 0.0f) {
float lvrot[3], x;
/* rotate view to lampspace */
- VECCOPY(lvrot, lv);
+ copy_v3_v3(lvrot, lv);
mul_m3_v3(lar->imat, lvrot);
x= MAX2(fabs(lvrot[0]/lvrot[2]) , fabs(lvrot[1]/lvrot[2]));
@@ -1213,7 +1213,7 @@ float lamp_get_visibility(LampRen *lar, float *co, float *lv, float *dist)
}
}
}
- if (visifac <= 0.001) visifac = 0.0f;
+ if (visifac <= 0.001f) visifac = 0.0f;
return visifac;
}
}
@@ -1231,7 +1231,7 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
view= shi->view;
- if (lar->energy == 0.0) return;
+ if (lar->energy == 0.0f) return;
/* only shadow lamps shouldn't affect shadow-less materials at all */
if ((lar->mode & LA_ONLYSHADOW) && (!(ma->mode & MA_SHADOW) || !(R.r.mode & R_SHADOW)))
return;
@@ -1279,7 +1279,7 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
cross_v3_v3v3(cross, shi->surfnor, vn);
cross_v3_v3v3(nstrand, vn, cross);
- blend= INPR(nstrand, shi->surfnor);
+ blend= dot_v3v3(nstrand, shi->surfnor);
blend= 1.0f - blend;
CLAMP(blend, 0.0f, 1.0f);
@@ -1314,8 +1314,8 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
/* dot product and reflectivity */
/* inp = dotproduct, is = shader result, i = lamp energy (with shadow), i_noshad = i without shadow */
- inp= vn[0]*lv[0] + vn[1]*lv[1] + vn[2]*lv[2];
-
+ inp= dot_v3v3(vn, lv);
+
/* phong threshold to prevent backfacing faces having artefacts on ray shadow (terminator problem) */
/* this complex construction screams for a nicer implementation! (ton) */
if(R.r.mode & R_SHADOW) {
@@ -1359,7 +1359,7 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
/* 'is' is diffuse */
if((ma->shade_flag & MA_CUBIC) && is>0.0f && is<1.0f)
- is= 3.0*is*is - 2.0*is*is*is; // nicer termination of shades
+ is= 3.0f*is*is - 2.0f*is*is*is; // nicer termination of shades
i= is*phongcorr;
@@ -1383,12 +1383,12 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
if(lar->shb || (lar->mode & LA_SHAD_RAY)) {
if(vn==vnor) /* tangent trigger */
- lamp_get_shadow(lar, shi, INPR(shi->vn, lv), shadfac, shi->depth);
+ lamp_get_shadow(lar, shi, dot_v3v3(shi->vn, lv), shadfac, shi->depth);
else
lamp_get_shadow(lar, shi, inp, shadfac, shi->depth);
/* warning, here it skips the loop */
- if((lar->mode & LA_ONLYSHADOW) && i>0.0) {
+ if((lar->mode & LA_ONLYSHADOW) && i>0.0f) {
shadfac[3]= i*lar->energy*(1.0f-shadfac[3]);
shr->shad[0] -= shadfac[3]*shi->r*(1.0f-lashdw[0]);
@@ -1425,7 +1425,7 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
add_to_diffuse(shr->diff, shi, is, i_noshad*lacol[0], i_noshad*lacol[1], i_noshad*lacol[2]);
}
else
- VECCOPY(shr->diff, shr->shad);
+ copy_v3_v3(shr->diff, shr->shad);
}
}
@@ -1448,7 +1448,7 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
t= vn[0]*lv[0]+vn[1]*lv[1]+vn[2]*lv[2];
if(lar->type==LA_HEMI) {
- t= 0.5*t+0.5;
+ t= 0.5f*t+0.5f;
}
t= shadfac[3]*shi->spec*spec(t, shi->har);
@@ -1531,7 +1531,7 @@ static void shade_lamp_loop_only_shadow(ShadeInput *shi, ShadeResult *shr)
continue;
}
- inpr= INPR(shi->vn, lv);
+ inpr= dot_v3v3(shi->vn, lv);
if(inpr <= 0.0f) {
if (shi->mat->shadowonly_flag == MA_SO_OLD)
accum+= 1.0f;
@@ -1712,9 +1712,9 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
/* AO was calculated for scanline already */
if(shi->depth || shi->volume_depth)
ambient_occlusion(shi);
- VECCOPY(shr->ao, shi->ao);
- VECCOPY(shr->env, shi->env); // XXX multiply
- VECCOPY(shr->indirect, shi->indirect); // XXX multiply
+ copy_v3_v3(shr->ao, shi->ao);
+ copy_v3_v3(shr->env, shi->env); // XXX multiply
+ copy_v3_v3(shr->indirect, shi->indirect); // XXX multiply
}
}
}
@@ -1759,7 +1759,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
invalpha= (shr->col[3] > FLT_EPSILON)? 1.0f/shr->col[3]: 1.0f;
if(texfac==0.0f) {
- VECCOPY(col, shr->col);
+ copy_v3_v3(col, shr->col);
mul_v3_fl(col, invalpha);
}
else if(texfac==1.0f) {
@@ -1767,7 +1767,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
mul_v3_fl(col, invalpha);
}
else {
- VECCOPY(col, shr->col);
+ copy_v3_v3(col, shr->col);
mul_v3_fl(col, invalpha);
col[0]= pow(col[0], 1.0f-texfac);
col[1]= pow(col[1], 1.0f-texfac);
@@ -1787,9 +1787,9 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
}
if(shi->combinedflag & SCE_PASS_SHADOW)
- VECCOPY(shr->combined, shr->shad) /* note, no ';' ! */
+ copy_v3_v3(shr->combined, shr->shad); /* note, no ';' ! */
else
- VECCOPY(shr->combined, shr->diff);
+ copy_v3_v3(shr->combined, shr->diff);
/* calculate shadow pass, we use a multiplication mask */
/* if diff = 0,0,0 it doesn't matter what the shadow pass is, so leave it as is */
@@ -1864,10 +1864,10 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
result[2]= shi->mirb*shi->refcol[3] + (1.0f - shi->mirb*shi->refcol[0])*shr->combined[2];
if(passflag & SCE_PASS_REFLECT)
- VECSUB(shr->refl, result, shr->combined);
+ sub_v3_v3v3(shr->refl, result, shr->combined);
if(shi->combinedflag & SCE_PASS_REFLECT)
- VECCOPY(shr->combined, result);
+ copy_v3_v3(shr->combined, result);
}
diff --git a/source/blender/render/intern/source/sss.c b/source/blender/render/intern/source/sss.c
index 0ba13b31c4b..36b577ce9a4 100644
--- a/source/blender/render/intern/source/sss.c
+++ b/source/blender/render/intern/source/sss.c
@@ -394,8 +394,8 @@ static void traverse_octree(ScatterTree *tree, ScatterNode *node, float *co, int
for(i=0; i<node->totpoint; i++) {
ScatterPoint *p= &node->points[i];
- VECSUB(sub, co, p->co);
- dist= INPR(sub, sub);
+ sub_v3_v3v3(sub, co, p->co);
+ dist= dot_v3v3(sub, sub);
if(p->back)
add_radiance(tree, NULL, p->rad, 0.0f, p->area, dist, result);
@@ -418,8 +418,8 @@ static void traverse_octree(ScatterTree *tree, ScatterNode *node, float *co, int
}
else {
/* decide subnode traversal based on maximum solid angle */
- VECSUB(sub, co, subnode->co);
- dist= INPR(sub, sub);
+ sub_v3_v3v3(sub, co, subnode->co);
+ dist= dot_v3v3(sub, sub);
/* actually area/dist > error, but this avoids division */
if(subnode->area+subnode->backarea>tree->error*dist) {
diff --git a/source/blender/render/intern/source/volume_precache.c b/source/blender/render/intern/source/volume_precache.c
index 2037acc943f..18132c4a7f3 100644
--- a/source/blender/render/intern/source/volume_precache.c
+++ b/source/blender/render/intern/source/volume_precache.c
@@ -490,7 +490,7 @@ static void *vol_precache_part(void *data)
RayObject *tree = pa->tree;
ShadeInput *shi = pa->shi;
float scatter_col[3] = {0.f, 0.f, 0.f};
- float co[3], cco[3];
+ float co[3], cco[3], view[3];
int x, y, z, i;
int res[3];
@@ -523,9 +523,9 @@ static void *vol_precache_part(void *data)
continue;
}
- copy_v3_v3(shi->view, cco);
- normalize_v3(shi->view);
- vol_get_scattering(shi, scatter_col, cco);
+ copy_v3_v3(view, cco);
+ normalize_v3(view);
+ vol_get_scattering(shi, scatter_col, cco, view);
obi->volume_precache->data_r[i] = scatter_col[0];
obi->volume_precache->data_g[i] = scatter_col[1];
diff --git a/source/blender/render/intern/source/volumetric.c b/source/blender/render/intern/source/volumetric.c
index 19bbb11e143..ad6a951adff 100644
--- a/source/blender/render/intern/source/volumetric.c
+++ b/source/blender/render/intern/source/volumetric.c
@@ -70,13 +70,13 @@ extern struct Render R;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* luminance rec. 709 */
-BM_INLINE float luminance(float* col)
+BM_INLINE float luminance(const float col[3])
{
return (0.212671f*col[0] + 0.71516f*col[1] + 0.072169f*col[2]);
}
/* tracing */
-static float vol_get_shadow(ShadeInput *shi, LampRen *lar, float *co)
+static float vol_get_shadow(ShadeInput *shi, LampRen *lar, const float co[3])
{
float visibility = 1.f;
@@ -95,7 +95,7 @@ static float vol_get_shadow(ShadeInput *shi, LampRen *lar, float *co)
is.dir[2] = -lar->vec[2];
is.dist = R.maxdist;
} else {
- VECSUB( is.dir, lar->co, is.start );
+ sub_v3_v3v3(is.dir, lar->co, is.start);
is.dist = normalize_v3( is.dir );
}
@@ -121,11 +121,11 @@ static float vol_get_shadow(ShadeInput *shi, LampRen *lar, float *co)
return visibility;
}
-static int vol_get_bounds(ShadeInput *shi, float *co, float *vec, float *hitco, Isect *isect, int intersect_type)
+static int vol_get_bounds(ShadeInput *shi, const float co[3], const float vec[3], float hitco[3], Isect *isect, int intersect_type)
{
- VECCOPY(isect->start, co);
- VECCOPY(isect->dir, vec );
+ copy_v3_v3(isect->start, co);
+ copy_v3_v3(isect->dir, vec);
isect->dist = FLT_MAX;
isect->mode= RE_RAY_MIRROR;
isect->last_hit = NULL;
@@ -153,7 +153,7 @@ static int vol_get_bounds(ShadeInput *shi, float *co, float *vec, float *hitco,
}
}
-static void shade_intersection(ShadeInput *shi, float *col, Isect *is)
+static void shade_intersection(ShadeInput *shi, float col_r[4], Isect *is)
{
ShadeInput shi_new;
ShadeResult shr_new;
@@ -173,7 +173,7 @@ static void shade_intersection(ShadeInput *shi, float *col, Isect *is)
shi_new.light_override= shi->light_override;
shi_new.mat_override= shi->mat_override;
- VECCOPY(shi_new.camera_co, is->start);
+ copy_v3_v3(shi_new.camera_co, is->start);
memset(&shr_new, 0, sizeof(ShadeResult));
@@ -182,16 +182,16 @@ static void shade_intersection(ShadeInput *shi, float *col, Isect *is)
shade_ray(is, &shi_new, &shr_new);
}
- copy_v3_v3(col, shr_new.combined);
- col[3] = shr_new.alpha;
+ copy_v3_v3(col_r, shr_new.combined);
+ col_r[3] = shr_new.alpha;
}
-static void vol_trace_behind(ShadeInput *shi, VlakRen *vlr, float *co, float *col)
+static void vol_trace_behind(ShadeInput *shi, VlakRen *vlr, const float co[3], float col[3])
{
Isect isect;
- VECCOPY(isect.start, co);
- VECCOPY(isect.dir, shi->view);
+ copy_v3_v3(isect.start, co);
+ copy_v3_v3(isect.dir, shi->view);
isect.dist = FLT_MAX;
isect.mode= RE_RAY_MIRROR;
@@ -213,7 +213,7 @@ static void vol_trace_behind(ShadeInput *shi, VlakRen *vlr, float *co, float *co
/* trilinear interpolation */
-static void vol_get_precached_scattering(Render *re, ShadeInput *shi, float *scatter_col, float *co)
+static void vol_get_precached_scattering(Render *re, ShadeInput *shi, float scatter_col[3], const float co[3])
{
VolumePrecache *vp = shi->obi->volume_precache;
float bbmin[3], bbmax[3], dim[3];
@@ -238,7 +238,7 @@ static void vol_get_precached_scattering(Render *re, ShadeInput *shi, float *sca
/* Meta object density, brute force for now
* (might be good enough anyway, don't need huge number of metaobs to model volumetric objects */
-static float metadensity(Object* ob, float* co)
+static float metadensity(Object* ob, const float co[3])
{
float mat[4][4], imat[4][4], dens = 0.f;
MetaBall* mb = (MetaBall*)ob->data;
@@ -284,7 +284,7 @@ static float metadensity(Object* ob, float* co)
return (dens < 0.f) ? 0.f : dens;
}
-float vol_get_density(struct ShadeInput *shi, float *co)
+float vol_get_density(struct ShadeInput *shi, const float co[3])
{
float density = shi->mat->vol.density;
float density_scale = shi->mat->vol.density_scale;
@@ -305,11 +305,11 @@ float vol_get_density(struct ShadeInput *shi, float *co)
/* Color of light that gets scattered out by the volume */
/* Uses same physically based scattering parameter as in transmission calculations,
* along with artificial reflection scale/reflection color tint */
-static void vol_get_reflection_color(ShadeInput *shi, float *ref_col, float *co)
+static void vol_get_reflection_color(ShadeInput *shi, float ref_col[3], const float co[3])
{
float scatter = shi->mat->vol.scattering;
float reflection= shi->mat->vol.reflection;
- VECCOPY(ref_col, shi->mat->vol.reflection_col);
+ copy_v3_v3(ref_col, shi->mat->vol.reflection_col);
if (shi->mat->mapto_textured & (MAP_SCATTERING+MAP_REFLECTION_COL))
do_volume_tex(shi, co, MAP_SCATTERING+MAP_REFLECTION_COL, ref_col, &scatter);
@@ -325,10 +325,10 @@ static void vol_get_reflection_color(ShadeInput *shi, float *ref_col, float *co)
/* compute emission component, amount of radiance to add per segment
* can be textured with 'emit' */
-static void vol_get_emission(ShadeInput *shi, float *emission_col, float *co)
+static void vol_get_emission(ShadeInput *shi, float emission_col[3], const float co[3])
{
float emission = shi->mat->vol.emission;
- VECCOPY(emission_col, shi->mat->vol.emission_col);
+ copy_v3_v3(emission_col, shi->mat->vol.emission_col);
if (shi->mat->mapto_textured & (MAP_EMISSION+MAP_EMISSION_COL))
do_volume_tex(shi, co, MAP_EMISSION+MAP_EMISSION_COL, emission_col, &emission);
@@ -343,7 +343,7 @@ static void vol_get_emission(ShadeInput *shi, float *emission_col, float *co)
* This can possibly use a specific scattering color,
* and absorption multiplier factor too, but these parameters are left out for simplicity.
* It's easy enough to get a good wide range of results with just these two parameters. */
-static void vol_get_sigma_t(ShadeInput *shi, float *sigma_t, float *co)
+static void vol_get_sigma_t(ShadeInput *shi, float sigma_t[3], const float co[3])
{
/* technically absorption, but named transmission color
* since it describes the effect of the coloring *after* absorption */
@@ -361,7 +361,7 @@ static void vol_get_sigma_t(ShadeInput *shi, float *sigma_t, float *co)
/* phase function - determines in which directions the light
* is scattered in the volume relative to incoming direction
* and view direction */
-static float vol_get_phasefunc(ShadeInput *UNUSED(shi), float g, float *w, float *wp)
+static float vol_get_phasefunc(ShadeInput *UNUSED(shi), float g, const float w[3], const float wp[3])
{
const float normalize = 0.25f; // = 1.f/4.f = M_PI/(4.f*M_PI)
@@ -408,7 +408,7 @@ static float vol_get_phasefunc(ShadeInput *UNUSED(shi), float g, float *w, float
}
/* Compute transmittance = e^(-attenuation) */
-static void vol_get_transmittance_seg(ShadeInput *shi, float *tr, float stepsize, float *co, float density)
+static void vol_get_transmittance_seg(ShadeInput *shi, float tr[3], float stepsize, const float co[3], float density)
{
/* input density = density at co */
float tau[3] = {0.f, 0.f, 0.f};
@@ -428,7 +428,7 @@ static void vol_get_transmittance_seg(ShadeInput *shi, float *tr, float stepsize
}
/* Compute transmittance = e^(-attenuation) */
-static void vol_get_transmittance(ShadeInput *shi, float *tr, float *co, float *endco)
+static void vol_get_transmittance(ShadeInput *shi, float tr[3], const float co[3], const float endco[3])
{
float p[3] = {co[0], co[1], co[2]};
float step_vec[3] = {endco[0] - co[0], endco[1] - co[1], endco[2] - co[2]};
@@ -464,7 +464,7 @@ static void vol_get_transmittance(ShadeInput *shi, float *tr, float *co, float *
tr[2] = expf(-tau[2]);
}
-static void vol_shade_one_lamp(struct ShadeInput *shi, float *co, LampRen *lar, float *lacol)
+static void vol_shade_one_lamp(struct ShadeInput *shi, const float co[3], const float view[3], LampRen *lar, float lacol[3])
{
float visifac, lv[3], lampdist;
float tr[3]={1.0,1.0,1.0};
@@ -487,7 +487,7 @@ static void vol_shade_one_lamp(struct ShadeInput *shi, float *co, LampRen *lar,
mul_v3_fl(lacol, visifac);
if (ELEM(lar->type, LA_SUN, LA_HEMI))
- VECCOPY(lv, lar->vec);
+ copy_v3_v3(lv, lar->vec);
negate_v3(lv);
if (shi->mat->vol.shade_type == MA_VOL_SHADE_SHADOWED) {
@@ -535,7 +535,7 @@ static void vol_shade_one_lamp(struct ShadeInput *shi, float *co, LampRen *lar,
if (luminance(lacol) < 0.001f) return;
normalize_v3(lv);
- p = vol_get_phasefunc(shi, shi->mat->vol.asymmetry, shi->view, lv);
+ p = vol_get_phasefunc(shi, shi->mat->vol.asymmetry, view, lv);
/* physically based scattering with non-physically based RGB gain */
vol_get_reflection_color(shi, ref_col, co);
@@ -546,14 +546,14 @@ static void vol_shade_one_lamp(struct ShadeInput *shi, float *co, LampRen *lar,
}
/* single scattering only for now */
-void vol_get_scattering(ShadeInput *shi, float *scatter_col, float *co)
+void vol_get_scattering(ShadeInput *shi, float scatter_col[3], const float co[3], const float view[3])
{
ListBase *lights;
GroupObject *go;
LampRen *lar;
-
- scatter_col[0] = scatter_col[1] = scatter_col[2] = 0.f;
-
+
+ zero_v3(scatter_col);
+
lights= get_lights(shi);
for(go=lights->first; go; go= go->next)
{
@@ -561,7 +561,7 @@ void vol_get_scattering(ShadeInput *shi, float *scatter_col, float *co)
lar= go->lampren;
if (lar) {
- vol_shade_one_lamp(shi, co, lar, lacol);
+ vol_shade_one_lamp(shi, co, view, lar, lacol);
add_v3_v3(scatter_col, lacol);
}
}
@@ -585,7 +585,7 @@ outgoing radiance from behind surface * beam transmittance/attenuation
* it also makes it harder to control the overall look of the volume since coloring the outscattered light results
* in the inverse color being transmitted through the rest of the volume.
*/
-static void volumeintegrate(struct ShadeInput *shi, float *col, float *co, float *endco)
+static void volumeintegrate(struct ShadeInput *shi, float col[4], const float co[3], const float endco[3])
{
float radiance[3] = {0.f, 0.f, 0.f};
float tr[3] = {1.f, 1.f, 1.f};
@@ -629,7 +629,7 @@ static void volumeintegrate(struct ShadeInput *shi, float *col, float *co, float
vol_get_precached_scattering(&R, shi, scatter_col, p2);
} else
- vol_get_scattering(shi, scatter_col, p);
+ vol_get_scattering(shi, scatter_col, p, shi->view);
radiance[0] += stepd * tr[0] * (emit_col[0] + scatter_col[0]);
radiance[1] += stepd * tr[1] * (emit_col[1] + scatter_col[1]);
@@ -736,7 +736,7 @@ static void volume_trace(struct ShadeInput *shi, struct ShadeResult *shr, int in
copy_v3_v3(shr->combined, col);
shr->alpha = col[3];
- VECCOPY(shr->diff, shr->combined);
+ copy_v3_v3(shr->diff, shr->combined);
}
/* Traces a shadow through the object,
diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c
index 925f8529dfa..ba922620ee1 100644
--- a/source/blender/render/intern/source/zbuf.c
+++ b/source/blender/render/intern/source/zbuf.c
@@ -239,7 +239,7 @@ static short cliptestf(float p, float q, float *u1, float *u2)
return 1;
}
-int testclip(float *v)
+int testclip(const float v[3])
{
float abs4; /* WATCH IT: this function should do the same as cliptestf, otherwise troubles in zbufclip()*/
short c=0;
@@ -1692,7 +1692,7 @@ static void makevertpyra(float *vez, float *labda, float **trias, float *v1, flo
/* ------------------------------------------------------------------------- */
-void projectverto(float *v1, float winmat[][4], float *adr)
+void projectverto(const float v1[3], float winmat[][4], float adr[4])
{
/* calcs homogenic coord of vertex v1 */
float x,y,z;
@@ -1710,7 +1710,7 @@ void projectverto(float *v1, float winmat[][4], float *adr)
/* ------------------------------------------------------------------------- */
-void projectvert(float *v1, float winmat[][4], float *adr)
+void projectvert(const float v1[3], float winmat[][4], float adr[4])
{
/* calcs homogenic coord of vertex v1 */
float x,y,z;
diff --git a/source/blender/windowmanager/intern/wm_dragdrop.c b/source/blender/windowmanager/intern/wm_dragdrop.c
index 21a725124ad..29cbeb84058 100644
--- a/source/blender/windowmanager/intern/wm_dragdrop.c
+++ b/source/blender/windowmanager/intern/wm_dragdrop.c
@@ -256,7 +256,7 @@ static void wm_drop_operator_draw(char *name, int x, int y)
glColor4ub(0, 0, 0, 50);
- uiSetRoundBox(15+16);
+ uiSetRoundBox(UI_CNR_ALL | UI_RB_ALPHA);
uiRoundBox(x, y, x + width + 8, y + 15, 4);
glColor4ub(255, 255, 255, 255);
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 27586525253..518ebeafc80 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -437,9 +437,23 @@ static void wm_operator_print(bContext *C, wmOperator *op)
static void wm_operator_reports(bContext *C, wmOperator *op, int retval, int popup)
{
- if(popup)
- if(op->reports->list.first)
+ if(popup) {
+ if(op->reports->list.first) {
+ /* FIXME, temp setting window, see other call to uiPupMenuReports for why */
+ wmWindow *win_prev= CTX_wm_window(C);
+ ScrArea *area_prev= CTX_wm_area(C);
+ ARegion *ar_prev= CTX_wm_region(C);
+
+ if(win_prev==NULL)
+ CTX_wm_window_set(C, CTX_wm_manager(C)->windows.first);
+
uiPupMenuReports(C, op->reports);
+
+ CTX_wm_window_set(C, win_prev);
+ CTX_wm_area_set(C, area_prev);
+ CTX_wm_region_set(C, ar_prev);
+ }
+ }
if(retval & OPERATOR_FINISHED) {
if(G.f & G_DEBUG)
@@ -877,8 +891,8 @@ static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, PointerRNA
CTX_wm_region_set(C, NULL);
CTX_wm_area_set(C, NULL);
retval= wm_operator_invoke(C, ot, event, properties, reports, poll_only);
- CTX_wm_region_set(C, ar);
CTX_wm_area_set(C, area);
+ CTX_wm_region_set(C, ar);
return retval;
}
@@ -1385,6 +1399,9 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa
* only have because lib linking errors need to be seen by users :(
* it can be removed without breaking anything but then no linking errors - campbell */
wmWindow *win_prev= CTX_wm_window(C);
+ ScrArea *area_prev= CTX_wm_area(C);
+ ARegion *ar_prev= CTX_wm_region(C);
+
if(win_prev==NULL)
CTX_wm_window_set(C, CTX_wm_manager(C)->windows.first);
@@ -1396,6 +1413,8 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa
BLI_movelisttolist(&CTX_wm_reports(C)->list, &handler->op->reports->list);
CTX_wm_window_set(C, win_prev);
+ CTX_wm_area_set(C, area_prev);
+ CTX_wm_region_set(C, ar_prev);
}
WM_operator_free(handler->op);
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c
index 0e94ad72d35..854fa688ea4 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -47,6 +47,7 @@
#include "BKE_blender.h"
#include "BKE_context.h"
#include "BKE_idprop.h"
+#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_screen.h"
@@ -680,6 +681,17 @@ wmKeyMap *WM_modalkeymap_add(wmKeyConfig *keyconf, const char *idname, EnumPrope
wmKeyMap *km= WM_keymap_find(keyconf, idname, 0, 0);
km->flag |= KEYMAP_MODAL;
km->modal_items= items;
+
+ if(!items) {
+ /* init modal items from default config */
+ wmWindowManager *wm = G.main->wm.first;
+ wmKeyMap *defaultkm= WM_keymap_list_find(&wm->defaultconf->keymaps, km->idname, 0, 0);
+
+ if(defaultkm) {
+ km->modal_items = defaultkm->modal_items;
+ km->poll = defaultkm->poll;
+ }
+ }
return km;
}
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index f2f568953c9..338be5c077c 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -109,21 +109,28 @@ static GHash *global_ops_hash= NULL;
wmOperatorType *WM_operatortype_find(const char *idname, int quiet)
{
- wmOperatorType *ot;
-
- char idname_bl[OP_MAX_TYPENAME]; // XXX, needed to support python style names without the _OT_ syntax
- WM_operator_bl_idname(idname_bl, idname);
+ if(idname[0]) {
+ wmOperatorType *ot;
+
+ /* needed to support python style names without the _OT_ syntax */
+ char idname_bl[OP_MAX_TYPENAME];
+ WM_operator_bl_idname(idname_bl, idname);
- if (idname_bl[0]) {
ot= BLI_ghash_lookup(global_ops_hash, idname_bl);
if(ot) {
return ot;
}
+
+ if(!quiet) {
+ printf("search for unknown operator '%s', '%s'\n", idname_bl, idname);
+ }
}
-
- if(!quiet)
- printf("search for unknown operator %s, %s\n", idname_bl, idname);
-
+ else {
+ if(!quiet) {
+ printf("search for empty operator\n");
+ }
+ }
+
return NULL;
}
@@ -1259,11 +1266,12 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(ar
split = uiLayoutSplit(layout, 0, 0);
col = uiLayoutColumn(split, 0);
uiItemL(col, "Links", ICON_NONE);
- uiItemStringO(col, _("Donations"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/blenderorg/blender-foundation/donation-payment/");
- uiItemStringO(col, _("Release Log"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/development/release-logs/blender-259/");
+ uiItemStringO(col, _("Donations"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/blenderorg/blender-foundation/donation-payment");
+ uiItemStringO(col, _("Credits"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/development/credits");
+ uiItemStringO(col, _("Release Log"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/development/release-logs/blender-259");
uiItemStringO(col, _("Manual"), ICON_URL, "WM_OT_url_open", "url", "http://wiki.blender.org/index.php/Doc:2.5/Manual");
- uiItemStringO(col, _("Blender Website"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/");
- uiItemStringO(col, _("User Community"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/community/user-community/"); //
+ uiItemStringO(col, _("Blender Website"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org");
+ uiItemStringO(col, _("User Community"), ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/community/user-community");
if(strcmp(STRINGIFY(BLENDER_VERSION_CYCLE), "release")==0) {
BLI_snprintf(url, sizeof(url), "http://www.blender.org/documentation/blender_python_api_%d_%d" STRINGIFY(BLENDER_VERSION_CHAR) "_release", BLENDER_VERSION/100, BLENDER_VERSION%100);
}
@@ -2074,7 +2082,9 @@ static int wm_collada_import_exec(bContext *C, wmOperator *op)
}
RNA_string_get(op->ptr, "filepath", filename);
- collada_import(C, filename);
+ if(collada_import(C, filename)) return OPERATOR_FINISHED;
+
+ BKE_report(op->reports, RPT_ERROR, "Errors found during parsing COLLADA document. Please see console for error log.");
return OPERATOR_FINISHED;
}
diff --git a/source/blenderplayer/CMakeLists.txt b/source/blenderplayer/CMakeLists.txt
index ddfdfc97bdc..c8bf3b002f1 100644
--- a/source/blenderplayer/CMakeLists.txt
+++ b/source/blenderplayer/CMakeLists.txt
@@ -138,6 +138,7 @@ endif()
bf_intern_ghost # duplicate for linking
bf_blenkernel # duplicate for linking
bf_intern_mikktspace
+ extern_recastnavigation
)
if(WITH_MOD_CLOTH_ELTOPO)
diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c
index a04fdfa0f74..a75668280cd 100644
--- a/source/blenderplayer/bad_level_call_stubs/stubs.c
+++ b/source/blenderplayer/bad_level_call_stubs/stubs.c
@@ -81,6 +81,7 @@ struct SculptSession;
struct ShadeInput;
struct ShadeResult;
struct SpaceImage;
+struct SpaceNode;
struct Tex;
struct TexResult;
struct Text;
@@ -105,7 +106,6 @@ struct bConstraintOb;
struct Context;
struct ChannelDriver;
-
/*new render funcs */
float *RE_RenderLayerGetPass(struct RenderLayer *rl, int passtype) {return (float *) NULL;}
float RE_filter_value(int type, float x) {return 0.0f;}
@@ -184,7 +184,6 @@ void ED_area_headerprint(struct ScrArea *sa, char *str){}
struct EditBone *ED_armature_bone_get_mirrored(struct ListBase *edbo, struct EditBone *ebo){return (struct EditBone *) NULL;}
struct EditBone *ED_armature_edit_bone_add(struct bArmature *arm, char *name){return (struct EditBone*) NULL;}
-struct Object *ED_object_pose_armature(struct Object *ob){ return (struct Object *)NULL; }
struct ListBase *get_active_constraints (struct Object *ob){return (struct ListBase *) NULL;}
struct ListBase *get_constraint_lb(struct Object *ob, struct bConstraint *con, struct bPoseChannel **pchan_r){return (struct ListBase *) NULL;}
int ED_pose_channel_in_IK_chain(struct Object *ob, struct bPoseChannel *pchan){return 0;}
@@ -247,6 +246,7 @@ void WM_cursor_wait (int val) {}
void ED_node_texture_default(struct Tex *tx){}
void ED_node_changed_update(struct bContext *C, struct bNode *node){}
void ED_node_generic_update(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node){}
+void ED_node_tree_update(struct SpaceNode *snode, struct Scene *scene){}
void ED_view3d_scene_layers_update(struct Main *bmain, struct Scene *scene){}
int ED_view3d_scene_layer_set(int lay, const int *values){return 0;}
void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar){}
@@ -297,8 +297,6 @@ void ED_sequencer_update_view(struct bContext *C, int view){}
float ED_rollBoneToVector(struct EditBone *bone, float new_up_axis[3]){return 0.0f;}
void ED_space_image_size(struct SpaceImage *sima, int *width, int *height){}
-struct ListBase *ED_curve_editnurbs(struct Curve *cu){return NULL;}
-void free_curve_editNurb (struct Curve *cu){}
void ED_nurb_set_spline_type(struct Nurb *nu, int type){}
void EM_selectmode_set(struct EditMesh *em){}
diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt
index c76c944b32c..c97bc32e788 100644
--- a/source/creator/CMakeLists.txt
+++ b/source/creator/CMakeLists.txt
@@ -439,17 +439,17 @@ elseif(WIN32)
PATTERN ".svn" EXCLUDE
)
- if(NOT CMAKE_CL_64)
- install(
- FILES ${LIBDIR}/gettext/lib/gnu_gettext.dll
- DESTINATION ${TARGETDIR}
- )
+ install(
+ FILES ${LIBDIR}/gettext/lib/gnu_gettext.dll
+ DESTINATION ${TARGETDIR}
+ )
- install(
- FILES ${LIBDIR}/iconv/lib/iconv.dll
- DESTINATION ${TARGETDIR}
- )
- endif()
+ if(NOT CMAKE_CL_64)
+ install(
+ FILES ${LIBDIR}/iconv/lib/iconv.dll
+ DESTINATION ${TARGETDIR}
+ )
+ endif()
endif()
install( # same as linux!, deduplicate
@@ -721,13 +721,16 @@ add_dependencies(blender makesdna)
get_property(BLENDER_LINK_LIBS GLOBAL PROPERTY BLENDER_LINK_LIBS)
-set(BLENDER_LINK_LIBS bf_nodes ${BLENDER_LINK_LIBS} bf_windowmanager bf_render)
+set(BLENDER_LINK_LIBS
+ ${BLENDER_LINK_LIBS}
+ bf_windowmanager
+ bf_render
+)
if(WITH_MOD_FLUID)
list(APPEND BLENDER_LINK_LIBS bf_intern_elbeem)
endif()
-
#if(UNIX)
# Sort libraries
set(BLENDER_SORTED_LIBS
@@ -808,6 +811,7 @@ endif()
extern_minilzo
extern_lzma
ge_logic_ketsji
+ extern_recastnavigation
ge_phys_common
ge_logic
ge_rasterizer
@@ -815,7 +819,6 @@ endif()
ge_logic_expressions
ge_scenegraph
ge_logic_network
- bf_python # duplicate for BPY_driver_exec
ge_logic_ngnetwork
extern_bullet
ge_logic_loopbacknetwork
diff --git a/source/creator/creator.c b/source/creator/creator.c
index 9b2cfb08382..264b4fc6208 100644
--- a/source/creator/creator.c
+++ b/source/creator/creator.c
@@ -542,22 +542,17 @@ static int set_output(int argc, const char **argv, void *data)
static int set_engine(int argc, const char **argv, void *data)
{
bContext *C = data;
- if (argc >= 1)
- {
- if (!strcmp(argv[1],"help"))
- {
+ if (argc >= 2) {
+ if (!strcmp(argv[1], "help")) {
RenderEngineType *type = NULL;
-
- for( type = R_engines.first; type; type = type->next )
- {
+ printf("Blender Engine Listing:\n");
+ for( type = R_engines.first; type; type = type->next ) {
printf("\t%s\n", type->idname);
}
exit(0);
}
- else
- {
- if (CTX_data_scene(C)==NULL)
- {
+ else {
+ if (CTX_data_scene(C)==NULL) {
printf("\nError: no blend loaded. order the arguments so '-E / --engine ' is after a blend is loaded.\n");
}
else {
@@ -574,7 +569,7 @@ static int set_engine(int argc, const char **argv, void *data)
}
else
{
- printf("\nEngine not specified.\n");
+ printf("\nEngine not specified, give 'help' for a list of available engines.\n");
return 0;
}
}
diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
index 40f1701e44a..ce542671425 100644
--- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
+++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
@@ -169,6 +169,11 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
int disableVBO = (U.gameflags & USER_DISABLE_VBO);
U.gameflags |= USER_DISABLE_VBO;
+ // Globals to be carried on over blender files
+ GlobalSettings gs;
+ gs.matmode= startscene->gm.matmode;
+ gs.glslflag= startscene->gm.flag;
+
do
{
View3D *v3d= CTX_wm_view3d(C);
@@ -239,6 +244,9 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
ketsjiengine->SetTimingDisplay(frameRate, profile, properties);
ketsjiengine->SetRestrictAnimationFPS(restrictAnimFPS);
+ //set the global settings (carried over if restart/load new files)
+ ketsjiengine->SetGlobalSettings(&gs);
+
#ifdef WITH_PYTHON
CValue::SetDeprecationWarnings(nodepwarnings);
#endif
@@ -370,12 +378,12 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
if(GPU_glsl_support())
useglslmat = true;
- else if(scene->gm.matmode == GAME_MAT_GLSL)
+ else if(gs.matmode == GAME_MAT_GLSL)
usemat = false;
- if(usemat && (scene->gm.matmode != GAME_MAT_TEXFACE))
+ if(usemat && (gs.matmode != GAME_MAT_TEXFACE))
sceneconverter->SetMaterials(true);
- if(useglslmat && (scene->gm.matmode == GAME_MAT_GLSL))
+ if(useglslmat && (gs.matmode == GAME_MAT_GLSL))
sceneconverter->SetGLSLMaterials(true);
KX_Scene* startscene = new KX_Scene(keyboarddevice,
@@ -494,6 +502,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
}
printf("Blender Game Engine Finished\n");
exitstring = ketsjiengine->GetExitString();
+ gs = *(ketsjiengine->GetGlobalSettings());
// when exiting the mainloop
@@ -507,9 +516,10 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
//PyDict_Clear(PyModule_GetDict(gameLogic));
// Keep original items, means python plugins will autocomplete members
- int listIndex;
PyObject *gameLogic_keys_new = PyDict_Keys(PyModule_GetDict(gameLogic));
- for (listIndex=0; listIndex < PyList_Size(gameLogic_keys_new); listIndex++) {
+ const Py_ssize_t numitems= PyList_GET_SIZE(gameLogic_keys_new);
+ Py_ssize_t listIndex;
+ for (listIndex=0; listIndex < numitems; listIndex++) {
PyObject* item = PyList_GET_ITEM(gameLogic_keys_new, listIndex);
if (!PySequence_Contains(gameLogic_keys, item)) {
PyDict_DelItem( PyModule_GetDict(gameLogic), item);
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h b/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h
index 67a2279d824..7e9a57a0fe7 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h
@@ -51,197 +51,195 @@
/**
Base Class for Blender specific inputdevices. Blender specific inputdevices are used when the gameengine is running in embedded mode instead of standalone mode.
*/
-class BL_BlenderInputDevice : public SCA_IInputDevice
+class BL_BlenderInputDevice : public SCA_IInputDevice
{
// this map is Blender specific: a conversion between blender and ketsji enums
std::map<int,KX_EnumInputs> m_reverseKeyTranslateTable;
public:
- BL_BlenderInputDevice()
- {
-
- /* The reverse table. In order to not confuse ourselves, we */
- /* immediately convert all events that come in to KX codes. */
- m_reverseKeyTranslateTable[LEFTMOUSE ] = KX_LEFTMOUSE ;
- m_reverseKeyTranslateTable[MIDDLEMOUSE ] = KX_MIDDLEMOUSE ;
- m_reverseKeyTranslateTable[RIGHTMOUSE ] = KX_RIGHTMOUSE ;
- m_reverseKeyTranslateTable[WHEELUPMOUSE ] = KX_WHEELUPMOUSE ;
- m_reverseKeyTranslateTable[WHEELDOWNMOUSE ] = KX_WHEELDOWNMOUSE ;
- m_reverseKeyTranslateTable[MOUSEX ] = KX_MOUSEX ;
- m_reverseKeyTranslateTable[MOUSEY ] = KX_MOUSEY ;
-
- // TIMERS
-
- m_reverseKeyTranslateTable[TIMER0 ] = KX_TIMER0 ;
- m_reverseKeyTranslateTable[TIMER1 ] = KX_TIMER1 ;
- m_reverseKeyTranslateTable[TIMER2 ] = KX_TIMER2 ;
-
- // SYSTEM
-#if 0
- /* **** XXX **** */
- m_reverseKeyTranslateTable[KEYBD ] = KX_KEYBD ;
- m_reverseKeyTranslateTable[RAWKEYBD ] = KX_RAWKEYBD ;
- m_reverseKeyTranslateTable[REDRAW ] = KX_REDRAW ;
- m_reverseKeyTranslateTable[INPUTCHANGE ] = KX_INPUTCHANGE ;
- m_reverseKeyTranslateTable[QFULL ] = KX_QFULL ;
- m_reverseKeyTranslateTable[WINFREEZE ] = KX_WINFREEZE ;
- m_reverseKeyTranslateTable[WINTHAW ] = KX_WINTHAW ;
- m_reverseKeyTranslateTable[WINCLOSE ] = KX_WINCLOSE ;
- m_reverseKeyTranslateTable[WINQUIT ] = KX_WINQUIT ;
- m_reverseKeyTranslateTable[Q_FIRSTTIME ] = KX_Q_FIRSTTIME ;
- /* **** XXX **** */
-#endif
- // standard keyboard
-
- m_reverseKeyTranslateTable[AKEY ] = KX_AKEY ;
- m_reverseKeyTranslateTable[BKEY ] = KX_BKEY ;
- m_reverseKeyTranslateTable[CKEY ] = KX_CKEY ;
- m_reverseKeyTranslateTable[DKEY ] = KX_DKEY ;
- m_reverseKeyTranslateTable[EKEY ] = KX_EKEY ;
- m_reverseKeyTranslateTable[FKEY ] = KX_FKEY ;
- m_reverseKeyTranslateTable[GKEY ] = KX_GKEY ;
-//XXX clean up
+ BL_BlenderInputDevice()
+ {
+
+ /* The reverse table. In order to not confuse ourselves, we */
+ /* immediately convert all events that come in to KX codes. */
+ m_reverseKeyTranslateTable[LEFTMOUSE ] = KX_LEFTMOUSE;
+ m_reverseKeyTranslateTable[MIDDLEMOUSE ] = KX_MIDDLEMOUSE;
+ m_reverseKeyTranslateTable[RIGHTMOUSE ] = KX_RIGHTMOUSE;
+ m_reverseKeyTranslateTable[WHEELUPMOUSE ] = KX_WHEELUPMOUSE;
+ m_reverseKeyTranslateTable[WHEELDOWNMOUSE ] = KX_WHEELDOWNMOUSE;
+ m_reverseKeyTranslateTable[MOUSEX ] = KX_MOUSEX;
+ m_reverseKeyTranslateTable[MOUSEY ] = KX_MOUSEY;
+
+ // TIMERS
+
+ m_reverseKeyTranslateTable[TIMER0 ] = KX_TIMER0;
+ m_reverseKeyTranslateTable[TIMER1 ] = KX_TIMER1;
+ m_reverseKeyTranslateTable[TIMER2 ] = KX_TIMER2;
+
+ // SYSTEM
+#if 0
+ /* **** XXX **** */
+ m_reverseKeyTranslateTable[KEYBD ] = KX_KEYBD;
+ m_reverseKeyTranslateTable[RAWKEYBD ] = KX_RAWKEYBD;
+ m_reverseKeyTranslateTable[REDRAW ] = KX_REDRAW;
+ m_reverseKeyTranslateTable[INPUTCHANGE ] = KX_INPUTCHANGE;
+ m_reverseKeyTranslateTable[QFULL ] = KX_QFULL;
+ m_reverseKeyTranslateTable[WINFREEZE ] = KX_WINFREEZE;
+ m_reverseKeyTranslateTable[WINTHAW ] = KX_WINTHAW;
+ m_reverseKeyTranslateTable[WINCLOSE ] = KX_WINCLOSE;
+ m_reverseKeyTranslateTable[WINQUIT ] = KX_WINQUIT;
+ m_reverseKeyTranslateTable[Q_FIRSTTIME ] = KX_Q_FIRSTTIME;
+ /* **** XXX **** */
+#endif
+ // standard keyboard
+
+ m_reverseKeyTranslateTable[AKEY ] = KX_AKEY;
+ m_reverseKeyTranslateTable[BKEY ] = KX_BKEY;
+ m_reverseKeyTranslateTable[CKEY ] = KX_CKEY;
+ m_reverseKeyTranslateTable[DKEY ] = KX_DKEY;
+ m_reverseKeyTranslateTable[EKEY ] = KX_EKEY;
+ m_reverseKeyTranslateTable[FKEY ] = KX_FKEY;
+ m_reverseKeyTranslateTable[GKEY ] = KX_GKEY;
+ //XXX clean up
#ifdef WIN32
#define HKEY 'h'
#endif
- m_reverseKeyTranslateTable[HKEY ] = KX_HKEY ;
-//XXX clean up
+ m_reverseKeyTranslateTable[HKEY ] = KX_HKEY;
+ //XXX clean up
#ifdef WIN32
#undef HKEY
#endif
- m_reverseKeyTranslateTable[IKEY ] = KX_IKEY ;
- m_reverseKeyTranslateTable[JKEY ] = KX_JKEY ;
- m_reverseKeyTranslateTable[KKEY ] = KX_KKEY ;
- m_reverseKeyTranslateTable[LKEY ] = KX_LKEY ;
- m_reverseKeyTranslateTable[MKEY ] = KX_MKEY ;
- m_reverseKeyTranslateTable[NKEY ] = KX_NKEY ;
- m_reverseKeyTranslateTable[OKEY ] = KX_OKEY ;
- m_reverseKeyTranslateTable[PKEY ] = KX_PKEY ;
- m_reverseKeyTranslateTable[QKEY ] = KX_QKEY ;
- m_reverseKeyTranslateTable[RKEY ] = KX_RKEY ;
- m_reverseKeyTranslateTable[SKEY ] = KX_SKEY ;
- m_reverseKeyTranslateTable[TKEY ] = KX_TKEY ;
- m_reverseKeyTranslateTable[UKEY ] = KX_UKEY ;
- m_reverseKeyTranslateTable[VKEY ] = KX_VKEY ;
- m_reverseKeyTranslateTable[WKEY ] = KX_WKEY ;
- m_reverseKeyTranslateTable[XKEY ] = KX_XKEY ;
- m_reverseKeyTranslateTable[YKEY ] = KX_YKEY ;
- m_reverseKeyTranslateTable[ZKEY ] = KX_ZKEY ;
-
- m_reverseKeyTranslateTable[ZEROKEY ] = KX_ZEROKEY ;
- m_reverseKeyTranslateTable[ONEKEY ] = KX_ONEKEY ;
- m_reverseKeyTranslateTable[TWOKEY ] = KX_TWOKEY ;
- m_reverseKeyTranslateTable[THREEKEY ] = KX_THREEKEY ;
- m_reverseKeyTranslateTable[FOURKEY ] = KX_FOURKEY ;
- m_reverseKeyTranslateTable[FIVEKEY ] = KX_FIVEKEY ;
- m_reverseKeyTranslateTable[SIXKEY ] = KX_SIXKEY ;
- m_reverseKeyTranslateTable[SEVENKEY ] = KX_SEVENKEY ;
- m_reverseKeyTranslateTable[EIGHTKEY ] = KX_EIGHTKEY ;
- m_reverseKeyTranslateTable[NINEKEY ] = KX_NINEKEY ;
-
- m_reverseKeyTranslateTable[CAPSLOCKKEY ] = KX_CAPSLOCKKEY ;
-
- m_reverseKeyTranslateTable[LEFTCTRLKEY ] = KX_LEFTCTRLKEY ;
- m_reverseKeyTranslateTable[LEFTALTKEY ] = KX_LEFTALTKEY ;
- m_reverseKeyTranslateTable[RIGHTALTKEY ] = KX_RIGHTALTKEY ;
- m_reverseKeyTranslateTable[RIGHTCTRLKEY ] = KX_RIGHTCTRLKEY ;
- m_reverseKeyTranslateTable[RIGHTSHIFTKEY ] = KX_RIGHTSHIFTKEY ;
- m_reverseKeyTranslateTable[LEFTSHIFTKEY ] = KX_LEFTSHIFTKEY ;
-
- m_reverseKeyTranslateTable[ESCKEY ] = KX_ESCKEY ;
- m_reverseKeyTranslateTable[TABKEY ] = KX_TABKEY ;
- m_reverseKeyTranslateTable[RETKEY ] = KX_RETKEY ;
- m_reverseKeyTranslateTable[SPACEKEY ] = KX_SPACEKEY ;
- m_reverseKeyTranslateTable[LINEFEEDKEY ] = KX_LINEFEEDKEY ;
- m_reverseKeyTranslateTable[BACKSPACEKEY ] = KX_BACKSPACEKEY ;
- m_reverseKeyTranslateTable[DELKEY ] = KX_DELKEY ;
- m_reverseKeyTranslateTable[SEMICOLONKEY ] = KX_SEMICOLONKEY ;
- m_reverseKeyTranslateTable[PERIODKEY ] = KX_PERIODKEY ;
- m_reverseKeyTranslateTable[COMMAKEY ] = KX_COMMAKEY ;
- m_reverseKeyTranslateTable[QUOTEKEY ] = KX_QUOTEKEY ;
- m_reverseKeyTranslateTable[ACCENTGRAVEKEY ] = KX_ACCENTGRAVEKEY ;
- m_reverseKeyTranslateTable[MINUSKEY ] = KX_MINUSKEY ;
- m_reverseKeyTranslateTable[SLASHKEY ] = KX_SLASHKEY ;
- m_reverseKeyTranslateTable[BACKSLASHKEY ] = KX_BACKSLASHKEY ;
- m_reverseKeyTranslateTable[EQUALKEY ] = KX_EQUALKEY ;
- m_reverseKeyTranslateTable[LEFTBRACKETKEY ] = KX_LEFTBRACKETKEY ;
- m_reverseKeyTranslateTable[RIGHTBRACKETKEY ] = KX_RIGHTBRACKETKEY ;
-
- m_reverseKeyTranslateTable[LEFTARROWKEY ] = KX_LEFTARROWKEY ;
- m_reverseKeyTranslateTable[DOWNARROWKEY ] = KX_DOWNARROWKEY ;
- m_reverseKeyTranslateTable[RIGHTARROWKEY ] = KX_RIGHTARROWKEY ;
- m_reverseKeyTranslateTable[UPARROWKEY ] = KX_UPARROWKEY ;
-
- m_reverseKeyTranslateTable[PAD2 ] = KX_PAD2 ;
- m_reverseKeyTranslateTable[PAD4 ] = KX_PAD4 ;
- m_reverseKeyTranslateTable[PAD6 ] = KX_PAD6 ;
- m_reverseKeyTranslateTable[PAD8 ] = KX_PAD8 ;
-
- m_reverseKeyTranslateTable[PAD1 ] = KX_PAD1 ;
- m_reverseKeyTranslateTable[PAD3 ] = KX_PAD3 ;
- m_reverseKeyTranslateTable[PAD5 ] = KX_PAD5 ;
- m_reverseKeyTranslateTable[PAD7 ] = KX_PAD7 ;
- m_reverseKeyTranslateTable[PAD9 ] = KX_PAD9 ;
-
- m_reverseKeyTranslateTable[PADPERIOD ] = KX_PADPERIOD ;
- m_reverseKeyTranslateTable[PADSLASHKEY ] = KX_PADSLASHKEY ;
- m_reverseKeyTranslateTable[PADASTERKEY ] = KX_PADASTERKEY ;
-
-
- m_reverseKeyTranslateTable[PAD0 ] = KX_PAD0 ;
- m_reverseKeyTranslateTable[PADMINUS ] = KX_PADMINUS ;
- m_reverseKeyTranslateTable[PADENTER ] = KX_PADENTER ;
- m_reverseKeyTranslateTable[PADPLUSKEY ] = KX_PADPLUSKEY ;
-
-
- m_reverseKeyTranslateTable[F1KEY ] = KX_F1KEY ;
- m_reverseKeyTranslateTable[F2KEY ] = KX_F2KEY ;
- m_reverseKeyTranslateTable[F3KEY ] = KX_F3KEY ;
- m_reverseKeyTranslateTable[F4KEY ] = KX_F4KEY ;
- m_reverseKeyTranslateTable[F5KEY ] = KX_F5KEY ;
- m_reverseKeyTranslateTable[F6KEY ] = KX_F6KEY ;
- m_reverseKeyTranslateTable[F7KEY ] = KX_F7KEY ;
- m_reverseKeyTranslateTable[F8KEY ] = KX_F8KEY ;
- m_reverseKeyTranslateTable[F9KEY ] = KX_F9KEY ;
- m_reverseKeyTranslateTable[F10KEY ] = KX_F10KEY ;
- m_reverseKeyTranslateTable[F11KEY ] = KX_F11KEY ;
- m_reverseKeyTranslateTable[F12KEY ] = KX_F12KEY ;
- m_reverseKeyTranslateTable[F13KEY ] = KX_F13KEY ;
- m_reverseKeyTranslateTable[F14KEY ] = KX_F14KEY ;
- m_reverseKeyTranslateTable[F15KEY ] = KX_F15KEY ;
- m_reverseKeyTranslateTable[F16KEY ] = KX_F16KEY ;
- m_reverseKeyTranslateTable[F17KEY ] = KX_F17KEY ;
- m_reverseKeyTranslateTable[F18KEY ] = KX_F18KEY ;
- m_reverseKeyTranslateTable[F19KEY ] = KX_F19KEY ;
-
- m_reverseKeyTranslateTable[PAUSEKEY ] = KX_PAUSEKEY ;
- m_reverseKeyTranslateTable[INSERTKEY ] = KX_INSERTKEY ;
- m_reverseKeyTranslateTable[HOMEKEY ] = KX_HOMEKEY ;
- m_reverseKeyTranslateTable[PAGEUPKEY ] = KX_PAGEUPKEY ;
- m_reverseKeyTranslateTable[PAGEDOWNKEY ] = KX_PAGEDOWNKEY ;
- m_reverseKeyTranslateTable[ENDKEY ] = KX_ENDKEY ;
-
-
- }
+ m_reverseKeyTranslateTable[IKEY ] = KX_IKEY;
+ m_reverseKeyTranslateTable[JKEY ] = KX_JKEY;
+ m_reverseKeyTranslateTable[KKEY ] = KX_KKEY;
+ m_reverseKeyTranslateTable[LKEY ] = KX_LKEY;
+ m_reverseKeyTranslateTable[MKEY ] = KX_MKEY;
+ m_reverseKeyTranslateTable[NKEY ] = KX_NKEY;
+ m_reverseKeyTranslateTable[OKEY ] = KX_OKEY;
+ m_reverseKeyTranslateTable[PKEY ] = KX_PKEY;
+ m_reverseKeyTranslateTable[QKEY ] = KX_QKEY;
+ m_reverseKeyTranslateTable[RKEY ] = KX_RKEY;
+ m_reverseKeyTranslateTable[SKEY ] = KX_SKEY;
+ m_reverseKeyTranslateTable[TKEY ] = KX_TKEY;
+ m_reverseKeyTranslateTable[UKEY ] = KX_UKEY;
+ m_reverseKeyTranslateTable[VKEY ] = KX_VKEY;
+ m_reverseKeyTranslateTable[WKEY ] = KX_WKEY;
+ m_reverseKeyTranslateTable[XKEY ] = KX_XKEY;
+ m_reverseKeyTranslateTable[YKEY ] = KX_YKEY;
+ m_reverseKeyTranslateTable[ZKEY ] = KX_ZKEY;
+
+ m_reverseKeyTranslateTable[ZEROKEY ] = KX_ZEROKEY;
+ m_reverseKeyTranslateTable[ONEKEY ] = KX_ONEKEY;
+ m_reverseKeyTranslateTable[TWOKEY ] = KX_TWOKEY;
+ m_reverseKeyTranslateTable[THREEKEY ] = KX_THREEKEY;
+ m_reverseKeyTranslateTable[FOURKEY ] = KX_FOURKEY;
+ m_reverseKeyTranslateTable[FIVEKEY ] = KX_FIVEKEY;
+ m_reverseKeyTranslateTable[SIXKEY ] = KX_SIXKEY;
+ m_reverseKeyTranslateTable[SEVENKEY ] = KX_SEVENKEY;
+ m_reverseKeyTranslateTable[EIGHTKEY ] = KX_EIGHTKEY;
+ m_reverseKeyTranslateTable[NINEKEY ] = KX_NINEKEY;
+
+ m_reverseKeyTranslateTable[CAPSLOCKKEY ] = KX_CAPSLOCKKEY;
+
+ m_reverseKeyTranslateTable[LEFTCTRLKEY ] = KX_LEFTCTRLKEY;
+ m_reverseKeyTranslateTable[LEFTALTKEY ] = KX_LEFTALTKEY;
+ m_reverseKeyTranslateTable[RIGHTALTKEY ] = KX_RIGHTALTKEY;
+ m_reverseKeyTranslateTable[RIGHTCTRLKEY ] = KX_RIGHTCTRLKEY;
+ m_reverseKeyTranslateTable[RIGHTSHIFTKEY ] = KX_RIGHTSHIFTKEY;
+ m_reverseKeyTranslateTable[LEFTSHIFTKEY ] = KX_LEFTSHIFTKEY;
+
+ m_reverseKeyTranslateTable[ESCKEY ] = KX_ESCKEY;
+ m_reverseKeyTranslateTable[TABKEY ] = KX_TABKEY;
+ m_reverseKeyTranslateTable[RETKEY ] = KX_RETKEY;
+ m_reverseKeyTranslateTable[SPACEKEY ] = KX_SPACEKEY;
+ m_reverseKeyTranslateTable[LINEFEEDKEY ] = KX_LINEFEEDKEY;
+ m_reverseKeyTranslateTable[BACKSPACEKEY ] = KX_BACKSPACEKEY;
+ m_reverseKeyTranslateTable[DELKEY ] = KX_DELKEY;
+ m_reverseKeyTranslateTable[SEMICOLONKEY ] = KX_SEMICOLONKEY;
+ m_reverseKeyTranslateTable[PERIODKEY ] = KX_PERIODKEY;
+ m_reverseKeyTranslateTable[COMMAKEY ] = KX_COMMAKEY;
+ m_reverseKeyTranslateTable[QUOTEKEY ] = KX_QUOTEKEY;
+ m_reverseKeyTranslateTable[ACCENTGRAVEKEY ] = KX_ACCENTGRAVEKEY;
+ m_reverseKeyTranslateTable[MINUSKEY ] = KX_MINUSKEY;
+ m_reverseKeyTranslateTable[SLASHKEY ] = KX_SLASHKEY;
+ m_reverseKeyTranslateTable[BACKSLASHKEY ] = KX_BACKSLASHKEY;
+ m_reverseKeyTranslateTable[EQUALKEY ] = KX_EQUALKEY;
+ m_reverseKeyTranslateTable[LEFTBRACKETKEY ] = KX_LEFTBRACKETKEY;
+ m_reverseKeyTranslateTable[RIGHTBRACKETKEY ] = KX_RIGHTBRACKETKEY;
+
+ m_reverseKeyTranslateTable[LEFTARROWKEY ] = KX_LEFTARROWKEY;
+ m_reverseKeyTranslateTable[DOWNARROWKEY ] = KX_DOWNARROWKEY;
+ m_reverseKeyTranslateTable[RIGHTARROWKEY ] = KX_RIGHTARROWKEY;
+ m_reverseKeyTranslateTable[UPARROWKEY ] = KX_UPARROWKEY;
+
+ m_reverseKeyTranslateTable[PAD2 ] = KX_PAD2;
+ m_reverseKeyTranslateTable[PAD4 ] = KX_PAD4;
+ m_reverseKeyTranslateTable[PAD6 ] = KX_PAD6;
+ m_reverseKeyTranslateTable[PAD8 ] = KX_PAD8;
+
+ m_reverseKeyTranslateTable[PAD1 ] = KX_PAD1;
+ m_reverseKeyTranslateTable[PAD3 ] = KX_PAD3;
+ m_reverseKeyTranslateTable[PAD5 ] = KX_PAD5;
+ m_reverseKeyTranslateTable[PAD7 ] = KX_PAD7;
+ m_reverseKeyTranslateTable[PAD9 ] = KX_PAD9;
+
+ m_reverseKeyTranslateTable[PADPERIOD ] = KX_PADPERIOD;
+ m_reverseKeyTranslateTable[PADSLASHKEY ] = KX_PADSLASHKEY;
+ m_reverseKeyTranslateTable[PADASTERKEY ] = KX_PADASTERKEY;
+
+
+ m_reverseKeyTranslateTable[PAD0 ] = KX_PAD0;
+ m_reverseKeyTranslateTable[PADMINUS ] = KX_PADMINUS;
+ m_reverseKeyTranslateTable[PADENTER ] = KX_PADENTER;
+ m_reverseKeyTranslateTable[PADPLUSKEY ] = KX_PADPLUSKEY;
+
+
+ m_reverseKeyTranslateTable[F1KEY ] = KX_F1KEY;
+ m_reverseKeyTranslateTable[F2KEY ] = KX_F2KEY;
+ m_reverseKeyTranslateTable[F3KEY ] = KX_F3KEY;
+ m_reverseKeyTranslateTable[F4KEY ] = KX_F4KEY;
+ m_reverseKeyTranslateTable[F5KEY ] = KX_F5KEY;
+ m_reverseKeyTranslateTable[F6KEY ] = KX_F6KEY;
+ m_reverseKeyTranslateTable[F7KEY ] = KX_F7KEY;
+ m_reverseKeyTranslateTable[F8KEY ] = KX_F8KEY;
+ m_reverseKeyTranslateTable[F9KEY ] = KX_F9KEY;
+ m_reverseKeyTranslateTable[F10KEY ] = KX_F10KEY;
+ m_reverseKeyTranslateTable[F11KEY ] = KX_F11KEY;
+ m_reverseKeyTranslateTable[F12KEY ] = KX_F12KEY;
+ m_reverseKeyTranslateTable[F13KEY ] = KX_F13KEY;
+ m_reverseKeyTranslateTable[F14KEY ] = KX_F14KEY;
+ m_reverseKeyTranslateTable[F15KEY ] = KX_F15KEY;
+ m_reverseKeyTranslateTable[F16KEY ] = KX_F16KEY;
+ m_reverseKeyTranslateTable[F17KEY ] = KX_F17KEY;
+ m_reverseKeyTranslateTable[F18KEY ] = KX_F18KEY;
+ m_reverseKeyTranslateTable[F19KEY ] = KX_F19KEY;
+
+ m_reverseKeyTranslateTable[PAUSEKEY ] = KX_PAUSEKEY;
+ m_reverseKeyTranslateTable[INSERTKEY ] = KX_INSERTKEY;
+ m_reverseKeyTranslateTable[HOMEKEY ] = KX_HOMEKEY;
+ m_reverseKeyTranslateTable[PAGEUPKEY ] = KX_PAGEUPKEY;
+ m_reverseKeyTranslateTable[PAGEDOWNKEY ] = KX_PAGEDOWNKEY;
+ m_reverseKeyTranslateTable[ENDKEY ] = KX_ENDKEY;
+ }
virtual ~BL_BlenderInputDevice()
- {
+ {
- }
-
- KX_EnumInputs ToNative(unsigned short incode) {
+ }
+
+ KX_EnumInputs ToNative(unsigned short incode) {
return m_reverseKeyTranslateTable[incode];
}
virtual bool IsPressed(SCA_IInputDevice::KX_EnumInputs inputcode)=0;
-// virtual const SCA_InputEvent& GetEventValue(SCA_IInputDevice::KX_EnumInputs inputcode)=0;
+ // virtual const SCA_InputEvent& GetEventValue(SCA_IInputDevice::KX_EnumInputs inputcode)=0;
virtual bool ConvertBlenderEvent(unsigned short incode,short val)=0;
-
+
#ifdef WITH_CXX_GUARDEDALLOC
public:
void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_BlenderInputDevice"); }
void operator delete(void *mem) { MEM_freeN(mem); }
#endif
-};
+};
#endif //__KX_BLENDERINPUTDEVICE
diff --git a/source/gameengine/Converter/BL_ActionActuator.cpp b/source/gameengine/Converter/BL_ActionActuator.cpp
index 50afac6992e..895def17e8e 100644
--- a/source/gameengine/Converter/BL_ActionActuator.cpp
+++ b/source/gameengine/Converter/BL_ActionActuator.cpp
@@ -88,10 +88,10 @@ BL_ActionActuator::BL_ActionActuator(SCA_IObject* gameobj,
m_blendin(blendin),
m_blendstart(0),
m_stridelength(stride),
+ m_layer_weight(layer_weight),
m_playtype(playtype),
m_priority(priority),
m_layer(layer),
- m_layer_weight(layer_weight),
m_ipo_flags(ipo_flags),
m_pose(NULL),
m_blendpose(NULL),
@@ -129,6 +129,50 @@ void BL_ActionActuator::SetBlendTime (float newtime){
m_blendframe = newtime;
}
+void BL_ActionActuator::SetLocalTime(float curtime)
+{
+ float dt = (curtime-m_starttime)*KX_KetsjiEngine::GetAnimFrameRate();
+
+ if (m_endframe < m_startframe)
+ dt = -dt;
+
+ m_localtime = m_startframe + dt;
+
+ // Handle wrap around
+ if (m_localtime < min(m_startframe, m_endframe) || m_localtime > max(m_startframe, m_endframe))
+ {
+ switch(m_playtype)
+ {
+ case ACT_ACTION_PLAY:
+ // Clamp
+ m_localtime = m_endframe;
+ break;
+ case ACT_ACTION_LOOP_END:
+ // Put the time back to the beginning
+ m_localtime = m_startframe;
+ m_starttime = curtime;
+ break;
+ case ACT_ACTION_PINGPONG:
+ // Swap the start and end frames
+ float temp = m_startframe;
+ m_startframe = m_endframe;
+ m_endframe = temp;
+
+ m_starttime = curtime;
+
+ break;
+ }
+ }
+}
+
+void BL_ActionActuator::ResetStartTime(float curtime)
+{
+ float dt = m_localtime - m_startframe;
+
+ m_starttime = curtime - dt / (KX_KetsjiEngine::GetAnimFrameRate());
+ //SetLocalTime(curtime);
+}
+
CValue* BL_ActionActuator::GetReplica() {
BL_ActionActuator* replica = new BL_ActionActuator(*this);//m_float,GetName());
replica->ProcessReplica();
@@ -173,6 +217,9 @@ bool BL_ActionActuator::Update(double curtime, bool frame)
case ACT_ACTION_FROM_PROP:
CValue* prop = GetParent()->GetProperty(m_propname);
+ // If we don't have a property, we can't do anything, so just bail
+ if (!prop) return false;
+
playtype = BL_Action::ACT_MODE_PLAY;
start = end = prop->GetNumber();
@@ -194,11 +241,46 @@ bool BL_ActionActuator::Update(double curtime, bool frame)
RemoveAllEvents();
}
+ if (m_flag & ACT_FLAG_ATTEMPT_PLAY)
+ SetLocalTime(curtime);
+
if (bUseContinue && (m_flag & ACT_FLAG_ACTIVE))
+ {
m_localtime = obj->GetActionFrame(m_layer);
+ ResetStartTime(curtime);
+ }
+
+ // Handle a frame property if it's defined
+ if ((m_flag & ACT_FLAG_ACTIVE) && m_framepropname[0] != 0)
+ {
+ CValue* oldprop = obj->GetProperty(m_framepropname);
+ CValue* newval = new CFloatValue(obj->GetActionFrame(m_layer));
+ if (oldprop)
+ oldprop->SetValue(newval);
+ else
+ obj->SetProperty(m_framepropname, newval);
+
+ newval->Release();
+ }
+
+ // Handle a finished animation
+ if ((m_flag & ACT_FLAG_PLAY_END) && obj->IsActionDone(m_layer))
+ {
+ m_flag &= ~ACT_FLAG_ACTIVE;
+ m_flag &= ~ACT_FLAG_ATTEMPT_PLAY;
+ obj->StopAction(m_layer);
+ return false;
+ }
- if (bPositiveEvent)
+ // If a different action is playing, we've been overruled and are no longer active
+ if (obj->GetCurrentAction(m_layer) != m_action)
+ m_flag &= ~ACT_FLAG_ACTIVE;
+
+ if (bPositiveEvent || (m_flag & ACT_FLAG_ATTEMPT_PLAY && !(m_flag & ACT_FLAG_ACTIVE)))
{
+ if (bPositiveEvent)
+ ResetStartTime(curtime);
+
if (obj->PlayAction(m_action->id.name+2, start, end, m_layer, m_priority, m_blendin, playtype, m_layer_weight, m_ipo_flags))
{
m_flag |= ACT_FLAG_ACTIVE;
@@ -210,11 +292,11 @@ bool BL_ActionActuator::Update(double curtime, bool frame)
else
m_flag &= ~ACT_FLAG_PLAY_END;
}
- else
- return false;
+ m_flag |= ACT_FLAG_ATTEMPT_PLAY;
}
else if ((m_flag & ACT_FLAG_ACTIVE) && bNegativeEvent)
{
+ m_flag &= ~ACT_FLAG_ATTEMPT_PLAY;
bAction *curr_action = obj->GetCurrentAction(m_layer);
if (curr_action && curr_action != m_action)
{
@@ -259,27 +341,6 @@ bool BL_ActionActuator::Update(double curtime, bool frame)
}
}
- // Handle a frame property if it's defined
- if ((m_flag & ACT_FLAG_ACTIVE) && m_framepropname[0] != 0)
- {
- CValue* oldprop = obj->GetProperty(m_framepropname);
- CValue* newval = new CFloatValue(obj->GetActionFrame(m_layer));
- if (oldprop)
- oldprop->SetValue(newval);
- else
- obj->SetProperty(m_framepropname, newval);
-
- newval->Release();
- }
-
- // Handle a finished animation
- if ((m_flag & ACT_FLAG_PLAY_END) && obj->IsActionDone(m_layer))
- {
- m_flag &= ~ACT_FLAG_ACTIVE;
- obj->StopAction(m_layer);
- return false;
- }
-
return true;
}
diff --git a/source/gameengine/Converter/BL_ActionActuator.h b/source/gameengine/Converter/BL_ActionActuator.h
index 5324cb10885..357c2b4a05e 100644
--- a/source/gameengine/Converter/BL_ActionActuator.h
+++ b/source/gameengine/Converter/BL_ActionActuator.h
@@ -64,6 +64,8 @@ public:
virtual void ProcessReplica();
void SetBlendTime (float newtime);
+ void SetLocalTime (float curtime);
+ void ResetStartTime (float curtime);
bAction* GetAction() { return m_action; }
void SetAction(bAction* act) { m_action= act; }
@@ -150,7 +152,7 @@ enum {
ACT_FLAG_ACTIVE = 1<<3,
ACT_FLAG_CONTINUE = 1<<4,
ACT_FLAG_PLAY_END = 1<<5,
-
+ ACT_FLAG_ATTEMPT_PLAY = 1<<6,
};
#endif
diff --git a/source/gameengine/Converter/BL_ArmatureObject.cpp b/source/gameengine/Converter/BL_ArmatureObject.cpp
index 395cae4ba87..684bd3f341e 100644
--- a/source/gameengine/Converter/BL_ArmatureObject.cpp
+++ b/source/gameengine/Converter/BL_ArmatureObject.cpp
@@ -231,10 +231,10 @@ BL_ArmatureObject::BL_ArmatureObject(
m_timestep(0.040),
m_activeAct(NULL),
m_activePriority(999),
+ m_vert_deform_type(vert_deform_type),
m_constraintNumber(0),
m_channelNumber(0),
- m_lastapplyframe(0.0),
- m_vert_deform_type(vert_deform_type)
+ m_lastapplyframe(0.0)
{
m_armature = (bArmature *)armature->data;
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
index fcfc07e631e..d4b43cd7ac1 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
@@ -180,6 +180,9 @@ extern Material defmaterial; /* material.c */
#include "BL_ArmatureObject.h"
#include "BL_DeformableGameObject.h"
+#include "KX_NavMeshObject.h"
+#include "KX_ObstacleSimulation.h"
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -1741,7 +1744,14 @@ static KX_GameObject *gameobject_from_blenderobject(
// needed for python scripting
kxscene->GetLogicManager()->RegisterMeshName(meshobj->GetName(),meshobj);
-
+
+ if (ob->gameflag & OB_NAVMESH)
+ {
+ gameobj = new KX_NavMeshObject(kxscene,KX_Scene::m_callbacks);
+ gameobj->AddMesh(meshobj);
+ break;
+ }
+
gameobj = new BL_DeformableGameObject(ob,kxscene,KX_Scene::m_callbacks);
// set transformation
@@ -2710,6 +2720,46 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
converter->RegisterWorldInfo(worldinfo);
kxscene->SetWorldInfo(worldinfo);
+ //create object representations for obstacle simulation
+ KX_ObstacleSimulation* obssimulation = kxscene->GetObstacleSimulation();
+ if (obssimulation)
+ {
+ for ( i=0;i<objectlist->GetCount();i++)
+ {
+ KX_GameObject* gameobj = static_cast<KX_GameObject*>(objectlist->GetValue(i));
+ struct Object* blenderobject = gameobj->GetBlenderObject();
+ if (blenderobject->gameflag & OB_HASOBSTACLE)
+ {
+ obssimulation->AddObstacleForObj(gameobj);
+ }
+ }
+ }
+
+ //process navigation mesh objects
+ for ( i=0; i<objectlist->GetCount();i++)
+ {
+ KX_GameObject* gameobj = static_cast<KX_GameObject*>(objectlist->GetValue(i));
+ struct Object* blenderobject = gameobj->GetBlenderObject();
+ if (blenderobject->type==OB_MESH && (blenderobject->gameflag & OB_NAVMESH))
+ {
+ KX_NavMeshObject* navmesh = static_cast<KX_NavMeshObject*>(gameobj);
+ navmesh->SetVisible(0, true);
+ navmesh->BuildNavMesh();
+ if (obssimulation)
+ obssimulation->AddObstaclesForNavMesh(navmesh);
+ }
+ }
+ for ( i=0; i<inactivelist->GetCount();i++)
+ {
+ KX_GameObject* gameobj = static_cast<KX_GameObject*>(inactivelist->GetValue(i));
+ struct Object* blenderobject = gameobj->GetBlenderObject();
+ if (blenderobject->type==OB_MESH && (blenderobject->gameflag & OB_NAVMESH))
+ {
+ KX_NavMeshObject* navmesh = static_cast<KX_NavMeshObject*>(gameobj);
+ navmesh->SetVisible(0, true);
+ }
+ }
+
#define CONVERT_LOGIC
#ifdef CONVERT_LOGIC
// convert logic bricks, sensors, controllers and actuators
diff --git a/source/gameengine/Converter/BL_MeshDeformer.h b/source/gameengine/Converter/BL_MeshDeformer.h
index 90466e930fb..0968478ce7e 100644
--- a/source/gameengine/Converter/BL_MeshDeformer.h
+++ b/source/gameengine/Converter/BL_MeshDeformer.h
@@ -88,7 +88,7 @@ protected:
// --
int m_tvtot;
BL_DeformableGameObject* m_gameobj;
- double m_lastDeformUpdate;
+ double m_lastDeformUpdate;
#ifdef WITH_CXX_GUARDEDALLOC
diff --git a/source/gameengine/Converter/BL_ShapeDeformer.h b/source/gameengine/Converter/BL_ShapeDeformer.h
index 655cc9d7aeb..609603ae52b 100644
--- a/source/gameengine/Converter/BL_ShapeDeformer.h
+++ b/source/gameengine/Converter/BL_ShapeDeformer.h
@@ -46,8 +46,8 @@ class BL_ShapeDeformer : public BL_SkinDeformer
{
public:
BL_ShapeDeformer(BL_DeformableGameObject *gameobj,
- Object *bmeshobj,
- RAS_MeshObject *mesh);
+ Object *bmeshobj,
+ RAS_MeshObject *mesh);
/* this second constructor is needed for making a mesh deformable on the fly. */
BL_ShapeDeformer(BL_DeformableGameObject *gameobj,
diff --git a/source/gameengine/Converter/BL_SkinDeformer.cpp b/source/gameengine/Converter/BL_SkinDeformer.cpp
index 3a379e8b0ed..93c65eb38de 100644
--- a/source/gameengine/Converter/BL_SkinDeformer.cpp
+++ b/source/gameengine/Converter/BL_SkinDeformer.cpp
@@ -243,7 +243,6 @@ void BL_SkinDeformer::BGEDeformVerts()
for (int i=0; i<m_bmesh->totvert; ++i)
{
float contrib = 0.f, weight, max_weight=0.f;
- Bone *bone;
bPoseChannel *pchan=NULL;
MDeformVert *dvert;
Eigen::Map<Eigen::Vector3f> norm(m_transnors[i]);
@@ -266,7 +265,6 @@ void BL_SkinDeformer::BGEDeformVerts()
if (index < numGroups && (pchan=m_dfnrToPC[index]))
{
weight = dvert->dw[j].weight;
- bone = pchan->bone;
if (weight)
{
@@ -318,8 +316,8 @@ bool BL_SkinDeformer::UpdateInternal(bool shape_applied)
/* duplicate */
for (int v =0; v<m_bmesh->totvert; v++)
{
- VECCOPY(m_transverts[v], m_bmesh->mvert[v].co);
- VECCOPY(m_transnors[v], m_bmesh->mvert[v].no);
+ copy_v3_v3(m_transverts[v], m_bmesh->mvert[v].co);
+ normal_short_to_float_v3(m_transnors[v], m_bmesh->mvert[v].no);
}
}
diff --git a/source/gameengine/Converter/CMakeLists.txt b/source/gameengine/Converter/CMakeLists.txt
index 3a217ce9d74..039f454e870 100644
--- a/source/gameengine/Converter/CMakeLists.txt
+++ b/source/gameengine/Converter/CMakeLists.txt
@@ -56,6 +56,7 @@ set(INC
../../../intern/guardedalloc
../../../intern/moto/include
../../../intern/string
+ ../../../extern/recastnavigation/Detour/Include
)
set(INC_SYS
diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
index ffb9a8ce691..656dcfa3220 100644
--- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
+++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
@@ -385,6 +385,12 @@ void KX_BlenderSceneConverter::ConvertScene(class KX_Scene* destinationscene,
//This cache mecanism is buggy so I leave it disable and the memory leak
//that would result from this is fixed in RemoveScene()
m_map_mesh_to_gamemesh.clear();
+
+#ifndef USE_BULLET
+ /* quiet compiler warning */
+ (void)useDbvtCulling;
+#endif
+
}
// This function removes all entities stored in the converter for that scene
@@ -679,7 +685,7 @@ void KX_BlenderSceneConverter::ResetPhysicsObjectsAnimationIpo(bool clearIpo)
MEM_freeN( tmpicu );
localDel_ipoCurve( tmpicu );
}
- }
+ }
} else
{ ipo = NULL; // XXX add_ipo(blenderObject->id.name+2, ID_OB);
blenderObject->ipo = ipo;
diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp
index a84a1419d0d..a14e5fb5449 100644
--- a/source/gameengine/Converter/KX_ConvertActuators.cpp
+++ b/source/gameengine/Converter/KX_ConvertActuators.cpp
@@ -72,6 +72,7 @@
#include "KX_SCA_ReplaceMeshActuator.h"
#include "KX_ParentActuator.h"
#include "KX_SCA_DynamicActuator.h"
+#include "KX_SteeringActuator.h"
#include "KX_Scene.h"
#include "KX_KetsjiEngine.h"
@@ -100,6 +101,7 @@
#include "BL_ActionActuator.h"
#include "BL_ShapeActionActuator.h"
#include "BL_ArmatureActuator.h"
+#include "RNA_access.h"
#include "BL_Action.h"
/* end of blender include block */
@@ -413,14 +415,21 @@ void BL_ConvertActuators(char* maggiename,
// if sound shall be 3D but isn't mono, we have to make it mono!
if(is3d)
{
- AUD_Reference<AUD_IReader> reader = snd_sound->createReader();
- if(reader->getSpecs().channels != AUD_CHANNELS_MONO)
+ try
{
- AUD_DeviceSpecs specs;
- specs.channels = AUD_CHANNELS_MONO;
- specs.rate = AUD_RATE_INVALID;
- specs.format = AUD_FORMAT_INVALID;
- snd_sound = new AUD_ChannelMapperFactory(snd_sound, specs);
+ AUD_Reference<AUD_IReader> reader = snd_sound->createReader();
+ if(reader->getSpecs().channels != AUD_CHANNELS_MONO)
+ {
+ AUD_DeviceSpecs specs;
+ specs.channels = AUD_CHANNELS_MONO;
+ specs.rate = AUD_RATE_INVALID;
+ specs.format = AUD_FORMAT_INVALID;
+ snd_sound = new AUD_ChannelMapperFactory(snd_sound, specs);
+ }
+ }
+ catch(AUD_Exception&)
+ {
+ // sound cannot be played... ignore
}
}
}
@@ -942,7 +951,7 @@ void BL_ConvertActuators(char* maggiename,
case ACT_2DFILTER:
{
bTwoDFilterActuator *_2dfilter = (bTwoDFilterActuator*) bact->data;
- SCA_2DFilterActuator *tmp = NULL;
+ SCA_2DFilterActuator *tmp = NULL;
RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode;
switch(_2dfilter->type)
@@ -1057,6 +1066,45 @@ void BL_ConvertActuators(char* maggiename,
baseact = tmparmact;
break;
}
+ case ACT_STEERING:
+ {
+ bSteeringActuator *stAct = (bSteeringActuator *) bact->data;
+ KX_GameObject *navmeshob = NULL;
+ if (stAct->navmesh)
+ {
+ PointerRNA settings_ptr;
+ RNA_pointer_create((ID *)stAct->navmesh, &RNA_GameObjectSettings, stAct->navmesh, &settings_ptr);
+ if (RNA_enum_get(&settings_ptr, "physics_type") == OB_BODY_TYPE_NAVMESH)
+ navmeshob = converter->FindGameObject(stAct->navmesh);
+ }
+ KX_GameObject *targetob = converter->FindGameObject(stAct->target);
+
+ int mode = KX_SteeringActuator::KX_STEERING_NODEF;
+ switch(stAct->type)
+ {
+ case ACT_STEERING_SEEK:
+ mode = KX_SteeringActuator::KX_STEERING_SEEK;
+ break;
+ case ACT_STEERING_FLEE:
+ mode = KX_SteeringActuator::KX_STEERING_FLEE;
+ break;
+ case ACT_STEERING_PATHFOLLOWING:
+ mode = KX_SteeringActuator::KX_STEERING_PATHFOLLOWING;
+ break;
+ }
+
+ bool selfTerminated = (stAct->flag & ACT_STEERING_SELFTERMINATED) !=0;
+ bool enableVisualization = (stAct->flag & ACT_STEERING_ENABLEVISUALIZATION) !=0;
+ short facingMode = (stAct->flag & ACT_STEERING_AUTOMATICFACING) ? stAct->facingaxis : 0;
+ bool normalup = (stAct->flag & ACT_STEERING_NORMALUP) !=0;
+ KX_SteeringActuator *tmpstact
+ = new KX_SteeringActuator(gameobj, mode, targetob, navmeshob,stAct->dist,
+ stAct->velocity, stAct->acceleration, stAct->turnspeed,
+ selfTerminated, stAct->updateTime,
+ scene->GetObstacleSimulation(), facingMode, normalup, enableVisualization);
+ baseact = tmpstact;
+ break;
+ }
default:
; /* generate some error */
}
diff --git a/source/gameengine/Converter/KX_IpoConvert.cpp b/source/gameengine/Converter/KX_IpoConvert.cpp
index 0ee99f5335b..b13dbe324f5 100644
--- a/source/gameengine/Converter/KX_IpoConvert.cpp
+++ b/source/gameengine/Converter/KX_IpoConvert.cpp
@@ -257,7 +257,7 @@ SG_Controller *BL_CreateCameraIPO(struct bAction *action, KX_GameObject* camera
ipocontr->m_clipstart = blendercamera->clipsta;
ipocontr->m_clipend = blendercamera->clipend;
- BL_InterpolatorList *adtList= GetAdtList(blendercamera->adt->action, converter);
+ BL_InterpolatorList *adtList= GetAdtList(action, converter);
// For each active channel in the adtList add an
// interpolator to the game object.
diff --git a/source/gameengine/Converter/SConscript b/source/gameengine/Converter/SConscript
index 0ae22d548c5..e155677e522 100644
--- a/source/gameengine/Converter/SConscript
+++ b/source/gameengine/Converter/SConscript
@@ -20,6 +20,7 @@ incs += ' #source/blender/misc #source/blender/blenloader #source/blender/gpu'
incs += ' #source/blender/windowmanager'
incs += ' #source/blender/makesrna'
incs += ' #source/blender/ikplugin'
+incs += ' #extern/recastnavigation/Detour/Include'
incs += ' #extern/Eigen2'
incs += ' ' + env['BF_BULLET_INC']
diff --git a/source/gameengine/Expressions/IfExpr.h b/source/gameengine/Expressions/IfExpr.h
index 5ac8d835afd..e67134c2271 100644
--- a/source/gameengine/Expressions/IfExpr.h
+++ b/source/gameengine/Expressions/IfExpr.h
@@ -20,7 +20,7 @@
#if !defined(AFX_IFEXPR_H__1F691841_C5C7_11D1_A863_0000B4542BD8__INCLUDED_)
#define AFX_IFEXPR_H__1F691841_C5C7_11D1_A863_0000B4542BD8__INCLUDED_
-#if _MSC_VER >= 1000
+#if defined(_MSC_VER) && _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
diff --git a/source/gameengine/Expressions/ListValue.cpp b/source/gameengine/Expressions/ListValue.cpp
index 271d5067dd9..934f2a8dd87 100644
--- a/source/gameengine/Expressions/ListValue.cpp
+++ b/source/gameengine/Expressions/ListValue.cpp
@@ -387,7 +387,7 @@ PyObject* listvalue_buffer_slice(PyObject* self,Py_ssize_t ilow, Py_ssize_t ihig
static PyObject *listvalue_buffer_concat(PyObject * self, PyObject * other)
{
CListValue *listval= static_cast<CListValue *>(BGE_PROXY_REF(self));
- int i, numitems, numitems_orig;
+ Py_ssize_t i, numitems, numitems_orig;
if (listval==NULL) {
PyErr_SetString(PyExc_SystemError, "CList+other, "BGE_PROXY_ERROR_MSG);
@@ -408,7 +408,7 @@ static PyObject *listvalue_buffer_concat(PyObject * self, PyObject * other)
CValue* listitemval;
bool error = false;
- numitems = PyList_Size(other);
+ numitems = PyList_GET_SIZE(other);
/* copy the first part of the list */
listval_new->Resize(numitems_orig + numitems);
diff --git a/source/gameengine/Expressions/Value.cpp b/source/gameengine/Expressions/Value.cpp
index e60b380e95c..41c0850a779 100644
--- a/source/gameengine/Expressions/Value.cpp
+++ b/source/gameengine/Expressions/Value.cpp
@@ -546,8 +546,8 @@ CValue* CValue::ConvertPythonToValue(PyObject* pyobj, const char *error_prefix)
CListValue* listval = new CListValue();
bool error = false;
- int i;
- int numitems = PyList_Size(pyobj);
+ Py_ssize_t i;
+ Py_ssize_t numitems = PyList_GET_SIZE(pyobj);
for (i=0;i<numitems;i++)
{
PyObject* listitem = PyList_GetItem(pyobj,i); /* borrowed ref */
diff --git a/source/gameengine/GameLogic/SCA_2DFilterActuator.h b/source/gameengine/GameLogic/SCA_2DFilterActuator.h
index 7f31c1713f4..82c82ac3be5 100644
--- a/source/gameengine/GameLogic/SCA_2DFilterActuator.h
+++ b/source/gameengine/GameLogic/SCA_2DFilterActuator.h
@@ -52,19 +52,19 @@ private:
public:
- SCA_2DFilterActuator(
- class SCA_IObject* gameobj,
- RAS_2DFilterManager::RAS_2DFILTER_MODE type,
- short flag,
- float float_arg,
- int int_arg,
- RAS_IRasterizer* rasterizer,
- SCA_IScene* scene);
+ SCA_2DFilterActuator(
+ class SCA_IObject* gameobj,
+ RAS_2DFilterManager::RAS_2DFILTER_MODE type,
+ short flag,
+ float float_arg,
+ int int_arg,
+ RAS_IRasterizer* rasterizer,
+ SCA_IScene* scene);
void SetShaderText(const char *text);
- virtual ~SCA_2DFilterActuator();
- virtual bool Update();
+ virtual ~SCA_2DFilterActuator();
+ virtual bool Update();
- virtual CValue* GetReplica();
+ virtual CValue* GetReplica();
};
#endif
diff --git a/source/gameengine/GameLogic/SCA_IActuator.h b/source/gameengine/GameLogic/SCA_IActuator.h
index bfcec983e2a..d2a8de32895 100644
--- a/source/gameengine/GameLogic/SCA_IActuator.h
+++ b/source/gameengine/GameLogic/SCA_IActuator.h
@@ -90,6 +90,7 @@ public:
KX_ACT_SHAPEACTION,
KX_ACT_STATE,
KX_ACT_ARMATURE,
+ KX_ACT_STEERING,
};
SCA_IActuator(SCA_IObject* gameobj, KX_ACTUATOR_TYPE type);
diff --git a/source/gameengine/GameLogic/SCA_PythonController.h b/source/gameengine/GameLogic/SCA_PythonController.h
index 3ccbfea7ed5..739e566237b 100644
--- a/source/gameengine/GameLogic/SCA_PythonController.h
+++ b/source/gameengine/GameLogic/SCA_PythonController.h
@@ -34,7 +34,7 @@
#ifndef KX_PYTHONCONTROLLER_H
#define KX_PYTHONCONTROLLER_H
-
+
#include "SCA_IController.h"
#include "SCA_LogicManager.h"
#include "BoolValue.h"
diff --git a/source/gameengine/GameLogic/SCA_RandomActuator.cpp b/source/gameengine/GameLogic/SCA_RandomActuator.cpp
index d76f3f775a5..c9d11a27c76 100644
--- a/source/gameengine/GameLogic/SCA_RandomActuator.cpp
+++ b/source/gameengine/GameLogic/SCA_RandomActuator.cpp
@@ -207,10 +207,10 @@ bool SCA_RandomActuator::Update()
sensible values. The termination condition states two
things:
1. s >= 0 is not allowed: to prevent the distro from
- getting a bias towards high values. This is a small
+ getting a bias towards high values. This is a small
correction, really, and might also be left out.
2. s == 0 is not allowed: to prevent a division by zero
- when renormalising the drawn value to the desired
+ when renormalising the drawn value to the desired
distribution shape. As a side effect, the distro will
never yield the exact mean.
I am not sure whether this is consistent, since the error
diff --git a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
index c5daae9c963..7b47d74d424 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
@@ -151,7 +151,7 @@ GPG_Application::~GPG_Application(void)
-bool GPG_Application::SetGameEngineData(struct Main* maggie, Scene *scene, int argc, char **argv)
+bool GPG_Application::SetGameEngineData(struct Main* maggie, Scene *scene, GlobalSettings *gs, int argc, char **argv)
{
bool result = false;
@@ -168,6 +168,9 @@ bool GPG_Application::SetGameEngineData(struct Main* maggie, Scene *scene, int a
m_argc= argc;
m_argv= argv;
+ /* Global Settings */
+ m_globalSettings= gs;
+
return result;
}
@@ -192,7 +195,7 @@ static LRESULT CALLBACK screenSaverWindowProc(HWND hwnd, UINT uMsg, WPARAM wPara
LONG dx = scr_save_mouse_pos.x - pt.x;
LONG dy = scr_save_mouse_pos.y - pt.y;
if (abs(dx) > SCR_SAVE_MOUSE_MOVE_THRESHOLD
- || abs(dy) > SCR_SAVE_MOUSE_MOVE_THRESHOLD)
+ || abs(dy) > SCR_SAVE_MOUSE_MOVE_THRESHOLD)
{
close = TRUE;
}
@@ -511,6 +514,12 @@ int GPG_Application::getExitRequested(void)
}
+GlobalSettings* GPG_Application::getGlobalSettings(void)
+{
+ return m_ketsjiengine->GetGlobalSettings();
+}
+
+
const STR_String& GPG_Application::getExitString(void)
{
@@ -552,7 +561,7 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode)
if(GPU_glsl_support())
m_blenderglslmat = (SYS_GetCommandLineInt(syshandle, "blender_glsl_material", 1) != 0);
- else if(gm->matmode == GAME_MAT_GLSL)
+ else if(m_globalSettings->matmode == GAME_MAT_GLSL)
m_blendermat = false;
// create the canvas, rasterizer and rendertools
@@ -629,6 +638,9 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode)
m_ketsjiengine->SetTimingDisplay(frameRate, profile, properties);
m_ketsjiengine->SetRestrictAnimationFPS(restrictAnimFPS);
+ //set the global settings (carried over if restart/load new files)
+ m_ketsjiengine->SetGlobalSettings(m_globalSettings);
+
m_engineInitialized = true;
}
@@ -685,9 +697,9 @@ bool GPG_Application::startEngine(void)
// if (always_use_expand_framing)
// sceneconverter->SetAlwaysUseExpandFraming(true);
- if(m_blendermat && (m_startScene->gm.matmode != GAME_MAT_TEXFACE))
+ if(m_blendermat && (m_globalSettings->matmode != GAME_MAT_TEXFACE))
m_sceneconverter->SetMaterials(true);
- if(m_blenderglslmat && (m_startScene->gm.matmode == GAME_MAT_GLSL))
+ if(m_blenderglslmat && (m_globalSettings->matmode == GAME_MAT_GLSL))
m_sceneconverter->SetGLSLMaterials(true);
KX_Scene* startscene = new KX_Scene(m_keyboard,
diff --git a/source/gameengine/GamePlayer/ghost/GPG_Application.h b/source/gameengine/GamePlayer/ghost/GPG_Application.h
index c0638517657..df87aea1195 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_Application.h
+++ b/source/gameengine/GamePlayer/ghost/GPG_Application.h
@@ -39,6 +39,8 @@
#include <wtypes.h>
#endif
+#include "KX_KetsjiEngine.h"
+
class KX_KetsjiEngine;
class KX_ISceneConverter;
class NG_LoopBackNetworkDeviceInterface;
@@ -61,7 +63,7 @@ public:
GPG_Application(GHOST_ISystem* system);
~GPG_Application(void);
- bool SetGameEngineData(struct Main* maggie, struct Scene* scene, int argc, char** argv);
+ bool SetGameEngineData(struct Main* maggie, struct Scene* scene, GlobalSettings* gs, int argc, char** argv);
bool startWindow(STR_String& title, int windowLeft, int windowTop, int windowWidth, int windowHeight,
const bool stereoVisual, const int stereoMode, const GHOST_TUns16 samples=0);
bool startFullScreen(int width, int height, int bpp, int frequency, const bool stereoVisual, const int stereoMode, const GHOST_TUns16 samples=0);
@@ -74,6 +76,7 @@ public:
virtual bool processEvent(GHOST_IEvent* event);
int getExitRequested(void);
const STR_String& getExitString(void);
+ GlobalSettings* getGlobalSettings(void);
bool StartGameEngine(int stereoMode);
void StopGameEngine();
@@ -111,6 +114,8 @@ protected:
/* Exit state. */
int m_exitRequested;
STR_String m_exitString;
+ GlobalSettings* m_globalSettings;
+
/* GHOST system abstraction. */
GHOST_ISystem* m_system;
/* Main window. */
diff --git a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
index 5318c417916..2695a67ac4f 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
@@ -751,6 +751,11 @@ int main(int argc, char** argv)
if(filename[0])
BLI_path_cwd(filename);
+
+ // fill the GlobalSettings with the first scene files
+ // those may change during the game and persist after using Game Actuator
+ GlobalSettings gs;
+
do
{
// Read the Blender file
@@ -804,9 +809,13 @@ int main(int argc, char** argv)
Scene *scene = bfd->curscene;
G.main = maggie;
- if (firstTimeRunning)
+ if (firstTimeRunning) {
G.fileflags = bfd->fileflags;
+ gs.matmode= scene->gm.matmode;
+ gs.glslflag= scene->gm.flag;
+ }
+
//Seg Fault; icon.c gIcons == 0
BKE_icons_init(1);
@@ -866,7 +875,7 @@ int main(int argc, char** argv)
}
// GPG_Application app (system, maggie, startscenename);
- app.SetGameEngineData(maggie, scene, argc, argv); /* this argc cant be argc_py_clamped, since python uses it */
+ app.SetGameEngineData(maggie, scene, &gs, argc, argv); /* this argc cant be argc_py_clamped, since python uses it */
BLI_strncpy(pathname, maggie->name, sizeof(pathname));
if(G.main != maggie) {
BLI_strncpy(G.main->name, maggie->name, sizeof(G.main->name));
@@ -962,6 +971,7 @@ int main(int argc, char** argv)
{
run = false;
exitstring = app.getExitString();
+ gs = *app.getGlobalSettings();
}
}
app.StopGameEngine();
diff --git a/source/gameengine/Ketsji/CMakeLists.txt b/source/gameengine/Ketsji/CMakeLists.txt
index 99c9fb25a65..9d8b1781869 100644
--- a/source/gameengine/Ketsji/CMakeLists.txt
+++ b/source/gameengine/Ketsji/CMakeLists.txt
@@ -57,6 +57,8 @@ set(INC
set(INC_SYS
${GLEW_INCLUDE_PATH}
+ ../../../extern/recastnavigation/Recast/Include
+ ../../../extern/recastnavigation/Detour/Include
)
set(SRC
@@ -90,9 +92,11 @@ set(SRC
KX_MeshProxy.cpp
KX_MotionState.cpp
KX_MouseFocusSensor.cpp
+ KX_NavMeshObject.cpp
KX_NearSensor.cpp
KX_ObColorIpoSGController.cpp
KX_ObjectActuator.cpp
+ KX_ObstacleSimulation.cpp
KX_OrientationInterpolator.cpp
KX_ParentActuator.cpp
KX_PhysicsObjectWrapper.cpp
@@ -120,6 +124,7 @@ set(SRC
KX_SceneActuator.cpp
KX_SoundActuator.cpp
KX_StateActuator.cpp
+ KX_SteeringActuator.cpp
KX_TimeCategoryLogger.cpp
KX_TimeLogger.cpp
KX_TouchEventManager.cpp
@@ -167,9 +172,11 @@ set(SRC
KX_MeshProxy.h
KX_MotionState.h
KX_MouseFocusSensor.h
+ KX_NavMeshObject.h
KX_NearSensor.h
KX_ObColorIpoSGController.h
KX_ObjectActuator.h
+ KX_ObstacleSimulation.h
KX_OrientationInterpolator.h
KX_ParentActuator.h
KX_PhysicsEngineEnums.h
@@ -199,6 +206,7 @@ set(SRC
KX_SceneActuator.h
KX_SoundActuator.h
KX_StateActuator.h
+ KX_SteeringActuator.h
KX_TimeCategoryLogger.h
KX_TimeLogger.h
KX_TouchEventManager.h
diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.h b/source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.h
index ff9131f464e..405e2d52989 100644
--- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.h
+++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.h
@@ -43,7 +43,7 @@ class KX_NetworkEventManager : public SCA_EventManager
public:
KX_NetworkEventManager(class SCA_LogicManager* logicmgr,
- class NG_NetworkDeviceInterface *ndi);
+ class NG_NetworkDeviceInterface *ndi);
virtual ~KX_NetworkEventManager ();
virtual void NextFrame();
@@ -51,7 +51,7 @@ public:
SCA_LogicManager* GetLogicManager() { return m_logicmgr; }
class NG_NetworkDeviceInterface* GetNetworkDevice() {
- return m_ndi; }
+ return m_ndi; }
};
#endif //KX_NETWORK_EVENTMANAGER_H
diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp
index 67178803457..ae8d7094015 100644
--- a/source/gameengine/Ketsji/KX_GameObject.cpp
+++ b/source/gameengine/Ketsji/KX_GameObject.cpp
@@ -73,6 +73,7 @@ typedef unsigned long uint_ptr;
#include "SCA_ISensor.h"
#include "SCA_IController.h"
#include "NG_NetworkScene.h" //Needed for sendMessage()
+#include "KX_ObstacleSimulation.h"
#include "BL_ActionManager.h"
@@ -110,8 +111,9 @@ KX_GameObject::KX_GameObject(
m_xray(false),
m_pHitObject(NULL),
m_actionManager(NULL),
- m_isDeformable(false)
- #ifdef WITH_PYTHON
+ m_isDeformable(false),
+ m_pObstacleSimulation(NULL)
+#ifdef WITH_PYTHON
, m_attr_dict(NULL)
#endif
{
@@ -157,8 +159,15 @@ KX_GameObject::~KX_GameObject()
{
delete m_pGraphicController;
}
+
+ if (m_pObstacleSimulation)
+ {
+ m_pObstacleSimulation->DestroyObstacleForObj(this);
+ }
+
if (m_actionManager)
{
+ KX_GetActiveScene()->RemoveAnimatedObject(this);
delete m_actionManager;
}
#ifdef WITH_PYTHON
@@ -355,8 +364,8 @@ BL_ActionManager* KX_GameObject::GetActionManager()
{
// We only want to create an action manager if we need it
if (!m_actionManager)
- m_actionManager = new BL_ActionManager(this);
-
+ { KX_GetActiveScene()->AddAnimatedObject(this); m_actionManager = new BL_ActionManager(this);
+ }
return m_actionManager;
}
@@ -427,6 +436,14 @@ void KX_GameObject::ProcessReplica()
m_actionManager = new BL_ActionManager(this);
m_state = 0;
+ KX_Scene* scene = KX_GetActiveScene();
+ KX_ObstacleSimulation* obssimulation = scene->GetObstacleSimulation();
+ struct Object* blenderobject = GetBlenderObject();
+ if (obssimulation && (blenderobject->gameflag & OB_HASOBSTACLE))
+ {
+ obssimulation->AddObstacleForObj(this);
+ }
+
#ifdef WITH_PYTHON
if(m_attr_dict)
m_attr_dict= PyDict_Copy(m_attr_dict);
diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h
index 6e79914172b..655bc9ff080 100644
--- a/source/gameengine/Ketsji/KX_GameObject.h
+++ b/source/gameengine/Ketsji/KX_GameObject.h
@@ -65,6 +65,7 @@ class PHY_IGraphicController;
class PHY_IPhysicsEnvironment;
class BL_ActionManager;
struct Object;
+class KX_ObstacleSimulation;
struct bAction;
#ifdef WITH_PYTHON
@@ -115,6 +116,9 @@ protected:
MT_CmMatrix4x4 m_OpenGL_4x4Matrix;
+ KX_ObstacleSimulation* m_pObstacleSimulation;
+
+
// The action manager is used to play/stop/update actions
BL_ActionManager* m_actionManager;
@@ -864,6 +868,16 @@ public:
}
m_bSuspendDynamics = false;
}
+
+ void RegisterObstacle(KX_ObstacleSimulation* obstacleSimulation)
+ {
+ m_pObstacleSimulation = obstacleSimulation;
+ }
+
+ void UnregisterObstacle()
+ {
+ m_pObstacleSimulation = NULL;
+ }
KX_ClientObjectInfo* getClientInfo() { return m_pClient_info; }
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
index 878232f7a50..65ff06456b4 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
@@ -84,6 +84,8 @@
#include "DNA_world_types.h"
#include "DNA_scene_types.h"
+#include "KX_NavMeshObject.h"
+
// If define: little test for Nzc: guarded drawing. If the canvas is
// not valid, skip rendering this frame.
//#define NZC_GUARDED_OUTPUT
@@ -886,8 +888,6 @@ void KX_KetsjiEngine::Render()
{
if((*it)->GetViewport())
{
- // Change the active camera so Python scripts can figure out what viewport they're in
- scene->SetActiveCamera(*it);
if (scene->IsClearingZBuffer())
m_rasterizer->ClearDepthBuffer();
@@ -899,10 +899,6 @@ void KX_KetsjiEngine::Render()
it++;
}
-
- // Now change the camera back
- scene->SetActiveCamera(cam);
-
PostRenderScene(scene);
}
@@ -1322,10 +1318,6 @@ void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
if (scene->GetPhysicsEnvironment())
scene->GetPhysicsEnvironment()->debugDrawWorld();
-
-#ifdef WITH_PYTHON
- scene->RunDrawingCallbacks(scene->GetPostDrawCB());
-#endif
}
void KX_KetsjiEngine::RenderFonts(KX_Scene* scene)
@@ -1345,9 +1337,15 @@ To run once per scene
*/
void KX_KetsjiEngine::PostRenderScene(KX_Scene* scene)
{
+ // We need to first make sure our viewport is correct (enabling multiple viewports can mess this up)
+ m_canvas->SetViewPort(0, 0, m_canvas->GetWidth(), m_canvas->GetHeight());
+
m_rendertools->MotionBlur(m_rasterizer);
scene->Render2DFilters(m_canvas);
- m_rasterizer->FlushDebugLines();
+#ifdef WITH_PYTHON
+ scene->RunDrawingCallbacks(scene->GetPostDrawCB());
+#endif
+ m_rasterizer->FlushDebugShapes();
}
void KX_KetsjiEngine::StopEngine()
@@ -1938,4 +1936,14 @@ void KX_KetsjiEngine::GetOverrideFrameColor(float& r, float& g, float& b) const
b = m_overrideFrameColorB;
}
+void KX_KetsjiEngine::SetGlobalSettings(GlobalSettings* gs)
+{
+ m_globalsettings.matmode = gs->matmode;
+ m_globalsettings.glslflag = gs->glslflag;
+}
+
+GlobalSettings* KX_KetsjiEngine::GetGlobalSettings(void)
+{
+ return &m_globalsettings;
+}
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.h b/source/gameengine/Ketsji/KX_KetsjiEngine.h
index b1009c7d8f0..f2f978a0afa 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.h
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.h
@@ -62,6 +62,11 @@ enum KX_ExitRequestMode
KX_EXIT_REQUEST_MAX
};
+typedef struct {
+ short matmode;
+ short glslflag;
+} GlobalSettings;
+
/**
* KX_KetsjiEngine is the core game engine class.
*/
@@ -193,6 +198,9 @@ private:
/** Blue component of framing bar color. */
float m_overrideFrameColorB;
+ /** Settings that doesn't go away with Game Actuator */
+ GlobalSettings m_globalsettings;
+
void RenderFrame(KX_Scene* scene, KX_Camera* cam);
void PostRenderScene(KX_Scene* scene);
void RenderDebugProperties();
@@ -404,7 +412,10 @@ public:
KX_Scene* CreateScene(const STR_String& scenename);
KX_Scene* CreateScene(Scene *scene);
-
+
+ GlobalSettings* GetGlobalSettings(void);
+ void SetGlobalSettings(GlobalSettings* gs);
+
protected:
/**
* Processes all scheduled scene activity.
diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.cpp b/source/gameengine/Ketsji/KX_NavMeshObject.cpp
new file mode 100644
index 00000000000..f72c98fb4bf
--- /dev/null
+++ b/source/gameengine/Ketsji/KX_NavMeshObject.cpp
@@ -0,0 +1,709 @@
+/**
+* $Id$
+* ***** BEGIN GPL LICENSE BLOCK *****
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+* 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 LICENSE BLOCK *****
+*/
+
+#include "BLI_math_vector.h"
+#include "KX_NavMeshObject.h"
+#include "RAS_MeshObject.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+
+extern "C" {
+#include "BKE_scene.h"
+#include "BKE_customdata.h"
+#include "BKE_cdderivedmesh.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_navmesh_conversion.h"
+}
+
+#include "KX_PythonInit.h"
+#include "KX_PyMath.h"
+#include "Value.h"
+#include "Recast.h"
+#include "DetourStatNavMeshBuilder.h"
+#include "KX_ObstacleSimulation.h"
+
+static const int MAX_PATH_LEN = 256;
+static const float polyPickExt[3] = {2, 4, 2};
+
+static void calcMeshBounds(const float* vert, int nverts, float* bmin, float* bmax)
+{
+ bmin[0] = bmax[0] = vert[0];
+ bmin[1] = bmax[1] = vert[1];
+ bmin[2] = bmax[2] = vert[2];
+ for (int i=1; i<nverts; i++)
+ {
+ if (bmin[0]>vert[3*i+0]) bmin[0] = vert[3*i+0];
+ if (bmin[1]>vert[3*i+1]) bmin[1] = vert[3*i+1];
+ if (bmin[2]>vert[3*i+2]) bmin[2] = vert[3*i+2];
+
+ if (bmax[0]<vert[3*i+0]) bmax[0] = vert[3*i+0];
+ if (bmax[1]<vert[3*i+1]) bmax[1] = vert[3*i+1];
+ if (bmax[2]<vert[3*i+2]) bmax[2] = vert[3*i+2];
+ }
+}
+
+inline void flipAxes(float* vec)
+{
+ std::swap(vec[1],vec[2]);
+}
+KX_NavMeshObject::KX_NavMeshObject(void* sgReplicationInfo, SG_Callbacks callbacks)
+: KX_GameObject(sgReplicationInfo, callbacks)
+, m_navMesh(NULL)
+{
+
+}
+
+KX_NavMeshObject::~KX_NavMeshObject()
+{
+ if (m_navMesh)
+ delete m_navMesh;
+}
+
+CValue* KX_NavMeshObject::GetReplica()
+{
+ KX_NavMeshObject* replica = new KX_NavMeshObject(*this);
+ replica->ProcessReplica();
+ return replica;
+}
+
+void KX_NavMeshObject::ProcessReplica()
+{
+ KX_GameObject::ProcessReplica();
+
+ BuildNavMesh();
+ KX_Scene* scene = KX_GetActiveScene();
+ KX_ObstacleSimulation* obssimulation = scene->GetObstacleSimulation();
+ if (obssimulation)
+ obssimulation->AddObstaclesForNavMesh(this);
+
+}
+
+bool KX_NavMeshObject::BuildVertIndArrays(float *&vertices, int& nverts,
+ unsigned short* &polys, int& npolys, unsigned short *&dmeshes,
+ float *&dvertices, int &ndvertsuniq, unsigned short *&dtris,
+ int& ndtris, int &vertsPerPoly)
+{
+ DerivedMesh* dm = mesh_create_derived_no_virtual(KX_GetActiveScene()->GetBlenderScene(), GetBlenderObject(),
+ NULL, CD_MASK_MESH);
+ int* recastData = (int*) dm->getFaceDataArray(dm, CD_RECAST);
+ if (recastData)
+ {
+ int *dtrisToPolysMap=NULL, *dtrisToTrisMap=NULL, *trisToFacesMap=NULL;
+ int nAllVerts = 0;
+ float *allVerts = NULL;
+ buildNavMeshDataByDerivedMesh(dm, vertsPerPoly, nAllVerts, allVerts, ndtris, dtris,
+ npolys, dmeshes, polys, dtrisToPolysMap, dtrisToTrisMap, trisToFacesMap);
+
+ unsigned short *verticesMap = new unsigned short[nAllVerts];
+ memset(verticesMap, 0xffff, sizeof(unsigned short)*nAllVerts);
+ int curIdx = 0;
+ //vertices - mesh verts
+ //iterate over all polys and create map for their vertices first...
+ for (int polyidx=0; polyidx<npolys; polyidx++)
+ {
+ unsigned short* poly = &polys[polyidx*vertsPerPoly*2];
+ for (int i=0; i<vertsPerPoly; i++)
+ {
+ unsigned short idx = poly[i];
+ if (idx==0xffff)
+ break;
+ if (verticesMap[idx]==0xffff)
+ {
+ verticesMap[idx] = curIdx++;
+ }
+ poly[i] = verticesMap[idx];
+ }
+ }
+ nverts = curIdx;
+ //...then iterate over detailed meshes
+ //transform indices to local ones (for each navigation polygon)
+ for (int polyidx=0; polyidx<npolys; polyidx++)
+ {
+ unsigned short *poly = &polys[polyidx*vertsPerPoly*2];
+ int nv = polyNumVerts(poly, vertsPerPoly);
+ unsigned short *dmesh = &dmeshes[4*polyidx];
+ unsigned short tribase = dmesh[2];
+ unsigned short trinum = dmesh[3];
+ unsigned short vbase = curIdx;
+ for (int j=0; j<trinum; j++)
+ {
+ unsigned short* dtri = &dtris[(tribase+j)*3*2];
+ for (int k=0; k<3; k++)
+ {
+ int newVertexIdx = verticesMap[dtri[k]];
+ if (newVertexIdx==0xffff)
+ {
+ newVertexIdx = curIdx++;
+ verticesMap[dtri[k]] = newVertexIdx;
+ }
+
+ if (newVertexIdx<nverts)
+ {
+ //it's polygon vertex ("shared")
+ int idxInPoly = polyFindVertex(poly, vertsPerPoly, newVertexIdx);
+ if (idxInPoly==-1)
+ {
+ printf("Building NavMeshObject: Error! Can't find vertex in polygon\n");
+ return false;
+ }
+ dtri[k] = idxInPoly;
+ }
+ else
+ {
+ dtri[k] = newVertexIdx - vbase + nv;
+ }
+ }
+ }
+ dmesh[0] = vbase-nverts; //verts base
+ dmesh[1] = curIdx-vbase; //verts num
+ }
+
+ vertices = new float[nverts*3];
+ ndvertsuniq = curIdx - nverts;
+ if (ndvertsuniq>0)
+ {
+ dvertices = new float[ndvertsuniq*3];
+ }
+ for (int vi=0; vi<nAllVerts; vi++)
+ {
+ int newIdx = verticesMap[vi];
+ if (newIdx!=0xffff)
+ {
+ if (newIdx<nverts)
+ {
+ //navigation mesh vertex
+ memcpy(vertices+3*newIdx, allVerts+3*vi, 3*sizeof(float));
+ }
+ else
+ {
+ //detailed mesh vertex
+ memcpy(dvertices+3*(newIdx-nverts), allVerts+3*vi, 3*sizeof(float));
+ }
+ }
+ }
+ }
+ else
+ {
+ //create from RAS_MeshObject (detailed mesh is fake)
+ RAS_MeshObject* meshobj = GetMesh(0);
+ vertsPerPoly = 3;
+ nverts = meshobj->m_sharedvertex_map.size();
+ if (nverts >= 0xffff)
+ return false;
+ //calculate count of tris
+ int nmeshpolys = meshobj->NumPolygons();
+ npolys = nmeshpolys;
+ for (int p=0; p<nmeshpolys; p++)
+ {
+ int vertcount = meshobj->GetPolygon(p)->VertexCount();
+ npolys+=vertcount-3;
+ }
+
+ //create verts
+ vertices = new float[nverts*3];
+ float* vert = vertices;
+ for (int vi=0; vi<nverts; vi++)
+ {
+ const float* pos = !meshobj->m_sharedvertex_map[vi].empty() ? meshobj->GetVertexLocation(vi) : NULL;
+ if (pos)
+ copy_v3_v3(vert, pos);
+ else
+ {
+ memset(vert, 0, 3*sizeof(float)); //vertex isn't in any poly, set dummy zero coordinates
+ }
+ vert+=3;
+ }
+
+ //create tris
+ polys = new unsigned short[npolys*3*2];
+ memset(polys, 0xff, sizeof(unsigned short)*3*2*npolys);
+ unsigned short *poly = polys;
+ RAS_Polygon* raspoly;
+ for (int p=0; p<nmeshpolys; p++)
+ {
+ raspoly = meshobj->GetPolygon(p);
+ for (int v=0; v<raspoly->VertexCount()-2; v++)
+ {
+ poly[0]= raspoly->GetVertex(0)->getOrigIndex();
+ for (size_t i=1; i<3; i++)
+ {
+ poly[i]= raspoly->GetVertex(v+i)->getOrigIndex();
+ }
+ poly += 6;
+ }
+ }
+ dmeshes = NULL;
+ dvertices = NULL;
+ ndvertsuniq = 0;
+ dtris = NULL;
+ ndtris = npolys;
+ }
+ dm->release(dm);
+
+ return true;
+}
+
+
+bool KX_NavMeshObject::BuildNavMesh()
+{
+ if (m_navMesh)
+ {
+ delete m_navMesh;
+ m_navMesh = NULL;
+ }
+
+ if (GetMeshCount()==0)
+ {
+ printf("Can't find mesh for navmesh object: %s \n", m_name.ReadPtr());
+ return false;
+ }
+
+ float *vertices = NULL, *dvertices = NULL;
+ unsigned short *polys = NULL, *dtris = NULL, *dmeshes = NULL;
+ int nverts = 0, npolys = 0, ndvertsuniq = 0, ndtris = 0;
+ int vertsPerPoly = 0;
+ if (!BuildVertIndArrays(vertices, nverts, polys, npolys,
+ dmeshes, dvertices, ndvertsuniq, dtris, ndtris, vertsPerPoly )
+ || vertsPerPoly<3)
+ {
+ printf("Can't build navigation mesh data for object:%s \n", m_name.ReadPtr());
+ return false;
+ }
+
+ MT_Point3 pos;
+ if (dmeshes==NULL)
+ {
+ for (int i=0; i<nverts; i++)
+ {
+ flipAxes(&vertices[i*3]);
+ }
+ for (int i=0; i<ndvertsuniq; i++)
+ {
+ flipAxes(&dvertices[i*3]);
+ }
+ }
+
+ buildMeshAdjacency(polys, npolys, nverts, vertsPerPoly);
+
+ float cs = 0.2f;
+
+ if (!nverts || !npolys)
+ return false;
+
+ float bmin[3], bmax[3];
+ calcMeshBounds(vertices, nverts, bmin, bmax);
+ //quantize vertex pos
+ unsigned short* vertsi = new unsigned short[3*nverts];
+ float ics = 1.f/cs;
+ for (int i=0; i<nverts; i++)
+ {
+ vertsi[3*i+0] = static_cast<unsigned short>((vertices[3*i+0]-bmin[0])*ics);
+ vertsi[3*i+1] = static_cast<unsigned short>((vertices[3*i+1]-bmin[1])*ics);
+ vertsi[3*i+2] = static_cast<unsigned short>((vertices[3*i+2]-bmin[2])*ics);
+ }
+
+ // Calculate data size
+ const int headerSize = sizeof(dtStatNavMeshHeader);
+ const int vertsSize = sizeof(float)*3*nverts;
+ const int polysSize = sizeof(dtStatPoly)*npolys;
+ const int nodesSize = sizeof(dtStatBVNode)*npolys*2;
+ const int detailMeshesSize = sizeof(dtStatPolyDetail)*npolys;
+ const int detailVertsSize = sizeof(float)*3*ndvertsuniq;
+ const int detailTrisSize = sizeof(unsigned char)*4*ndtris;
+
+ const int dataSize = headerSize + vertsSize + polysSize + nodesSize +
+ detailMeshesSize + detailVertsSize + detailTrisSize;
+ unsigned char* data = new unsigned char[dataSize];
+ if (!data)
+ return false;
+ memset(data, 0, dataSize);
+
+ unsigned char* d = data;
+ dtStatNavMeshHeader* header = (dtStatNavMeshHeader*)d; d += headerSize;
+ float* navVerts = (float*)d; d += vertsSize;
+ dtStatPoly* navPolys = (dtStatPoly*)d; d += polysSize;
+ dtStatBVNode* navNodes = (dtStatBVNode*)d; d += nodesSize;
+ dtStatPolyDetail* navDMeshes = (dtStatPolyDetail*)d; d += detailMeshesSize;
+ float* navDVerts = (float*)d; d += detailVertsSize;
+ unsigned char* navDTris = (unsigned char*)d; d += detailTrisSize;
+
+ // Store header
+ header->magic = DT_STAT_NAVMESH_MAGIC;
+ header->version = DT_STAT_NAVMESH_VERSION;
+ header->npolys = npolys;
+ header->nverts = nverts;
+ header->cs = cs;
+ header->bmin[0] = bmin[0];
+ header->bmin[1] = bmin[1];
+ header->bmin[2] = bmin[2];
+ header->bmax[0] = bmax[0];
+ header->bmax[1] = bmax[1];
+ header->bmax[2] = bmax[2];
+ header->ndmeshes = npolys;
+ header->ndverts = ndvertsuniq;
+ header->ndtris = ndtris;
+
+ // Store vertices
+ for (int i = 0; i < nverts; ++i)
+ {
+ const unsigned short* iv = &vertsi[i*3];
+ float* v = &navVerts[i*3];
+ v[0] = bmin[0] + iv[0] * cs;
+ v[1] = bmin[1] + iv[1] * cs;
+ v[2] = bmin[2] + iv[2] * cs;
+ }
+ //memcpy(navVerts, vertices, nverts*3*sizeof(float));
+
+ // Store polygons
+ const unsigned short* src = polys;
+ for (int i = 0; i < npolys; ++i)
+ {
+ dtStatPoly* p = &navPolys[i];
+ p->nv = 0;
+ for (int j = 0; j < vertsPerPoly; ++j)
+ {
+ if (src[j] == 0xffff) break;
+ p->v[j] = src[j];
+ p->n[j] = src[vertsPerPoly+j]+1;
+ p->nv++;
+ }
+ src += vertsPerPoly*2;
+ }
+
+ header->nnodes = createBVTree(vertsi, nverts, polys, npolys, vertsPerPoly,
+ cs, cs, npolys*2, navNodes);
+
+
+ if (dmeshes==NULL)
+ {
+ //create fake detail meshes
+ for (int i = 0; i < npolys; ++i)
+ {
+ dtStatPolyDetail& dtl = navDMeshes[i];
+ dtl.vbase = 0;
+ dtl.nverts = 0;
+ dtl.tbase = i;
+ dtl.ntris = 1;
+ }
+ // setup triangles.
+ unsigned char* tri = navDTris;
+ for(size_t i=0; i<ndtris; i++)
+ {
+ for (size_t j=0; j<3; j++)
+ tri[4*i+j] = j;
+ }
+ }
+ else
+ {
+ //verts
+ memcpy(navDVerts, dvertices, ndvertsuniq*3*sizeof(float));
+ //tris
+ unsigned char* tri = navDTris;
+ for(size_t i=0; i<ndtris; i++)
+ {
+ for (size_t j=0; j<3; j++)
+ tri[4*i+j] = dtris[6*i+j];
+ }
+ //detailed meshes
+ for (int i = 0; i < npolys; ++i)
+ {
+ dtStatPolyDetail& dtl = navDMeshes[i];
+ dtl.vbase = dmeshes[i*4+0];
+ dtl.nverts = dmeshes[i*4+1];
+ dtl.tbase = dmeshes[i*4+2];
+ dtl.ntris = dmeshes[i*4+3];
+ }
+ }
+
+ m_navMesh = new dtStatNavMesh;
+ m_navMesh->init(data, dataSize, true);
+
+ delete [] vertices;
+ delete [] polys;
+ if (dvertices)
+ {
+ delete [] dvertices;
+ }
+
+ return true;
+}
+
+dtStatNavMesh* KX_NavMeshObject::GetNavMesh()
+{
+ return m_navMesh;
+}
+
+void KX_NavMeshObject::DrawNavMesh(NavMeshRenderMode renderMode)
+{
+ if (!m_navMesh)
+ return;
+ MT_Vector3 color(0.f, 0.f, 0.f);
+
+ switch (renderMode)
+ {
+ case RM_POLYS :
+ case RM_WALLS :
+ for (int pi=0; pi<m_navMesh->getPolyCount(); pi++)
+ {
+ const dtStatPoly* poly = m_navMesh->getPoly(pi);
+
+ for (int i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j = i++)
+ {
+ if (poly->n[j] && renderMode==RM_WALLS)
+ continue;
+ const float* vif = m_navMesh->getVertex(poly->v[i]);
+ const float* vjf = m_navMesh->getVertex(poly->v[j]);
+ MT_Point3 vi(vif[0], vif[2], vif[1]);
+ MT_Point3 vj(vjf[0], vjf[2], vjf[1]);
+ vi = TransformToWorldCoords(vi);
+ vj = TransformToWorldCoords(vj);
+ KX_RasterizerDrawDebugLine(vi, vj, color);
+ }
+ }
+ break;
+ case RM_TRIS :
+ for (int i = 0; i < m_navMesh->getPolyDetailCount(); ++i)
+ {
+ const dtStatPoly* p = m_navMesh->getPoly(i);
+ const dtStatPolyDetail* pd = m_navMesh->getPolyDetail(i);
+
+ for (int j = 0; j < pd->ntris; ++j)
+ {
+ const unsigned char* t = m_navMesh->getDetailTri(pd->tbase+j);
+ MT_Point3 tri[3];
+ for (int k = 0; k < 3; ++k)
+ {
+ const float* v;
+ if (t[k] < p->nv)
+ v = m_navMesh->getVertex(p->v[t[k]]);
+ else
+ v = m_navMesh->getDetailVertex(pd->vbase+(t[k]-p->nv));
+ float pos[3];
+ vcopy(pos, v);
+ flipAxes(pos);
+ tri[k].setValue(pos);
+ }
+
+ for (int k=0; k<3; k++)
+ tri[k] = TransformToWorldCoords(tri[k]);
+
+ for (int k=0; k<3; k++)
+ KX_RasterizerDrawDebugLine(tri[k], tri[(k+1)%3], color);
+ }
+ }
+ break;
+ default:
+ /* pass */
+ break;
+ }
+}
+
+MT_Point3 KX_NavMeshObject::TransformToLocalCoords(const MT_Point3& wpos)
+{
+ MT_Matrix3x3 orientation = NodeGetWorldOrientation();
+ const MT_Vector3& scaling = NodeGetWorldScaling();
+ orientation.scale(scaling[0], scaling[1], scaling[2]);
+ MT_Transform worldtr(NodeGetWorldPosition(), orientation);
+ MT_Transform invworldtr;
+ invworldtr.invert(worldtr);
+ MT_Point3 lpos = invworldtr(wpos);
+ return lpos;
+}
+
+MT_Point3 KX_NavMeshObject::TransformToWorldCoords(const MT_Point3& lpos)
+{
+ MT_Matrix3x3 orientation = NodeGetWorldOrientation();
+ const MT_Vector3& scaling = NodeGetWorldScaling();
+ orientation.scale(scaling[0], scaling[1], scaling[2]);
+ MT_Transform worldtr(NodeGetWorldPosition(), orientation);
+ MT_Point3 wpos = worldtr(lpos);
+ return wpos;
+}
+
+int KX_NavMeshObject::FindPath(const MT_Point3& from, const MT_Point3& to, float* path, int maxPathLen)
+{
+ if (!m_navMesh)
+ return 0;
+ MT_Point3 localfrom = TransformToLocalCoords(from);
+ MT_Point3 localto = TransformToLocalCoords(to);
+ float spos[3], epos[3];
+ localfrom.getValue(spos); flipAxes(spos);
+ localto.getValue(epos); flipAxes(epos);
+ dtStatPolyRef sPolyRef = m_navMesh->findNearestPoly(spos, polyPickExt);
+ dtStatPolyRef ePolyRef = m_navMesh->findNearestPoly(epos, polyPickExt);
+
+ int pathLen = 0;
+ if (sPolyRef && ePolyRef)
+ {
+ dtStatPolyRef* polys = new dtStatPolyRef[maxPathLen];
+ int npolys;
+ npolys = m_navMesh->findPath(sPolyRef, ePolyRef, spos, epos, polys, maxPathLen);
+ if (npolys)
+ {
+ pathLen = m_navMesh->findStraightPath(spos, epos, polys, npolys, path, maxPathLen);
+ for (int i=0; i<pathLen; i++)
+ {
+ flipAxes(&path[i*3]);
+ MT_Point3 waypoint(&path[i*3]);
+ waypoint = TransformToWorldCoords(waypoint);
+ waypoint.getValue(&path[i*3]);
+ }
+ }
+ }
+
+ return pathLen;
+}
+
+float KX_NavMeshObject::Raycast(const MT_Point3& from, const MT_Point3& to)
+{
+ if (!m_navMesh)
+ return 0.f;
+ MT_Point3 localfrom = TransformToLocalCoords(from);
+ MT_Point3 localto = TransformToLocalCoords(to);
+ float spos[3], epos[3];
+ localfrom.getValue(spos); flipAxes(spos);
+ localto.getValue(epos); flipAxes(epos);
+ dtStatPolyRef sPolyRef = m_navMesh->findNearestPoly(spos, polyPickExt);
+ float t=0;
+ static dtStatPolyRef polys[MAX_PATH_LEN];
+ m_navMesh->raycast(sPolyRef, spos, epos, t, polys, MAX_PATH_LEN);
+ return t;
+}
+
+void KX_NavMeshObject::DrawPath(const float *path, int pathLen, const MT_Vector3& color)
+{
+ MT_Vector3 a,b;
+ for (int i=0; i<pathLen-1; i++)
+ {
+ a.setValue(&path[3*i]);
+ b.setValue(&path[3*(i+1)]);
+ KX_RasterizerDrawDebugLine(a, b, color);
+ }
+}
+
+
+#ifndef DISABLE_PYTHON
+//----------------------------------------------------------------------------
+//Python
+
+PyTypeObject KX_NavMeshObject::Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "KX_NavMeshObject",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,
+ 0,
+ 0,
+ 0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &KX_GameObject::Type,
+ 0,0,0,0,0,0,
+ py_base_new
+};
+
+PyAttributeDef KX_NavMeshObject::Attributes[] = {
+ { NULL } //Sentinel
+};
+
+//KX_PYMETHODTABLE_NOARGS(KX_GameObject, getD),
+PyMethodDef KX_NavMeshObject::Methods[] = {
+ KX_PYMETHODTABLE(KX_NavMeshObject, findPath),
+ KX_PYMETHODTABLE(KX_NavMeshObject, raycast),
+ KX_PYMETHODTABLE(KX_NavMeshObject, draw),
+ KX_PYMETHODTABLE(KX_NavMeshObject, rebuild),
+ {NULL,NULL} //Sentinel
+};
+
+KX_PYMETHODDEF_DOC(KX_NavMeshObject, findPath,
+ "findPath(start, goal): find path from start to goal points\n"
+ "Returns a path as list of points)\n")
+{
+ PyObject *ob_from, *ob_to;
+ if (!PyArg_ParseTuple(args,"OO:getPath",&ob_from,&ob_to))
+ return NULL;
+ MT_Point3 from, to;
+ if (!PyVecTo(ob_from, from) || !PyVecTo(ob_to, to))
+ return NULL;
+
+ float path[MAX_PATH_LEN*3];
+ int pathLen = FindPath(from, to, path, MAX_PATH_LEN);
+ PyObject *pathList = PyList_New( pathLen );
+ for (int i=0; i<pathLen; i++)
+ {
+ MT_Point3 point(&path[3*i]);
+ PyList_SET_ITEM(pathList, i, PyObjectFrom(point));
+ }
+
+ return pathList;
+}
+
+KX_PYMETHODDEF_DOC(KX_NavMeshObject, raycast,
+ "raycast(start, goal): raycast from start to goal points\n"
+ "Returns hit factor)\n")
+{
+ PyObject *ob_from, *ob_to;
+ if (!PyArg_ParseTuple(args,"OO:getPath",&ob_from,&ob_to))
+ return NULL;
+ MT_Point3 from, to;
+ if (!PyVecTo(ob_from, from) || !PyVecTo(ob_to, to))
+ return NULL;
+ float hit = Raycast(from, to);
+ return PyFloat_FromDouble(hit);
+}
+
+KX_PYMETHODDEF_DOC(KX_NavMeshObject, draw,
+ "draw(mode): navigation mesh debug drawing\n"
+ "mode: WALLS, POLYS, TRIS\n")
+{
+ int arg;
+ NavMeshRenderMode renderMode = RM_TRIS;
+ if (PyArg_ParseTuple(args,"i:rebuild",&arg) && arg>=0 && arg<RM_MAX)
+ renderMode = (NavMeshRenderMode)arg;
+ DrawNavMesh(renderMode);
+ Py_RETURN_NONE;
+}
+
+KX_PYMETHODDEF_DOC_NOARGS(KX_NavMeshObject, rebuild,
+ "rebuild(): rebuild navigation mesh\n")
+{
+ BuildNavMesh();
+ Py_RETURN_NONE;
+}
+
+#endif // DISABLE_PYTHON
diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.h b/source/gameengine/Ketsji/KX_NavMeshObject.h
new file mode 100644
index 00000000000..78e9488ad1c
--- /dev/null
+++ b/source/gameengine/Ketsji/KX_NavMeshObject.h
@@ -0,0 +1,83 @@
+/**
+* $Id$
+*
+* ***** BEGIN GPL LICENSE BLOCK *****
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+* 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 LICENSE BLOCK *****
+*/
+#ifndef __KX_NAVMESHOBJECT
+#define __KX_NAVMESHOBJECT
+#include "DetourStatNavMesh.h"
+#include "KX_GameObject.h"
+#include "PyObjectPlus.h"
+#include <vector>
+
+class RAS_MeshObject;
+class MT_Transform;
+
+class KX_NavMeshObject: public KX_GameObject
+{
+ Py_Header;
+
+protected:
+ dtStatNavMesh* m_navMesh;
+
+ bool BuildVertIndArrays(float *&vertices, int& nverts,
+ unsigned short* &polys, int& npolys, unsigned short *&dmeshes,
+ float *&dvertices, int &ndvertsuniq, unsigned short* &dtris,
+ int& ndtris, int &vertsPerPoly);
+
+public:
+ KX_NavMeshObject(void* sgReplicationInfo, SG_Callbacks callbacks);
+ ~KX_NavMeshObject();
+
+ virtual CValue* GetReplica();
+ virtual void ProcessReplica();
+
+
+ bool BuildNavMesh();
+ dtStatNavMesh* GetNavMesh();
+ int FindPath(const MT_Point3& from, const MT_Point3& to, float* path, int maxPathLen);
+ float Raycast(const MT_Point3& from, const MT_Point3& to);
+
+ enum NavMeshRenderMode {RM_WALLS, RM_POLYS, RM_TRIS, RM_MAX};
+ void DrawNavMesh(NavMeshRenderMode mode);
+ void DrawPath(const float *path, int pathLen, const MT_Vector3& color);
+
+ MT_Point3 TransformToLocalCoords(const MT_Point3& wpos);
+ MT_Point3 TransformToWorldCoords(const MT_Point3& lpos);
+#ifndef DISABLE_PYTHON
+ /* --------------------------------------------------------------------- */
+ /* Python interface ---------------------------------------------------- */
+ /* --------------------------------------------------------------------- */
+
+ KX_PYMETHOD_DOC(KX_NavMeshObject, findPath);
+ KX_PYMETHOD_DOC(KX_NavMeshObject, raycast);
+ KX_PYMETHOD_DOC(KX_NavMeshObject, draw);
+ KX_PYMETHOD_DOC_NOARGS(KX_NavMeshObject, rebuild);
+#endif
+};
+
+#endif //__KX_NAVMESHOBJECT
+
diff --git a/source/gameengine/Ketsji/KX_ObjectActuator.cpp b/source/gameengine/Ketsji/KX_ObjectActuator.cpp
index 7289ffc6e29..cb59ef42699 100644
--- a/source/gameengine/Ketsji/KX_ObjectActuator.cpp
+++ b/source/gameengine/Ketsji/KX_ObjectActuator.cpp
@@ -237,9 +237,9 @@ bool KX_ObjectActuator::Update()
if (m_current_linear_factor > 1.0)
m_current_linear_factor = 1.0;
linV = m_current_linear_factor * m_linear_velocity;
- parent->setLinearVelocity(linV,(m_bitLocalFlag.LinearVelocity) != 0);
+ parent->setLinearVelocity(linV,(m_bitLocalFlag.LinearVelocity) != 0);
} else {
- parent->setLinearVelocity(m_linear_velocity,(m_bitLocalFlag.LinearVelocity) != 0);
+ parent->setLinearVelocity(m_linear_velocity,(m_bitLocalFlag.LinearVelocity) != 0);
}
}
}
@@ -260,7 +260,7 @@ bool KX_ObjectActuator::Update()
if (m_current_angular_factor > 1.0)
m_current_angular_factor = 1.0;
angV = m_current_angular_factor * m_angular_velocity;
- parent->setAngularVelocity(angV,(m_bitLocalFlag.AngularVelocity) != 0);
+ parent->setAngularVelocity(angV,(m_bitLocalFlag.AngularVelocity) != 0);
} else {
parent->setAngularVelocity(m_angular_velocity,(m_bitLocalFlag.AngularVelocity) != 0);
}
diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp
new file mode 100644
index 00000000000..5f78d9a3722
--- /dev/null
+++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp
@@ -0,0 +1,869 @@
+/**
+* Simulation for obstacle avoidance behavior
+*
+* $Id$
+*
+* ***** BEGIN GPL LICENSE BLOCK *****
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version. The Blender
+* Foundation also sells licenses for use in proprietary software under
+* the Blender License. See http://www.blender.org/BL/ for information
+* about this.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 LICENSE BLOCK *****
+*/
+
+#include "KX_ObstacleSimulation.h"
+#include "KX_NavMeshObject.h"
+#include "KX_PythonInit.h"
+#include "DNA_object_types.h"
+#include "BLI_math.h"
+
+namespace
+{
+ inline float perp(const MT_Vector2& a, const MT_Vector2& b) { return a.x()*b.y() - a.y()*b.x(); }
+
+ inline float sqr(float x) { return x*x; }
+ inline float lerp(float a, float b, float t) { return a + (b-a)*t; }
+ inline float clamp(float a, float mn, float mx) { return a < mn ? mn : (a > mx ? mx : a); }
+
+ inline float vdistsqr(const float* a, const float* b) { return sqr(b[0]-a[0]) + sqr(b[1]-a[1]); }
+ inline float vdist(const float* a, const float* b) { return sqrtf(vdistsqr(a,b)); }
+ inline void vcpy(float* a, const float* b) { a[0]=b[0]; a[1]=b[1]; }
+ inline float vdot(const float* a, const float* b) { return a[0]*b[0] + a[1]*b[1]; }
+ inline float vperp(const float* a, const float* b) { return a[0]*b[1] - a[1]*b[0]; }
+ inline void vsub(float* v, const float* a, const float* b) { v[0] = a[0]-b[0]; v[1] = a[1]-b[1]; }
+ inline void vadd(float* v, const float* a, const float* b) { v[0] = a[0]+b[0]; v[1] = a[1]+b[1]; }
+ inline void vscale(float* v, const float* a, const float s) { v[0] = a[0]*s; v[1] = a[1]*s; }
+ inline void vset(float* v, float x, float y) { v[0]=x; v[1]=y; }
+ inline float vlensqr(const float* v) { return vdot(v,v); }
+ inline float vlen(const float* v) { return sqrtf(vlensqr(v)); }
+ inline void vlerp(float* v, const float* a, const float* b, float t) { v[0] = lerp(a[0], b[0], t); v[1] = lerp(a[1], b[1], t); }
+ inline void vmad(float* v, const float* a, const float* b, float s) { v[0] = a[0] + b[0]*s; v[1] = a[1] + b[1]*s; }
+ inline void vnorm(float* v)
+ {
+ float d = vlen(v);
+ if (d > 0.0001f)
+ {
+ d = 1.0f/d;
+ v[0] *= d;
+ v[1] *= d;
+ }
+ }
+}
+inline float triarea(const float* a, const float* b, const float* c)
+{
+ return (b[0]*a[1] - a[0]*b[1]) + (c[0]*b[1] - b[0]*c[1]) + (a[0]*c[1] - c[0]*a[1]);
+}
+
+static void closestPtPtSeg(const float* pt,
+ const float* sp, const float* sq,
+ float& t)
+{
+ float dir[2],diff[3];
+ vsub(dir,sq,sp);
+ vsub(diff,pt,sp);
+ t = vdot(diff,dir);
+ if (t <= 0.0f) { t = 0; return; }
+ float d = vdot(dir,dir);
+ if (t >= d) { t = 1; return; }
+ t /= d;
+}
+
+static float distPtSegSqr(const float* pt, const float* sp, const float* sq)
+{
+ float t;
+ closestPtPtSeg(pt, sp,sq, t);
+ float np[2];
+ vlerp(np, sp,sq, t);
+ return vdistsqr(pt,np);
+}
+
+static int sweepCircleCircle(const MT_Vector3& pos0, const MT_Scalar r0, const MT_Vector2& v,
+ const MT_Vector3& pos1, const MT_Scalar r1,
+ float& tmin, float& tmax)
+{
+ static const float EPS = 0.0001f;
+ MT_Vector2 c0(pos0.x(), pos0.y());
+ MT_Vector2 c1(pos1.x(), pos1.y());
+ MT_Vector2 s = c1 - c0;
+ MT_Scalar r = r0+r1;
+ float c = s.length2() - r*r;
+ float a = v.length2();
+ if (a < EPS) return 0; // not moving
+
+ // Overlap, calc time to exit.
+ float b = MT_dot(v,s);
+ float d = b*b - a*c;
+ if (d < 0.0f) return 0; // no intersection.
+ tmin = (b - sqrtf(d)) / a;
+ tmax = (b + sqrtf(d)) / a;
+ return 1;
+}
+
+static int sweepCircleSegment(const MT_Vector3& pos0, const MT_Scalar r0, const MT_Vector2& v,
+ const MT_Vector3& pa, const MT_Vector3& pb, const MT_Scalar sr,
+ float& tmin, float &tmax)
+{
+ // equation parameters
+ MT_Vector2 c0(pos0.x(), pos0.y());
+ MT_Vector2 sa(pa.x(), pa.y());
+ MT_Vector2 sb(pb.x(), pb.y());
+ MT_Vector2 L = sb-sa;
+ MT_Vector2 H = c0-sa;
+ MT_Scalar radius = r0+sr;
+ float l2 = L.length2();
+ float r2 = radius * radius;
+ float dl = perp(v, L);
+ float hl = perp(H, L);
+ float a = dl * dl;
+ float b = 2.0f * hl * dl;
+ float c = hl * hl - (r2 * l2);
+ float d = (b*b) - (4.0f * a * c);
+
+ // infinite line missed by infinite ray.
+ if (d < 0.0f)
+ return 0;
+
+ d = sqrtf(d);
+ tmin = (-b - d) / (2.0f * a);
+ tmax = (-b + d) / (2.0f * a);
+
+ // line missed by ray range.
+ /* if (tmax < 0.0f || tmin > 1.0f)
+ return 0;*/
+
+ // find what part of the ray was collided.
+ MT_Vector2 Pedge;
+ Pedge = c0+v*tmin;
+ H = Pedge - sa;
+ float e0 = MT_dot(H, L) / l2;
+ Pedge = c0 + v*tmax;
+ H = Pedge - sa;
+ float e1 = MT_dot(H, L) / l2;
+
+ if (e0 < 0.0f || e1 < 0.0f)
+ {
+ float ctmin, ctmax;
+ if (sweepCircleCircle(pos0, r0, v, pa, sr, ctmin, ctmax))
+ {
+ if (e0 < 0.0f && ctmin > tmin)
+ tmin = ctmin;
+ if (e1 < 0.0f && ctmax < tmax)
+ tmax = ctmax;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+
+ if (e0 > 1.0f || e1 > 1.0f)
+ {
+ float ctmin, ctmax;
+ if (sweepCircleCircle(pos0, r0, v, pb, sr, ctmin, ctmax))
+ {
+ if (e0 > 1.0f && ctmin > tmin)
+ tmin = ctmin;
+ if (e1 > 1.0f && ctmax < tmax)
+ tmax = ctmax;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+static bool inBetweenAngle(float a, float amin, float amax, float& t)
+{
+ if (amax < amin) amax += (float)M_PI*2;
+ if (a < amin-(float)M_PI) a += (float)M_PI*2;
+ if (a > amin+(float)M_PI) a -= (float)M_PI*2;
+ if (a >= amin && a < amax)
+ {
+ t = (a-amin) / (amax-amin);
+ return true;
+ }
+ return false;
+}
+
+static float interpolateToi(float a, const float* dir, const float* toi, const int ntoi)
+{
+ for (int i = 0; i < ntoi; ++i)
+ {
+ int next = (i+1) % ntoi;
+ float t;
+ if (inBetweenAngle(a, dir[i], dir[next], t))
+ {
+ return lerp(toi[i], toi[next], t);
+ }
+ }
+ return 0;
+}
+
+KX_ObstacleSimulation::KX_ObstacleSimulation(MT_Scalar levelHeight, bool enableVisualization)
+: m_levelHeight(levelHeight)
+, m_enableVisualization(enableVisualization)
+{
+
+}
+
+KX_ObstacleSimulation::~KX_ObstacleSimulation()
+{
+ for (size_t i=0; i<m_obstacles.size(); i++)
+ {
+ KX_Obstacle* obs = m_obstacles[i];
+ delete obs;
+ }
+ m_obstacles.clear();
+}
+KX_Obstacle* KX_ObstacleSimulation::CreateObstacle(KX_GameObject* gameobj)
+{
+ KX_Obstacle* obstacle = new KX_Obstacle();
+ obstacle->m_gameObj = gameobj;
+
+ vset(obstacle->vel, 0,0);
+ vset(obstacle->pvel, 0,0);
+ vset(obstacle->dvel, 0,0);
+ vset(obstacle->nvel, 0,0);
+ for (int i = 0; i < VEL_HIST_SIZE; ++i)
+ vset(&obstacle->hvel[i*2], 0,0);
+ obstacle->hhead = 0;
+
+ gameobj->RegisterObstacle(this);
+ m_obstacles.push_back(obstacle);
+ return obstacle;
+}
+
+void KX_ObstacleSimulation::AddObstacleForObj(KX_GameObject* gameobj)
+{
+ KX_Obstacle* obstacle = CreateObstacle(gameobj);
+ struct Object* blenderobject = gameobj->GetBlenderObject();
+ obstacle->m_type = KX_OBSTACLE_OBJ;
+ obstacle->m_shape = KX_OBSTACLE_CIRCLE;
+ obstacle->m_rad = blenderobject->obstacleRad;
+}
+
+void KX_ObstacleSimulation::AddObstaclesForNavMesh(KX_NavMeshObject* navmeshobj)
+{
+ dtStatNavMesh* navmesh = navmeshobj->GetNavMesh();
+ if (navmesh)
+ {
+ int npoly = navmesh->getPolyCount();
+ for (int pi=0; pi<npoly; pi++)
+ {
+ const dtStatPoly* poly = navmesh->getPoly(pi);
+
+ for (int i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j = i++)
+ {
+ if (poly->n[j]) continue;
+ const float* vj = navmesh->getVertex(poly->v[j]);
+ const float* vi = navmesh->getVertex(poly->v[i]);
+
+ KX_Obstacle* obstacle = CreateObstacle(navmeshobj);
+ obstacle->m_type = KX_OBSTACLE_NAV_MESH;
+ obstacle->m_shape = KX_OBSTACLE_SEGMENT;
+ obstacle->m_pos = MT_Point3(vj[0], vj[2], vj[1]);
+ obstacle->m_pos2 = MT_Point3(vi[0], vi[2], vi[1]);
+ obstacle->m_rad = 0;
+ }
+ }
+ }
+}
+
+void KX_ObstacleSimulation::DestroyObstacleForObj(KX_GameObject* gameobj)
+{
+ for (size_t i=0; i<m_obstacles.size(); )
+ {
+ if (m_obstacles[i]->m_gameObj == gameobj)
+ {
+ KX_Obstacle* obstacle = m_obstacles[i];
+ obstacle->m_gameObj->UnregisterObstacle();
+ m_obstacles[i] = m_obstacles.back();
+ m_obstacles.pop_back();
+ delete obstacle;
+ }
+ else
+ i++;
+ }
+}
+
+void KX_ObstacleSimulation::UpdateObstacles()
+{
+ for (size_t i=0; i<m_obstacles.size(); i++)
+ {
+ if (m_obstacles[i]->m_type==KX_OBSTACLE_NAV_MESH || m_obstacles[i]->m_shape==KX_OBSTACLE_SEGMENT)
+ continue;
+
+ KX_Obstacle* obs = m_obstacles[i];
+ obs->m_pos = obs->m_gameObj->NodeGetWorldPosition();
+ obs->vel[0] = obs->m_gameObj->GetLinearVelocity().x();
+ obs->vel[1] = obs->m_gameObj->GetLinearVelocity().y();
+
+ // Update velocity history and calculate perceived (average) velocity.
+ vcpy(&obs->hvel[obs->hhead*2], obs->vel);
+ obs->hhead = (obs->hhead+1) % VEL_HIST_SIZE;
+ vset(obs->pvel,0,0);
+ for (int j = 0; j < VEL_HIST_SIZE; ++j)
+ vadd(obs->pvel, obs->pvel, &obs->hvel[j*2]);
+ vscale(obs->pvel, obs->pvel, 1.0f/VEL_HIST_SIZE);
+ }
+}
+
+KX_Obstacle* KX_ObstacleSimulation::GetObstacle(KX_GameObject* gameobj)
+{
+ for (size_t i=0; i<m_obstacles.size(); i++)
+ {
+ if (m_obstacles[i]->m_gameObj == gameobj)
+ return m_obstacles[i];
+ }
+
+ return NULL;
+}
+
+void KX_ObstacleSimulation::AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj,
+ MT_Vector3& velocity, MT_Scalar maxDeltaSpeed,MT_Scalar maxDeltaAngle)
+{
+}
+
+void KX_ObstacleSimulation::DrawObstacles()
+{
+ if (!m_enableVisualization)
+ return;
+ static const MT_Vector3 bluecolor(0,0,1);
+ static const MT_Vector3 normal(0.,0.,1.);
+ static const int SECTORS_NUM = 32;
+ for (size_t i=0; i<m_obstacles.size(); i++)
+ {
+ if (m_obstacles[i]->m_shape==KX_OBSTACLE_SEGMENT)
+ {
+ MT_Point3 p1 = m_obstacles[i]->m_pos;
+ MT_Point3 p2 = m_obstacles[i]->m_pos2;
+ //apply world transform
+ if (m_obstacles[i]->m_type == KX_OBSTACLE_NAV_MESH)
+ {
+ KX_NavMeshObject* navmeshobj = static_cast<KX_NavMeshObject*>(m_obstacles[i]->m_gameObj);
+ p1 = navmeshobj->TransformToWorldCoords(p1);
+ p2 = navmeshobj->TransformToWorldCoords(p2);
+ }
+
+ KX_RasterizerDrawDebugLine(p1, p2, bluecolor);
+ }
+ else if (m_obstacles[i]->m_shape==KX_OBSTACLE_CIRCLE)
+ {
+ KX_RasterizerDrawDebugCircle(m_obstacles[i]->m_pos, m_obstacles[i]->m_rad, bluecolor,
+ normal, SECTORS_NUM);
+ }
+ }
+}
+
+static MT_Point3 nearestPointToObstacle(MT_Point3& pos ,KX_Obstacle* obstacle)
+{
+ switch (obstacle->m_shape)
+ {
+ case KX_OBSTACLE_SEGMENT :
+ {
+ MT_Vector3 ab = obstacle->m_pos2 - obstacle->m_pos;
+ if (!ab.fuzzyZero())
+ {
+ MT_Vector3 abdir = ab.normalized();
+ MT_Vector3 v = pos - obstacle->m_pos;
+ MT_Scalar proj = abdir.dot(v);
+ CLAMP(proj, 0, ab.length());
+ MT_Point3 res = obstacle->m_pos + abdir*proj;
+ return res;
+ }
+ }
+ case KX_OBSTACLE_CIRCLE :
+ default:
+ return obstacle->m_pos;
+ }
+}
+
+static bool filterObstacle(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, KX_Obstacle* otherObst,
+ float levelHeight)
+{
+ //filter obstacles by type
+ if ( (otherObst == activeObst) ||
+ (otherObst->m_type==KX_OBSTACLE_NAV_MESH && otherObst->m_gameObj!=activeNavMeshObj) )
+ return false;
+
+ //filter obstacles by position
+ MT_Point3 p = nearestPointToObstacle(activeObst->m_pos, otherObst);
+ if ( fabs(activeObst->m_pos.z() - p.z()) > levelHeight)
+ return false;
+
+ return true;
+}
+
+///////////*********TOI_rays**********/////////////////
+KX_ObstacleSimulationTOI::KX_ObstacleSimulationTOI(MT_Scalar levelHeight, bool enableVisualization)
+: KX_ObstacleSimulation(levelHeight, enableVisualization),
+ m_maxSamples(32),
+ m_minToi(0.0f),
+ m_maxToi(0.0f),
+ m_velWeight(1.0f),
+ m_curVelWeight(1.0f),
+ m_toiWeight(1.0f),
+ m_collisionWeight(1.0f)
+{
+}
+
+
+void KX_ObstacleSimulationTOI::AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj,
+ MT_Vector3& velocity, MT_Scalar maxDeltaSpeed, MT_Scalar maxDeltaAngle)
+{
+ int nobs = m_obstacles.size();
+ int obstidx = std::find(m_obstacles.begin(), m_obstacles.end(), activeObst) - m_obstacles.begin();
+ if (obstidx == nobs)
+ return;
+
+ vset(activeObst->dvel, velocity.x(), velocity.y());
+
+ //apply RVO
+ sampleRVO(activeObst, activeNavMeshObj, maxDeltaAngle);
+
+ // Fake dynamic constraint.
+ float dv[2];
+ float vel[2];
+ vsub(dv, activeObst->nvel, activeObst->vel);
+ float ds = vlen(dv);
+ if (ds > maxDeltaSpeed || ds<-maxDeltaSpeed)
+ vscale(dv, dv, fabs(maxDeltaSpeed/ds));
+ vadd(vel, activeObst->vel, dv);
+
+ velocity.x() = vel[0];
+ velocity.y() = vel[1];
+}
+
+///////////*********TOI_rays**********/////////////////
+static const int AVOID_MAX_STEPS = 128;
+struct TOICircle
+{
+ TOICircle() : n(0), minToi(0), maxToi(1) {}
+ float toi[AVOID_MAX_STEPS]; // Time of impact (seconds)
+ float toie[AVOID_MAX_STEPS]; // Time of exit (seconds)
+ float dir[AVOID_MAX_STEPS]; // Direction (radians)
+ int n; // Number of samples
+ float minToi, maxToi; // Min/max TOI (seconds)
+};
+
+KX_ObstacleSimulationTOI_rays::KX_ObstacleSimulationTOI_rays(MT_Scalar levelHeight, bool enableVisualization):
+ KX_ObstacleSimulationTOI(levelHeight, enableVisualization)
+{
+ m_maxSamples = 32;
+ m_minToi = 0.5f;
+ m_maxToi = 1.2f;
+ m_velWeight = 4.0f;
+ m_toiWeight = 1.0f;
+ m_collisionWeight = 100.0f;
+}
+
+
+void KX_ObstacleSimulationTOI_rays::sampleRVO(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj,
+ const float maxDeltaAngle)
+{
+ MT_Vector2 vel(activeObst->dvel[0], activeObst->dvel[1]);
+ float vmax = (float) vel.length();
+ float odir = (float) atan2(vel.y(), vel.x());
+
+ MT_Vector2 ddir = vel;
+ ddir.normalize();
+
+ float bestScore = FLT_MAX;
+ float bestDir = odir;
+ float bestToi = 0;
+
+ TOICircle tc;
+ tc.n = m_maxSamples;
+ tc.minToi = m_minToi;
+ tc.maxToi = m_maxToi;
+
+ const int iforw = m_maxSamples/2;
+ const float aoff = (float)iforw / (float)m_maxSamples;
+
+ size_t nobs = m_obstacles.size();
+ for (int iter = 0; iter < m_maxSamples; ++iter)
+ {
+ // Calculate sample velocity
+ const float ndir = ((float)iter/(float)m_maxSamples) - aoff;
+ const float dir = odir+ndir*M_PI*2;
+ MT_Vector2 svel;
+ svel.x() = cosf(dir) * vmax;
+ svel.y() = sinf(dir) * vmax;
+
+ // Find min time of impact and exit amongst all obstacles.
+ float tmin = m_maxToi;
+ float tmine = 0;
+ for (int i = 0; i < nobs; ++i)
+ {
+ KX_Obstacle* ob = m_obstacles[i];
+ bool res = filterObstacle(activeObst, activeNavMeshObj, ob, m_levelHeight);
+ if (!res)
+ continue;
+
+ float htmin,htmax;
+
+ if (ob->m_shape == KX_OBSTACLE_CIRCLE)
+ {
+ MT_Vector2 vab;
+ if (vlen(ob->vel) < 0.01f*0.01f)
+ {
+ // Stationary, use VO
+ vab = svel;
+ }
+ else
+ {
+ // Moving, use RVO
+ vab = 2*svel - vel - ob->vel;
+ }
+
+ if (!sweepCircleCircle(activeObst->m_pos, activeObst->m_rad,
+ vab, ob->m_pos, ob->m_rad, htmin, htmax))
+ continue;
+ }
+ else if (ob->m_shape == KX_OBSTACLE_SEGMENT)
+ {
+ MT_Point3 p1 = ob->m_pos;
+ MT_Point3 p2 = ob->m_pos2;
+ //apply world transform
+ if (ob->m_type == KX_OBSTACLE_NAV_MESH)
+ {
+ KX_NavMeshObject* navmeshobj = static_cast<KX_NavMeshObject*>(ob->m_gameObj);
+ p1 = navmeshobj->TransformToWorldCoords(p1);
+ p2 = navmeshobj->TransformToWorldCoords(p2);
+ }
+ if (!sweepCircleSegment(activeObst->m_pos, activeObst->m_rad, svel,
+ p1, p2, ob->m_rad, htmin, htmax))
+ continue;
+ }
+
+ if (htmin > 0.0f)
+ {
+ // The closest obstacle is somewhere ahead of us, keep track of nearest obstacle.
+ if (htmin < tmin)
+ tmin = htmin;
+ }
+ else if (htmax > 0.0f)
+ {
+ // The agent overlaps the obstacle, keep track of first safe exit.
+ if (htmax > tmine)
+ tmine = htmax;
+ }
+ }
+
+ // Calculate sample penalties and final score.
+ const float apen = m_velWeight * fabsf(ndir);
+ const float tpen = m_toiWeight * (1.0f/(0.0001f+tmin/m_maxToi));
+ const float cpen = m_collisionWeight * (tmine/m_minToi)*(tmine/m_minToi);
+ const float score = apen + tpen + cpen;
+
+ // Update best score.
+ if (score < bestScore)
+ {
+ bestDir = dir;
+ bestToi = tmin;
+ bestScore = score;
+ }
+
+ tc.dir[iter] = dir;
+ tc.toi[iter] = tmin;
+ tc.toie[iter] = tmine;
+ }
+
+ if (vlen(activeObst->vel) > 0.1)
+ {
+ // Constrain max turn rate.
+ float cura = atan2(activeObst->vel[1],activeObst->vel[0]);
+ float da = bestDir - cura;
+ if (da < -M_PI) da += (float)M_PI*2;
+ if (da > M_PI) da -= (float)M_PI*2;
+ if (da < -maxDeltaAngle)
+ {
+ bestDir = cura - maxDeltaAngle;
+ bestToi = min(bestToi, interpolateToi(bestDir, tc.dir, tc.toi, tc.n));
+ }
+ else if (da > maxDeltaAngle)
+ {
+ bestDir = cura + maxDeltaAngle;
+ bestToi = min(bestToi, interpolateToi(bestDir, tc.dir, tc.toi, tc.n));
+ }
+ }
+
+ // Adjust speed when time of impact is less than min TOI.
+ if (bestToi < m_minToi)
+ vmax *= bestToi/m_minToi;
+
+ // New steering velocity.
+ activeObst->nvel[0] = cosf(bestDir) * vmax;
+ activeObst->nvel[1] = sinf(bestDir) * vmax;
+}
+
+///////////********* TOI_cells**********/////////////////
+
+static void processSamples(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj,
+ KX_Obstacles& obstacles, float levelHeight, const float vmax,
+ const float* spos, const float cs, const int nspos, float* res,
+ float maxToi, float velWeight, float curVelWeight, float sideWeight,
+ float toiWeight)
+{
+ vset(res, 0,0);
+
+ const float ivmax = 1.0f / vmax;
+
+ float adir[2], adist;
+ vcpy(adir, activeObst->pvel);
+ if (vlen(adir) > 0.01f)
+ vnorm(adir);
+ else
+ vset(adir,0,0);
+ float activeObstPos[2];
+ vset(activeObstPos, activeObst->m_pos.x(), activeObst->m_pos.y());
+ adist = vdot(adir, activeObstPos);
+
+ float minPenalty = FLT_MAX;
+
+ for (int n = 0; n < nspos; ++n)
+ {
+ float vcand[2];
+ vcpy(vcand, &spos[n*2]);
+
+ // Find min time of impact and exit amongst all obstacles.
+ float tmin = maxToi;
+ float side = 0;
+ int nside = 0;
+
+ for (int i = 0; i < obstacles.size(); ++i)
+ {
+ KX_Obstacle* ob = obstacles[i];
+ bool res = filterObstacle(activeObst, activeNavMeshObj, ob, levelHeight);
+ if (!res)
+ continue;
+ float htmin, htmax;
+
+ if (ob->m_shape==KX_OBSTACLE_CIRCLE)
+ {
+ float vab[2];
+
+ // Moving, use RVO
+ vscale(vab, vcand, 2);
+ vsub(vab, vab, activeObst->vel);
+ vsub(vab, vab, ob->vel);
+
+ // Side
+ // NOTE: dp, and dv are constant over the whole calculation,
+ // they can be precomputed per object.
+ const float* pa = activeObstPos;
+ float pb[2];
+ vset(pb, ob->m_pos.x(), ob->m_pos.y());
+
+ const float orig[2] = {0,0};
+ float dp[2],dv[2],np[2];
+ vsub(dp,pb,pa);
+ vnorm(dp);
+ vsub(dv,ob->dvel, activeObst->dvel);
+
+ const float a = triarea(orig, dp,dv);
+ if (a < 0.01f)
+ {
+ np[0] = -dp[1];
+ np[1] = dp[0];
+ }
+ else
+ {
+ np[0] = dp[1];
+ np[1] = -dp[0];
+ }
+
+ side += clamp(min(vdot(dp,vab)*2,vdot(np,vab)*2), 0.0f, 1.0f);
+ nside++;
+
+ if (!sweepCircleCircle(activeObst->m_pos, activeObst->m_rad, vab, ob->m_pos, ob->m_rad,
+ htmin, htmax))
+ continue;
+
+ // Handle overlapping obstacles.
+ if (htmin < 0.0f && htmax > 0.0f)
+ {
+ // Avoid more when overlapped.
+ htmin = -htmin * 0.5f;
+ }
+ }
+ else if (ob->m_shape == KX_OBSTACLE_SEGMENT)
+ {
+ MT_Point3 p1 = ob->m_pos;
+ MT_Point3 p2 = ob->m_pos2;
+ //apply world transform
+ if (ob->m_type == KX_OBSTACLE_NAV_MESH)
+ {
+ KX_NavMeshObject* navmeshobj = static_cast<KX_NavMeshObject*>(ob->m_gameObj);
+ p1 = navmeshobj->TransformToWorldCoords(p1);
+ p2 = navmeshobj->TransformToWorldCoords(p2);
+ }
+ float p[2], q[2];
+ vset(p, p1.x(), p1.y());
+ vset(q, p2.x(), p2.y());
+
+ // NOTE: the segments are assumed to come from a navmesh which is shrunken by
+ // the agent radius, hence the use of really small radius.
+ // This can be handle more efficiently by using seg-seg test instead.
+ // If the whole segment is to be treated as obstacle, use agent->rad instead of 0.01f!
+ const float r = 0.01f; // agent->rad
+ if (distPtSegSqr(activeObstPos, p, q) < sqr(r+ob->m_rad))
+ {
+ float sdir[2], snorm[2];
+ vsub(sdir, q, p);
+ snorm[0] = sdir[1];
+ snorm[1] = -sdir[0];
+ // If the velocity is pointing towards the segment, no collision.
+ if (vdot(snorm, vcand) < 0.0f)
+ continue;
+ // Else immediate collision.
+ htmin = 0.0f;
+ htmax = 10.0f;
+ }
+ else
+ {
+ if (!sweepCircleSegment(activeObstPos, r, vcand, p, q, ob->m_rad, htmin, htmax))
+ continue;
+ }
+
+ // Avoid less when facing walls.
+ htmin *= 2.0f;
+ }
+
+ if (htmin >= 0.0f)
+ {
+ // The closest obstacle is somewhere ahead of us, keep track of nearest obstacle.
+ if (htmin < tmin)
+ tmin = htmin;
+ }
+ }
+
+ // Normalize side bias, to prevent it dominating too much.
+ if (nside)
+ side /= nside;
+
+ const float vpen = velWeight * (vdist(vcand, activeObst->dvel) * ivmax);
+ const float vcpen = curVelWeight * (vdist(vcand, activeObst->vel) * ivmax);
+ const float spen = sideWeight * side;
+ const float tpen = toiWeight * (1.0f/(0.1f+tmin/maxToi));
+
+ const float penalty = vpen + vcpen + spen + tpen;
+
+ if (penalty < minPenalty)
+ {
+ minPenalty = penalty;
+ vcpy(res, vcand);
+ }
+ }
+}
+
+void KX_ObstacleSimulationTOI_cells::sampleRVO(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj,
+ const float maxDeltaAngle)
+{
+ vset(activeObst->nvel, 0.f, 0.f);
+ float vmax = vlen(activeObst->dvel);
+
+ float* spos = new float[2*m_maxSamples];
+ int nspos = 0;
+
+ if (!m_adaptive)
+ {
+ const float cvx = activeObst->dvel[0]*m_bias;
+ const float cvy = activeObst->dvel[1]*m_bias;
+ float vmax = vlen(activeObst->dvel);
+ const float vrange = vmax*(1-m_bias);
+ const float cs = 1.0f / (float)m_sampleRadius*vrange;
+
+ for (int y = -m_sampleRadius; y <= m_sampleRadius; ++y)
+ {
+ for (int x = -m_sampleRadius; x <= m_sampleRadius; ++x)
+ {
+ if (nspos < m_maxSamples)
+ {
+ const float vx = cvx + (float)(x+0.5f)*cs;
+ const float vy = cvy + (float)(y+0.5f)*cs;
+ if (vx*vx+vy*vy > sqr(vmax+cs/2)) continue;
+ spos[nspos*2+0] = vx;
+ spos[nspos*2+1] = vy;
+ nspos++;
+ }
+ }
+ }
+ processSamples(activeObst, activeNavMeshObj, m_obstacles, m_levelHeight, vmax, spos, cs/2,
+ nspos, activeObst->nvel, m_maxToi, m_velWeight, m_curVelWeight, m_collisionWeight, m_toiWeight);
+ }
+ else
+ {
+ int rad;
+ float res[2];
+ float cs;
+ // First sample location.
+ rad = 4;
+ res[0] = activeObst->dvel[0]*m_bias;
+ res[1] = activeObst->dvel[1]*m_bias;
+ cs = vmax*(2-m_bias*2) / (float)(rad-1);
+
+ for (int k = 0; k < 5; ++k)
+ {
+ const float half = (rad-1)*cs*0.5f;
+
+ nspos = 0;
+ for (int y = 0; y < rad; ++y)
+ {
+ for (int x = 0; x < rad; ++x)
+ {
+ const float vx = res[0] + x*cs - half;
+ const float vy = res[1] + y*cs - half;
+ if (vx*vx+vy*vy > sqr(vmax+cs/2)) continue;
+ spos[nspos*2+0] = vx;
+ spos[nspos*2+1] = vy;
+ nspos++;
+ }
+ }
+
+ processSamples(activeObst, activeNavMeshObj, m_obstacles, m_levelHeight, vmax, spos, cs/2,
+ nspos, res, m_maxToi, m_velWeight, m_curVelWeight, m_collisionWeight, m_toiWeight);
+
+ cs *= 0.5f;
+ }
+ vcpy(activeObst->nvel, res);
+ }
+}
+
+KX_ObstacleSimulationTOI_cells::KX_ObstacleSimulationTOI_cells(MT_Scalar levelHeight, bool enableVisualization)
+: KX_ObstacleSimulationTOI(levelHeight, enableVisualization)
+, m_bias(0.4f)
+, m_adaptive(true)
+, m_sampleRadius(15)
+{
+ m_maxSamples = (m_sampleRadius*2+1)*(m_sampleRadius*2+1) + 100;
+ m_maxToi = 1.5f;
+ m_velWeight = 2.0f;
+ m_curVelWeight = 0.75f;
+ m_toiWeight = 2.5f;
+ m_collisionWeight = 0.75f; //side_weight
+}
diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.h b/source/gameengine/Ketsji/KX_ObstacleSimulation.h
new file mode 100644
index 00000000000..d926e8deb71
--- /dev/null
+++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.h
@@ -0,0 +1,145 @@
+/**
+* Simulation for obstacle avoidance behavior
+* (based on Cane Project - http://code.google.com/p/cane by Mikko Mononen (c) 2009)
+*
+*
+* $Id$
+*
+* ***** BEGIN GPL LICENSE BLOCK *****
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version. The Blender
+* Foundation also sells licenses for use in proprietary software under
+* the Blender License. See http://www.blender.org/BL/ for information
+* about this.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 LICENSE BLOCK *****
+*/
+
+#ifndef __KX_OBSTACLESIMULATION
+#define __KX_OBSTACLESIMULATION
+
+#include <vector>
+#include "MT_Point2.h"
+#include "MT_Point3.h"
+
+class KX_GameObject;
+class KX_NavMeshObject;
+
+enum KX_OBSTACLE_TYPE
+{
+ KX_OBSTACLE_OBJ,
+ KX_OBSTACLE_NAV_MESH,
+};
+
+enum KX_OBSTACLE_SHAPE
+{
+ KX_OBSTACLE_CIRCLE,
+ KX_OBSTACLE_SEGMENT,
+};
+
+#define VEL_HIST_SIZE 6
+struct KX_Obstacle
+{
+ KX_OBSTACLE_TYPE m_type;
+ KX_OBSTACLE_SHAPE m_shape;
+ MT_Point3 m_pos;
+ MT_Point3 m_pos2;
+ MT_Scalar m_rad;
+
+ float vel[2];
+ float pvel[2];
+ float dvel[2];
+ float nvel[2];
+ float hvel[VEL_HIST_SIZE*2];
+ int hhead;
+
+
+ KX_GameObject* m_gameObj;
+};
+typedef std::vector<KX_Obstacle*> KX_Obstacles;
+
+class KX_ObstacleSimulation
+{
+protected:
+ KX_Obstacles m_obstacles;
+
+ MT_Scalar m_levelHeight;
+ bool m_enableVisualization;
+
+ KX_Obstacle* CreateObstacle(KX_GameObject* gameobj);
+public:
+ KX_ObstacleSimulation(MT_Scalar levelHeight, bool enableVisualization);
+ virtual ~KX_ObstacleSimulation();
+
+ void DrawObstacles();
+ //void DebugDraw();
+
+ void AddObstacleForObj(KX_GameObject* gameobj);
+ void DestroyObstacleForObj(KX_GameObject* gameobj);
+ void AddObstaclesForNavMesh(KX_NavMeshObject* navmesh);
+ KX_Obstacle* GetObstacle(KX_GameObject* gameobj);
+ void UpdateObstacles();
+ virtual void AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj,
+ MT_Vector3& velocity, MT_Scalar maxDeltaSpeed,MT_Scalar maxDeltaAngle);
+
+};
+class KX_ObstacleSimulationTOI: public KX_ObstacleSimulation
+{
+protected:
+ int m_maxSamples; // Number of sample steps
+ float m_minToi; // Min TOI
+ float m_maxToi; // Max TOI
+ float m_velWeight; // Sample selection angle weight
+ float m_curVelWeight; // Sample selection current velocity weight
+ float m_toiWeight; // Sample selection TOI weight
+ float m_collisionWeight; // Sample selection collision weight
+
+ virtual void sampleRVO(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj,
+ const float maxDeltaAngle) = 0;
+public:
+ KX_ObstacleSimulationTOI(MT_Scalar levelHeight, bool enableVisualization);
+ virtual void AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj,
+ MT_Vector3& velocity, MT_Scalar maxDeltaSpeed,MT_Scalar maxDeltaAngle);
+};
+
+class KX_ObstacleSimulationTOI_rays: public KX_ObstacleSimulationTOI
+{
+protected:
+ virtual void sampleRVO(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj,
+ const float maxDeltaAngle);
+public:
+ KX_ObstacleSimulationTOI_rays(MT_Scalar levelHeight, bool enableVisualization);
+};
+
+class KX_ObstacleSimulationTOI_cells: public KX_ObstacleSimulationTOI
+{
+protected:
+ float m_bias;
+ bool m_adaptive;
+ int m_sampleRadius;
+ virtual void sampleRVO(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj,
+ const float maxDeltaAngle);
+public:
+ KX_ObstacleSimulationTOI_cells(MT_Scalar levelHeight, bool enableVisualization);
+};
+
+#endif
diff --git a/source/gameengine/Ketsji/KX_OrientationInterpolator.cpp b/source/gameengine/Ketsji/KX_OrientationInterpolator.cpp
index d9483083aa1..bd743159950 100644
--- a/source/gameengine/Ketsji/KX_OrientationInterpolator.cpp
+++ b/source/gameengine/Ketsji/KX_OrientationInterpolator.cpp
@@ -51,6 +51,6 @@ void KX_OrientationInterpolator::Execute(float currentTime) const {
MT_Scalar ss = si*sh;
m_target.setValue(cj*ch, sj*sc-cs, sj*cc+ss,
- cj*sh, sj*ss+cc, sj*cs-sc,
- -sj, cj*si, cj*ci);
+ cj*sh, sj*ss+cc, sj*cs-sc,
+ -sj, cj*si, cj*ci);
}
diff --git a/source/gameengine/Ketsji/KX_PolygonMaterial.cpp b/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
index 9d0597051ad..d32f267f0e0 100644
--- a/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
+++ b/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
@@ -187,7 +187,7 @@ void KX_PolygonMaterial::DefaultActivate(RAS_IRasterizer* rasty, TCachingInfo& c
rasty->SetCullFace(true);
if ((m_drawingmode & RAS_IRasterizer::KX_LINES) ||
- (rasty->GetDrawingMode() <= RAS_IRasterizer::KX_WIREFRAME))
+ (rasty->GetDrawingMode() <= RAS_IRasterizer::KX_WIREFRAME))
rasty->SetLines(true);
else
rasty->SetLines(false);
diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp
index 395e2048cb7..62ca2910c60 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInit.cpp
@@ -87,6 +87,8 @@ extern "C" {
#include "KX_GameActuator.h"
#include "KX_ParentActuator.h"
#include "KX_SCA_DynamicActuator.h"
+#include "KX_SteeringActuator.h"
+#include "KX_NavMeshObject.h"
#include "SCA_IInputDevice.h"
#include "SCA_PropertySensor.h"
@@ -181,6 +183,13 @@ void KX_RasterizerDrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,cons
gp_Rasterizer->DrawDebugLine(from,to,color);
}
+void KX_RasterizerDrawDebugCircle(const MT_Vector3& center, const MT_Scalar radius, const MT_Vector3& color,
+ const MT_Vector3& normal, int nsector)
+{
+ if (gp_Rasterizer)
+ gp_Rasterizer->DrawDebugCircle(center, radius, color, normal, nsector);
+}
+
#ifdef WITH_PYTHON
static PyObject *gp_OrigPythonSysPath= NULL;
@@ -725,7 +734,7 @@ static PyObject *gLibNew(PyObject*, PyObject* args)
if(idcode==ID_ME) {
PyObject *ret= PyList_New(0);
PyObject *item;
- for(int i= 0; i < PyList_GET_SIZE(names); i++) {
+ for(Py_ssize_t i= 0; i < PyList_GET_SIZE(names); i++) {
name= _PyUnicode_AsString(PyList_GET_ITEM(names, i));
if(name) {
RAS_MeshObject *meshobj= kx_scene->GetSceneConverter()->ConvertMeshSpecial(kx_scene, maggie, name);
@@ -1104,7 +1113,7 @@ static PyObject* gPySetGLSLMaterialSetting(PyObject*,
PyObject* args,
PyObject*)
{
- GameData *gm= &(gp_KetsjiScene->GetBlenderScene()->gm);
+ GlobalSettings *gs= gp_KetsjiEngine->GetGlobalSettings();
char *setting;
int enable, flag, sceneflag;
@@ -1118,15 +1127,15 @@ static PyObject* gPySetGLSLMaterialSetting(PyObject*,
return NULL;
}
- sceneflag= gm->flag;
+ sceneflag= gs->glslflag;
if (enable)
- gm->flag &= ~flag;
+ gs->glslflag &= ~flag;
else
- gm->flag |= flag;
+ gs->glslflag |= flag;
/* display lists and GLSL materials need to be remade */
- if(sceneflag != gm->flag) {
+ if(sceneflag != gs->glslflag) {
GPU_materials_free();
if(gp_KetsjiEngine) {
KX_SceneList *scenes = gp_KetsjiEngine->CurrentScenes();
@@ -1147,7 +1156,7 @@ static PyObject* gPyGetGLSLMaterialSetting(PyObject*,
PyObject* args,
PyObject*)
{
- GameData *gm= &(gp_KetsjiScene->GetBlenderScene()->gm);
+ GlobalSettings *gs= gp_KetsjiEngine->GetGlobalSettings();
char *setting;
int enabled = 0, flag;
@@ -1161,7 +1170,7 @@ static PyObject* gPyGetGLSLMaterialSetting(PyObject*,
return NULL;
}
- enabled = ((gm->flag & flag) != 0);
+ enabled = ((gs->glslflag & flag) != 0);
return PyLong_FromSsize_t(enabled);
}
@@ -1173,18 +1182,18 @@ static PyObject* gPySetMaterialType(PyObject*,
PyObject* args,
PyObject*)
{
- GameData *gm= &(gp_KetsjiScene->GetBlenderScene()->gm);
+ GlobalSettings *gs= gp_KetsjiEngine->GetGlobalSettings();
int type;
if (!PyArg_ParseTuple(args,"i:setMaterialType",&type))
return NULL;
if(type == KX_BLENDER_GLSL_MATERIAL)
- gm->matmode= GAME_MAT_GLSL;
+ gs->matmode= GAME_MAT_GLSL;
else if(type == KX_BLENDER_MULTITEX_MATERIAL)
- gm->matmode= GAME_MAT_MULTITEX;
+ gs->matmode= GAME_MAT_MULTITEX;
else if(type == KX_TEXFACE_MATERIAL)
- gm->matmode= GAME_MAT_TEXFACE;
+ gs->matmode= GAME_MAT_TEXFACE;
else {
PyErr_SetString(PyExc_ValueError, "Rasterizer.setMaterialType(int): material type is not known");
return NULL;
@@ -1195,12 +1204,12 @@ static PyObject* gPySetMaterialType(PyObject*,
static PyObject* gPyGetMaterialType(PyObject*)
{
- GameData *gm= &(gp_KetsjiScene->GetBlenderScene()->gm);
+ GlobalSettings *gs= gp_KetsjiEngine->GetGlobalSettings();
int flag;
- if(gm->matmode == GAME_MAT_GLSL)
+ if(gs->matmode == GAME_MAT_GLSL)
flag = KX_BLENDER_GLSL_MATERIAL;
- else if(gm->matmode == GAME_MAT_MULTITEX)
+ else if(gs->matmode == GAME_MAT_MULTITEX)
flag = KX_BLENDER_MULTITEX_MATERIAL;
else
flag = KX_TEXFACE_MATERIAL;
@@ -1655,6 +1664,16 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack
KX_MACRO_addTypesToDict(d, ROT_MODE_ZXY, ROT_MODE_ZXY);
KX_MACRO_addTypesToDict(d, ROT_MODE_ZYX, ROT_MODE_ZYX);
+ /* Steering actuator */
+ KX_MACRO_addTypesToDict(d, KX_STEERING_SEEK, KX_SteeringActuator::KX_STEERING_SEEK);
+ KX_MACRO_addTypesToDict(d, KX_STEERING_FLEE, KX_SteeringActuator::KX_STEERING_FLEE);
+ KX_MACRO_addTypesToDict(d, KX_STEERING_PATHFOLLOWING, KX_SteeringActuator::KX_STEERING_PATHFOLLOWING);
+
+ /* KX_NavMeshObject render mode */
+ KX_MACRO_addTypesToDict(d, RM_WALLS, KX_NavMeshObject::RM_WALLS);
+ KX_MACRO_addTypesToDict(d, RM_POLYS, KX_NavMeshObject::RM_POLYS);
+ KX_MACRO_addTypesToDict(d, RM_TRIS, KX_NavMeshObject::RM_TRIS);
+
/* BL_Action play modes */
KX_MACRO_addTypesToDict(d, KX_ACTION_MODE_PLAY, BL_Action::ACT_MODE_PLAY);
KX_MACRO_addTypesToDict(d, KX_ACTION_MODE_LOOP, BL_Action::ACT_MODE_LOOP);
@@ -1751,7 +1770,7 @@ static void initPySysObjects(Main *maggie)
initPySysObjects__append(sys_path, gp_GamePythonPath);
-// fprintf(stderr, "\nNew Path: %d ", PyList_Size(sys_path));
+// fprintf(stderr, "\nNew Path: %d ", PyList_GET_SIZE(sys_path));
// PyObject_Print(sys_path, stderr, 0);
}
@@ -1775,7 +1794,7 @@ static void restorePySysObjects(void)
gp_OrigPythonSysModules= NULL;
-// fprintf(stderr, "\nRestore Path: %d ", PyList_Size(sys_path));
+// fprintf(stderr, "\nRestore Path: %d ", PyList_GET_SIZE(sys_path));
// PyObject_Print(sys_path, stderr, 0);
}
diff --git a/source/gameengine/Ketsji/KX_PythonInit.h b/source/gameengine/Ketsji/KX_PythonInit.h
index 1b172c35eff..d76e8f913df 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.h
+++ b/source/gameengine/Ketsji/KX_PythonInit.h
@@ -72,6 +72,9 @@ class KX_KetsjiEngine* KX_GetActiveEngine();
#include "MT_Vector3.h"
void KX_RasterizerDrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color);
+void KX_RasterizerDrawDebugCircle(const MT_Vector3& center, const MT_Scalar radius, const MT_Vector3& color,
+ const MT_Vector3& normal, int nsector);
+
#endif //__KX_PYTHON_INIT
diff --git a/source/gameengine/Ketsji/KX_PythonInitTypes.cpp b/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
index 1c4a17e31fc..49a08135c38 100644
--- a/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
@@ -68,6 +68,7 @@
#include "KX_SCA_ReplaceMeshActuator.h"
#include "KX_SceneActuator.h"
#include "KX_StateActuator.h"
+#include "KX_SteeringActuator.h"
#include "KX_TrackToActuator.h"
#include "KX_VehicleWrapper.h"
#include "KX_VertexProxy.h"
@@ -99,6 +100,7 @@
#include "SCA_PythonController.h"
#include "SCA_RandomActuator.h"
#include "SCA_IController.h"
+#include "KX_NavMeshObject.h"
static void PyType_Attr_Set(PyGetSetDef *attr_getset, PyAttributeDef *attr)
{
@@ -217,9 +219,11 @@ void initPyTypes(void)
PyType_Ready_Attr(dict, KX_SCA_EndObjectActuator, init_getset);
PyType_Ready_Attr(dict, KX_SCA_ReplaceMeshActuator, init_getset);
PyType_Ready_Attr(dict, KX_Scene, init_getset);
+ PyType_Ready_Attr(dict, KX_NavMeshObject, init_getset);
PyType_Ready_Attr(dict, KX_SceneActuator, init_getset);
PyType_Ready_Attr(dict, KX_SoundActuator, init_getset);
PyType_Ready_Attr(dict, KX_StateActuator, init_getset);
+ PyType_Ready_Attr(dict, KX_SteeringActuator, init_getset);
PyType_Ready_Attr(dict, KX_TouchSensor, init_getset);
PyType_Ready_Attr(dict, KX_TrackToActuator, init_getset);
PyType_Ready_Attr(dict, KX_VehicleWrapper, init_getset);
diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp
index a49c1bf4b4c..bdc30810b9e 100644
--- a/source/gameengine/Ketsji/KX_Scene.cpp
+++ b/source/gameengine/Ketsji/KX_Scene.cpp
@@ -87,6 +87,7 @@
#include "BL_ModifierDeformer.h"
#include "BL_ShapeDeformer.h"
#include "BL_DeformableGameObject.h"
+#include "KX_ObstacleSimulation.h"
#ifdef USE_BULLET
#include "KX_SoftBodyDeformer.h"
@@ -168,6 +169,7 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice,
m_lightlist= new CListValue();
m_inactivelist = new CListValue();
m_euthanasyobjects = new CListValue();
+ m_animatedlist = new CListValue();
m_logicmgr = new SCA_LogicManager();
@@ -213,6 +215,19 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice,
m_bucketmanager=new RAS_BucketManager();
+ bool showObstacleSimulation = scene->gm.flag & GAME_SHOW_OBSTACLE_SIMULATION;
+ switch (scene->gm.obstacleSimulation)
+ {
+ case OBSTSIMULATION_TOI_rays:
+ m_obstacleSimulation = new KX_ObstacleSimulationTOI_rays((MT_Scalar)scene->gm.levelHeight, showObstacleSimulation);
+ break;
+ case OBSTSIMULATION_TOI_cells:
+ m_obstacleSimulation = new KX_ObstacleSimulationTOI_cells((MT_Scalar)scene->gm.levelHeight, showObstacleSimulation);
+ break;
+ default:
+ m_obstacleSimulation = NULL;
+ }
+
#ifdef WITH_PYTHON
m_attr_dict = PyDict_New(); /* new ref */
m_draw_call_pre = NULL;
@@ -235,6 +250,9 @@ KX_Scene::~KX_Scene()
this->RemoveObject(parentobj);
}
+ if (m_obstacleSimulation)
+ delete m_obstacleSimulation;
+
if(m_objectlist)
m_objectlist->Release();
@@ -253,6 +271,9 @@ KX_Scene::~KX_Scene()
if (m_euthanasyobjects)
m_euthanasyobjects->Release();
+ if (m_animatedlist)
+ m_animatedlist->Release();
+
if (m_logicmgr)
delete m_logicmgr;
@@ -1502,10 +1523,20 @@ void KX_Scene::LogicBeginFrame(double curtime)
m_logicmgr->BeginFrame(curtime, 1.0/KX_KetsjiEngine::GetTicRate());
}
+void KX_Scene::AddAnimatedObject(CValue* gameobj)
+{
+ m_animatedlist->Add(gameobj);
+}
+
+void KX_Scene::RemoveAnimatedObject(CValue* gameobj)
+{
+ m_animatedlist->RemoveValue(gameobj);
+}
+
void KX_Scene::UpdateAnimations(double curtime)
{
// Update any animations
- for (int i=0; i<GetObjectList()->GetCount(); ++i)
+ for (int i=0; i<m_animatedlist->GetCount(); ++i)
((KX_GameObject*)GetObjectList()->GetValue(i))->UpdateActionManager(curtime);
}
@@ -1531,6 +1562,10 @@ void KX_Scene::LogicEndFrame()
obj->Release();
RemoveObject(obj);
}
+
+ //prepare obstacle simulation for new frame
+ if (m_obstacleSimulation)
+ m_obstacleSimulation->UpdateObstacles();
}
@@ -1902,7 +1937,7 @@ void KX_Scene::Render2DFilters(RAS_ICanvas* canvas)
void KX_Scene::RunDrawingCallbacks(PyObject* cb_list)
{
- int len;
+ Py_ssize_t len;
if (cb_list && (len=PyList_GET_SIZE(cb_list)))
{
@@ -1911,7 +1946,7 @@ void KX_Scene::RunDrawingCallbacks(PyObject* cb_list)
PyObject* ret;
// Iterate the list and run the callbacks
- for (int pos=0; pos < len; pos++)
+ for (Py_ssize_t pos=0; pos < len; pos++)
{
func= PyList_GET_ITEM(cb_list, pos);
ret= PyObject_Call(func, args, NULL);
@@ -1963,6 +1998,8 @@ PyMethodDef KX_Scene::Methods[] = {
KX_PYMETHODTABLE(KX_Scene, replace),
KX_PYMETHODTABLE(KX_Scene, suspend),
KX_PYMETHODTABLE(KX_Scene, resume),
+ KX_PYMETHODTABLE(KX_Scene, drawObstacleSimulation),
+
/* dict style access */
KX_PYMETHODTABLE(KX_Scene, get),
@@ -2287,6 +2324,16 @@ KX_PYMETHODDEF_DOC(KX_Scene, resume,
Py_RETURN_NONE;
}
+KX_PYMETHODDEF_DOC(KX_Scene, drawObstacleSimulation,
+ "drawObstacleSimulation()\n"
+ "Draw debug visualization of obstacle simulation.\n")
+{
+ if (GetObstacleSimulation())
+ GetObstacleSimulation()->DrawObstacles();
+
+ Py_RETURN_NONE;
+}
+
/* Matches python dict.get(key, [default]) */
KX_PYMETHODDEF_DOC(KX_Scene, get, "")
{
diff --git a/source/gameengine/Ketsji/KX_Scene.h b/source/gameengine/Ketsji/KX_Scene.h
index da9cc12c76a..5954d5465ba 100644
--- a/source/gameengine/Ketsji/KX_Scene.h
+++ b/source/gameengine/Ketsji/KX_Scene.h
@@ -88,6 +88,7 @@ class SCA_JoystickManager;
class btCollisionShape;
class KX_BlenderSceneConverter;
struct KX_ClientObjectInfo;
+class KX_ObstacleSimulation;
#ifdef WITH_CXX_GUARDEDALLOC
#include "MEM_guardedalloc.h"
@@ -130,6 +131,7 @@ protected:
CListValue* m_parentlist; // all 'root' parents
CListValue* m_lightlist;
CListValue* m_inactivelist; // all objects that are not in the active layer
+ CListValue* m_animatedlist; // all animated objects
SG_QList m_sghead; // list of nodes that needs scenegraph update
// the Dlist is not object that must be updated
@@ -292,6 +294,9 @@ protected:
struct Scene* m_blenderScene;
RAS_2DFilterManager m_filtermanager;
+
+ KX_ObstacleSimulation* m_obstacleSimulation;
+
public:
KX_Scene(class SCA_IInputDevice* keyboarddevice,
class SCA_IInputDevice* mousedevice,
@@ -334,6 +339,10 @@ public:
int NewRemoveObject(CValue* gameobj);
void ReplaceMesh(CValue* gameobj,
void* meshob, bool use_gfx, bool use_phys);
+
+ void AddAnimatedObject(CValue* gameobj);
+ void RemoveAnimatedObject(CValue* gameobj);
+
/**
* @section Logic stuff
* Initiate an update of the logic system.
@@ -580,6 +589,8 @@ public:
void Update2DFilter(vector<STR_String>& propNames, void* gameObj, RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass, STR_String& text);
void Render2DFilters(RAS_ICanvas* canvas);
+ KX_ObstacleSimulation* GetObstacleSimulation() {return m_obstacleSimulation;};
+
#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -592,6 +603,8 @@ public:
KX_PYMETHOD_DOC(KX_Scene, suspend);
KX_PYMETHOD_DOC(KX_Scene, resume);
KX_PYMETHOD_DOC(KX_Scene, get);
+ KX_PYMETHOD_DOC(KX_Scene, drawObstacleSimulation);
+
/* attributes */
static PyObject* pyattr_get_name(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
diff --git a/source/gameengine/Ketsji/KX_SoundActuator.cpp b/source/gameengine/Ketsji/KX_SoundActuator.cpp
index 6c7b515c095..f24243fcdfc 100644
--- a/source/gameengine/Ketsji/KX_SoundActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SoundActuator.cpp
@@ -108,7 +108,15 @@ void KX_SoundActuator::play()
break;
}
- m_handle = AUD_getDevice()->play(sound, 0);
+ try
+ {
+ m_handle = AUD_getDevice()->play(sound, 0);
+ }
+ catch(AUD_Exception&)
+ {
+ // cannot play back, ignore
+ return;
+ }
AUD_Reference<AUD_I3DHandle> handle3d = AUD_Reference<AUD_I3DHandle>(m_handle);
diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.cpp b/source/gameengine/Ketsji/KX_SteeringActuator.cpp
new file mode 100644
index 00000000000..a0a2e148c1e
--- /dev/null
+++ b/source/gameengine/Ketsji/KX_SteeringActuator.cpp
@@ -0,0 +1,630 @@
+/**
+* Add steering behaviors
+*
+* $Id$
+*
+* ***** BEGIN GPL LICENSE BLOCK *****
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version. The Blender
+* Foundation also sells licenses for use in proprietary software under
+* the Blender License. See http://www.blender.org/BL/ for information
+* about this.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 LICENSE BLOCK *****
+*/
+
+#include "BLI_math.h"
+#include "KX_SteeringActuator.h"
+#include "KX_GameObject.h"
+#include "KX_NavMeshObject.h"
+#include "KX_ObstacleSimulation.h"
+#include "KX_PythonInit.h"
+#include "KX_PyMath.h"
+#include "Recast.h"
+
+/* ------------------------------------------------------------------------- */
+/* Native functions */
+/* ------------------------------------------------------------------------- */
+
+KX_SteeringActuator::KX_SteeringActuator(SCA_IObject *gameobj,
+ int mode,
+ KX_GameObject *target,
+ KX_GameObject *navmesh,
+ float distance,
+ float velocity,
+ float acceleration,
+ float turnspeed,
+ bool isSelfTerminated,
+ int pathUpdatePeriod,
+ KX_ObstacleSimulation* simulation,
+ short facingmode,
+ bool normalup,
+ bool enableVisualization) :
+ SCA_IActuator(gameobj, KX_ACT_STEERING),
+ m_mode(mode),
+ m_target(target),
+ m_distance(distance),
+ m_velocity(velocity),
+ m_acceleration(acceleration),
+ m_turnspeed(turnspeed),
+ m_isSelfTerminated(isSelfTerminated),
+ m_pathUpdatePeriod(pathUpdatePeriod),
+ m_updateTime(0),
+ m_isActive(false),
+ m_simulation(simulation),
+ m_enableVisualization(enableVisualization),
+ m_facingMode(facingmode),
+ m_normalUp(normalup),
+ m_obstacle(NULL),
+ m_pathLen(0),
+ m_wayPointIdx(-1),
+ m_steerVec(MT_Vector3(0, 0, 0))
+{
+ m_navmesh = static_cast<KX_NavMeshObject*>(navmesh);
+ if (m_navmesh)
+ m_navmesh->RegisterActuator(this);
+ if (m_target)
+ m_target->RegisterActuator(this);
+
+ if (m_simulation)
+ m_obstacle = m_simulation->GetObstacle((KX_GameObject*)gameobj);
+ KX_GameObject* parent = ((KX_GameObject*)gameobj)->GetParent();
+ if (m_facingMode>0 && parent)
+ {
+ m_parentlocalmat = parent->GetSGNode()->GetLocalOrientation();
+ }
+ else
+ m_parentlocalmat.setIdentity();
+}
+
+KX_SteeringActuator::~KX_SteeringActuator()
+{
+ if (m_navmesh)
+ m_navmesh->UnregisterActuator(this);
+ if (m_target)
+ m_target->UnregisterActuator(this);
+}
+
+CValue* KX_SteeringActuator::GetReplica()
+{
+ KX_SteeringActuator* replica = new KX_SteeringActuator(*this);
+ // replication just copy the m_base pointer => common random generator
+ replica->ProcessReplica();
+ return replica;
+}
+
+void KX_SteeringActuator::ProcessReplica()
+{
+ if (m_target)
+ m_target->RegisterActuator(this);
+ if (m_navmesh)
+ m_navmesh->RegisterActuator(this);
+ SCA_IActuator::ProcessReplica();
+}
+
+
+bool KX_SteeringActuator::UnlinkObject(SCA_IObject* clientobj)
+{
+ if (clientobj == m_target)
+ {
+ m_target = NULL;
+ return true;
+ }
+ else if (clientobj == m_navmesh)
+ {
+ m_navmesh = NULL;
+ return true;
+ }
+ return false;
+}
+
+void KX_SteeringActuator::Relink(CTR_Map<CTR_HashedPtr, void*> *obj_map)
+{
+ void **h_obj = (*obj_map)[m_target];
+ if (h_obj) {
+ if (m_target)
+ m_target->UnregisterActuator(this);
+ m_target = (KX_GameObject*)(*h_obj);
+ m_target->RegisterActuator(this);
+ }
+
+ h_obj = (*obj_map)[m_navmesh];
+ if (h_obj) {
+ if (m_navmesh)
+ m_navmesh->UnregisterActuator(this);
+ m_navmesh = (KX_NavMeshObject*)(*h_obj);
+ m_navmesh->RegisterActuator(this);
+ }
+}
+
+bool KX_SteeringActuator::Update(double curtime, bool frame)
+{
+ if (frame)
+ {
+ double delta = curtime - m_updateTime;
+ m_updateTime = curtime;
+
+ if (m_posevent && !m_isActive)
+ {
+ delta = 0;
+ m_pathUpdateTime = -1;
+ m_updateTime = curtime;
+ m_isActive = true;
+ }
+ bool bNegativeEvent = IsNegativeEvent();
+ if (bNegativeEvent)
+ m_isActive = false;
+
+ RemoveAllEvents();
+
+ if (!delta)
+ return true;
+
+ if (bNegativeEvent || !m_target)
+ return false; // do nothing on negative events
+
+ KX_GameObject *obj = (KX_GameObject*) GetParent();
+ const MT_Point3& mypos = obj->NodeGetWorldPosition();
+ const MT_Point3& targpos = m_target->NodeGetWorldPosition();
+ MT_Vector3 vectotarg = targpos - mypos;
+ MT_Vector3 vectotarg2d = vectotarg;
+ vectotarg2d.z() = 0;
+ m_steerVec = MT_Vector3(0, 0, 0);
+ bool apply_steerforce = false;
+ bool terminate = true;
+
+ switch (m_mode) {
+ case KX_STEERING_SEEK:
+ if (vectotarg2d.length2()>m_distance*m_distance)
+ {
+ terminate = false;
+ m_steerVec = vectotarg;
+ m_steerVec.normalize();
+ apply_steerforce = true;
+ }
+ break;
+ case KX_STEERING_FLEE:
+ if (vectotarg2d.length2()<m_distance*m_distance)
+ {
+ terminate = false;
+ m_steerVec = -vectotarg;
+ m_steerVec.normalize();
+ apply_steerforce = true;
+ }
+ break;
+ case KX_STEERING_PATHFOLLOWING:
+ if (m_navmesh && vectotarg.length2()>m_distance*m_distance)
+ {
+ terminate = false;
+
+ static const MT_Scalar WAYPOINT_RADIUS(0.25);
+
+ if (m_pathUpdateTime<0 || (m_pathUpdatePeriod>=0 &&
+ curtime - m_pathUpdateTime>((double)m_pathUpdatePeriod/1000)))
+ {
+ m_pathUpdateTime = curtime;
+ m_pathLen = m_navmesh->FindPath(mypos, targpos, m_path, MAX_PATH_LENGTH);
+ m_wayPointIdx = m_pathLen > 1 ? 1 : -1;
+ }
+
+ if (m_wayPointIdx>0)
+ {
+ MT_Vector3 waypoint(&m_path[3*m_wayPointIdx]);
+ if ((waypoint-mypos).length2()<WAYPOINT_RADIUS*WAYPOINT_RADIUS)
+ {
+ m_wayPointIdx++;
+ if (m_wayPointIdx>=m_pathLen)
+ {
+ m_wayPointIdx = -1;
+ terminate = true;
+ }
+ else
+ waypoint.setValue(&m_path[3*m_wayPointIdx]);
+ }
+
+ m_steerVec = waypoint - mypos;
+ apply_steerforce = true;
+
+
+ if (m_enableVisualization)
+ {
+ //debug draw
+ static const MT_Vector3 PATH_COLOR(1,0,0);
+ m_navmesh->DrawPath(m_path, m_pathLen, PATH_COLOR);
+ }
+ }
+
+ }
+ break;
+ }
+
+ if (apply_steerforce)
+ {
+ bool isdyna = obj->IsDynamic();
+ if (isdyna)
+ m_steerVec.z() = 0;
+ if (!m_steerVec.fuzzyZero())
+ m_steerVec.normalize();
+ MT_Vector3 newvel = m_velocity*m_steerVec;
+
+ //adjust velocity to avoid obstacles
+ if (m_simulation && m_obstacle /*&& !newvel.fuzzyZero()*/)
+ {
+ if (m_enableVisualization)
+ KX_RasterizerDrawDebugLine(mypos, mypos + newvel, MT_Vector3(1.,0.,0.));
+ m_simulation->AdjustObstacleVelocity(m_obstacle, m_mode!=KX_STEERING_PATHFOLLOWING ? m_navmesh : NULL,
+ newvel, m_acceleration*delta, m_turnspeed/180.0f*M_PI*delta);
+ if (m_enableVisualization)
+ KX_RasterizerDrawDebugLine(mypos, mypos + newvel, MT_Vector3(0.,1.,0.));
+ }
+
+ HandleActorFace(newvel);
+ if (isdyna)
+ {
+ //temporary solution: set 2D steering velocity directly to obj
+ //correct way is to apply physical force
+ MT_Vector3 curvel = obj->GetLinearVelocity();
+ newvel.z() = curvel.z();
+ obj->setLinearVelocity(newvel, false);
+ }
+ else
+ {
+ MT_Vector3 movement = delta*newvel;
+ obj->ApplyMovement(movement, false);
+ }
+ }
+ else
+ {
+ if (m_simulation && m_obstacle)
+ {
+ m_obstacle->dvel[0] = 0.f;
+ m_obstacle->dvel[1] = 0.f;
+ }
+
+ }
+
+ if (terminate && m_isSelfTerminated)
+ return false;
+ }
+
+ return true;
+}
+
+const MT_Vector3& KX_SteeringActuator::GetSteeringVec()
+{
+ static MT_Vector3 ZERO_VECTOR(0, 0, 0);
+ if (m_isActive)
+ return m_steerVec;
+ else
+ return ZERO_VECTOR;
+}
+
+inline float vdot2(const float* a, const float* b)
+{
+ return a[0]*b[0] + a[2]*b[2];
+}
+static bool barDistSqPointToTri(const float* p, const float* a, const float* b, const float* c)
+{
+ float v0[3], v1[3], v2[3];
+ vsub(v0, c,a);
+ vsub(v1, b,a);
+ vsub(v2, p,a);
+
+ const float dot00 = vdot2(v0, v0);
+ const float dot01 = vdot2(v0, v1);
+ const float dot02 = vdot2(v0, v2);
+ const float dot11 = vdot2(v1, v1);
+ const float dot12 = vdot2(v1, v2);
+
+ // Compute barycentric coordinates
+ float invDenom = 1.0f / (dot00 * dot11 - dot01 * dot01);
+ float u = (dot11 * dot02 - dot01 * dot12) * invDenom;
+ float v = (dot00 * dot12 - dot01 * dot02) * invDenom;
+
+ float ud = u<0.f ? -u : (u>1.f ? u-1.f : 0.f);
+ float vd = v<0.f ? -v : (v>1.f ? v-1.f : 0.f);
+ return ud*ud+vd*vd ;
+}
+
+inline void flipAxes(float* vec)
+{
+ std::swap(vec[1],vec[2]);
+}
+
+static bool getNavmeshNormal(dtStatNavMesh* navmesh, const MT_Vector3& pos, MT_Vector3& normal)
+{
+ static const float polyPickExt[3] = {2, 4, 2};
+ float spos[3];
+ pos.getValue(spos);
+ flipAxes(spos);
+ dtStatPolyRef sPolyRef = navmesh->findNearestPoly(spos, polyPickExt);
+ if (sPolyRef == 0)
+ return false;
+ const dtStatPoly* p = navmesh->getPoly(sPolyRef-1);
+ const dtStatPolyDetail* pd = navmesh->getPolyDetail(sPolyRef-1);
+
+ float distMin = FLT_MAX;
+ int idxMin = -1;
+ for (int i = 0; i < pd->ntris; ++i)
+ {
+ const unsigned char* t = navmesh->getDetailTri(pd->tbase+i);
+ const float* v[3];
+ for (int j = 0; j < 3; ++j)
+ {
+ if (t[j] < p->nv)
+ v[j] = navmesh->getVertex(p->v[t[j]]);
+ else
+ v[j] = navmesh->getDetailVertex(pd->vbase+(t[j]-p->nv));
+ }
+ float dist = barDistSqPointToTri(spos, v[0], v[1], v[2]);
+ if (dist<distMin)
+ {
+ distMin = dist;
+ idxMin = i;
+ }
+ }
+
+ if (idxMin>=0)
+ {
+ const unsigned char* t = navmesh->getDetailTri(pd->tbase+idxMin);
+ const float* v[3];
+ for (int j = 0; j < 3; ++j)
+ {
+ if (t[j] < p->nv)
+ v[j] = navmesh->getVertex(p->v[t[j]]);
+ else
+ v[j] = navmesh->getDetailVertex(pd->vbase+(t[j]-p->nv));
+ }
+ MT_Vector3 tri[3];
+ for (size_t j=0; j<3; j++)
+ tri[j].setValue(v[j][0],v[j][2],v[j][1]);
+ MT_Vector3 a,b;
+ a = tri[1]-tri[0];
+ b = tri[2]-tri[0];
+ normal = b.cross(a).safe_normalized();
+ return true;
+ }
+
+ return false;
+}
+
+void KX_SteeringActuator::HandleActorFace(MT_Vector3& velocity)
+{
+ if (m_facingMode==0 && (!m_navmesh || !m_normalUp))
+ return;
+ KX_GameObject* curobj = (KX_GameObject*) GetParent();
+ MT_Vector3 dir = m_facingMode==0 ? curobj->NodeGetLocalOrientation().getColumn(1) : velocity;
+ if (dir.fuzzyZero())
+ return;
+ dir.normalize();
+ MT_Vector3 up(0,0,1);
+ MT_Vector3 left;
+ MT_Matrix3x3 mat;
+
+ if (m_navmesh && m_normalUp)
+ {
+ dtStatNavMesh* navmesh = m_navmesh->GetNavMesh();
+ MT_Vector3 normal;
+ MT_Vector3 trpos = m_navmesh->TransformToLocalCoords(curobj->NodeGetWorldPosition());
+ if (getNavmeshNormal(navmesh, trpos, normal))
+ {
+
+ left = (dir.cross(up)).safe_normalized();
+ dir = (-left.cross(normal)).safe_normalized();
+ up = normal;
+ }
+ }
+
+ switch (m_facingMode)
+ {
+ case 1: // TRACK X
+ {
+ left = dir.safe_normalized();
+ dir = -(left.cross(up)).safe_normalized();
+ break;
+ };
+ case 2: // TRACK Y
+ {
+ left = (dir.cross(up)).safe_normalized();
+ break;
+ }
+
+ case 3: // track Z
+ {
+ left = up.safe_normalized();
+ up = dir.safe_normalized();
+ dir = left;
+ left = (dir.cross(up)).safe_normalized();
+ break;
+ }
+
+ case 4: // TRACK -X
+ {
+ left = -dir.safe_normalized();
+ dir = -(left.cross(up)).safe_normalized();
+ break;
+ };
+ case 5: // TRACK -Y
+ {
+ left = (-dir.cross(up)).safe_normalized();
+ dir = -dir;
+ break;
+ }
+ case 6: // track -Z
+ {
+ left = up.safe_normalized();
+ up = -dir.safe_normalized();
+ dir = left;
+ left = (dir.cross(up)).safe_normalized();
+ break;
+ }
+ }
+
+ mat.setValue (
+ left[0], dir[0],up[0],
+ left[1], dir[1],up[1],
+ left[2], dir[2],up[2]
+ );
+
+
+
+ KX_GameObject* parentObject = curobj->GetParent();
+ if(parentObject)
+ {
+ MT_Point3 localpos;
+ localpos = curobj->GetSGNode()->GetLocalPosition();
+ MT_Matrix3x3 parentmatinv;
+ parentmatinv = parentObject->NodeGetWorldOrientation ().inverse ();
+ mat = parentmatinv * mat;
+ mat = m_parentlocalmat * mat;
+ curobj->NodeSetLocalOrientation(mat);
+ curobj->NodeSetLocalPosition(localpos);
+ }
+ else
+ {
+ curobj->NodeSetLocalOrientation(mat);
+ }
+
+}
+
+#ifndef DISABLE_PYTHON
+
+/* ------------------------------------------------------------------------- */
+/* Python functions */
+/* ------------------------------------------------------------------------- */
+
+/* Integration hooks ------------------------------------------------------- */
+PyTypeObject KX_SteeringActuator::Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "KX_SteeringActuator",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,0,0,0,0,0,0,0,0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &SCA_IActuator::Type,
+ 0,0,0,0,0,0,
+ py_base_new
+};
+
+PyMethodDef KX_SteeringActuator::Methods[] = {
+ {NULL,NULL} //Sentinel
+};
+
+PyAttributeDef KX_SteeringActuator::Attributes[] = {
+ KX_PYATTRIBUTE_INT_RW("behaviour", KX_STEERING_NODEF+1, KX_STEERING_MAX-1, true, KX_SteeringActuator, m_mode),
+ KX_PYATTRIBUTE_RW_FUNCTION("target", KX_SteeringActuator, pyattr_get_target, pyattr_set_target),
+ KX_PYATTRIBUTE_RW_FUNCTION("navmesh", KX_SteeringActuator, pyattr_get_navmesh, pyattr_set_navmesh),
+ KX_PYATTRIBUTE_FLOAT_RW("distance", 0.0f, 1000.0f, KX_SteeringActuator, m_distance),
+ KX_PYATTRIBUTE_FLOAT_RW("velocity", 0.0f, 1000.0f, KX_SteeringActuator, m_velocity),
+ KX_PYATTRIBUTE_FLOAT_RW("acceleration", 0.0f, 1000.0f, KX_SteeringActuator, m_acceleration),
+ KX_PYATTRIBUTE_FLOAT_RW("turnspeed", 0.0f, 720.0f, KX_SteeringActuator, m_turnspeed),
+ KX_PYATTRIBUTE_BOOL_RW("selfterminated", KX_SteeringActuator, m_isSelfTerminated),
+ KX_PYATTRIBUTE_BOOL_RW("enableVisualization", KX_SteeringActuator, m_enableVisualization),
+ KX_PYATTRIBUTE_RO_FUNCTION("steeringVec", KX_SteeringActuator, pyattr_get_steeringVec),
+ KX_PYATTRIBUTE_SHORT_RW("facingMode", 0, 6, true, KX_SteeringActuator, m_facingMode),
+ KX_PYATTRIBUTE_INT_RW("pathUpdatePeriod", -1, 100000, true, KX_SteeringActuator, m_pathUpdatePeriod),
+ { NULL } //Sentinel
+};
+
+PyObject* KX_SteeringActuator::pyattr_get_target(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_SteeringActuator* actuator = static_cast<KX_SteeringActuator*>(self);
+ if (!actuator->m_target)
+ Py_RETURN_NONE;
+ else
+ return actuator->m_target->GetProxy();
+}
+
+int KX_SteeringActuator::pyattr_set_target(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_SteeringActuator* actuator = static_cast<KX_SteeringActuator*>(self);
+ KX_GameObject *gameobj;
+
+ if (!ConvertPythonToGameObject(value, &gameobj, true, "actuator.object = value: KX_SteeringActuator"))
+ return PY_SET_ATTR_FAIL; // ConvertPythonToGameObject sets the error
+
+ if (actuator->m_target != NULL)
+ actuator->m_target->UnregisterActuator(actuator);
+
+ actuator->m_target = (KX_GameObject*) gameobj;
+
+ if (actuator->m_target)
+ actuator->m_target->RegisterActuator(actuator);
+
+ return PY_SET_ATTR_SUCCESS;
+}
+
+PyObject* KX_SteeringActuator::pyattr_get_navmesh(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_SteeringActuator* actuator = static_cast<KX_SteeringActuator*>(self);
+ if (!actuator->m_navmesh)
+ Py_RETURN_NONE;
+ else
+ return actuator->m_navmesh->GetProxy();
+}
+
+int KX_SteeringActuator::pyattr_set_navmesh(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_SteeringActuator* actuator = static_cast<KX_SteeringActuator*>(self);
+ KX_GameObject *gameobj;
+
+ if (!ConvertPythonToGameObject(value, &gameobj, true, "actuator.object = value: KX_SteeringActuator"))
+ return PY_SET_ATTR_FAIL; // ConvertPythonToGameObject sets the error
+
+ if (!PyObject_TypeCheck(value, &KX_NavMeshObject::Type))
+ {
+ PyErr_Format(PyExc_TypeError, "KX_NavMeshObject is expected");
+ return PY_SET_ATTR_FAIL;
+ }
+
+ if (actuator->m_navmesh != NULL)
+ actuator->m_navmesh->UnregisterActuator(actuator);
+
+ actuator->m_navmesh = static_cast<KX_NavMeshObject*>(gameobj);
+
+ if (actuator->m_navmesh)
+ actuator->m_navmesh->RegisterActuator(actuator);
+
+ return PY_SET_ATTR_SUCCESS;
+}
+
+PyObject* KX_SteeringActuator::pyattr_get_steeringVec(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_SteeringActuator* actuator = static_cast<KX_SteeringActuator*>(self);
+ const MT_Vector3& steeringVec = actuator->GetSteeringVec();
+ return PyObjectFrom(steeringVec);
+}
+
+#endif // DISABLE_PYTHON
+
+/* eof */
+
diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.h b/source/gameengine/Ketsji/KX_SteeringActuator.h
new file mode 100644
index 00000000000..4f8303107f7
--- /dev/null
+++ b/source/gameengine/Ketsji/KX_SteeringActuator.h
@@ -0,0 +1,130 @@
+/**
+* Add steering behaviors
+*
+*
+* $Id$
+*
+* ***** BEGIN GPL LICENSE BLOCK *****
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version. The Blender
+* Foundation also sells licenses for use in proprietary software under
+* the Blender License. See http://www.blender.org/BL/ for information
+* about this.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 LICENSE BLOCK *****
+*/
+
+#ifndef __KX_STEERINGACTUATOR
+#define __KX_STEERINGACTUATOR
+
+#include "SCA_IActuator.h"
+#include "SCA_LogicManager.h"
+#include "MT_Matrix3x3.h"
+
+class KX_GameObject;
+class KX_NavMeshObject;
+struct KX_Obstacle;
+class KX_ObstacleSimulation;
+const int MAX_PATH_LENGTH = 128;
+
+class KX_SteeringActuator : public SCA_IActuator
+{
+ Py_Header;
+
+ /** Target object */
+ KX_GameObject *m_target;
+ KX_NavMeshObject *m_navmesh;
+ int m_mode;
+ float m_distance;
+ float m_velocity;
+ float m_acceleration;
+ float m_turnspeed;
+ KX_ObstacleSimulation* m_simulation;
+
+ KX_Obstacle* m_obstacle;
+ double m_updateTime;
+ bool m_isActive;
+ bool m_isSelfTerminated;
+ bool m_enableVisualization;
+ short m_facingMode;
+ bool m_normalUp;
+ float m_path[MAX_PATH_LENGTH*3];
+ int m_pathLen;
+ int m_pathUpdatePeriod;
+ double m_pathUpdateTime;
+ int m_wayPointIdx;
+ MT_Matrix3x3 m_parentlocalmat;
+ MT_Vector3 m_steerVec;
+ void HandleActorFace(MT_Vector3& velocity);
+public:
+ enum KX_STEERINGACT_MODE
+ {
+ KX_STEERING_NODEF = 0,
+ KX_STEERING_SEEK,
+ KX_STEERING_FLEE,
+ KX_STEERING_PATHFOLLOWING,
+ KX_STEERING_MAX
+ };
+
+ KX_SteeringActuator(class SCA_IObject* gameobj,
+ int mode,
+ KX_GameObject *target,
+ KX_GameObject *navmesh,
+ float distance,
+ float velocity,
+ float acceleration,
+ float turnspeed,
+ bool isSelfTerminated,
+ int pathUpdatePeriod,
+ KX_ObstacleSimulation* simulation,
+ short facingmode,
+ bool normalup,
+ bool enableVisualization);
+ virtual ~KX_SteeringActuator();
+ virtual bool Update(double curtime, bool frame);
+
+ virtual CValue* GetReplica();
+ virtual void ProcessReplica();
+ virtual void Relink(CTR_Map<CTR_HashedPtr, void*> *obj_map);
+ virtual bool UnlinkObject(SCA_IObject* clientobj);
+ const MT_Vector3& GetSteeringVec();
+
+#ifndef DISABLE_PYTHON
+
+ /* --------------------------------------------------------------------- */
+ /* Python interface ---------------------------------------------------- */
+ /* --------------------------------------------------------------------- */
+
+ /* These are used to get and set m_target */
+ static PyObject* pyattr_get_target(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
+ static int pyattr_set_target(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+ static PyObject* pyattr_get_navmesh(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
+ static int pyattr_set_navmesh(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+ static PyObject* pyattr_get_steeringVec(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
+
+
+#endif // DISABLE_PYTHON
+
+}; /* end of class KX_SteeringActuator : public SCA_PropertyActuator */
+
+#endif
+
diff --git a/source/gameengine/Ketsji/KX_TrackToActuator.h b/source/gameengine/Ketsji/KX_TrackToActuator.h
index c5e96bd7454..bbf0134a859 100644
--- a/source/gameengine/Ketsji/KX_TrackToActuator.h
+++ b/source/gameengine/Ketsji/KX_TrackToActuator.h
@@ -57,7 +57,7 @@ class KX_TrackToActuator : public SCA_IActuator
public:
KX_TrackToActuator(SCA_IObject* gameobj, SCA_IObject *ob, int time,
- bool threedee,int trackflag,int upflag);
+ bool threedee,int trackflag,int upflag);
virtual ~KX_TrackToActuator();
virtual CValue* GetReplica() {
KX_TrackToActuator* replica = new KX_TrackToActuator(*this);
diff --git a/source/gameengine/Ketsji/SConscript b/source/gameengine/Ketsji/SConscript
index c5509dd7de8..9b453ed76d5 100644
--- a/source/gameengine/Ketsji/SConscript
+++ b/source/gameengine/Ketsji/SConscript
@@ -20,6 +20,7 @@ incs += ' #source/gameengine/GameLogic #source/gameengine/Expressions #source/ga
incs += ' #source/gameengine/SceneGraph #source/gameengine/Physics/common'
incs += ' #source/gameengine/Physics/Dummy'
incs += ' #source/blender/misc #source/blender/blenloader #extern/glew/include #source/blender/gpu'
+incs += ' #extern/recastnavigation/Recast/Include #extern/recastnavigation/Detour/Include'
incs += ' ' + env['BF_BULLET_INC']
incs += ' ' + env['BF_OPENGL_INC']
diff --git a/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h b/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h
index 67d0e741507..cb7807a86a6 100644
--- a/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h
+++ b/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h
@@ -52,8 +52,8 @@ public:
virtual void NextFrame();
bool Connect(char *address, unsigned int port, char *password,
- unsigned int localport, unsigned int timeout) {
- return true;}
+ unsigned int localport, unsigned int timeout) {
+ return true;}
bool Disconnect(void) {return true;}
virtual void SendNetworkMessage(class NG_NetworkMessage* msg);
diff --git a/source/gameengine/Network/NG_NetworkDeviceInterface.h b/source/gameengine/Network/NG_NetworkDeviceInterface.h
index 6df228680ec..857b4660327 100644
--- a/source/gameengine/Network/NG_NetworkDeviceInterface.h
+++ b/source/gameengine/Network/NG_NetworkDeviceInterface.h
@@ -64,7 +64,7 @@ public:
bool IsOnline(void) { return m_online; }
virtual bool Connect(char *address, unsigned int port, char *password,
- unsigned int localport, unsigned int timeout)=0;
+ unsigned int localport, unsigned int timeout)=0;
virtual bool Disconnect(void)=0;
virtual void SendNetworkMessage(NG_NetworkMessage* msg)=0;
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h b/source/gameengine/Physics/Bullet/CcdPhysicsController.h
index 08445654916..82acd64161f 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h
@@ -216,12 +216,12 @@ struct CcdConstructionInfo
///more advanced collision filtering should be done in btCollisionDispatcher::NeedsCollision
enum CollisionFilterGroups
{
- DefaultFilter = 1,
- StaticFilter = 2,
- KinematicFilter = 4,
- DebrisFilter = 8,
- SensorFilter = 16,
- AllFilter = DefaultFilter | StaticFilter | KinematicFilter | DebrisFilter | SensorFilter,
+ DefaultFilter = 1,
+ StaticFilter = 2,
+ KinematicFilter = 4,
+ DebrisFilter = 8,
+ SensorFilter = 16,
+ AllFilter = DefaultFilter | StaticFilter | KinematicFilter | DebrisFilter | SensorFilter,
};
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
index 526176481ed..39b2022a1f4 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
@@ -2564,8 +2564,8 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl
btPlaneSpace1( axisInA, axis1, axis2 );
frameInA.getBasis().setValue( axisInA.x(), axis1.x(), axis2.x(),
- axisInA.y(), axis1.y(), axis2.y(),
- axisInA.z(), axis1.z(), axis2.z() );
+ axisInA.y(), axis1.y(), axis2.y(),
+ axisInA.z(), axis1.z(), axis2.z() );
frameInA.setOrigin( pivotInA );
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
index 18e1282b111..c34a00513bf 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
@@ -164,7 +164,7 @@ protected:
virtual float getConstraintParam(int constraintId,int param);
- virtual void removeConstraint(int constraintid);
+ virtual void removeConstraint(int constraintid);
virtual float getAppliedImpulse(int constraintid);
diff --git a/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp b/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp
index ed18ff0329e..725d00aa5cd 100644
--- a/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp
+++ b/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp
@@ -306,8 +306,8 @@ void RAS_2DFilterManager::SetupTextures(bool depth, bool luminance)
if(depth){
glGenTextures(1, (GLuint*)&texname[1]);
glBindTexture(GL_TEXTURE_2D, texname[1]);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, texturewidth,textureheight,
- 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE,NULL);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, texturewidth,textureheight,
+ 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE,NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE,
GL_NONE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
@@ -433,6 +433,9 @@ void RAS_2DFilterManager::RenderFilters(RAS_ICanvas* canvas)
glCopyTexImage2D(GL_TEXTURE_2D,0,GL_LUMINANCE16, 0, 0, texturewidth,textureheight, 0);
}
+ // reverting to texunit 0, without this we get bug [#28462]
+ glActiveTextureARB(GL_TEXTURE0);
+
glViewport(0,0, texturewidth, textureheight);
glDisable(GL_DEPTH_TEST);
diff --git a/source/gameengine/Rasterizer/RAS_CameraData.h b/source/gameengine/Rasterizer/RAS_CameraData.h
index e6254f72511..5657fda4f3c 100644
--- a/source/gameengine/Rasterizer/RAS_CameraData.h
+++ b/source/gameengine/Rasterizer/RAS_CameraData.h
@@ -49,19 +49,19 @@ struct RAS_CameraData
float m_focallength;
RAS_CameraData(float lens = 35.0, float scale = 6.0, float clipstart = 0.1, float clipend = 5000.0, bool perspective = true,
- float focallength = 3.0, bool viewport = false, int viewportleft = 0, int viewportbottom = 0,
- int viewportright = 0, int viewporttop = 0) :
- m_lens(lens),
- m_scale(scale),
- m_clipstart(clipstart),
- m_clipend(clipend),
- m_perspective(perspective),
- m_viewport(viewport),
- m_viewportleft(viewportleft),
- m_viewportbottom(viewportbottom),
- m_viewportright(viewportright),
- m_viewporttop(viewporttop),
- m_focallength(focallength)
+ float focallength = 3.0, bool viewport = false, int viewportleft = 0, int viewportbottom = 0,
+ int viewportright = 0, int viewporttop = 0) :
+ m_lens(lens),
+ m_scale(scale),
+ m_clipstart(clipstart),
+ m_clipend(clipend),
+ m_perspective(perspective),
+ m_viewport(viewport),
+ m_viewportleft(viewportleft),
+ m_viewportbottom(viewportbottom),
+ m_viewportright(viewportright),
+ m_viewporttop(viewporttop),
+ m_focallength(focallength)
{
}
};
diff --git a/source/gameengine/Rasterizer/RAS_IRasterizer.h b/source/gameengine/Rasterizer/RAS_IRasterizer.h
index c46ebf742a0..877a7219a1c 100644
--- a/source/gameengine/Rasterizer/RAS_IRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_IRasterizer.h
@@ -393,7 +393,9 @@ public:
virtual void SetPolygonOffset(float mult, float add) = 0;
virtual void DrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color)=0;
- virtual void FlushDebugLines()=0;
+ virtual void DrawDebugCircle(const MT_Vector3& center, const MT_Scalar radius, const MT_Vector3& color,
+ const MT_Vector3& normal, int nsector)=0;
+ virtual void FlushDebugShapes()=0;
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Blur2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Blur2DFilter.h
index a277d9835d8..3a3ea57d67b 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Blur2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Blur2DFilter.h
@@ -38,17 +38,17 @@ uniform vec2 bgl_TextureCoordinateOffset[9];
void main(void)
{
- vec4 sample[9];
+ vec4 sample[9];
- for (int i = 0; i < 9; i++)
- {
- sample[i] = texture2D(bgl_RenderedTexture,
- gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]);
- }
+ for (int i = 0; i < 9; i++)
+ {
+ sample[i] = texture2D(bgl_RenderedTexture,
+ gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]);
+ }
- gl_FragColor = (sample[0] + (2.0*sample[1]) + sample[2] +
- (2.0*sample[3]) + sample[4] + (2.0*sample[5]) +
- sample[6] + (2.0*sample[7]) + sample[8]) / 13.0;
+ gl_FragColor = (sample[0] + (2.0*sample[1]) + sample[2] +
+ (2.0*sample[3]) + sample[4] + (2.0*sample[5]) +
+ sample[6] + (2.0*sample[7]) + sample[8]) / 13.0;
}
);
#endif
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Dilation2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Dilation2DFilter.h
index 6aeff254f77..f486be47f9f 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Dilation2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Dilation2DFilter.h
@@ -38,17 +38,17 @@ uniform vec2 bgl_TextureCoordinateOffset[9];
void main(void)
{
- vec4 sample[9];
- vec4 maxValue = vec4(0.0);
+ vec4 sample[9];
+ vec4 maxValue = vec4(0.0);
- for (int i = 0; i < 9; i++)
- {
- sample[i] = texture2D(bgl_RenderedTexture,
- gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]);
- maxValue = max(sample[i], maxValue);
- }
+ for (int i = 0; i < 9; i++)
+ {
+ sample[i] = texture2D(bgl_RenderedTexture,
+ gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]);
+ maxValue = max(sample[i], maxValue);
+ }
- gl_FragColor = maxValue;
+ gl_FragColor = maxValue;
}
);
#endif
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Erosion2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Erosion2DFilter.h
index 1e9dccaec87..a1755dc0eeb 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Erosion2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Erosion2DFilter.h
@@ -33,22 +33,22 @@
#define __RAS_EROSION2DFILTER
const char * ErosionFragmentShader=STRINGIFY(
-uniform sampler2D bgl_RenderedTexture;
-uniform vec2 bgl_TextureCoordinateOffset[9];
+ uniform sampler2D bgl_RenderedTexture;
+ uniform vec2 bgl_TextureCoordinateOffset[9];
void main(void)
{
- vec4 sample[9];
- vec4 minValue = vec4(1.0);
+ vec4 sample[9];
+ vec4 minValue = vec4(1.0);
- for (int i = 0; i < 9; i++)
- {
- sample[i] = texture2D(bgl_RenderedTexture,
- gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]);
- minValue = min(sample[i], minValue);
- }
+ for (int i = 0; i < 9; i++)
+ {
+ sample[i] = texture2D(bgl_RenderedTexture,
+ gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]);
+ minValue = min(sample[i], minValue);
+ }
- gl_FragColor = minValue;
+ gl_FragColor = minValue;
}
);
#endif
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Laplacian2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Laplacian2DFilter.h
index c7cfa83a11f..45c94d358ba 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Laplacian2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Laplacian2DFilter.h
@@ -38,18 +38,18 @@ uniform vec2 bgl_TextureCoordinateOffset[9];
void main(void)
{
- vec4 sample[9];
+ vec4 sample[9];
- for (int i = 0; i < 9; i++)
- {
- sample[i] = texture2D(bgl_RenderedTexture,
- gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]);
- }
+ for (int i = 0; i < 9; i++)
+ {
+ sample[i] = texture2D(bgl_RenderedTexture,
+ gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]);
+ }
- gl_FragColor = (sample[4] * 8.0) -
- (sample[0] + sample[1] + sample[2] +
- sample[3] + sample[5] +
- sample[6] + sample[7] + sample[8]);
+ gl_FragColor = (sample[4] * 8.0) -
+ (sample[0] + sample[1] + sample[2] +
+ sample[3] + sample[5] +
+ sample[6] + sample[7] + sample[8]);
gl_FragColor = vec4(gl_FragColor.rgb, 1.0);
}
);
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Prewitt2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Prewitt2DFilter.h
index ada53cd751d..8d08d9077cb 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Prewitt2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Prewitt2DFilter.h
@@ -38,23 +38,23 @@ uniform vec2 bgl_TextureCoordinateOffset[9];
void main(void)
{
- vec4 sample[9];
+ vec4 sample[9];
- for (int i = 0; i < 9; i++)
- {
- sample[i] = texture2D(bgl_RenderedTexture,
- gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]);
- }
+ for (int i = 0; i < 9; i++)
+ {
+ sample[i] = texture2D(bgl_RenderedTexture,
+ gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]);
+ }
- vec4 horizEdge = sample[2] + sample[5] + sample[8] -
- (sample[0] + sample[3] + sample[6]);
+ vec4 horizEdge = sample[2] + sample[5] + sample[8] -
+ (sample[0] + sample[3] + sample[6]);
- vec4 vertEdge = sample[0] + sample[1] + sample[2] -
- (sample[6] + sample[7] + sample[8]);
+ vec4 vertEdge = sample[0] + sample[1] + sample[2] -
+ (sample[6] + sample[7] + sample[8]);
- gl_FragColor.rgb = sqrt((horizEdge.rgb * horizEdge.rgb) +
- (vertEdge.rgb * vertEdge.rgb));
- gl_FragColor.a = 1.0;
+ gl_FragColor.rgb = sqrt((horizEdge.rgb * horizEdge.rgb) +
+ (vertEdge.rgb * vertEdge.rgb));
+ gl_FragColor.a = 1.0;
}
);
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sharpen2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sharpen2DFilter.h
index 0d68bc09c70..a9c827fa9e1 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sharpen2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sharpen2DFilter.h
@@ -38,18 +38,18 @@ uniform vec2 bgl_TextureCoordinateOffset[9];
void main(void)
{
- vec4 sample[9];
+ vec4 sample[9];
- for (int i = 0; i < 9; i++)
- {
- sample[i] = texture2D(bgl_RenderedTexture,
- gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]);
- }
+ for (int i = 0; i < 9; i++)
+ {
+ sample[i] = texture2D(bgl_RenderedTexture,
+ gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]);
+ }
- gl_FragColor = (sample[4] * 9.0) -
- (sample[0] + sample[1] + sample[2] +
- sample[3] + sample[5] +
- sample[6] + sample[7] + sample[8]);
+ gl_FragColor = (sample[4] * 9.0) -
+ (sample[0] + sample[1] + sample[2] +
+ sample[3] + sample[5] +
+ sample[6] + sample[7] + sample[8]);
}
);
#endif
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sobel2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sobel2DFilter.h
index 0f80f0f22b4..350ce19fafd 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sobel2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sobel2DFilter.h
@@ -38,23 +38,23 @@ uniform vec2 bgl_TextureCoordinateOffset[9];
void main(void)
{
- vec4 sample[9];
+ vec4 sample[9];
- for (int i = 0; i < 9; i++)
- {
- sample[i] = texture2D(bgl_RenderedTexture,
- gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]);
- }
+ for (int i = 0; i < 9; i++)
+ {
+ sample[i] = texture2D(bgl_RenderedTexture,
+ gl_TexCoord[0].st + bgl_TextureCoordinateOffset[i]);
+ }
- vec4 horizEdge = sample[2] + (2.0*sample[5]) + sample[8] -
- (sample[0] + (2.0*sample[3]) + sample[6]);
+ vec4 horizEdge = sample[2] + (2.0*sample[5]) + sample[8] -
+ (sample[0] + (2.0*sample[3]) + sample[6]);
- vec4 vertEdge = sample[0] + (2.0*sample[1]) + sample[2] -
- (sample[6] + (2.0*sample[7]) + sample[8]);
+ vec4 vertEdge = sample[0] + (2.0*sample[1]) + sample[2] -
+ (sample[6] + (2.0*sample[7]) + sample[8]);
- gl_FragColor.rgb = sqrt((horizEdge.rgb * horizEdge.rgb) +
- (vertEdge.rgb * vertEdge.rgb));
- gl_FragColor.a = 1.0;
+ gl_FragColor.rgb = sqrt((horizEdge.rgb * horizEdge.rgb) +
+ (vertEdge.rgb * vertEdge.rgb));
+ gl_FragColor.a = 1.0;
}
);
#endif
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
index 50d034a5a5a..6ad9e591474 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
@@ -55,6 +55,10 @@
#include "BKE_DerivedMesh.h"
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
/**
* 32x32 bit masks for vinterlace stereo mode
*/
@@ -354,9 +358,9 @@ void RAS_OpenGLRasterizer::ClearCachingInfo(void)
m_materialCachingInfo = 0;
}
-void RAS_OpenGLRasterizer::FlushDebugLines()
+void RAS_OpenGLRasterizer::FlushDebugShapes()
{
- if(!m_debugLines.size())
+ if(!m_debugShapes.size())
return;
// DrawDebugLines
@@ -368,29 +372,67 @@ void RAS_OpenGLRasterizer::FlushDebugLines()
if(light) glDisable(GL_LIGHTING);
if(tex) glDisable(GL_TEXTURE_2D);
+ //draw lines
glBegin(GL_LINES);
- for (unsigned int i=0;i<m_debugLines.size();i++)
+ for (unsigned int i=0;i<m_debugShapes.size();i++)
{
- glColor4f(m_debugLines[i].m_color[0],m_debugLines[i].m_color[1],m_debugLines[i].m_color[2],1.f);
- const MT_Scalar* fromPtr = &m_debugLines[i].m_from.x();
- const MT_Scalar* toPtr= &m_debugLines[i].m_to.x();
-
+ if (m_debugShapes[i].m_type != OglDebugShape::LINE)
+ continue;
+ glColor4f(m_debugShapes[i].m_color[0],m_debugShapes[i].m_color[1],m_debugShapes[i].m_color[2],1.f);
+ const MT_Scalar* fromPtr = &m_debugShapes[i].m_pos.x();
+ const MT_Scalar* toPtr= &m_debugShapes[i].m_param.x();
glVertex3dv(fromPtr);
glVertex3dv(toPtr);
}
glEnd();
+ //draw circles
+ for (unsigned int i=0;i<m_debugShapes.size();i++)
+ {
+ if (m_debugShapes[i].m_type != OglDebugShape::CIRCLE)
+ continue;
+ glBegin(GL_LINE_LOOP);
+ glColor4f(m_debugShapes[i].m_color[0],m_debugShapes[i].m_color[1],m_debugShapes[i].m_color[2],1.f);
+
+ static const MT_Vector3 worldUp(0.,0.,1.);
+ MT_Vector3 norm = m_debugShapes[i].m_param;
+ MT_Matrix3x3 tr;
+ if (norm.fuzzyZero() || norm == worldUp)
+ {
+ tr.setIdentity();
+ }
+ else
+ {
+ MT_Vector3 xaxis, yaxis;
+ xaxis = MT_cross(norm, worldUp);
+ yaxis = MT_cross(xaxis, norm);
+ tr.setValue(xaxis.x(), xaxis.y(), xaxis.z(),
+ yaxis.x(), yaxis.y(), yaxis.z(),
+ norm.x(), norm.y(), norm.z());
+ }
+ MT_Scalar rad = m_debugShapes[i].m_param2.x();
+ int n = (int) m_debugShapes[i].m_param2.y();
+ for (int j = 0; j<n; j++)
+ {
+ MT_Scalar theta = j*M_PI*2/n;
+ MT_Vector3 pos(cos(theta)*rad, sin(theta)*rad, 0.);
+ pos = pos*tr;
+ pos += m_debugShapes[i].m_pos;
+ const MT_Scalar* posPtr = &pos.x();
+ glVertex3dv(posPtr);
+ }
+ glEnd();
+ }
+
if(light) glEnable(GL_LIGHTING);
if(tex) glEnable(GL_TEXTURE_2D);
- m_debugLines.clear();
+ m_debugShapes.clear();
}
void RAS_OpenGLRasterizer::EndFrame()
{
-
-
- FlushDebugLines();
+ FlushDebugShapes();
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
index 61568df91eb..c0e02f6df77 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
@@ -49,10 +49,15 @@ using namespace std;
#define RAS_MAX_TEXCO 8 // match in BL_Material
#define RAS_MAX_ATTRIB 16 // match in BL_BlenderShader
-struct OglDebugLine
+struct OglDebugShape
{
- MT_Vector3 m_from;
- MT_Vector3 m_to;
+ enum SHAPE_TYPE{
+ LINE, CIRCLE
+ };
+ SHAPE_TYPE m_type;
+ MT_Vector3 m_pos;
+ MT_Vector3 m_param;
+ MT_Vector3 m_param2;
MT_Vector3 m_color;
};
@@ -256,18 +261,32 @@ public:
virtual void SetPolygonOffset(float mult, float add);
- virtual void FlushDebugLines();
+ virtual void FlushDebugShapes();
- virtual void DrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color)
+ virtual void DrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color)
{
- OglDebugLine line;
- line.m_from = from;
- line.m_to = to;
+ OglDebugShape line;
+ line.m_type = OglDebugShape::LINE;
+ line.m_pos= from;
+ line.m_param = to;
line.m_color = color;
- m_debugLines.push_back(line);
+ m_debugShapes.push_back(line);
+ }
+
+ virtual void DrawDebugCircle(const MT_Vector3& center, const MT_Scalar radius, const MT_Vector3& color,
+ const MT_Vector3& normal, int nsector)
+ {
+ OglDebugShape line;
+ line.m_type = OglDebugShape::CIRCLE;
+ line.m_pos= center;
+ line.m_param = normal;
+ line.m_color = color;
+ line.m_param2.x() = radius;
+ line.m_param2.y() = (float) nsector;
+ m_debugShapes.push_back(line);
}
- std::vector <OglDebugLine> m_debugLines;
+ std::vector <OglDebugShape> m_debugShapes;
virtual void SetTexCoordNum(int num);
virtual void SetAttribNum(int num);
diff --git a/source/gameengine/SceneGraph/SG_DList.h b/source/gameengine/SceneGraph/SG_DList.h
index b82e51e0d2f..9e7e514b27a 100644
--- a/source/gameengine/SceneGraph/SG_DList.h
+++ b/source/gameengine/SceneGraph/SG_DList.h
@@ -134,88 +134,88 @@ public:
}
};
- SG_DList()
- {
- m_flink = m_blink = this;
- }
+ SG_DList()
+ {
+ m_flink = m_blink = this;
+ }
SG_DList(const SG_DList& other)
{
- m_flink = m_blink = this;
+ m_flink = m_blink = this;
}
- virtual ~SG_DList()
- {
+ virtual ~SG_DList()
+ {
Delink();
- }
+ }
- inline bool Empty() // Check for empty queue
- {
- return ( m_flink == this );
- }
- bool AddBack( SG_DList *item ) // Add to the back
- {
+ inline bool Empty() // Check for empty queue
+ {
+ return ( m_flink == this );
+ }
+ bool AddBack( SG_DList *item ) // Add to the back
+ {
if (!item->Empty())
return false;
- item->m_blink = m_blink;
- item->m_flink = this;
- m_blink->m_flink = item;
- m_blink = item;
+ item->m_blink = m_blink;
+ item->m_flink = this;
+ m_blink->m_flink = item;
+ m_blink = item;
return true;
- }
- bool AddFront( SG_DList *item ) // Add to the back
- {
+ }
+ bool AddFront( SG_DList *item ) // Add to the back
+ {
if (!item->Empty())
return false;
- item->m_flink = m_flink;
- item->m_blink = this;
- m_flink->m_blink = item;
- m_flink = item;
+ item->m_flink = m_flink;
+ item->m_blink = this;
+ m_flink->m_blink = item;
+ m_flink = item;
return true;
- }
- SG_DList *Remove() // Remove from the front
- {
- if (Empty())
- {
- return NULL;
- }
- SG_DList* item = m_flink;
- m_flink = item->m_flink;
- m_flink->m_blink = this;
- item->m_flink = item->m_blink = item;
- return item;
- }
- bool Delink() // Remove from the middle
- {
+ }
+ SG_DList *Remove() // Remove from the front
+ {
+ if (Empty())
+ {
+ return NULL;
+ }
+ SG_DList* item = m_flink;
+ m_flink = item->m_flink;
+ m_flink->m_blink = this;
+ item->m_flink = item->m_blink = item;
+ return item;
+ }
+ bool Delink() // Remove from the middle
+ {
if (Empty())
return false;
m_blink->m_flink = m_flink;
m_flink->m_blink = m_blink;
m_flink = m_blink = this;
return true;
- }
- inline SG_DList *Peek() // Look at front without removing
- {
- return m_flink;
- }
- inline SG_DList *Back() // Look at front without removing
- {
- return m_blink;
- }
- inline SG_DList *Self()
- {
- return this;
- }
- inline const SG_DList *Peek() const // Look at front without removing
- {
- return (const SG_DList*)m_flink;
- }
- inline const SG_DList *Back() const // Look at front without removing
- {
- return (const SG_DList*)m_blink;
- }
- inline const SG_DList *Self() const
- {
- return this;
- }
+ }
+ inline SG_DList *Peek() // Look at front without removing
+ {
+ return m_flink;
+ }
+ inline SG_DList *Back() // Look at front without removing
+ {
+ return m_blink;
+ }
+ inline SG_DList *Self()
+ {
+ return this;
+ }
+ inline const SG_DList *Peek() const // Look at front without removing
+ {
+ return (const SG_DList*)m_flink;
+ }
+ inline const SG_DList *Back() const // Look at front without removing
+ {
+ return (const SG_DList*)m_blink;
+ }
+ inline const SG_DList *Self() const
+ {
+ return this;
+ }
#ifdef WITH_CXX_GUARDEDALLOC
diff --git a/source/gameengine/SceneGraph/SG_IObject.h b/source/gameengine/SceneGraph/SG_IObject.h
index c42935bc487..8c0159fe8d4 100644
--- a/source/gameengine/SceneGraph/SG_IObject.h
+++ b/source/gameengine/SceneGraph/SG_IObject.h
@@ -194,7 +194,7 @@ public:
/**
* Clear the array of pointers to controllers associated with
* this node. This does not delete the controllers themselves!
- * This should be used very carefully to avoid memory
+ * This should be used very carefully to avoid memory
* leaks.
*/
diff --git a/source/gameengine/SceneGraph/SG_QList.h b/source/gameengine/SceneGraph/SG_QList.h
index de79c35821e..eb404b1a5a5 100644
--- a/source/gameengine/SceneGraph/SG_QList.h
+++ b/source/gameengine/SceneGraph/SG_QList.h
@@ -91,73 +91,73 @@ public:
};
SG_QList() : SG_DList()
- {
- m_fqlink = m_bqlink = this;
- }
+ {
+ m_fqlink = m_bqlink = this;
+ }
SG_QList(const SG_QList& other) : SG_DList()
{
- m_fqlink = m_bqlink = this;
+ m_fqlink = m_bqlink = this;
}
- virtual ~SG_QList()
- {
+ virtual ~SG_QList()
+ {
QDelink();
- }
+ }
- inline bool QEmpty() // Check for empty queue
- {
- return ( m_fqlink == this );
- }
- bool QAddBack( SG_QList *item ) // Add to the back
- {
+ inline bool QEmpty() // Check for empty queue
+ {
+ return ( m_fqlink == this );
+ }
+ bool QAddBack( SG_QList *item ) // Add to the back
+ {
if (!item->QEmpty())
return false;
- item->m_bqlink = m_bqlink;
- item->m_fqlink = this;
- m_bqlink->m_fqlink = item;
- m_bqlink = item;
+ item->m_bqlink = m_bqlink;
+ item->m_fqlink = this;
+ m_bqlink->m_fqlink = item;
+ m_bqlink = item;
return true;
- }
- bool QAddFront( SG_QList *item ) // Add to the back
- {
+ }
+ bool QAddFront( SG_QList *item ) // Add to the back
+ {
if (!item->Empty())
return false;
- item->m_fqlink = m_fqlink;
- item->m_bqlink = this;
- m_fqlink->m_bqlink = item;
- m_fqlink = item;
+ item->m_fqlink = m_fqlink;
+ item->m_bqlink = this;
+ m_fqlink->m_bqlink = item;
+ m_fqlink = item;
return true;
- }
- SG_QList *QRemove() // Remove from the front
- {
- if (QEmpty())
- {
- return NULL;
- }
- SG_QList* item = m_fqlink;
- m_fqlink = item->m_fqlink;
- m_fqlink->m_bqlink = this;
- item->m_fqlink = item->m_bqlink = item;
- return item;
- }
- bool QDelink() // Remove from the middle
- {
+ }
+ SG_QList *QRemove() // Remove from the front
+ {
+ if (QEmpty())
+ {
+ return NULL;
+ }
+ SG_QList* item = m_fqlink;
+ m_fqlink = item->m_fqlink;
+ m_fqlink->m_bqlink = this;
+ item->m_fqlink = item->m_bqlink = item;
+ return item;
+ }
+ bool QDelink() // Remove from the middle
+ {
if (QEmpty())
return false;
m_bqlink->m_fqlink = m_fqlink;
m_fqlink->m_bqlink = m_bqlink;
m_fqlink = m_bqlink = this;
return true;
- }
- inline SG_QList *QPeek() // Look at front without removing
- {
- return m_fqlink;
- }
- inline SG_QList *QBack() // Look at front without removing
- {
- return m_bqlink;
- }
-
-
+ }
+ inline SG_QList *QPeek() // Look at front without removing
+ {
+ return m_fqlink;
+ }
+ inline SG_QList *QBack() // Look at front without removing
+ {
+ return m_bqlink;
+ }
+
+
#ifdef WITH_CXX_GUARDEDALLOC
public:
void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SG_QList"); }
diff --git a/source/gameengine/SceneGraph/SG_Spatial.cpp b/source/gameengine/SceneGraph/SG_Spatial.cpp
index 94b8584051e..09fb7278bfa 100644
--- a/source/gameengine/SceneGraph/SG_Spatial.cpp
+++ b/source/gameengine/SceneGraph/SG_Spatial.cpp
@@ -115,7 +115,7 @@ UpdateSpatialData(
const SG_Spatial *parent,
double time,
bool& parentUpdated
-){
+ ){
bool bComputesWorldTransform = false;
// update spatial controllers
diff --git a/source/gameengine/VideoTexture/CMakeLists.txt b/source/gameengine/VideoTexture/CMakeLists.txt
index 04683a5f99b..448fb307d2d 100644
--- a/source/gameengine/VideoTexture/CMakeLists.txt
+++ b/source/gameengine/VideoTexture/CMakeLists.txt
@@ -95,7 +95,6 @@ if(WITH_CODEC_FFMPEG)
${PTHREADS_INCLUDE_DIRS}
)
add_definitions(-DWITH_FFMPEG)
- add_definitions(-D__STDC_CONSTANT_MACROS)
endif()
blender_add_lib(ge_videotex "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/gameengine/VideoTexture/Exception.h b/source/gameengine/VideoTexture/Exception.h
index 16248186108..11e617cf4ce 100644
--- a/source/gameengine/VideoTexture/Exception.h
+++ b/source/gameengine/VideoTexture/Exception.h
@@ -122,11 +122,11 @@ public:
desc = m_description;
}
- void registerDesc(void)
- {
- if (std::find(m_expDescs.begin(), m_expDescs.end(), this) == m_expDescs.end())
- m_expDescs.push_back(this);
- }
+ void registerDesc(void)
+ {
+ if (std::find(m_expDescs.begin(), m_expDescs.end(), this) == m_expDescs.end())
+ m_expDescs.push_back(this);
+ }
// list of exception descriptions
static std::vector<ExpDesc*> m_expDescs;
diff --git a/source/gameengine/VideoTexture/ImageBase.cpp b/source/gameengine/VideoTexture/ImageBase.cpp
index 86de214e2d3..65509ab9424 100644
--- a/source/gameengine/VideoTexture/ImageBase.cpp
+++ b/source/gameengine/VideoTexture/ImageBase.cpp
@@ -375,7 +375,7 @@ void Image_dealloc (PyImage * self)
if (self->m_image->m_exports > 0)
{
PyErr_SetString(PyExc_SystemError,
- "deallocated Image object has exported buffers");
+ "deallocated Image object has exported buffers");
PyErr_Print();
}
// if release requires deleting of object, do it
diff --git a/source/gameengine/VideoTexture/ImageRender.cpp b/source/gameengine/VideoTexture/ImageRender.cpp
index 24833ace08f..f7546d876b2 100644
--- a/source/gameengine/VideoTexture/ImageRender.cpp
+++ b/source/gameengine/VideoTexture/ImageRender.cpp
@@ -328,11 +328,11 @@ static int ImageRender_init (PyObject * pySelf, PyObject * args, PyObject * kwds
// get background color
PyObject * getBackground (PyImage * self, void * closure)
{
- return Py_BuildValue("[BBBB]",
- getImageRender(self)->getBackground(0),
- getImageRender(self)->getBackground(1),
- getImageRender(self)->getBackground(2),
- getImageRender(self)->getBackground(3));
+ return Py_BuildValue("[BBBB]",
+ getImageRender(self)->getBackground(0),
+ getImageRender(self)->getBackground(1),
+ getImageRender(self)->getBackground(2),
+ getImageRender(self)->getBackground(3));
}
// set color
diff --git a/source/gameengine/VideoTexture/blendVideoTex.cpp b/source/gameengine/VideoTexture/blendVideoTex.cpp
index 2cb3831de52..e7244265fc4 100644
--- a/source/gameengine/VideoTexture/blendVideoTex.cpp
+++ b/source/gameengine/VideoTexture/blendVideoTex.cpp
@@ -112,7 +112,7 @@ static PyMethodDef moduleMethods[] =
{NULL} /* Sentinel */
};
-#if WITH_FFMPEG
+#ifdef WITH_FFMPEG
extern PyTypeObject VideoFFmpegType;
extern PyTypeObject ImageFFmpegType;
#endif
@@ -134,7 +134,7 @@ extern PyTypeObject ImageViewportType;
static void registerAllTypes(void)
{
-#if WITH_FFMPEG
+#ifdef WITH_FFMPEG
pyImageTypes.add(&VideoFFmpegType, "VideoFFmpeg");
pyImageTypes.add(&ImageFFmpegType, "ImageFFmpeg");
#endif
diff --git a/source/tests/check_deprecated.py b/source/tests/check_deprecated.py
index 856e1f6d272..34b07518162 100644
--- a/source/tests/check_deprecated.py
+++ b/source/tests/check_deprecated.py
@@ -130,7 +130,7 @@ def deprecations():
def main():
import datetime
- now = datetime.datetime.now()\
+ now = datetime.datetime.now()
deps = deprecations()